你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

借助 Azure CLI 开始使用 IoT 中心模块标识和模块孪生

模块标识和模块孪生类似于 Azure IoT 中心设备标识和设备孪生,但提供更精细的粒度。 Azure IoT 中心设备标识和设备孪生支持后端应用程序配置设备并提供对设备状况的可见性,而模块标识和模块孪生则为设备的各个组件提供这些功能。 在支持多个组件的设备上(例如操作系统设备或固件设备),模块标识和模块孪生允许每个部件拥有独立的配置和条件。

注意

本文所述的功能只能用于 IoT 中心的标准层。 有关 IoT 中心基本层和标准/免费层的详细信息,请参阅选择适合你的解决方案的 IoT 中心层

本文介绍如何创建 Azure CLI 会话,可在其中:

  • 创建设备标识,然后为该设备创建模块标识。

  • 更新与模块标识关联的模块孪生的一组所需属性。

先决条件

  • Azure CLI。 还可以使用 Azure Cloud Shell (即在浏览器或 Windows 终端等应用中运行的交互式 CLI shell)运行本文中的命令。 如果使用 Cloud Shell,则无需安装任何内容。 如果要在本地使用 CLI,本文需要 Azure CLI 2.36 版本或更高版本。 运行 az --version 即可查找版本。 若要在本地安装或升级 Azure CLI,请参阅安装 Azure CLI

  • 一个 IoT 中心。 使用 CLIAzure 门户创建一个。

  • 确保已在防火墙中打开端口 8883。 本文中的示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在一些公司和教育网络环境中,可能会阻止此端口。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)

模块身份验证

可以使用对称密钥或 X.509 证书对模块标识进行身份验证。 对于 X.509 证书身份验证,模块的证书公用名称 (CN) 格式必须CN=<deviceid>/<moduleid> 所示。 例如:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

准备 Cloud Shell

如果要使用 Azure Cloud Shell,必须先启动并配置它。 如果在本地使用 CLI,请跳到准备 CLI 会话部分。

  1. 在 Azure 门户的页面标题中选择“Cloud Shell”图标。

    Azure 门户页面标题中全局控件的屏幕截图,其中突出显示了“Cloud Shell”图标。

    注意

    如果这是你第一次使用 Cloud Shell,系统会提示你创建使用 Cloud Shell 所需的存储。 选择用于创建存储帐户和 Microsoft Azure 文件共享的订阅。

  2. 使用 Cloud Shell 工具栏中的环境选择器选择首选的 CLI 环境。 本文使用 Bash 环境。 还可以使用 PowerShell 环境。

    注意

    某些命令在 Bash 和 PowerShell 环境中需要不同的语法或格式设置。 有关详细信息,请参阅有关成功使用 Azure CLI 的提示

    Azure Cloud Shell 窗口的屏幕截图,其中突出显示了工具栏中的环境选择器。

准备 CLI 会话

接下来,必须准备 Azure CLI 会话。 如果使用的是 Cloud Shell,请在“Cloud Shell”选项卡中运行会话。如果使用的是本地 CLI 客户端,请在 CLI 实例中运行会话。

  1. 如果使用的是 Cloud Shell,请跳到下一步。 否则,请在 CLI 会话中运行 az login 命令以登录到 Azure 帐户。

    如果使用的是 Cloud Shell,则会自动登录到 Azure 帐户。 Azure CLI 会话与 IoT 中心之间的所有通信都会经过身份验证和加密。 因此,本文无需你在真实设备上使用的额外身份验证(例如连接字符串)。 有关使用 Azure CLI 进行登录的详细信息,请参阅使用 Azure CLI 登录

    az login
    
  2. 在 CLI 会话中,运行 az extension add 命令。 命令将 Azure CLI 的 Microsoft Azure IoT 扩展添加到 CLI shell。 该扩展会将特定于 IoT 中心、IoT Edge 和 IoT 中心设备预配服务(DPS)的命令添加到 Azure CLI。 安装该扩展后,无需在任何 Cloud Shell 会话中再次安装。

    az extension add --name azure-iot
    

    注意

    本文使用最新版本的 Azure IoT 扩展(称为 azure-iot)。 旧版本称为 azure-cli-iot-ext。只应同时安装有一个版本。 可以使用命令 az extension list 来验证当前安装的扩展。

    使用 az extension remove --name azure-cli-iot-ext 可删除扩展的旧版本。

    使用 az extension add --name azure-iot 可添加扩展的新版本。

    若要查看已安装了哪些扩展,请使用 az extension list

