## 设备监控系统(dmsys)和设备mqtt通信设计 ## MQTT的主题 1. 服务端服务器的名字,是一个主题 2. 每个设备的编号,是一个主题 > 设备发数据给服务端,使用服务端主题, 服务端发消息给设备,使用设备端的主题.2个主题的设备号的位置正好是反的,这个方便从主题上分辨出数据的方向. 服务器的完整主题形式:${serverName}/${catlog}[-{attr}]/${deviceId} * serverName: 就是服务器的编号,字符串类型. e.g dmsys1, dmsys50, dmsys100, 我们一般用名字和数字组成. xxx50是测试节点,xxx100是生产节点,其他是开发用的. * catlog: 消息类型,e.g control, event类型等, control表示服务端主动下发的命令,需要设备返回结果. event代表设备主动上报的事件信息. 占用比较少的topic主题类型,依靠消息格式进行区分. * attr: 是catlog的修饰,可以没有。 如果有的化,就是-隔离. 修饰可以表达payload的格式:zip编码,lzo编码,flat编码,gb编码等. * deviceId:设备的SN号,来自某个设备的消息. > 服务端是监听所有的deviceId, 监听要要用通配符,主题的路径是通过大到小进行规划的. 消息定义到catlog,每个消息都有类别. 设备的主题的完整性是:${deviceId}/${catlog}[-{attr}]/${serverName} * serverName: 服务器的编号,字符串类型. * deviceId: 是设备的SN号. * catlog: 和服务端一致. MQTT里面无法进行应答的操作, 我们采用动态应答方式,来实现应答。需要应答的消息的,主题内容里面包含了reply的信息,随机的uuid数据。返回时发给对应的主题 ${originTopic}/${reply} (reply是字符串类型uuid) 例如,设备需要应答消息给服务端 1. 服务端publish 到设备的某个主题,${deviceId}/${catlog}, 在这个消息的payload编码里面,有reply的编码,假设uuid是c447e273-be53-414a-b3e1-43890c2b7eb7(reply:c447e273-be53-414a-b3e1-43890c2b7eb7). 2. 服务端然后subscibe ${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7eb7这个主题. 3. 设备端得到这个消息后,publish到${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7eb7这个主题. 4. 服务端收到消息后, unsubscribe ${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7eb7这个主题. ## Payload的编码 默认使用flatbuffer编码, 这个会减轻服务端的压力。如果有大数据的话,设备部分可以考虑是使用压缩编码来减低数据流量. type+payload control type:LogCollect, AppInstall, Reboot event type: HeartBeat 1. fbs说明 ``` //获取日志的 table, 设备根据下发的url直接上传日志 table LogCollect { userid:string; url:string; result:Result; reason:string; reply:string; } //安装应用以及配置的 table, 设备根据下发的url直接下载应用 //uid 匹配目标文件. table FileUpgrade { userid:string; url:string; uid:string; appkey:string; result:Result; reason:string; reply:string; } //主动上报事件. 非命令控制返回. file upgrade result table UpgradeRecordEvent { userid:string; url:string; uid:string; appkey:string; result:Result; reason:string; } //主动上报事件,设备心跳,包含各种设备信息. table HeartBeatEvent { serial:string; deviceip:string; serverip:string; gps:string; status:int; nettype:int; devtype:string; softver:string; } //重启设备 table Reboot { reqtime:long; result:Result; reason:string; reply:string; } table Payload{ type: Payloads; } ``` ``` 作者: renevy 创建: 2021/07/19 更新: 2021/07/19 ```