阅读电信AEP、阿里云物联网、网页文章后,个人对于物模型概念的浅浅理解。若有错误,欢迎纠正。

  1. 设备影子

设备影子是一个JSON文件,用于存储设备的在线状态、设备最近一次上报的设备属性、应用服务器期望下发的配置(期望值)。每个设备有且只有一个设备影子,设备可以获取和设置设备影子以此来同步状态,这个同步可以是影子同步给设备,也可以是设备同步给影子。

*每个设备有且只有一个设备影子,由设备ID唯一标识

*设备影子用于存储设备上报的(状态)属性(设备状态值)应用程序期望的设备(状态)属性(下发指令)

*无论该设备是否在线,都可以通过该影子获取和设置设备的属性

*设备上线或者设备上报属性时,如果desired区和reported区存在差异,则将差异部分下发给设备,配置的预期属性需在产品模型中定义且method具有可写属性“W”才可下发

*限制: 设备影子JSON文档中的key不允许特殊字符:点(.)、dollar符号($)、空char(十六进制的ASCII码为00)。如果包含了以上特殊字符则无法正常刷新影子文档。

  1. 阿里云-设备影子

参考地址:https://help.aliyun.com/document_detail/53930.html?spm=a2c4g.11186623.0.0.23bc7dd43gnXz4

(1)概念

物联网平台提供设备影子功能,用于缓存设备上报的状态数据和应用程序下发的指令信息。设备在线时,可以直接获取物联网平台指令;设备离线后,再次上线可以主动拉取物联网平台指令。

设备影子是一个JSON文档,用于存储设备上报状态数据和应用程序期望状态信息。

每个设备有且只有一个设备影子,设备可以通过MQTT获取和设置设备影子来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。

(2)与设置设备期望属性值区别

设备影子与设置设备期望属性值功能,都是在物联网平台云端存储期望数据,设备上线后获取对应的期望数据,实现对相应业务逻辑的控制。两功能的应用范围不同,说明如下

功能项

区别

设置设备期望属性值

应用范围单一,仅设置设备的物模型属性值。使用该功能前,必须为设备定义物模型属性。

若需设置设备物模型属性的期望值,使用该功能即可。使用示例,请参见设置期望属性值控制灯泡状态

设备影子

应用范围更广,且不依赖物模型属性定义,可设置设备状态等数据。具体应用场景,请参见下文描述。

设备影子的设置说明,请参见设备影子JSON详解

(3)应用场景

在以下场景中,您可选择使用设备影子功能,获取设备上报数据和应用程序期望数据。

A、应用程序请求获取设备状态

场景描述:

场景一:设备网络不稳定,设备频繁上下线,无法正常响应应用程序的请求。

场景二:设备网络稳定,同时响应多个应用程序的请求,即使响应的结果一样,设备本身处理能力有限,也会无法负载多次请求。

使用设备影子机制,设备状态变更,只需同步状态给设备影子一次,应用程序请求获取设备状态,不论应用程序请求数量,和设备是否联网在线,都可从设备影子中获取设备当前状态,实现应用程序与设备解耦。应用程序获取设备影子中状态的流程图如下,其中数据流转过程,请参见设备主动上报状态

B、应用程序下发指令给设备,变更设备状态。

场景描述:设备处于下线状态,或设备网络不稳定,设备频繁上下线,应用程序发送控制指令给设备,设备不在线,指令就会发送失败。

使用设备影子机制,可以将应用程序下发的指令,携带时间戳存储到设备影子中。设备再上线时,获取设备影子中指令,并根据时间戳确定是否执行。应用程序更新设备状态的流程图如下,其中数据流转过程,请参见应用程序改变设备状态设备主动获取影子内容设备主动删除影子属性

个人疑问:

【步骤1.2影子回复更新结果,总觉得这个步骤的序号有问题,应该是4.2影子回复更新结果。因为步骤1.1设备影子存储指令,并携带时间戳这个步骤后,设备并没有执行设备影子中存储的‘更新设备状态’的指令,那步骤1.2回复的更新结果是什么嘞?若设备是离线状态,执行了步骤1.1后,设备影子则可以立刻恢复更新结果(离线时更新失败),所以感觉这张图只能表示设备离线状态下的过程?

  1. 华为云-设备影子