创建设备标识和模块标识

在本部分中,你会在 CLI 会话中创建 IoT 中心的设备标识,然后使用该设备标识创建模块标识。 最多可以在每个设备标识下创建 50 个模块标识。

要创建设备标识和模块标识,请:

  1. 在 CLI 会话中运行 az iot hub device-identity create 命令,从而将以下占位符替换为相应的值。 此命令会创建模块的设备标识。

    {DeviceName}。 设备的名称。

    {HubName}。 IoT 中心的名称。

    az iot hub device-identity create --device-id {DeviceName} --hub-name {HubName} 
    
  2. 在 CLI 会话中运行 az iot hub module-identity create 命令,从而将以下占位符替换为相应的值。 此命令会在上一步中创建的设备标识下为模块创建模块标识。

    {DeviceName}。 设备的名称。

    {HubName}。 IoT 中心的名称。

    {ModuleName}。 设备模块的名称。

    az iot hub module-identity create --device-id {DeviceName} --hub-name {HubName} \
                                      --module-id {ModuleName}
    

更新模块孪生

创建模块标识后,在 IoT 中心内隐式创建模块孪生。 在本部分中,你将使用 CLI 会话更新与在上一部分中创建的模块标识关联的模块孪生上的一组所需属性。

  1. 在 CLI 会话中,运行 az iot hub module-twin update 命令,从而将以下占位符替换为相应的值。 在此示例中,我们将更新在上一部分创建的模块标识的模块孪生上的多个所需属性。

    {DeviceName}。 设备的名称。

    {HubName}。 IoT 中心的名称。

    {ModuleName}。 设备模块的名称。

    az iot hub module-twin update --device-id {DeviceName} --hub-name {HubName} \
                                  --module-id {ModuleName} \
                                  --desired '{"conditions":{"temperature":{"warning":75, "critical":100}}}'
    
  2. 在 CLI 会话中,确认 JSON 响应会显示更新操作的结果。 在以下 JSON 响应示例中,我们在 az iot hub module-twin update CLI 命令中分别将 SampleDeviceSampleModule 用于占位符 {DeviceName}{ModuleName}

    {
      "authenticationType": "sas",
      "capabilities": null,
      "cloudToDeviceMessageCount": 0,
      "connectionState": "Disconnected",
      "deviceEtag": "Mzg0OEN1NzW=",
      "deviceId": "SampleDevice",
      "deviceScope": null,
      "etag": "AAAAAAAAAAI=",
      "lastActivityTime": "0001-01-01T00:00:00+00:00",
      "modelId": "",
      "moduleId": "SampleModule",
      "parentScopes": null,
      "properties": {
        "desired": {
          "$metadata": {
            "$lastUpdated": "2023-02-17T21:26:10.5835633Z",
            "$lastUpdatedVersion": 2,
            "conditions": {
              "$lastUpdated": "2023-02-17T21:26:10.5835633Z",
              "$lastUpdatedVersion": 2,
              "temperature": {
                "$lastUpdated": "2023-02-17T21:26:10.5835633Z",
                "$lastUpdatedVersion": 2,
                "critical": {
                  "$lastUpdated": "2023-02-17T21:26:10.5835633Z",
                  "$lastUpdatedVersion": 2
                },
                "warning": {
                  "$lastUpdated": "2023-02-17T21:26:10.5835633Z",
                  "$lastUpdatedVersion": 2
                }
              }
            }
          },
          "$version": 2,
          "conditions": {
            "temperature": {
              "critical": 100,
              "warning": 75
            }
          }
        },
        "reported": {
          "$metadata": {
            "$lastUpdated": "0001-01-01T00:00:00Z"
          },
          "$version": 1
        }
      },
      "status": "enabled",
      "statusReason": null,
      "statusUpdateTime": "0001-01-01T00:00:00+00:00",
      "tags": null,
      "version": 3,
      "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
      }
    }
    

后续步骤

要了解如何使用 Azure CLI 扩展 IoT 解决方案以及计划设备上的更新,请参阅计划和广播作业

若要继续学习 IoT 中心和设备管理模式(例如端到端基于映像的更新)的入门知识,请参阅使用 Raspberry Pi 3 B+ Reference Image 的 Device Update for Azure IoT Hub 文章