理解设备标识(Device Identity)
分类: Azure物联网 ◆ 标签: #Azure #IoT Hub # #指南 #入门 ◆ 发布于: 2023-06-13 22:40:56
在Azure IoT Hub的设计中,针对设备和模块有一个概念是Identity, 即设备或者模块的标识(Identity), 在任何设备或者模块接入Azure IoT Hub之前,必须先创建一个合法的Identity, 它包含设备或者模块本身的一些基本信息:
- 设备或者模块的
ID, 需要注意的是它是区分大小写的,因此TestDevice和testdevice代表的是两个设备标识。 - 设备或者模块的认证方式,例如是通过对称
key还是证书。 - 设备或者模块认证的详细值,例如对称
Key的值,证书的指纹。 - 设备或者模块的状态:这里的状态不是在线状态,而是指该设备或者模块是不是可用。
- 其他的一些基本信息,例如
Azure IoT Hub自动生成的etags或者generate id等。
以上的这些标准信息也是存储在Azure IoT Hub中,我们有一个标准的名称命名该存储:Identity registry, 为了用户能够操作Identity Registry, 支持下述操作:
- 创建
Identity - 更新
Identity - 根据设备
ID取回Identity信息 - 删除
Identity - 取得最大1000个设备或者模块
Identity: 注意是最大1000个,不是所有的。 - 导出所有的
Identity到Azure 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必选的属性,还有一些其他的属性属于可选的项目:
capabilitiesdeviceScopeparentScopeconnectionStatestatusReasonstatusUpdateTime
Identity registry里记录的标识信息主要还是用于设备或者模块的接入,如果需要作为应用对设备或者模块赋予更多的数据能力,例如状态信息等等,Azure IoT Hub还提供了另外一个概念Device Twin, 我们下一节来学习它。
监控设备或者模块Identity的变化
指当我们创建了新的Identity或者删除了一个旧的Identity, 关于这个部分我们可以采用如下的步骤来监控。
登录到
Azure Portal, 找到IoT Hub的资源,从左侧菜单里找到Event, 如下图:

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

选择事件的输出
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。