参考地址:https://support.huaweicloud.com/usermanual-iothub/iot_01_0049.html

设备影子上有desired区和reported区。

desired区用于存储对设备属性的配置,即期望值。当需要修改设备的服务属性值时,可修改设备影子的desired区的属性值,设备在线时,desired属性值立即同步到设备。如果设备不在线,待设备上线或上报数据时,desired属性值同步到设备。

reported区用于存储设备最新上报的设备属性值,即上报值。当设备上报数据时,平台刷新reported区属性值为设备上报的设备属性值。

说明:

(a)设备影子可以通过调用应用侧API接口配置,也可以通过登录控制台,在设备详情->设备影子->属性配置页面配置。(设备影子主要针对设备属性配置,它的配置依赖产品模型)。

(b)设备影子配置属于异步命令,物联网平台会直接回复配置响应,然后平台通过设备在线状态,决定立即下发还是缓存下发。

(c)设备上线后,影子服务会下发desired值给设备,待设备属性上报时,影子服务检查属性值与下发的desired值是否匹配。若匹配,则说明影子数据在设备侧配置成功,缓存清除;若不匹配,则说明影子数据在设备侧未配置成功,在下次设备上线或属性上报时,会继续下发缓存desired值给设备,直到下发配置成功。

(d)限制:设备影子JSON文档中的key不允许特殊字符:点(.)、dollar符号($)、空char(十六进制的ASCII码为00)。如果包含了以上特殊字符则无法正常刷新影子文档。

(e)设备影子desired配置给设备后,需要设备回响应表示已收到请求。如果设备不回响应(平台则认为设备测未适配影子设置流程,平台设置设备属性),则平台有个5 分钟的保护期,避免过多流量冲击设备,保护期内设备属性上报时,平台比对reported和desired即使有差异,也不会下发差值。设备正常适配下发流程中的属性设置响应,平台则每次属性上报都会将差值下发给设设备。

应用场景:

适合资源受限低功耗设备,长期处于休眠状态的场景。

(a)查询设备最新上报数据和设备最新在线状态:

*当在控制台上查询设备上报数据时,由于设备可能长时间处于离线状态或因网络不稳定掉线,而无法获取到最新数据。通过设备影子机制,设备影子中始终保持设备最新上报的数据设备当前状态,控制台上只需要查询设备影子中存储的数据,即可获取设备最新上报的数据和设备状态。

*很多应用服务器频繁的查询设备在线状态,由于设备处理能力有限,频繁查询会损耗设备性能。使用设备影子机制,设备只需要主动同步状态给设备影子一次,多个应用程序请求设备影子获取设备状态,即可获取设备最新状态,从而将应用程序和设备解耦。

(b)修改设备属性值:用户通过“设备 > 设备详情 > 设备影子”修改设备的属性值。由于设备可能长时间处于离线状态,修改设备属性值的操作不能及时下发给设备。在这种情况下,物联网平台可以将修改设备的属性信息存储在设备影子中,待设备上线后,将修改的设备属性值同步给设备,从而完成设备属性值的修改。

  1. 个人理解

(1)设备影子引用的情况

A.网络的不稳定性

B.稳定网络下多个应用同时请求某一设备(设备本身处理能力有限,无法负载多次请求)。

(2)设备影子主要两大功能

A.应用程序请求获取设备状态

B.应用程序下发指令给设备,变更设备状态

(3)设备影子json文档内存储版本信息,设备影子的版本,携带该参数时平台会校验值必须等于当前影子版本,初始从0开始。

(4)根据时间的匹对可以判断设备影子内存储的最新状态和应用下发的最新指令。感觉设备影子就相当于一个存储最新设备状态和应用程序最新指令的一个缓存器一样,当设备再次上线后会更新设备影子中的状态信息。当设备离线前会同步设备状态信息给设备影子。当多个应用程序下发请求,若响应的结果都一样,设备影子可以返回设备最新状态给所有应用程序。

(6)设备影子功能板块应展示最新一次上报的数据(属性标识、属性值、上报时间)

更多推荐