你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
设备管理入门 (Azure CLI)
后端应用可使用 Azure IoT 中心基元(例如设备孪生和直接方法)来远程启动和监视设备上的设备管理操作。 本文介绍 Azure CLI 和设备如何协同工作,以使用 IoT 中心为设备调用直接方法。
注意
本文所述的功能只能用于 IoT 中心的标准层。 有关 IoT 中心基本层和标准/免费层的详细信息,请参阅选择适合你的解决方案的 IoT 中心层。
使用直接方法可从 Azure CLI 会话启动设备管理操作(例如重新启动、恢复出厂设置以及固件更新)。 设备负责以下操作:
处理从 IoT 中心发送的方法请求。
在设备上启动相应的设备特定操作。
通过向 IoT 中心 报告的属性,提供状态更新。
可以使用 Azure CLI 运行设备孪生查询,以报告设备管理操作的进度。 有关使用直接方法的详细信息,请参阅云到设备的通信指南。
本文展示了如何创建两个 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 中心。 如果还没有中心,则可以按照创建 IoT 中心中的步骤进行操作。
确保已在防火墙中打开端口 8883。 本文中的设备示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)。
准备 Cloud Shell
如果要使用 Azure Cloud Shell,必须先启动并配置它。 如果在本地使用 CLI,请跳到 准备两个 CLI 会话节。
在 Azure 门户的页面标题中选择“Cloud Shell”图标。
注意
如果这是你第一次使用 Cloud Shell,系统会提示你创建使用 Cloud Shell 所需的存储。 选择用于创建存储帐户和 Microsoft Azure 文件共享的订阅。
使用 Cloud Shell 工具栏中的环境选择器选择首选的 CLI 环境。 本文使用 Bash 环境。 还可以使用 PowerShell 环境。
注意
某些命令在 Bash 和 PowerShell 环境中需要不同的语法或格式设置。 有关详细信息,请参阅有关成功使用 Azure CLI 的提示。
准备两个 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 登录。
在第一个 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 会话。 如果正在浏览器中使用 Cloud Shell,请在第一个 CLI 会话的工具栏上选择“打开新会话”图标。 如果在本地使用 CLI,请打开第二个 CLI 实例。
创建和模拟设备
在本部分,你将在第一个 CLI 会话中创建 IoT 中心的设备标识,然后使用该设备标识来模拟设备。 模拟设备将响应你在第二个 CLI 会话中调用的直接方法。
若要创建和启动模拟设备,请执行以下操作:
在第一个 CLI 会话中运行 az iot hub device-identity create 命令,将以下占位符替换为相应的值。 此命令会为模拟设备创建设备标识。
{DeviceName}。 模拟设备的名称。
{HubName}。 IoT 中心的名称。
az iot hub device-identity create --device-id {DeviceName} --hub-name {HubName}
在第一个 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 会话中运行的模拟设备上调用直接方法。
确认第一个 CLI 会话中的模拟设备是否正在运行。 如果未运行,请根据创建和模拟设备中所述,再次运行 az iot device simulate 命令来重启模拟设备。
在第二个 CLI 会话中运行 az iot hub invoke-device-method 命令,并将以下占位符替换为相应的值。 在此示例中,设备没有预先存在的方法。 该命令在模拟设备上调用示例方法名称。 该方法在其响应中提供状态代码和有效负载。
{DeviceName}。 模拟设备的名称。
{HubName}。 IoT 中心的名称。
{MethodName}。 直接方法的名称。 模拟设备没有预先存在的方法,因此你可以为此命令选择任意所需名称。
az iot hub invoke-device-method --device-id {DeviceName} --hub-name {HubName} \ --method-name {MethodName}
在第一个 CLI 会话中,确认输出是否显示了方法调用。 在以下屏幕截图中,我们在
az iot hub invoke-device-method
CLI 命令中分别为{DeviceName}
和{MethodName}
占位符使用了SampleDevice
和SampleMethod
。在第二个 CLI 会话中,确认输出是否显示了从调用的方法收到的状态代码和有效负载。
使用有效负载调用直接方法
在本部分,你将使用第二个 CLI 会话调用直接方法,并为第一个 CLI 会话中运行的模拟设备提供有效负载。
确认第一个 CLI 会话中的模拟设备是否正在运行。 如果未运行,请根据创建和模拟设备中所述,再次运行 az iot device simulate 命令来重启模拟设备。
在第二个 CLI 会话中运行 az iot hub invoke-device-method 命令,并将以下占位符替换为相应的值。 在此示例中,设备没有预先存在的方法。 该命令在模拟设备上调用示例方法名称并为该方法提供有效负载。 该方法在其响应中提供状态代码和有效负载。
{DeviceName}。 模拟设备的名称。
{HubName}。 IoT 中心的名称。
{MethodName}。 直接方法的名称。 模拟设备没有预先存在的方法,因此你可以为此命令选择任意所需名称。
az iot hub invoke-device-method --device-id {DeviceName} --hub-name {HubName} \ --method-name {MethodName} \ --method-payload '{ "SamplePayload": "PayloadValue" }'
在第一个 CLI 会话中,确认输出是否显示了方法调用。 在以下屏幕截图中,我们在
az iot hub invoke-device-method
CLI 命令中分别为{DeviceName}
和{MethodName}
占位符使用了SampleDevice
和SampleMethod
。在第二个 CLI 会话中,确认输出是否显示了从调用的方法收到的状态代码和有效负载。
后续步骤
若要了解如何使用 Azure CLI 扩展 IoT 解决方案以及计划设备上的方法调用,请参阅计划和广播作业。
若要继续学习 IoT 中心和设备管理模式(例如端到端基于映像的更新)的入门知识,请参阅使用 Raspberry Pi 3 B+ Reference Image 的 Device Update for Azure IoT Hub 文章。