设备发数据给服务端,使用服务端主题, 服务端发消息给设备,使用设备端的主题.2个主题的设备号的位置正好是反的,这个方便从主题上分辨出数据的方向.
服务器的完整主题形式:${serverName}/${catlog}[-{attr}]/${deviceId}
服务端是监听所有的deviceId, 监听要要用通配符,主题的路径是通过大到小进行规划的.
消息定义到catlog,每个消息都有类别.
设备的主题的完整性是:${deviceId}/${catlog}[-{attr}]/${serverName}
MQTT里面无法进行应答的操作, 我们采用动态应答方式,来实现应答。需要应答的消息的,主题内容里面包含了reply的信息,随机的uuid数据。返回时发给对应的主题 ${originTopic}/${reply} (reply是字符串类型uuid)
例如,设备需要应答消息给服务端
c447e273-be53-414a-b3e1-43890c2b7e(reply:c447e273-be53-414a-b3e1-43890c2b7e).c447e273-be53-414a-b3e1-43890c2b7e这个主题.c447e273-be53-414a-b3e1-43890c2b7e这个主题.c447e273-be53-414a-b3e1-43890c2b7e这个主题.默认使用flatbuffer编码, 这个会减轻服务端的压力。如果有大数据的话,设备部分可以考虑是使用压缩编码来减低数据流量. type+payload
control type:LogCollect, AppInstall, Reboot event type: HeartBeat
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