你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
教程:使用 Raspberry Pi 3 B + Reference Image 的 Device Update for Azure IoT Hub
Device Update for Azure IoT Hub 支持基于映像、包和脚本的更新。
映像更新在设备的最终状态中提供更高级别的置信度。 通常可以更轻松地在预生产环境和生产环境之间复制映像更新的结果,因为它不会带来与包及其依赖项相同的挑战。 由于其原子性质,你还可以轻松采用 A/B 故障转移模型。
本教程将逐步指导你使用 Raspberry Pi 3 B+ 板上的 Device Update for IoT Hub 完成基于映像的端到端更新。
本教程介绍以下操作:
- 下载映像。
- 将标记添加到 IoT 设备。
- 导入更新。
- 部署映像更新。
- 监视更新部署。
备注
本教程中的映像更新已在 Raspberry Pi B3 板上进行了验证。
先决条件
创建 Device Update 帐户和实例,并配置 IoT 中心(如果尚未这样做)。 本教程需要通过以太网连接来连接设备。
请在 Device Update GitHub 发布页面上的“资产”中下载文件。 Tutorial_RaspberryPi.zip 包含本教程所需的所有文件。
在 IoT 中心创建设备并获取连接字符串
现在,将设备添加到 IoT 中心。 在 IoT 中心内,将为设备生成一个连接字符串。
在 Azure 门户中,导航到 IoT 中心。
在左窗格中,选择“设备”。 然后,选择“新建”。
在“设备 ID”下,输入设备的名称。 确保选中“自动生成密钥”复选框。
选择“保存”。 在“设备”页上,你创建的设备应位于列表中。
导航到设备视图获取设备连接字符串,选择“主连接字符串”旁边的“复制”图标。
将复制的字符粘贴到某个位置,以便以后在以下步骤中使用:
此复制的字符串为设备连接字符串。
设置 Raspberry Pi
我们在 Device Update GitHub 发布页面上的“资产”中提供基本映像和更新文件。 Tutorial_RaspberryPi.zip 包含本教程所需的所有文件。 .wic 文件是可刷写到 Raspberry Pi 3 B+ 板上的基础映像。 swUpdate (.swu) 文件、自定义 swupdate 脚本和清单是将要通过 Device Update for IoT Hub 导入的更新文件。
此基础映像使用(基于 3.4.4 版本)的 Yocto 内部版本,其中包含:
- 使用 DU 启用双分区更新的 SWUpdate
- 设备更新代理
若要详细了解所使用的 Yocto 层,请参阅 Device Update Yocto GitHub。
可以使用最喜欢的 OS 刷写工具,在将在 Raspberry Pi 3 B+ 设备中使用的 SD 卡上安装 Device Update 基础映像 (adu-base-image)。 下面是使用 bmaptool 刷写到 SD 卡的说明。
使用 bmaptool 刷入 SD 卡
安装该
bmaptool
实用程序(如果尚未安装)。sudo apt-get install bmap-tools
在
/dev
中找到 SD 卡的路径。 路径应类似于/dev/sd*
或/dev/mmcblk*
。 可以使用dmesg
实用工具来帮助找到正确的路径。先卸载所有已装载的分区,然后再进行刷写。
sudo umount /dev/<device>
请确保你对该设备具有写入权限。
sudo chmod a+rw /dev/<device>
可选:为了更快地刷写,请将 bimap 文件与映像文件一起下载,并将其放在同一目录中。
刷写 SD 卡。
sudo bmaptool copy <path to image> /dev/<device>
Device Update for Azure IoT Hub 软件受以下许可条款的约束:
使用代理之前,请阅读许可条款。 安装和使用即表示你接受这些条款。 如果不同意许可条款,请不要使用 Device Update for IoT Hub 代理。
在 Raspberry Pi 上配置设备更新代理
请确保 Raspberry Pi 3 已连接到网络。
在 PowerShell 窗口中使用以下命令通过 SSH 连接到 Raspberry Pi 3:
ssh raspberrypi3 -l root
设备上必须有 DU 配置文件(du-config.json 和 du-diagnostics-config.json),以便正确配置 IoT 中心的设备更新。
- 使用以下命令创建或打开
du-config.json
文件以进行编辑:
nano /adu/du-config.json
运行该命令后,你将看到编辑器打开一个文件。 如果你从未创建过该文件,则该文件将为空。 现在,复制以下示例 du-config.json 内容并替换设备所需的配置。 然后将示例连接字符串替换为在上述步骤中创建的设备的连接字符串。
du-config.json
{ "schemaVersion": "1.0", "aduShellTrustedUsers": [ "adu", "do" ], "manufacturer": "contoso", "model": "virtual-vacuum-v2", "agents": [ { "name": "main", "runas": "adu", "connectionSource": { "connectionType": "string", "connectionData": "HostName=example-connection-string.azure-devices.net;DeviceId=example-device;SharedAccessKey=M5oK/rOP12aB5678YMWv5vFWHFGJFwE8YU6u0uTnrmU=" }, "manufacturer": "contoso", "model": "virtual-vacuum-v2" } ] }
- 完成更改后,选择
Ctrl+X
以退出编辑器。 然后输入y
以保存更改。
- 使用以下命令创建或打开
现在,你需要使用类似的命令创建
du-diagnostics-config.json
文件。- 首先使用以下命令创建或打开
du-diagnostics-config.json
文件进行编辑:
nano /adu/du-diagnostics-config.json
- 复制下面提供的 du-diagnostics-config.json 内容并替换不同于默认版本的任何配置。 示例 du-diagnostics-config.json 文件表示用于 Device Update for Iot Hub 的默认日志位置。 如果实现不同,只需要更改这些默认值。
du-diagnostics-config.json
{ "logComponents":[ { "componentName":"adu", "logPath":"/adu/logs/" }, { "componentName":"do", "logPath":"/var/log/deliveryoptimization-agent/" } ], "maxKilobytesToUploadPerLogPath":50 }
- 完成更改后,选择
Ctrl+X
以退出编辑器。 然后输入y
以保存更改。
- 首先使用以下命令创建或打开
使用以下命令显示位于目录中
/adu/
目录的文件。 你应可以通过以下操作同时看到配置文件和 du-diagnostics-config.json 文件:ls -la /adu/
重新启动设备更新系统守护程序,以确保已应用配置。 在终端内使用以下命令登录到
raspberrypi
:systemctl start deviceupdate-agent
使用以下命令检查代理是否处于活动状态:
systemctl status deviceupdate-agent
你应会看到状态为“活动”和“绿色”。
在 Device Update for IoT 中心中连接设备
在左窗格中,选择“设备”。
选择包含设备名的链接。
在页面顶部选择“设备孪生”。
在“设备孪生”属性的“已报表”部分,查找 Linux 内核版本。
对于未从 Device Update 收到更新的新设备,DeviceManagement:DeviceInformation:1.swVersion 值将表示设备上正在运行的固件版本。 将更新应用到设备后,Device Update 将使用 AzureDeviceUpdateCore:ClientMetadata:4.installedUpdateId 属性值来表示设备上正在运行的固件版本。
基础映像文件和更新映像文件的文件名中包含版本号。
adu-<image type>-image-<machine>-<version number>.<extension>
在后面的“导入更新”部分使用该版本号。
将 Device Update 组标记添加到设备
在 Azure 门户中导航到 IoT 中心。
在左侧窗格的“设备”下,找到你的 IoT 设备并转到设备孪生或模块孪生。
在 Device Update 代理模块的“模块孪生”中,通过将现有 Device Update 标记值设置为 null 来删除这些标记。 如果在 Device Update 代理中使用设备标识,请在“设备孪生”中进行这些更改。
按如下所示添加新的 Device Update 标记值:
"tags": { "ADUGroup": "<CustomTagValue>" }
此屏幕截图显示了需要在孪生体中添加标记的部分。
导入更新
从最新代理的“发布资产”下的 Tutorial_RaspberryPi.zip 下载示例教程清单和示例更新(.swu 文件)以及示例 A/B 脚本。
登录到 Azure 门户并转到具有设备更新的 IoT 中心。 在左窗格的“自动设备管理”下,选择“更新”。
选择“更新”选项卡。
选择“+ 导入新更新”。
选择“+ 从存储容器中选择”。 选择一个现有帐户,或使用“+ 存储帐户”创建一个新帐户。 然后选择现有容器,或者使用“+ 容器”创建新容器。 此容器将用于暂存更新文件以供导入。
注意
建议每次导入更新时都使用新容器,以避免意外地从以前的更新导入文件。 如果不使用新容器,请务必在完成此步骤之前删除现有容器中的任何文件。
在容器中,选择“上传”并转到在步骤 1 中下载的文件。 选择所有更新文件后,选择“上传”。 然后选择“选择”按钮以返回到“导入更新”页。
此屏幕截图显示了导入步骤。 文件名可能与示例中使用的名称不匹配。
在“导入更新”页上,查看要导入的文件。 然后选择“导入更新”以启动导入过程。 对于本教程,请导入之前下载的示例教程清单和示例更新(.swu 文件)以及示例 A/B 脚本。
导入过程开始后,屏幕切换到“导入历史记录”部分。 当“状态”列指示导入成功时,选择“可用更新”标题。 现在应会在列表中看到导入的更新。
有关导入过程的详细信息,请参阅将更新导入到 Device Update。
查看设备组
Device Update 使用组来组织设备。 Device Update 根据设备的分配标记和兼容性属性自动将设备分组。 每个设备仅属于一个组,但组可以有多个子组来对不同的设备类进行排序。
转到页面顶部的“组和部署”选项卡。
查看组列表和更新合规性图表。 更新合规性图表显示了处于各种合规性状态的设备的计数:“最新的更新”、“可用的新更新”和“正在进行的更新”。 了解更新合规性。
应会看到一个设备组,其中包含在本教程中设置的模拟设备,以及新组中设备的任何可用更新。 如果设备不满足组的设备类要求,它们将显示在相应的无效组中。 若要从此视图中将最佳可用更新部署到新的用户定义组,请选择组旁边的“部署”。
有关标记和组的详细信息,请参阅管理设备组。
部署更新
创建组后,你应该会看到新的更新可用于你的设备组,并在最佳更新下显示该更新的链接。 可能需要刷新一次。
有关合规性的详细信息,请参阅 Device Update 合规性。
通过选择组名称来选择目标组。 你将转到“组基本信息”下的组详细信息。
要启动部署,请前往“当前部署”选项卡。在“可用更新”部分,选择所需更新旁边的“部署”链接。 给定组的最佳可用更新将以“最佳”高亮表示。
计划你的部署,以便立即开始部署或在将来开始部署。 然后选择“创建”。
提示
默认情况下,开始日期和时间距当前时间 24 小时。 如果你希望部署更早开始,请务必选择其他日期和时间。
在“部署详细信息”下,“状态”变为“活动”。 已部署的更新标有“(正在部署)”。
查看合规性图表以了解更新是否现在正在进行。
成功更新设备后,你会看到合规性图表和部署详细信息也会更新,以反映相同的情况。
监视更新部署
现在,你已经在 Raspberry Pi 3 B+ 设备上使用 Device Update for IoT Hub 成功完成了端到端映像更新。
清理资源
清理 Device Update 帐户、实例、IoT 中心和 IoT 设备(如果不再需要)。