消息服务接入指南
准备工作
在开始之前,您需要进行以下准备工作:
请注意:H系列设备一般不会连接到臻云极致平台,如果需要对接,请前往CPS平台
获取MQTT客户端
消息服务是依托MQTT
协议来实现的,推荐你先了解MQTT
相关的知识。
该功能的接入需要用到使用任意语言开发的MQTT
客户端,主要有:
开发语言 | 推荐MQTT客户端 |
---|---|
C | Eclipse Paho C |
C++ | Eclipse Paho C++ |
C# | Eclipse Paho C# |
Java | Eclipse Paho Java |
Android | Eclipse Paho Andriod |
iOS | MQTT-Client Framework |
Python | Eclipse Paho Python |
Golang | Eclipse Paho Golang |
PHP | Mosquitto-PHP |
JavaScript | Eclipse Paho JavaScript |
其他语言的MQTT客户端可以访问mqtt.github进行下载。
注意:
- 当前消息服务仅支持标准的
MQTT v3.1.1
协议,不兼容MQTT v5
或MQTT V3
。 - 支持通配符订阅,参见通配符订阅
- 支持共享订阅,参见共享订阅
- 不支持CleanSession=false,请在每次掉线后重新订阅设备消息
- 不支持保留消息,发布的消息请将Retained标志置为false
- 不支持遗嘱消息
- 不支持QoS2消息
获取MQTT连接信息
使用消息服务订阅设备消息或者发送消息给设备之前,需要先获取连接消息服务器的信息,参考获取MQTT连接信息。
连接消息服务器
选择适合你使用的开发语言的MQTT
客户端,并使用服务器返回的登录信息设置以下参数(各种语言中设置方法可能不一样):
broker: "tcp://[host]:[port]"
username: "[username]"
password: "[password]"
client id: "[clientid]"
clean session: true # 可选;开启后,当客户端异常掉线时可能会丢失消息
keep alive: 30 # 可选;单位为秒
注意事项:
- 必须使用获取到的MQTT连接信息进行MQTT的连接操作,不能改动任何一个值,否则您肯定连接不上。
- 不能将获取到的MQTT连接信息存起来重复使用,每次连接MQTT之前都应该使用此接口获取新的MQTT连接信息再使用,否则你很可能出现连接不上的问题,因为密码有过期时间。
订阅设备状态
MQTT连接成功后,订阅此topic可以立即收到设备的当前状态,当设备状态变更,也会立即收到通知。
订阅Topic
device/${sn}/event/state
消息示例
{
"id": "", # 消息ID
"sn": "12345678-87654321", # 设备SN
"name": "online", # online是在线;offline是离线
"will": false, # 是否是遗言消息(若不懂,请查询MQTT遗言机制)
"proxy": "", # 不用管
"timestamp": 1597281588 # 时间戳,若是遗言,此时间戳不是离线时间
}
订阅设备消息
您可以订阅设备提供的消息,但不同类型的设备提供的消息是不一样的,具体需要以提供的协议文档为主,下面以路侧产品(H系列)的订阅识别结果(ivs_result
)为例进行说明。
订阅Topic
device/${sn}/message/up/${name}
{sn}
为设备的序列号,无法订阅不属于您的设备消息{name}
为消息的名称,在此例子中就是ivs_result
在此例中,topic为device/12345678-87654321/message/up/ivs_result
,若订阅成功,当设备产生识别结果时你将收到此数据。 当订阅的设备不属于你,或者订阅的消息名称不正确,订阅将失败,按照MQTT协议 ,订阅失败将返回0x80错误码,请确保使用的MQTT客户端能够返回此错误码。
消息示例
{
"id": "c9uKOgYZqIeSgRI4", # 消息ID
"bv": 12309, # 设备board_version
"sn": "12345678-87654321", # 设备序列号
"name": "ivs_result", # 消息名称
"version": "1.0", # 消息版本
"payload": {
"alarm_info": {
"alarm_status": 0
},
"bg_img": [
{
"image": "bg_image_0",
"image_length": 950541,
"image_send_flag": 1,
"key": 92,
"path": "aW1ncy9iZTAzNDUzYS0xMGU5MTkwYy8yMDIwMDgxMy8xNTk3Mjg1ODY0XzFfMF9mdWxsLmpwZw=="
}
],
"chnlid": 0,
"feture_img": [
{
"image": "feture_image_0",
"image_length": 5522,
"image_send_flag": 1,
"key": 93,
"path": "aW1ncy9iZTAzNDUzYS0xMGU5MTkwYy8yMDIwMDgxMy8xNTk3Mjg1ODY0XzFfMF9jbGlwLmpwZw=="
}
],
"product_h": {
"car_pos": {
"loc": {
"bottom": 0,
"left": 0,
"right": 0,
"top": 0
},
"pos": 0
},
"parking": {
"parking_state": 8,
"zone_id": 1,
"zone_name": "WUItMDAy"
},
"plate": {
"color": 0,
"confidence": null,
"loc": {
"bottom": 607,
"left": 1522,
"right": 1826,
"top": 903
},
"plate": "X1/ml6BfXw==",
"type": 0
},
"reco": {
"group_id": -1,
"reco_flag": 1,
"reco_id": 92,
"reco_time": "2020-08-13 10:31:04"
}
},
"reco_id": 92,
"serial": 75644590,
"time_s": 1597285864,
"trigger_type": 8
},
"timestamp": 1597285865 # 时间戳
}
此处的结果样式可能与实际不同,具体协议请参见不同产品的协议文档。
向设备发送消息
您可以向设备发送消息,同样,不同类型的设备提供的消息是不一样的,具体需要以提供的协议文档为主,下面以路侧产品(H系列)的发送手动触发消息(ivs_trigger
)为例进行说明。
发布Topic
device/${sn}/message/down/${name}
{sn}
为设备的序列号,无法向不属于您的设备发送消息{name}
为消息的名称,在此例子中就是ivs_trigger
在此例中,发布topic为device/12345678-87654321/message/down/ivs_trigger
,由于MQTT协议的原因,您无法得知发送是否成功,更无从得知消息是否被指定设备接收,为了解决此问题,我们提供了订阅发送消息回执的方式。
订阅回执Topic
device/${sn}/message/down/${name}/reply
如果您需要知道设备是否收到发送的消息以及是否处理结果,您可以订阅回执消息,在此例中,订阅回执Topic为device/12345678-87654321/message/down/ivs_trigger/reply
。
注意事项:
- 如果要订阅发布消息的回执,请一定在发布消息之前订阅回执Topic。
- 发布消息和回执消息的
id
字段相同,通过此字段。 - 如果要发送的设备不属于你或者发布的消息设备不支持,此消息是不会到达设备的。
- 建议订阅消息的回执,这样在超过一定时间(比如10s)还没有收到回执消息,即可判定发送失败。
消息示例
发布消息示例
{
"id": "NYGtiXpPy5ratyzU", # 消息ID,用于关联具体消息
"sn": "12345678-87654321", # 设备序列号
"name": "ivs_trigger", # 消息名称
"version": "1.0", # 消息版本,目前都填 1.0
"payload": null, # 消息数据,视具体消息而定
"timestamp": 1597285865 # 时间戳
}
回执消息示例
{
"id": "NYGtiXpPy5ratyzU", # 消息ID,用于关联具体消息
"sn": "12345678-87654321", # 设备序列号
"name": "ivs_trigger", # 消息名称
"code": 200, # 设备是否处理成功,200成功,非200失败
"version": "1.0", # 消息版本,目前都填 1.0
"payload": null, # 消息数据,视具体消息而定
"timestamp": 1597285865 # 时间戳
}
获取图片
某些协议(比如ivs_result),需要传输图片,在我们提供的所有MQTT协议中,都不直接携带图片数据,而是只携带一个BASE64编码的图片路径,比如像下面这样:
{
"id": "c9uKOgYZqIeSgRI4", # 消息ID
"bv": 12309, # 设备board_version
"sn": "12345678-87654321", # 设备序列号
"name": "ivs_result", # 消息名称
"version": "1.0", # 消息版本
"payload": {
...
"bg_img": [
{
"image": "bg_image_0",
"image_length": 950541,
"image_send_flag": 1,
"key": 92,
"path": "aW1ncy9iZTAzNDUzYS0xMGU5MTkwYy8yMDIwMDgxMy8xNTk3Mjg1ODY0XzFfMF9mdWxsLmpwZw=="
}
]
...
}
...
}
将path
字段BASE64解码后:
imgs/be03453a-10e9190c/20200813/1597285864_1_0_full.jpg
然后参见下载图片去获取此图片的数据。