设备影子
小结:
1、
应用场景
在以下场景中,您可选择使用设备影子功能,获取设备上报数据和应用程序期望数据。
- 应用程序请求获取设备状态。
场景描述:
- 设备网络不稳定,设备频繁上下线,无法正常响应应用程序的请求。
- 设备网络稳定,同时响应多个应用程序的请求,即使响应的结果一样,设备本身处理能力有限,也会无法负载多次请求。
使用设备影子机制,设备状态变更,只需同步状态给设备影子一次,应用程序请求获取设备状态,不论应用程序请求数量,和设备是否联网在线,都可从设备影子中获取设备当前状态,实现应用程序与设备解耦。
2、
设备影子概览 https://help.aliyun.com/document_detail/53930.html
物联网平台提供设备影子功能,用于缓存设备上报的状态数据和应用程序下发的指令信息。设备在线时,可以直接获取物联网平台指令;设备离线后,再次上线可以主动拉取物联网平台指令。本文主要介绍设备影子的应用场景和使用方法。
什么是设备影子
设备影子是一个JSON文档,用于存储设备上报状态数据和应用程序期望状态信息。JSON数据格式的详细说明,请参见设备影子JSON详解。
每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。
应用场景
在以下场景中,您可选择使用设备影子功能,获取设备上报数据和应用程序期望数据。
- 应用程序请求获取设备状态。
场景描述:
- 设备网络不稳定,设备频繁上下线,无法正常响应应用程序的请求。
- 设备网络稳定,同时响应多个应用程序的请求,即使响应的结果一样,设备本身处理能力有限,也会无法负载多次请求。
使用设备影子机制,设备状态变更,只需同步状态给设备影子一次,应用程序请求获取设备状态,不论应用程序请求数量,和设备是否联网在线,都可从设备影子中获取设备当前状态,实现应用程序与设备解耦。
应用程序获取设备影子中状态的流程图如下,其中数据流转过程,请参见设备主动上报状态。
- 应用程序下发指令给设备,变更设备状态。
场景描述:设备处于下线状态,或设备网络不稳定,设备频繁上下线,应用程序发送控制指令给设备,设备不在线,指令就会发送失败。
使用设备影子机制,可以将应用程序下发的指令,携带时间戳存储到设备影子中。设备再上线时,获取设备影子中指令,并根据时间戳确定是否执行。
应用程序更新设备状态的流程图如下,其中数据流转过程,请参见应用程序改变设备状态、设备主动获取影子内容、设备主动删除影子属性。
查看与更新设备影子
您需在设备端完成设备影子功能开发,具体内容,请参见设备影子。
完成设备开发和接入后,您可以在物联网平台控制台,查看设备影子信息,更新设备影子状态。
相关API
GetDeviceShadow:获取设备影子。
UpdateDeviceShadow:更新设备影子。
本文档介绍设备影子的JSON格式表达方法。
设备影子JSON文档示例:
{
"state": {
"desired": {
"color": "RED",
"sequence": [
"RED",
"GREEN",
"BLUE"
]
},
"reported": {
"color": "GREEN"
}
},
"metadata": {
"desired": {
"color": {
"timestamp": 1469564492
},
"sequence": {
"timestamp": 1469564492
}
},
"reported": {
"color": {
"timestamp": 1469564492
}
}
},
"timestamp": 1469564492,
"version": 1
}
JSON属性描述,如下表表 1所示。
属性 | 描述 |
---|---|
desired | 设备的预期状态。仅当设备影子文档具有预期状态时,才包含desired部分。
应用程序向desired部分写入数据,更新事物的状态,而无需直接连接到该设备。 |
reported | 设备的报告状态。设备可以在reported部分写入数据,报告其最新状态。
应用程序可以通过读取该参数值,获取设备的状态。 JSON文档中也可以不包含reported部分,没有reported部分的文档同样为有效影子JSON文档。 |
metadata | 当用户更新设备状态文档后,设备影子服务会自动更新metadata的值。
设备状态的元数据的信息包含以 Epoch 时间表示的每个属性的时间戳,用来获取准确的更新时间。 |
timestamp | 影子文档的最新更新时间。 |
version | 用户主动更新版本号时,设备影子会检查请求中的version值是否大于当前版本号。
如果大于当前版本号,则更新设备影子,并将version值更新到请求的版本中,反之则会拒绝更新设备影子。 该参数更新后,版本号会递增,用于确保正在更新的文档为最新版本。 version参数为long型。为防止参数溢出,您可以手动传入 |
设备影子支持数组。更新数组时必须全量更新,不能只更新数组的某一部分。
更新数组数据示例:
- 初始状态:
{ "reported" : { "colors" : [ "RED", "GREEN", "BLUE" ] } }
- 更新:
{ "reported" : { "colors" : [ "RED" ] } }
- 最终状态:
{ "reported" : { "colors" : [ "RED" ] }
-
物联网通信 设备影子详情-开发者手册-文档中心-腾讯云 https://cloud.tencent.com/document/product/634/11918
设备影子文档是服务器端为设备缓存的一份状态和配置数据。它以 JSON 文本形式存储,由以下部分组成:
state
reported
设备自身上报的状态。设备可以向本文档部分写入数据,以报告其新状态。应用程序可以读取本文档部分,以获取设备的状态。
desired
设备预期的状态。应用程序通过 HTTP RESTful API 向本文档写入数据更新设备状态,设备 SDK 通过注册相关属性和回调,设备影子服务同步影子数据到设备。
metadata
设备影子的元数据信息,包括 state 部分每个属性项的最后更新时间等。
version
设备影子文档的版本号,每次设备影子文档更新之后,版本号都会递增。版本号由腾讯云后台维护,这可以确保设备的数据与设备影子的数据保持一致。
timestamp
设备影子文档的最后一次更新时间。设备影子文档示例如下:
{
"state": {
"reported": {
"attr_name1": "value1"
},
"desired": {
"attr_name2": "value2"
}
},
"metadata": {
"reported": {
"attr_name1": {
"timestamp": 123456789
}
},
"desired": {
"attr_name2": {
"timestamp": 123456789
}
}
},
"version": 1,
"timestamp": 123456789
}
空白部分
当设备影子文档为空时,此时获取到设备影子文档示例如下:
{
"state":{},
"metadata":{},
"version":0
}
当设备影子文档具有预期状态时,才会有 desired 部分,reported 部分可以为空,例如:
{
"state": {
"desired": {
"attr_name2": "value2"
}
},
"metadata": {
"desired": {
"attr_name2": {
"timestamp": 123456789
}
}
},
"version": 1,
"timestamp": 123456789
}
当设备更新状态成功之后,需要上报最新的状态,并将 desired 部分从文档中删除。要想将 desired 部分从文档中删除,需要将 desired 部分置为 null,例如:
{
"state": {
"reported": {
"attr_name1": "new_value1",
"attr_name2": "new_value2"
},
"desired": null
},
"version": 1
}
数组
设备影子文档支持数组,不支持针对数组某个元素进行更新,只能更新整个数组,并且数组元素不能有空值。
IoT场景中「设备影子」是做什么的? https://mp.weixin.qq.com/s/-qygfHUYtk-W2xguO0mm5w
IoT场景中「设备影子」是做什么的?
随着各大云平台IoT物联网技术的宣传,IoT开发者之间常常会提到设备影子。物联网平台提供的设备影子功能,在云端保存为一个JSON文档,用于存储设备上报状态、应用程序期望状态信息。设备在线时,可以直接获取云端指令;设备离线后,再次上线可以主动拉取云端指令。
各大云平台对比
应用场景
设备影子是一个JSON文档,用于存储设备上报状态、应用程序期望状态信息。
每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。
场景1:网络不稳定,设备频繁上下线
由于网络不稳定,设备频繁上下线。应用程序发出需要获取当前的设备状态请求时,设备掉线,无法获取设备状态,但下一秒设备又连接成功,应用程序无法正确发起请求。
使用设备影子机制存储设备最新状态,一旦设备状态产生变化,设备会将状态同步到设备影子。应用程序在请求设备当前状态时,只需要获取影子中的状态即可,不需要关心设备是否在线。
场景2:多程序同时请求获取设备状态
如果设备网络稳定,很多应用程序请求获取设备状态,设备需要根据请求响应多次,即使响应的结果是一样的,设备本身处理能力有限,无法负载被请求多次的情况。
使用设备影子机制,设备只需要主动同步状态给设备影子一次,多个应用程序请求设备影子获取设备状态,即可获取设备最新状态,做到应用程序和设备的解耦。
场景3:设备掉线,控制指令下发
设备网络不稳定,导致设备频繁上下线,应用程序发送控制指令给设备时,设备掉线,指令无法下达到设备。
-
使用设备影子机制,应用程序发送控制指令,指令携带时间戳保存在设备影子中。当设备掉线重连时,获取指令并根据时间戳确定是否执行。
-
设备真实掉线,指令发送失败。设备再上线时,设备影子功能通过指令加时间戳的模式,保证设备不会执行过期指令。