背景信息
步骤一:设备主动获取设备影子内容
若应用程序发送指令时设备离线,设备重连MQTT后,需要主动获取设备影子内容。
- 设备通过Topic:
/${productId}/${deviceId}/shadow/update
,向物联网平台发送查询指令,获取设备影子内容。请求内容如下:
{
"method":"get",
"messageId":"157065985"
}
字段说明
字段名 | 类型 | 是否必须 | 说明 | |
---|---|---|---|---|
1 | method | String | 是 | 表示设备请求设备影子时的操作类型。当执行获取操作时,method设置为get。 |
2 | messageId | String | 是 | 消息ID,最长为64位字符,标识该消息的唯一ID,发送端进行定位消息使用 |
- 物联网平台收到查询指令后,返回查询结果。下发到Topic:
/${productId}/${deviceId}/shadow/get
中,消息示例:
{
"method": "reply",
"messageId":"157065985",
"payload": {
"code": 0,
"state": {
},
"metadata": {
}
},
"timestamp": 0
}
字段说明
字段名称 | 类型 | 说明 | |
---|---|---|---|
1 | method | String | 表示设备影子服务下发消息时的方法类型,当回复获取设备影子消息时,method 值为 reply |
2 | messageId | String | 设备上报消息时的消息ID,最长为64位,设备影子服务下发时将原值发送 |
3 | payload | Object | 设备影子服务下发消息的内容 |
4 | payload.code | Int | 表示设备影子处理该请求的状态,为0表示正常,不为0为异常 |
5 | payload.state | Object | 设备影子文档当前状态 |
6 | payload.state.desired | Object | 设备影子文档当前期望状态,当没有设置过期望值时,没有该数据 |
7 | payload.state.reported | Object | 设备影子文档当前上报状态,当没有设置过上报值时,没有该数据 |
8 | payload.metadata | Object | 设备影子文档当前状态元数据 |
9 | payload.metadata.reported | Object | 设备影子文档当前上报状态元数据,当前为保存对应属性的最后更新时间,当没有设置过期望值时,没有该数据 |
10 | payload.metadata.desired | Object | 设备影子文档当前期望状态元数据,当前为保存对应属性的最后更新时间,当没有设置过上报值时,没有该数据 |
11 | timestamp | Long | 时间戳毫秒值,表示设备影子文档的最后更新时间,设备端应保存该值,后续更新时进行携带 |
示例消息表示请求发送成功,获取的消息值未空,未上报过消息。
步骤二:设备主动上报状态
设备在线时,若设备状态有变更,应当主动上报设备状态到影子,以便应用程序主动获取设备影子状态。
- 设备调用Topic:
/${productId}/${deviceId}/shadow/update
向物联网平台上报最新状态到影子。上报消息示例:
{
"method":"update",
"messageId":"157889065985",
"state":{
"reported": {
"color": "red"
}
},
"timestamp": 0
}
字段说明
字段名 | 类型 | 是否必须 | 说明 | |
---|---|---|---|---|
1 | method | String | 是 | 表示设备或者应用程序请求设备影子时的操作类型。当执行更新操作时,method为必填字段,设置为update。 |
2 | messageId | String | 是 | 消息ID,最长为64位字符,标识该消息的唯一ID,发送端进行定位消息使用 |
3 | state | Object | 是 | 表示设备发送给设备影子的状态上报信息。reported为必填字段,状态信息会同步到设备影子的 reported 部分,如该上报字段有对应期望值,设备影子服务在更新上报值的同时,对该字段的期望值进行移除。 |
4 | timestamp | Long | 是 | 表示设备影子的最新时间戳,毫秒值。设备影子服务在收到更新请求后。先进行判断是否等于设备影子最新时间戳,不等于则判断是否大于等于该上报字段的metadata中的最后更新时间戳,如不满足,则提示版本冲突,不进行保存。 |
- 物联网平台接收到设备影子的消息后,更新影子文件。然后通过Topic:
/${productId}/${deviceId}/shadow/get
,进行广播设备影子更新事件。
{
"method":"update",
"messageId":"157889065985",
"payload":{
"code":0,
"state":{
"reported":{
"color":"red"
}
},
"metadata":{
"reported":{
"color":{
"timestamp":1626317187000
}
}
}
},
"timestamp":1626317187000
}
字段说明
字段名称 | 类型 | 说明 | |
---|---|---|---|
1 | method | String | 表示设备影子服务下发消息时的方法类型,当广播设备影子更新消息时,method 值为 update |
2 | messageId | String | 设备上报消息时的消息ID,最长为64位字符,设备影子服务下发时将原值发送 |
3 | payload | Object | 设备影子服务下发消息的内容 |
4 | payload.code | Int | 表示设备影子处理该请求的状态,为0表示正常,不为0为异常 |
5 | payload.state | Object | 设备影子文档当前状态 |
6 | payload.state.reported | Object | 设备影子文档当前上报状态 |
7 | payload.metadata | Object | 设备影子文档当前状态元数据 |
8 | payload.metadata.reported | Object | 设备影子文档当前上报状态元数据,目前为存储设备影子上报值的更新毫秒时间戳,Key为timestamp |
9 | timestamp | Long | 表示设备影子的最新更新时间戳,毫秒值,设备获取到该时间戳后,应进行本地保存,在后续更新时进行携带 |
表示响应失败,并返回具体错误码和错误消息。
{ "method":"reply", "messageId":"157889065985", "payload":{ "code": ${errorcode}, "msg": "${errormessage}" } }
表示影子版本冲突导致响应失败。设备影子服务会返回云端设备影子更新时间,设备端应保存该设备影子最新更新时间。然后设备端应当检查当前messageId对应的上报数值是否与本地属性值一致,如一致则使用设备影子最新更新时间再次进行上报更新,如不一致则丢弃该上报消息。
{ "method":"reply", "messageId":"157889065985", "payload":{ "code":900010, "msg":"影子版本冲突。" }, "timestamp":1626317187000 }
步骤三:应用程序改变设备状态
应用程序向设备影子发送期望属性,最终实现改变设备状态。
下发期望状态给设备影子。
- 可以开发云端应用程序,调用API下发设备影子期望属性,详细说明,请参见下发设备影子期望值。
物联网平台根据下发的期望状态消息更新影子内容,然后通过Topic:
/${productId}/${deviceId}/shadow/get
向设备返回应答报文。下发期望状态的消息示例:{ "method":"control", "messageId":"157889865984", "payload":{ "code": 0, "state":{ "desired":{ "color":"green" } }, "metadata":{ "desired":{ "color": { "timestamp": 1369564576000 } } } }, "timestamp":1369564576000 }
字段名称 | 类型 | 说明 | |
---|---|---|---|
1 | method | String | 表示设备影子服务下发消息时的方法类型,当执行下发期望值时method 值为 control |
2 | messageId | String | 应用程序或设备上报消息时的消息ID,最长为64位,设备影子服务下发时将原值发送 |
3 | payload | Object | 设备影子服务下发消息的内容 |
4 | payload.code | Int | 表示设备影子处理该请求的状态,为0表示正常,不为0为异常 |
5 | payload.state | Object | 设备影子文档当前状态 |
6 | payload.state.desired | Object | 设备影子文档当前期望状态,为当前设备影子文档中全量期望值 |
7 | payload.metadata | Object | 设备影子文档当前状态元数据 |
8 | payload.metadata.desired | Object | 设备影子文档当前期望状态元数据,为当前设备影子文档中全量期望值 |
10 | timestamp | Long | 表示设备影子的最新更新时间戳,毫秒值,设备获取到该时间戳后,应进行本地保存,在后续更新时进行携带 |
如果设备不在线,具体操作,请参见步骤一
示例消息为设置期望color
属性值为green
- 设备根据期望值进行状态更新/业务处理,更新完成后上报最新的状态至设备影子,并处理应答报文。具体操作,请参见步骤二。
创建时间:2023-03-27 17:36
最后编辑:陈勇琦 更新时间:2024-10-18 16:29
最后编辑:陈勇琦 更新时间:2024-10-18 16:29