硬件接入流程说明
请先阅读一下一些约定和默认的规则,方便您在后续过程中更好的理解和顺利的对接
整体流程
名词解释
目前存在两种mqtt连接方式,根据init接口返回cloud字段来分别适配两种连接方式。
阿里云MQTT名词解释
https://help.aliyun.com/document_detail/42420.html
华为云EMQX说明
https://www.emqx.io/docs/zh/v5.1/
命名规则
外部厂商设备ID推荐的编号规则
推荐 "厂商名称简拼大写"+"年月日"+"序列号"命名方式,比如:GLODON20200107001,GLODON为厂商简拼,20200107为年月日,001为当天序列号
阿里云Client ID命名
微消息队列 MQTT 版的 Client ID 是每个客户端的唯一标识,要求全局唯一,使用相同的 Client ID 连接微消息队列 MQTT 版服务会被拒绝。Client ID 由两部分组成,组织形式为 阿里云MQTT名词解释
中的描述。
连接阿里云时的clientID 必须
华为云ClientID命名
华为云就直接使用设备号就行:GLODON20200107001
设备发送消息到平台时的Topic命名规则
参考设备:人脸闸机
GLM/$product
/$type
/$qos
比如测试环境下人脸闸机设备消息发往:GLM/gateface/e/1,
规则描述:
- GLM 为根Topic从 iot init 接口中动态获取,下方有详细描述
$product
: 设备类型,如 gdb 工地宝 ,gatebox 闸机宝, gateface 人脸设备 如无特殊情况,人脸设备统一使用 gateface, 但也存在之前两个特殊的类型定义 face-dg 弹弓人脸,face-mobile中移人脸$type
: e,event 设备上报 s,service 设备指令下发 ,用来区分是event还是service 服务调用一般是直接下发到指定设备!$qos
: 通讯质量 qos 取值范围 0,1
消息体规则:
- 消息务必请使用utf-8格式编码,不然可能导致解析乱码
时间戳传递规则
- 由于工地宝和小黑盒设备的特殊性,时间戳没有用
long
类型,而是用字符串型传递的 - 基于Android 设备,大屏,人脸,时间戳
ts
字段,syncTime
字段尽可能传递long
类型
Mqtt通讯规则
event格式
{
"client" : $clientId ,
"event" : $eventName ,
"data": {
$JsonDocument
},
"success": 是否成功,
"error": 错误码,或是英文
"ts": "1551863638000"
}
clientId
: 设备的唯一编码event
: 调用event的名称data
: $JsonDocument 为具体 event 的json表示信息,在下方的实例中有详尽展示success
: 是否成功,0失败 1成功error
: 返回错误码或是英文,不能有中文ts
: 时间戳,为字符串格式,设备端C程序只能存int不方便存longlong也就是java的long类型,如果非嵌入式C设备,这个时间戳要使用java对应的Long类型
service格式
{
"service" : "$serviceName",
"data" : {
$JsonDocument
},
"ts": "1551863638000",
}
service
: 服务名称
data
: $JsonDocument具体service 的json表示信息,在下方的实例中有详尽展示
ts
: 时间戳,为字符串格式,设备端C程序只能存int不方便存longlong也就是java的long类型,如果非嵌入式C设备,这个时间戳要使用java对应的Long类型
设备接收消息
连接阿里云请不要显示订阅任何Topic 阿里云版本的MQTT服务无需显示订阅任务topic,服务端会帮每一个连接的设备订阅p2p的消息队列,更多信息请参考
https://help.aliyun.com/document_detail/96176.html?spm=a2c4g.11186623.6.552.4abf3dc9phvCNK (P2P 消息收发模式(MQTT))
关于MQTT连接方式和topic拼接方式,clientId拼接方式,下方使用token模式认证方式链接MQTT服务
小节中会有详尽描述
阿里云MQTT接受P2P消息
代码中只要处理 messageArrived
方法即可,有P2P消息时,便会在这里触发回调,这里也是客户端接受消息,触发响应动作的代码位置
华为云通过EMQ方式连接MQTT服务接受P2P消息
EMQ方式连接需要在连接建立后显示主动订阅 GLM/p2p/DEVICE_CODE
, DEVICE_CODE 是自己的设备号,订阅完此队列后,同样在 messageArrived
处理回调逻辑即可