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

教程:使用 Raspberry Pi 映像的 Azure Device Update for IoT Hub

Device Update for Azure IoT Hub 支持基于映像、包和脚本的更新。 本教程演示了如何在 Raspberry Pi 3 B+ 开发板上使用 Yocto 映像进行端到端基于映像的 Device Update for IoT Hub 更新。

映像更新提供对设备结束状态的高置信度,并且不会像基于包或脚本的更新一样产生相同的包及依赖项管理挑战。 可以更轻松地在预生产环境和生产环境之间复制映像更新的结果,或轻松采用 A/B 故障转移模型。

在本教程中,你将了解:

  • 下载并安装映像更新。
  • 向 IoT 设备分配标记。
  • 导入映像更新。
  • 部署映像更新。
  • 查看更新部署历史记录。

先决条件

注册设备并获取连接字符串

将设备添加到 IoT 中心的设备注册表,并获取为设备生成的连接字符串 IoT 中心。

  1. Azure 门户中,打开与 Device Update 实例关联的 IoT 中心页。
  2. 在左侧导航窗格中,选择“设备管理”>“设备”。
  3. 在“设备”页上,选择“添加设备”。
  4. 在“设备 ID”下,输入设备的名称。 确保选择“自动生成密钥”复选框。
  5. 选择“保存”。 设备将会显示在“设备”页上的列表中。
  6. 在“设备”页上,选择已注册的设备。
  7. 在设备页上,选择“连接字符串(主键)”旁边的“复制”图标。 保存此设备连接字符串以在配置 Device Update 代理时使用。

注意

处于演示摸底,本教程使用了设备连接字符串向 IoT 中心进行身份验证并连接该中心。 对于生产方案,最好使用模块标识和 IoT 标识服务来预配设备。 有关详细信息,请参阅 Device Update 代理预配

设置 Raspberry Pi

Tutorial_RaspberryPi3.zip 文件包含了本教程所需的所有文件。GitHub Device Update 发布页上最新版本的“资产”部分下载文件,然后将其解压缩。

在提取的 Tutorial_RaspberryPi3 文件夹中,可以刷写到 Raspberry Pi 开发板的基础映像为 adu-base-image-raspberrypi3.wic。 此基础映像使用的是基于 3.4.4 版本的 Yocto 内部版本。 该映像包含 Device Update 代理和 SWUpdate,可以实现 Device Update 双分区更新。 有关 Yocto 层的详细信息,请参阅使用 Yocto 项目通过 Device Update 代理生成基于 Linux 的自定义系统

通过 Device Update 导入的更新文件包括:

  • SWUpdate 文件 adu-update-image-raspberrypi3-1.2.0.swu
  • 自定义 SWUpdate 脚本 example-a-b-update.sh
  • 清单 EDS-ADUClient.yocto-update.1.2.0.importmanifest.json

使用 bmaptool 刷入 SD 卡

重要

Azure Device Update for IoT Hub 软件受以下许可条款的约束:

使用代理之前,请先阅读许可条款。 安装和使用代理即表示你接受这些条款。 如果不同意许可条款,请不要使用 Device Update 代理。

使用操作系统刷机工具将 Device Update 基础镜像安装到你在 Raspberry Pi 设备中使用的 SD 卡上。 以下说明使用了 bmaptool 来刷写 SD 卡。 将 <device> 占位符替换为设备名称,并将 <path to image> 占位符替换为下载的图像文件的路径。

  1. 如果没有实用工具 bmap-tools,请安装该实用工具。

    sudo apt-get install bmap-tools
    
  2. 在 /dev 中找到 SD 卡路径。 路径外观应类似于 /dev/sd* 或 /dev/mmcblk*。 可以使用 dmesg 实用工具来帮助找到正确的路径。

  3. 先卸载所有已装载的分区,然后再进行刷写。

    sudo umount /dev/<device>
    
  4. 请确保你对该设备具有写入权限。

    sudo chmod a+rw /dev/<device>
    
  5. 刷写 SD 卡。

    sudo bmaptool copy <path to image> /dev/<device>
    

    提示

    为了更快地进行刷写,可以下载 bimap 文件与映像文件,并将其放在同一目录中。

