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

计划和广播作业(Azure CLI)

使用 Azure IoT 中心来计划和跟踪可更新数百万台设备的作业。 使用作业可以:

  • 更新所需属性
  • 更新标记
  • 调用直接方法

从概念上讲,作业会包装其中一项操作,并跟踪针对一组设备的执行进度。 作业与之交互的设备集由设备孪生查询定义。 例如,后端应用可使用作业重启 10,000 台设备(由设备孪生查询指定并计划在将来执行)。 该应用程序随后可以在其中每个设备接收和执行重新启动方法时跟踪进度。

可在以下文章中了解有关所有这些功能的详细信息:

注意

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

本文展示了如何创建两个 Azure CLI 会话:

  • 用于创建模拟设备的会话。 模拟设备配置为在调用任何直接方法时返回状态代码和 JSON 有效负载。

  • 创建两个计划作业的会话。 第一个作业调用直接方法,第二个作业更新在其他会话中创建的模拟设备上所需的设备孪生属性。

先决条件

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

  • Azure 订阅中的 IoT 中心。 使用 CLIAzure 门户创建一个。

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

准备 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 实例。 使用单独的 CLI 会话来完成以下任务:

  • 第一个会话模拟与 IoT 中心通信的 IoT 设备。
  • 第二个会话使用 IoT 中心为模拟设备计划作业。

注意

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

  1. 在第一个 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

  2. 打开第二个 CLI 会话。 如果正在浏览器中使用 Cloud Shell,请在第一个 CLI 会话的工具栏上选择“打开新会话”图标。 如果在本地使用 CLI,请打开第二个 CLI 实例。

    Azure Cloud Shell 窗口的屏幕截图,其中突出显示了工具栏中的“打开新会话”图标。

创建和模拟设备

在本节中,你会在第一个 CLI 会话中创建 IoT 中心的设备标识,然后使用该设备标识模拟设备。 模拟设备会响应在第二个 CLI 会话中计划的作业。

若要创建和启动模拟设备,请执行以下操作:

  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 device simulate 命令,将以下占位符替换为相应的值。 此命令模拟在上一步中创建的设备。 模拟设备配置为在每次调用直接方法时返回状态代码和有效负载。

    {DeviceName}。 模拟设备的名称。

    {HubName}。 IoT 中心的名称。

    az iot device simulate --device-id {DeviceName} --hub-name {HubName} \
                           --method-response-code 201 \
                           --method-response-payload '{"result":"Direct method successful"}'
    

    提示

    默认情况下,az iot device simulate 命令会发送 100 条设备到云的消息,消息之间间隔 3 秒。 发送所有消息后,模拟结束。 如果希望模拟运行更长时间,可以使用 --msg-count 参数指定更多消息,或使用 --msg-interval 参数指定更长的消息间隔。 还可以再次运行该命令以重启模拟设备。

计划作业以调用直接方法

在本节中,你会在第二个 CLI 会话中计划作业,从而在第一个 CLI 会话中运行的模拟设备上调用直接方法。

  1. 确认第一个 CLI 会话中的模拟设备是否正在运行。 如果未运行,请根据 创建和模拟设备 再次运行 az iot device simulate 命令以重启模拟设备。

  2. 在第二个 CLI 会话中,运行 az iot hub job create 命令,将以下占位符替换为相应的值。 在此示例中,设备没有预先存在的方法。 该命令会计划作业,该作业在模拟设备上调用示例方法名称,为该方法的有效负载提供 null 值。 该方法在其响应中提供状态代码和有效负载。

    {HubName}。 IoT 中心的名称。

    {JobName}。 计划作业的名称。 作业名称具有唯一性,因此每次运行此命令时,请选择不同的作业名称。

    {MethodName}。 直接方法的名称。 模拟设备没有预先存在的方法,因此可以为此命令选择任意所需名称。

    {DeviceName}。 模拟设备的名称。

    az iot hub job create --hub-name {HubName} --job-id {JobName} \
                          --job-type scheduleDeviceMethod \
                          --method-name {MethodName} --method-payload 'null' \
                          --query-condition "deviceId = '{DeviceName}'"
    

    提示

    计划调用直接方法的作业 az iot hub job create 命令时,必须为 --method-name--method-payload 可选参数指定值。 对于不接受有效负载的直接方法,请为 --method-payload 参数指定 null

  3. 在第一个 CLI 会话中,确认输出显示了方法调用。 在以下屏幕截图中,我们在上一步的 az iot hub job create CLI 命令中分别为 {DeviceName}{MethodName} 占位符使用了 SampleDeviceSampleMethod

    模拟设备的屏幕截图,其中显示了调用方法后的输出。

计划作业以更新设备孪生的属性

在本节中,你会在第二个 CLI 会话中计划作业,从而在第一个 CLI 会话中运行的模拟设备上更新所需的设备孪生属性。

  1. 确认第一个 CLI 会话中的模拟设备是否正在运行。 如果未运行,请根据 创建和模拟设备 再次运行 az iot device simulate 命令以重启模拟设备。

  2. 在第二个 CLI 会话中,运行 az iot hub job create 命令,将以下占位符替换为相应的值。 在此示例中,我们会计划作业以将模拟设备所需的孪生属性值 BuildingNo 设置为 45。

    {HubName}。 IoT 中心的名称。

    {JobName}。 计划作业的名称。 作业名称具有唯一性,因此每次运行此命令时,请选择不同的作业名称。

    {DeviceName}。 模拟设备的名称。

    az iot hub job create --hub-name {HubName} --job-id {JobName} \
                          --job-type scheduleUpdateTwin \
                          --twin-patch '{"properties":{"desired": {"BuildingNo": 45}}}' \
                          --query-condition "deviceId = '{DeviceName}'"
    
  3. 在第一个 CLI 会话中,确认输出显示了报告的设备孪生属性已成功更新,指示所需的设备孪生属性也已更新。

    模拟设备的屏幕截图,其中显示了设备孪生属性更新后的输出。

后续步骤

在本文中,你使用了 Azure CLI 来模拟设备并计划作业,从而运行直接方法并为该模拟设备更新设备孪生的属性。

要继续探索 IoT 中心和设备管理模式,请在 使用 Raspberry Pi 3 B + Reference Image 的 Device Update for Azure IoT Hub 教程 中更新映像。