2023年07月29日 15:52
DVS-Server跟需要用户开发的Application Service的通信逻辑示意图如下:
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,实现通信。
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)