Skip to main content

理解设备标识(Device Identity)

分类:  Azure物联网 标签:  #Azure #IoT Hub # #指南 #入门 发布于: 2023-06-13 22:40:56

Azure IoT Hub的设计中,针对设备和模块有一个概念是Identity, 即设备或者模块的标识(Identity), 在任何设备或者模块接入Azure IoT Hub之前,必须先创建一个合法的Identity, 它包含设备或者模块本身的一些基本信息:

  • 设备或者模块的ID, 需要注意的是它是区分大小写的,因此TestDevicetestdevice代表的是两个设备标识。
  • 设备或者模块的认证方式,例如是通过对称key还是证书。
  • 设备或者模块认证的详细值,例如对称Key的值,证书的指纹。
  • 设备或者模块的状态:这里的状态不是在线状态,而是指该设备或者模块是不是可用。
  • 其他的一些基本信息,例如Azure IoT Hub自动生成的etags或者generate id等。

以上的这些标准信息也是存储在Azure IoT Hub中,我们有一个标准的名称命名该存储:Identity registry, 为了用户能够操作Identity Registry, 支持下述操作:

  • 创建Identity
  • 更新Identity
  • 根据设备ID取回Identity信息
  • 删除Identity
  • 取得最大1000个设备或者模块Identity: 注意是最大1000个,不是所有的。
  • 导出所有的IdentityAzure Storage Blob
  • Azure Storage Blob里导入所有的设备Identity

如上是Identity Registry支持的所有的动作,用户可以通过Identity Registry提供的rest API或者Azure IoT Hub提供的Service SDK进行操作。

Identity长什么样?

Identity看上去是一个json文档,如下是一个实例:

{
    "id": "testdevice1",
    "eTag": "Nzk5NzE1NDQ5",
    "status": "enabled",
    "authentication": {
        "symmetricKey": {
            "primaryKey": "{Key value}",
            "secondaryKey": "{Key Value}"
        },
        "x509Thumbprint": {
            "primaryThumbprint": null,
            "secondaryThumbprint": null
        },
        "type": "sas"
    },
    "twinETag": "AAAAAAAAAAM=",
    "tags": {},
    "properties": {
        "desired": {
            "testvar1": "testvalue1",
            "testvar2": "testvalue2"
        },
        "reported": {
            "testvar1": "testvalue1",
            "testvar2": "testvalue2"
        }
    },
    "capabilities": {
        "iotEdge": false
    }
}

需要注意的是在Identity的数据中从twinETag开始到结束都是是Device Twin的数据,而这之前的才是Identity数据。

根据官方的文档,一个Identity可以有如下的一些字段:

  • id: 指定设备或者模块的id, 该id区分大小写。
  • eTag: 由Azure IoT Hub自动生成,对用户是只读的属性,另外需要注意的是,可以利用eTag实现乐观锁。
  • status: 代表该设备或者模块的状态。
  • authentication: 代表该设备的认证方法

以上几项是一个设备或者模块Identity必选的属性,还有一些其他的属性属于可选的项目:

  • capabilities
  • deviceScope
  • parentScope
  • connectionState
  • statusReason
  • statusUpdateTime

Identity registry里记录的标识信息主要还是用于设备或者模块的接入,如果需要作为应用对设备或者模块赋予更多的数据能力,例如状态信息等等,Azure IoT Hub还提供了另外一个概念Device Twin, 我们下一节来学习它。

监控设备或者模块Identity的变化

指当我们创建了新的Identity或者删除了一个旧的Identity, 关于这个部分我们可以采用如下的步骤来监控。

  1. 登录到Azure Portal , 找到IoT Hub的资源,从左侧菜单里找到Event, 如下图:



  2. 点击+ Event Subscription, 如下图,可以选择事件:



  3. 选择事件的输出Endpoint:



通过如上的步骤即可监控Identity的变化。

导出所有的设备标识

根据我们之前的提示,通过代码列出最多1000个设备的标识,如果想全部导出自己的设备标识并备份,可以使用Service SDK的方法直接导出设备的标识到Azure Storage Blob

我们可以快速的测试一下:

创建项目:

dotnet new console -o ExportAndImportIdentity
cd ExportAndImportIdentity
dotnet add package Microsoft.Azure.Devices
code .

使用VS Code打开项目之后,编辑Program.cs, 代码非常简单:

using Microsoft.Azure.Devices;

RegistryManager registryManager = RegistryManager.CreateFromConnectionString(
    @"您的Azure IoT Hub连接字符串"
);

JobProperties exportJob = await registryManager.ExportDevicesAsync(
    @"您的Azure Storage Blob的SAS Key连接字符串,记得要给予该字符串足够的权限(读写,list等等)",
    false
);

while(true)
{
    exportJob = await registryManager.GetJobAsync(exportJob.JobId);

    if (exportJob.Status == JobStatus.Completed ||
    exportJob.Status == JobStatus.Failed ||
    exportJob.Status == JobStatus.Cancelled)
    {
        // Job has finished executing
        break;
    }

    await Task.Delay(TimeSpan.FromSeconds(5));
}

运行该代码片段,即可在对应的Azure Storage Blob里看到所有的设备标识导出结果。

下一节,我们来学习Device Twin