API通信接口介绍

2023年07月29日 15:52

关键词:

DVS-Server跟需要用户开发的Application Service的通信逻辑示意图如下:
20230729235000.png

DVS-Server 通过http协议上报DVS设备的状态跟告警信息,对应的接口是:/dvs/updatestatus/dvs/updatewarn

由于防区的划分及定义是由Application Service实现的,所以Application Service需要把防区的配置信息以及各防区的振动告警阀值信息下发给DVS-Server,而Application Service可能部署在跟DVS-server不一个网段,甚至Application Service采用云主机放置于公网,所以当前Application Service下发信息给DVS-Server,我们采用websocket来做通信。(后期DVS-server也计划推出MQTT的协议做通信)

DVS-Server推送整条光纤的实时振动曲线数据给Application Server 显示,也是通过websocket协议。 因此需要用户配置一个WebSocket的server服务。以便DVS-Server能够连接上,并推送数据。

以下是用nodejs搭的一个websocket的server服务。DVS-Server跟Application Service,作为client连接上该服务,然后该服务会转发数据报文至不通的client,实现通信

20230730075228.png
DVS-Server通过:ws://{websocket_server_ip:8082}/dvs/{DeviceId} 连接服务
Application Service的后台程序调用:ws://{websocket_server_ip:8082}/dvs/{DeviceId}/controlparameters 下发报文
Application Service直接在浏览器UI中通过JS连接:ws://{websocket_server_ip:8082}/dvs/{DeviceId}/ui 连接服务,并接收DVS-Server推送过来的二进制数据,实时绘制DVS的振动曲线。

以上{websocket_server_ip:8082}代表websocket server的服务地址{DeviceId}代表DVS-Server的设备ID,该ID为Application Service中分配给该DVS-Server的ID,用于区分不同的DVS设备。

NODEJS的websocket server代码如下:

var ws = require("nodejs-websocket")
// Scream server example: "hi" -> "HI!!!"
var server = ws.createServer(function (conn) {
    console.log("New connection")
    conn.on('text', function (str) { //从application service 下发报文
        var path = this.path
        if (path.indexOf('/controlparameters') !== -1) {
            server.connections.forEach(function (conn1) {
                if ([conn1.path,'/controlparameters'].join('') == path) {//推送到对应的ui
                  conn1.sendText(str)
                }
            })
        }
    })
    //conn.path
    conn.on("binary", function (inStream) { //DVS-Server 推送2进制数数据
        var data = Buffer.alloc(0)
        var path = this.path
        //console.info('path', path)
        inStream.on("readable", function () {
            var newData = inStream.read()
            if (newData)
                data = Buffer.concat([data, newData], data.length+newData.length)
        })
        inStream.on("end", function () {
            //console.log("Received " + data.length + " bytes of binary data")
            //process_my_data(data)
            if (conn.path.indexOf('ui') == -1 && conn.path.indexOf('dvs' != -1)) {//shell
              server.connections.forEach(function (conn1) {
                  if ([conn.path,'/ui'].join('') == conn1.path) {//推送到对应的ui
                    //console.info('OK', conn.path)
                    conn1.send(data)
                  }
              })
            }
        })
    })
    
    conn.on("close", function (code, reason) {
        console.log("Connection closed")
    })
}).listen(8082)