Device Update for Azure IoT Hub 支持基于映像、包和脚本的更新。
映像更新提高了对设备最终状态的信心水平。 在预生产环境和生产环境之间复制映像更新的结果通常更容易,因为它不会带来与包及其依赖项相同的挑战。 由于其原子性质,你还可以轻松采用 A/B 故障转移模型。
本教程为您介绍在 Raspberry Pi 3 B+ 开发板上使用设备更新 for IoT 中心完成端到端的映像更新的步骤。
本教程介绍以下操作:
- 下载映像。
- 将标记添加到 IoT 设备。
- 导入更新。
- 创建设备组。
- 部署映像更新。
- 监控软件更新部署。
注释
本教程中的映像更新已在 Raspberry Pi B3 开发板上进行了验证。
先决条件
如果尚未执行此作,请创建 设备更新帐户和实例 并配置 IoT 中心。
下载映像
我们在Device Update GitHub 发布页面的资源中提供示例映像。 .gz 压缩文件是可以刷写到 Raspberry Pi 3 B+ 板的基础镜像文件。 swUpdate 文件是您通过 IoT Hub 的设备更新功能导入的更新。
使用图像刷写 SD 卡
使用你喜欢的系统刷写工具在将用于 Raspberry Pi 3 B+ 设备的 SD 卡上安装设备更新的基础映像(adu-base-image)。
使用 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>
适用于 Azure IoT 中心软件的设备更新受以下许可条款的约束:
使用代理之前阅读许可条款。 安装和使用构成了你接受这些条款。 如果不同意许可条款,请不要使用适用于 IoT 中心代理的设备更新。
在 IoT 中心创建设备或模块并获取连接字符串
现在,将设备添加到 IoT 中心。 在 IoT 中心内,为设备生成连接字符串。
从 Azure 门户启动 IoT 中心。
创建新设备。
在左窗格中,选择“设备”。 然后选择新建。
在“设备 ID”下,输入设备的名称。 确保选中“自动生成密钥”复选框。
选择“保存”。 在 “设备” 页上,创建的设备应位于列表中。
使用以下两个选项之一获取设备连接字符串:
- 选项 1:将设备更新代理与模块标识配合使用:在同一 “设备” 页上,选择顶部的 “添加模块标识 ”。 创建名为 IoTHubDeviceUpdate 的新设备更新模块。 选择适用于用例的其他选项,然后选择“ 保存”。 选择新创建的模块。 在模块视图中,选择主连接字符串旁边的“复制”图标。
- 选项 2:将设备更新代理用于设备标识:在设备视图中,选择主连接字符串旁边的“复制”图标。
将复制的字符粘贴到某个位置,以便稍后在以下步骤中使用:
此复制的字符串是设备连接字符串。
为 IoT 中心的设备更新准备设备配置
两个配置文件必须位于设备上,以便 IoT 中心的设备更新正确配置。 第一个文件是du-config.json
文件,该文件必须存在于/adu/du-config.json
。 第二个文件是du-diagnostics-config.json
文件,文件必须存在于/adu/du-diagnostics-config.json
。
下面是两个示例 du-config.json
和 du-diagnostics-config.json
文件:
示例 du-config.json
{
"schemaVersion": "1.0",
"aduShellTrustedUsers": [
"adu",
"do"
],
"manufacturer": "fabrikam",
"model": "vacuum",
"agents": [
{
"name": "main",
"runas": "adu",
"connectionSource": {
"connectionType": "string",
"connectionData": "HostName=example-connection-string.azure-devices.net;DeviceId=example-device;SharedAccessKey=M5oK/rOP12aB5678YMWv5vFWHFGJFwE8YU6u0uTnrmU="
},
"manufacturer": "fabrikam",
"model": "vacuum"
}
]
}
示例 du-diagnostics-config.json
{
"logComponents":[
{
"componentName":"adu",
"logPath":"/adu/logs/"
},
{
"componentName":"do",
"logPath":"/var/log/deliveryoptimization-agent/"
}
],
"maxKilobytesToUploadPerLogPath":50
}
在 Raspberry Pi 上配置设备更新代理
确保 Raspberry Pi 3 已连接到网络。
按照以下说明添加配置详细信息:
首先,在 PowerShell 窗口中使用以下命令通过 SSH 登录到计算机:
ssh raspberrypi3 -l root
使用以下命令创建或打开
du-config.json
文件进行编辑:nano /adu/du-config.json
运行该命令后,应会看到一个打开的编辑器,其中包含该文件。 如果从未创建过该文件,则该文件将为空。 现在复制上述示例 du-config.json 内容,并替换设备所需的配置。 然后将示例连接字符串替换为您在前面步骤中创建的设备的连接字符串。
完成更改后,选择 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 文件表示 IoT 中心设备更新的默认日志位置。 如果实现有所不同,你才需要更改这些内容。
完成更改后,选择 Ctrl+X 退出编辑器。 然后输入 y 保存更改。
使用以下命令显示目录中
/adu/
的文件。 应该看到这两个配置 files.du-diagnostics-config.json 文件以便进行编辑:ls -la /adu/
重启设备更新系统守护程序,确保应用了配置。 在登录
raspberrypi
的终端中使用以下命令:systemctl start adu-agent
使用以下命令检查代理是否实时:
systemctl status adu-agent
应会看到状态恢复为活动状态,绿色状态。
在 IoT 中心的设备更新中连接设备
在左窗格中,选择“设备”。
选择与设备名称匹配的链接。
在页面顶部,如果要使用 IoT 设备标识直接连接到设备更新,请选择 “设备孪生 ”。 否则,请选择您创建的模块,然后选择其配对模块。
在设备孪生属性的报告部分下,查找 Linux 内核版本。 对于未从设备更新接收更新的新设备, DeviceManagement:DeviceInformation:1.swVersion 值表示设备上运行的固件版本。 将更新应用到设备后,设备更新使用 AzureDeviceUpdateCore:ClientMetadata:4.installedUpdateId 属性值来表示设备上运行的固件版本。
基本映像文件和更新映像文件在文件名中具有版本号。
adu-<image type>-image-<machine>-<version number>.<extension>
在后面的“导入更新”部分中使用该版本号。
为您的设备添加标签
登录 Azure 门户并转到 IoT 中心。
在左窗格中的“设备”下,找到您的 IoT 设备,然后转到设备孪生或模块孪生。
在 Device Update 代理模块的“模块孪生”中,通过将现有 Device Update 标记值设置为 null 来删除这些标记。 如果您正在使用设备更新代理与设备标识一起使用,请在设备孪生中进行这些更改。
按如下所示添加新的 Device Update 标记值:
"tags": { "ADUGroup": "<CustomTagValue>" }
导入更新
从发布资产下载最新代理的示例教程清单(教程导入 Manifest_Pi.json)和示例更新(adu-update-image-raspberrypi3-0.6.5073.1.swu)。
登录到 Azure 门户并转到具有设备更新的 IoT 中心。 在左窗格的“自动设备管理”下,选择“更新”。
选择“汇报”选项卡。
选择“+ 导入新更新 (Import New Update)”。
选择“+ 从存储容器中进行选择”。 选择一个现有帐户,或使用“+ 存储帐户”创建一个新帐户。 然后选择现有容器,或者使用“+ 容器”创建新容器。 此容器将用于暂存更新文件以供导入。
注释
建议每次导入更新时都使用新容器,以避免意外地从以前的更新导入文件。 如果不使用新容器,请务必在完成此步骤之前删除现有容器中的任何文件。
在容器中,选择“上传”并转到在步骤 1 中下载的文件。 选择所有更新文件后,选择“ 上传”。 然后选择“选择”按钮以返回到“导入更新”页。
此屏幕截图显示了导入步骤。 文件名可能与示例中使用的名称不匹配。
在“导入更新”页上,查看要导入的文件。 然后选择“导入更新”以启动导入过程。
导入过程开始,屏幕将切换到 “导入历史记录 ”部分。 当“状态”列指示导入成功时,选择“可用更新”标题。 现在应会在列表中看到导入的更新。
详细了解 如何导入更新。
创建更新组
转到页面顶部的“组和部署”选项卡。
选择 “添加组 ”以创建新组。
从列表中选择一个 IoT 中心 标记和一个 设备类。 然后选择“创建组”。
创建组后,符合性图表和组列表将被更新。 更新合规性图表显示了处于各种合规性状态的设备的计数:“最新的更新”、“可用的新更新”和“正在进行的更新”。 了解更新合规性。
你应该可以看到你新创建的组以及新组中设备的任何可用更新。 如果有设备不符合该组的设备类别要求,它们将显示在相应的无效设备组中。 若要从此视图中将最佳可用更新部署到新的用户定义组,请选择组旁边的“部署”。
部署更新
创建组后,应会看到可用于设备组的新更新。 更新的链接应在 “最佳更新”下。 可能需要刷新一次。 深入了解更新的合规情况。
通过选择组名称来选择目标组。 你将被引导到组基本信息下的组详细信息。
若要开始部署,请转到“当前部署”选项卡。从“可用更新”部分选择所需更新旁边的部署链接。 给定组的最佳可用更新将以最佳高亮表示。
计划你的部署,以便立即开始部署或在将来开始部署。 然后选择 创建。
在“部署详细信息”下,“状态”变为“活动”。 已部署的更新标记为“(正在部署)”。
查看合规性图表以了解更新是否现在正在进行。
成功更新设备后,你会看到合规性图表和部署详细信息也会更新,以反映相同的情况。
监控更新部署
您现在已成功在 Raspberry Pi 3 B+ 设备上通过 IoT 中心的设备更新完成了端到端的映像更新。
清理资源
不再需要时,请清理设备更新帐户、实例、IoT 中心和 IoT 设备。