背景信息

  • 设备影子功能的更多信息,请参见 设备影子
  • 完整的设备影子数据流及错误码,请参见 设备影子数据流
  • 设备影子功能基于MQTT接入,开发过程中涉及MQTT接入的代码说明,请参见 MQTT接入

步骤一:设备主动获取设备影子内容

若应用程序发送指令时设备离线,设备重连MQTT后,需要主动获取设备影子内容。

  1. 设备通过Topic:/${productId}/${deviceId}/shadow/update,向物联网平台发送查询指令,获取设备影子内容。请求内容如下:
{
  "method":"get",
  "messageId":"157065985"
}

字段说明

字段名 类型 是否必须 说明
1 method String 表示设备请求设备影子时的操作类型。当执行获取操作时,method设置为get
2 messageId String 消息ID,最长为64位字符,标识该消息的唯一ID,发送端进行定位消息使用
  1. 物联网平台收到查询指令后,返回查询结果。下发到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 时间戳毫秒值,表示设备影子文档的最后更新时间,设备端应保存该值,后续更新时进行携带

示例消息表示请求发送成功,获取的消息值未空,未上报过消息。

步骤二:设备主动上报状态

设备在线时,若设备状态有变更,应当主动上报设备状态到影子,以便应用程序主动获取设备影子状态。

  1. 设备调用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中的最后更新时间戳,如不满足,则提示版本冲突,不进行保存。
  1. 物联网平台接收到设备影子的消息后,更新影子文件。然后通过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
}

步骤三:应用程序改变设备状态

应用程序向设备影子发送期望属性,最终实现改变设备状态。

  1. 下发期望状态给设备影子。

  2. 物联网平台根据下发的期望状态消息更新影子内容,然后通过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

  1. 设备根据期望值进行状态更新/业务处理,更新完成后上报最新的状态至设备影子,并处理应答报文。具体操作,请参见步骤二。
 创建时间:2023-03-27 17:36
最后编辑:陈勇琦  更新时间:2024-10-18 16:29