消息下发使用说明
消息下发是平台向设备直接下发消息的一种方式。具有缓存特性,当设备不在线时,平台会对下发的消息进行缓存,直到设备上线。
消息缓存下发使用说明
- 应用侧或平台用下发设备消息接口,下发请求到物联网平台,下发消息样例如下:
POST https://{Endpoint}/v5/iot/{project_id}/devices/{device_id}/messages Content-Type: application/json X-Auth-Token: ******** { "message_id": "99b32da9-cd17-4cdf-a286-f6e849cbc364", "name": "messageName", "message": "HelloWorld" }
- 物联网平台向应用返回201 Created,消息状态为PENDING。
- 物联网平台通过设备消息状态变更通知接口推送消息结果给应用,设备未上线时,设备消息状态为等待(PENDING),对应的消息样例如下:
Topic: $oc/devices/{device_id}/sys/messages/down 数据格式: { "resource": "device.message.status", "event": "update", "notify_data": { "message_id": "string", "name": "string", "device_id": "string", "status": "PENDING", "timestamp": "string" } }
- 设备上线。
- 设备订阅消息下发的topic,用于接收消息,订阅的topic见步骤6。
- 物联网平台根据协议规范下发消息给设备。MQTT设备必须先订阅平台消息下发下行接口对应的Topic才能收到平台下发的消息,消息样例如下:
Topic: $oc/devices/{device_id}/sys/messages/down 数据格式: { "object_device_id": "{object_device_id}", "name": "name", "id": "id", "content": "hello" }
- 平台将消息的最终结果推送给应用服务器,设备消息状态为已送达(DELIVERED)。使用接口:设备消息状态变更通知接口。
Topic: $oc/devices/{device_id}/sys/messages/down 数据格式: { "resource": "device.message.status", "event": "update", "notify_data": { "message_id": "string", "name": "string", "device_id": "string", "status": "DELIVERED", "timestamp": "string" } }
消息下发使用QoS 1说明
MQTT设备接入,使用QoS 1的系统Topic进行设备消息下发说明:
- 设备上线。
- 订阅Topic,设置订阅Topic的QoS为1。
图3 订阅Topic的QoS为1
- 应用侧或平台用下发设备消息接口,下发请求到物联网平台,下发消息样例如下:
POST https://{Endpoint}/v5/iot/{project_id}/devices/{device_id}/messages Content-Type: application/json X-Auth-Token: ******** { "message_id": "99b32da9-cd17-4cdf-a286-f6e849cbc364", "name": "messageName", "message": "HelloWorld" }
- 物联网平台根据协议规范下发消息给设备。MQTT设备必须先订阅平台消息下发下行接口对应的Topic才能收到平台下发的消息,消息样例如下:
Topic: $oc/devices/{device_id}/sys/messages/down 数据格式: { "object_device_id": "{object_device_id}", "name": "name", "id": "id", "content": "hello" }
- 物联网平台向设备下发消息后,向应用服务器返回201 Created,消息状态为DELIVERED。消息下发是异步操作,不需要等设备ACK就可以回响应。
- 物联网平台没有收到设备接收消息的ACK响应,重发消息;默认每隔2s重发一次,总下发3次。
- 设备再次上线或订阅Topic。
- 物联网平台会重发之前设备未回ACK且未超时的消息,默认每隔10s重发一次,总下发5次;每次重发也会触发每隔2s重发机制。
- 平台将消息的最终结果推送给应用服务器,设备消息状态为已送达(DELIVERED)或超时(TIMEOUT)。使用接口:设备消息状态变更通知接口。
Topic: $oc/devices/{device_id}/sys/messages/down 数据格式: { "resource": "device.message.status", "event": "update", "notify_data": { "message_id": "string", "name": "string", "device_id": "string", "status": "DELIVERED", "timestamp": "string" } }
下发消息状态
MQTT设备消息执行状态以及状态变化机制如下所示。
消息执行状态 |
说明 |
---|---|
等待(PENDING) |
MQTT协议设备不在线,物联网平台会将消息进行缓存,此时任务状态为“等待”状态。 |
超时(TIMEOUT) |
物联网平台缓存的PENDING状态的消息,如果1天之内还没有下发下去,物联网平台会将消息状态设置为“超时”。 |
已送达(DELIVERED) |
物联网平台将消息发送给设备后,状态变为“已送达”。 |
失败(FAILED) |
物联网平台发送消息给设备不成功,消息状态变为“失败”。 |