Device Twin介绍
分类: Azure物联网 ◆ 标签: #Azure #IoT Hub # #入门 #指南 ◆ 发布于: 2023-06-13 22:43:06

Azure IoT Hub
为设备提供了Device Identity
,每个设备的Identity
都存储在Identity Registry
里, 客户可以通过它的rest api
或者SDK
来管理Identity
, 但是Identity
里没有存储设备的状态信息,例如设备上配置数据,运行时状态数据,Azure IoT Hub
提供另外一个概念来记录这部分数据:Device Twin
。
什么是Device Twin
Device Twin
是存储在Azure IoT Hub
服务端的一份Json
文档,每一个设备对应一份Json
文档,该文档随着Device Identity
创建而创建,随着Identity
被删除而删除, 通过该文件记录设备的状态信息,为了应用编程的需要,将这部分数据分为三个部分:
Tags
:Json
文档里有一部分用于定义tags
, 用户可以定义各种自定义的数据,例如设备的位置,设备版本号,设备驱动信息等等。Desired Property
: 期望属性,这部分属性值,顾名思义,用于定义希望设备设定的某些值,例如设备风扇的转速,某些硬件开关的设置值等等。Reported Property
: 上报属性,这部分属性值是由于设备端根据设备的情况上报给Azure IoT Hub
并存储在Device Twin
中。
很多时候Desired Property
和reported Property
搭配使用,当然这不是必须的。
Module Twin
和Device Twin
的设计概念一摸一样,我们就不另外介绍了。
下面我们来看一个Device Twin
的实际例子:
{ "deviceId": "devA", "etag": "AAAAAAAAAAc=", "status": "enabled", "statusReason": "provisioned", "statusUpdateTime": "0001-01-01T00:00:00", "connectionState": "connected", "lastActivityTime": "2015-02-30T16:24:48.789Z", "cloudToDeviceMessageCount": 0, "authenticationType": "sas", "x509Thumbprint": { "primaryThumbprint": null, "secondaryThumbprint": null }, "version": 2, "tags": { "deploymentLocation": { "building": "43", "floor": "1" } }, "properties": { "desired": { "telemetryConfig": { "sendFrequency": "5m" }, "$metadata" : {...}, "$version": 1 }, "reported": { "telemetryConfig": { "sendFrequency": "5m", "status": "success" }, "batteryLevel": 55, "$metadata" : {...}, "$version": 4 } } }
以上就是一个Device Twin
的详细情况,从version
到开头处的数据是属于Identity
的数据,并不是Device Twin
的数据,需要注意这一点。只有Version
: 2之后的数据才是Device Twin
数据,如上图所示,主要包括:tags
, properties:desired
以及properties:reported
。
应用如何使用Device Twin
在IoT
的解决方案中,我们主要会将应用分为设备应用以及后端应用,我们来看一下Device Twin
提供了哪些功能方便用户开发应用。
设备应用
设备应用可以对device twin
进行如下的操作:
- 读/写
reported Property
: 设备应用可以根据自身的情况利用上报属性从而保持必须要的状态配置。 - 根据设备
ID
取回Device Twin
的数据,建议设备应用每次在连接建立完成之后第一件事就是抓取Device Twin
的所有数据,然后根据其中的Desired Property
初始化设备参数。 - 监控
device twin
的desired property
值变化: 根据预期属性的值变化,动态的更改设备对应的配置,更改成功后,通过上报属性上报状态。
后端应用
后端应用可以对Device Twin
进行如下的操作:
- 根据设备
ID
取回Device Twin
数据。 - 读写
Desired Property
- 读写
tags
值 - 读取
reported Property
值 - 监控
reported Property
值更改。
Device Twin
其他相关
除了我们上面介绍的基本信息,Device Twin
还有一些其他的特点:
tags
和属性的键值定义都是utf-8
格式的,而且区分大小写的。键值长度不会超过1kb.- 每个属性或者
tags
的值只能包括如下的类型:boolean
- `number
string
object
array
- 每个值最大不能超过32KB。
同步更新问题
当我们开发设备应用或者后端应用时,有一点需要提出来的是,当同时有多个线程或者进程更新Device Twin
文档时,我们需要用户在自己的代码中实现乐观同步锁,防止应用同时更新某一个值。
为了实现乐观同步锁,用户可以参考两个值:一个是Device Twin
中的etags
值,这个值对于应用是只读的,并且该值由Azure IoT Hub
保持原子操作,另外一个值是每一个值都有一个$version
的元数据,这个值也是Azure IoT Hub
保证它是一直增长的,如果要实现乐观锁,可以考虑参考该值。
后面我们会继续学习如何在设备应用和后端应用中实现我们这里讨论和device twin
相关的操作。