Skip to main content

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被删除而删除, 通过该文件记录设备的状态信息,为了应用编程的需要,将这部分数据分为三个部分:

  • TagsJson文档里有一部分用于定义tags, 用户可以定义各种自定义的数据,例如设备的位置,设备版本号,设备驱动信息等等。
  • Desired Property: 期望属性,这部分属性值,顾名思义,用于定义希望设备设定的某些值,例如设备风扇的转速,某些硬件开关的设置值等等。
  • Reported Property: 上报属性,这部分属性值是由于设备端根据设备的情况上报给Azure IoT Hub并存储在Device Twin中。

很多时候Desired Propertyreported Property搭配使用,当然这不是必须的。

Module TwinDevice 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数据,如上图所示,主要包括:tagsproperties:desired以及properties:reported

应用如何使用Device Twin

IoT的解决方案中,我们主要会将应用分为设备应用以及后端应用,我们来看一下Device Twin提供了哪些功能方便用户开发应用。

设备应用

设备应用可以对device twin进行如下的操作:

  • 读/写 reported Property: 设备应用可以根据自身的情况利用上报属性从而保持必须要的状态配置。
  • 根据设备ID取回Device Twin的数据,建议设备应用每次在连接建立完成之后第一件事就是抓取Device Twin的所有数据,然后根据其中的Desired Property初始化设备参数。
  • 监控device twindesired property值变化: 根据预期属性的值变化,动态的更改设备对应的配置,更改成功后,通过上报属性上报状态。

后端应用

后端应用可以对Device Twin进行如下的操作:

  • 根据设备ID取回Device Twin数据。
  • 读写Desired Property
  • 读写tags
  • 读取reported Property
  • 监控reported Property值更改。

Device Twin其他相关

除了我们上面介绍的基本信息,Device Twin还有一些其他的特点:

  1. tags和属性的键值定义都是utf-8格式的,而且区分大小写的。键值长度不会超过1kb.
  2. 每个属性或者tags的值只能包括如下的类型:
    1. boolean
    2. `number
    3. string
    4. object
    5. array
  3. 每个值最大不能超过32KB。

同步更新问题

当我们开发设备应用或者后端应用时,有一点需要提出来的是,当同时有多个线程或者进程更新Device Twin文档时,我们需要用户在自己的代码中实现乐观同步锁,防止应用同时更新某一个值。

为了实现乐观同步锁,用户可以参考两个值:一个是Device Twin中的etags值,这个值对于应用是只读的,并且该值由Azure IoT Hub保持原子操作,另外一个值是每一个值都有一个$version的元数据,这个值也是Azure IoT Hub保证它是一直增长的,如果要实现乐观锁,可以考虑参考该值。

后面我们会继续学习如何在设备应用和后端应用中实现我们这里讨论和device twin相关的操作。