在 Raspberry Pi 上配置设备更新代理

  1. 请确保 Raspberry Pi 已连接到网络。

  2. 在 PowerShell 窗口中使用以下命令通过安全外壳 (SSH) 连接到 Raspberry Pi 3:

    ssh raspberrypi3 -l root
    

创建 Device Update 配置文件

Device Update du-config.json 和 du-diagnostics-config.json 配置文件必须位于设备上。 要创建文件,请在已登录到 Raspberry Pi 的终端中运行以下命令。

  1. 要创建 du-config.json 文件或将其打开进行编辑,请运行以下命令:

    nano /adu/du-config.json
    
  2. 编辑器将打开 du-config.json 文件。 如果正在创建文件,则它是一个空文件。 将以下代码复制并粘贴到文件中,以将示例值替换为设备所需的任何配置。 将示例 connectionData 字符串替换为在设备注册步骤中复制的设备连接字符串。

    {
       "schemaVersion": "1.0",
       "aduShellTrustedUsers": [
          "adu",
          "do"
       ],
       "manufacturer": "contoso",
       "model": "virtual-vacuum-v2",
       "agents": [
          {
          "name": "main",
          "runas": "adu",
          "connectionSource": {
             "connectionType": "string",
             "connectionData": "HostName=<hub_name>.azure-devices.net;DeviceId=<device_id>;SharedAccessKey=<device_key>" 
          },
          "manufacturer": "contoso",
          "model": "virtual-vacuum-v2"
          }
       ]
    }  
    
  3. 按 Ctrl+X 退出编辑器,并输入 y 以保存更改

  4. 使用类似的命令创建 du-diagnostics-config.json 文件。 创建并打开该文件:

    nano /adu/du-diagnostics-config.json
    
  5. 将以下 du-diagnostics-config.json 代码复制并粘贴到文件中。 这些值是默认的 Device Update 日志位置,仅当配置不同于默认配置时,才需要更改它们。

    {
       "logComponents":[
          {
             "componentName":"adu",
             "logPath":"/adu/logs/"
          },
          {
             "componentName":"do",
             "logPath":"/var/log/deliveryoptimization-agent/"
          }
       ],
       "maxKilobytesToUploadPerLogPath":50
    }
    
  6. 按 Ctrl+X 退出编辑器,并输入 y 以保存更改

  7. 使用以下命令显示位于 /adu/ 目录中的文件。 应会看到这两个配置文件。

    ls -la /adu/
    
  8. 使用以下命令重启 Device Update 系统守护程序,并确保应用配置。

    systemctl start deviceupdate-agent
    
  9. 运行以下命令检查代理是否处于活动状态:

    systemctl status deviceupdate-agent
    

    状态应显示为活动并且为绿色。

连接到 IoT 中心中的设备并添加组标记

  1. 在 Device Update 实例的 Azure 门户 IoT 中心页上,从左侧导航中选择“设备管理”>“设备”。

  2. 在“设备”页上,选择设备的名称。

  3. 在设备页面顶部选择“设备孪生”。

  4. 在“设备孪生”页上的设备孪生 "properties" 部分的 "reported" 部分下面,查找设备的 Linux 内核版本。

    对于未从 Device Update 接收更新的新设备,DeviceManagement:DeviceInformation:1.swVersion 属性值表示设备上正在运行的固件版本。 设备应用更新后,AzureDeviceUpdateCore:ClientMetadata:4.installedUpdateId 属性值表示固件版本。

    基础和更新映像文件名的格式为 adu-<image type>-image-<machine>-<version number>.<extension>。 请注意导入更新时要使用的版本号。

添加组标记

Device Update 可根据设备的已分配标记和兼容性属性自动将设备组织为组。 每台设备只能属于一个组,但组可以包含多个子组来对不同的设备类进行排序。 有关标记和组的详细信息,请参阅管理设备组

  1. 在设备孪生中,通过将现有 Device Update 标记值设置为 null 来删除任何这些值,然后添加以下新的 Device Update 组标记。 如果对 Device Update 代理使用模块标识,请在“模块标识孪生”而不是设备孪生中添加标记。

    "tags": {
        "ADUGroup": "<CustomTagValue>"
    },
    

    以下屏幕截图显示了文件中添加标记的位置。

    显示包含标记信息的孪生体的屏幕截图。

  2. 选择“保存”。

