communication-protocol.md 3.6 KB

设备监控系统(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-43890c2b7e(reply:c447e273-be53-414a-b3e1-43890c2b7e).
  2. 服务端然后subscibe ${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7e这个主题.
  3. 设备端得到这个消息后,publish到${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7e这个主题.
  4. 服务端收到消息后, unsubscribe ${deviceId}/${catlog}/c447e273-be53-414a-b3e1-43890c2b7e这个主题.

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