导入更新

  1. 在 Device Update 实例的 Azure 门户 IoT 中心页上,从左侧导航中选择“设备管理”>“更新”。

  2. 在“更新”页上,选择“导入新更新”。

  3. 在“导入更新”页上,选择“从存储容器中选择”。

  4. 在“存储帐户”页面上,选择现有存储帐户,或通过选择“存储帐户”来创建新帐户。

  5. 在“容器”页面上,选择现有容器,或通过选择“容器”来创建新容器。 你将使用容器来暂存更新文件以进行导入。

    显示存储帐户和容器的屏幕截图。

    提示

    为避免意外地从之前的更新中导入文件,建议每次导入更新时使用新容器。 如果不使用新容器,请务必删除现有容器中的任何文件。

  6. 在容器页面上,选择“上传”。 从下载的 Tutorial_RaspberryPi3 文件夹中拖放或浏览到并选择以下更新文件:

    • adu-update-image-raspberrypi3-1.2.0.swu
    • example-a-b-update.sh
    • EDS-ADUClient.yocto-update.1.2.0.importmanifest.json
  7. 选择“上传”。 上传后,文件会显示在容器页上。

  8. 在容器页上,查看并选择要导入的文件,然后选择“选择”。

    屏幕截图显示了如何选择已上传的文件。

  9. 在“导入更新”屏幕上,选择“导入更新”。

    屏幕截图显示了“导入更新”。

导入过程将会开始,屏幕会切换到“更新”屏幕。 导入成功后,它将显示在“更新”选项卡上。有关导入过程的详细信息,请参阅将更新导入到 Device Update

屏幕截图显示了作业状态。

选择设备组

可以使用已应用于设备的组标记将更新部署到设备组。 选择“更新”页顶部的“组和部署”选项卡,以查看组和部署列表以及更新符合性图表。

更新合规性图表显示了处于各种合规性状态的设备的计数:“最新的更新”、“可用的新更新”和“正在进行的更新”。 有关详细信息,请参阅 Device Update 合规性

在“组名”下,可以看到连接到此 IoT 中心的设备的所有设备组及其可用更新的列表,以及“状态”下用于部署更新的链接。 不满足组的设备类要求的任何设备将会显示在相应的无效组中。 有关标记和组的详细信息,请参阅管理设备组

你应会看到一个设备组,其中包含在本教程中设置的设备,以及组中设备的可用更新。 可能需要刷新页面。 要从此视图中将最佳可用更新部署组,请选择组旁边的“部署”。

屏幕截图显示了更新符合性视图。

部署更新

  1. 在“组详细信息”页上,选择“当前部署”选项卡,然后选择“可用更新”部分中所需更新旁边的“部署”。 该组的最佳可用更新将以“最佳”突出显示。

    屏幕截图显示了如何选择一个更新。

  2. 在“创建部署”页上,计划要立即或在将来开始的部署,然后选择“创建”。

    显示如何创建部署的屏幕截图。

    提示

    默认情况下,开始日期和时间距当前时间 24 小时。 如果希望更快开始部署,请务必选择其他日期和时间。

  3. 在“部署详细信息”下,“状态”变为“活动”。 在“可用更新”下,所选更新标记为“(正在部署)”。

    将部署显示为“活动”的屏幕截图。

  4. 在“更新”页面上,查看符合性图表以了解更新目前是否正在进行。 设备成功更新后,符合性图表和部署详细信息会更新以体现该状态。

    显示更新成功的屏幕截图。

查看更新部署历史记录

要查看部署历史记录,请:

  1. 选择“组详细信息”页顶部的“部署历史记录”选项卡,然后选择所创建部署旁边的“详细信息”链接。

    屏幕截图显示了“部署历史记录”。

  2. 在“部署详细信息”页上,选择“刷新”以查看最新状态详细信息。

    显示部署详细信息的屏幕截图。

清理资源

如果不再需要在本教程中创建的资源,则可将其删除。

  1. Azure 门户中,导航到包含资源的资源组。
  2. 如果要删除组中的所有资源,请选择“删除资源组”。
  3. 如果只想删除部分资源,请使用复选框选择资源,然后选择“删除”。

后续步骤