Compartir a través de

使用 Visual Studio 2022 开发和调试适用于 Azure IoT Edge 的模块

适用于:IoT Edge 1.5 复选标记 IoT Edge 1.5 IoT Edge 1.4 复选标记 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge

本文介绍如何使用 Visual Studio 2022 开发、调试以及部署自定义 Azure IoT Edge 模块。 Visual Studio 2022 为以 C 和 C# 编写的 IoT Edge 模块提供模板。 受支持的设备体系结构有 Windows x64、Linux x64、ARM32 和 ARM64(预览)。 有关支持的操作系统、语言和体系结构的详细信息,请参阅语言和体系结构支持

本文包含适用于两种 IoT Edge 开发工具的步骤。

  • 命令行接口 (CLI) 是开发的首选工具。
  • 适用于 Visual Studio 的 Azure IoT Edge Tools 扩展。 该扩展处于维护模式

使用开头的工具选择器按钮选择用于本文的工具选项。 这两种工具都具有以下优势:

  • 在本地开发计算机上创建、编辑、生成、运行和调试 IoT Edge 解决方案和模块。
  • 利用 Visual Studio 开发的优势,使用 C 或 C# 编写 Azure IoT 模块。
  • 通过 Azure IoT 中心将 IoT Edge 解决方案部署到 IoT Edge 设备。

先决条件

本文假设你使用运行 Windows 的计算机作为开发计算机。

  • 在开发计算机上安装或修改 Visual Studio 2022。 选择“Azure 开发”和“使用 C++ 的桌面开发”工作负载选项。

  • 从 Visual Studio Marketplace 下载并安装 Azure IoT Edge Tools。 可以使用 Azure IoT Edge Tools 扩展来创建和生成 IoT Edge 解决方案。 首选开发工具为命令行 (CLI) Azure IoT Edge 开发工具。 该扩展包括用于创建 Visual Studio 项目的 Azure IoT Edge 项目模板。 目前,无论使用哪种开发工具,都需要安装该扩展。

    重要

    适用于 VS 2022 的 Azure IoT Edge Tools 扩展处于维护模式。 首选开发工具为命令行 (CLI) Azure IoT Edge 开发工具

    提示

    如果使用的是 Visual Studio 2019,请从 Visual Studio 市场下载并安装 Azure IoT Edge Tools for VS 2019

  • 安装 Vcpkg 库管理器

    git clone https://github.com/Microsoft/vcpkg
    cd vcpkg
    bootstrap-vcpkg.bat
    

    安装适用于 Windows 的 azure-iot-sdk-c 程序包

    vcpkg.exe install azure-iot-sdk-c:x64-windows
    vcpkg.exe --triplet x64-windows integrate install
    
  • 在开发计算机上下载并安装与 Docker 兼容的容器管理系统,以生成和运行模块映像。 例如,安装 Docker Community Edition

  • 若要使用 Linux 容器开发模块,请使用满足 Docker Desktop 要求的 Windows 计算机。

  • 创建用于存储模块映像的 Azure 容器注册表Docker Hub

    提示

    对于原型和测试用途,可以使用本地 Docker 注册表,而不使用云注册表。

  • 安装 Azure CLI

  • 若要在设备上测试模块,你则至少需要一个 IoT Edge 设备和一个活动的 IoT 中心。 若要创建用于测试的 IoT Edge 设备,可以在 Azure 门户中创建或通过 CLI 创建:

    • Azure 门户中创建一个是最快的。 从 Azure 门户转到 IoT 中心资源。 在“设备管理”菜单下选择“设备”,然后选择“添加设备”。

      在“创建设备”中,使用“设备 ID”命名设备,选中“IoT Edge 设备”,然后选择左下角的“保存”。

      最后,从“设备管理”>“设备”菜单中确认新设备已存在于 IoT 中心中。 有关通过 Azure 门户创建 IoT Edge 设备的详细信息,请参阅使用对称密钥在 Linux 上创建和预配 IoT Edge 设备

    • 若要使用 CLI 创建 IoT Edge 设备,请按照 LinuxWindows 快速入门中的步骤操作。 在注册 IoT Edge 设备的过程中,创建一个 IoT Edge 设备。

    如果你正在开发计算机上运行 IoT Edge 守护程序,则可能需要停止 EdgeHub 和 EdgeAgent,然后再在 Visual Studio 中开始开发。

创建 Azure IoT Edge 项目

可在 Visual Studio 的 IoT Edge 项目模板中创建要部署到 IoT Edge 设备的解决方案。 首先,创建一个 Azure IoT Edge 解决方案。 然后,在这个解决方案中创建一个模块。 每一个 IoT Edge 解决方案都可包含多个模块。

警告

用于 Visual Studio 扩展的 Azure IoT Edge 工具缺少 C 和 C# 模块的项目模板。 我们正在积极解决此问题。 如果无法使用扩展创建 IoT Edge 模块,请使用以下解决方法。

下载以下文件并将其放置在列出的 Visual Studio 模板目录中:

模板文件 添加到目录
azureiotedgemodule-v0.0.4.zip %userprofile%\Documents\Visual Studio 2022\Templates\ProjectTemplates\Visual C#
azureiotedgevcmodulevs17-v0.0.9.zip %userprofile%\Documents\Visual Studio 2022\Templates\ProjectTemplates\Visual C++ Project

我们要在解决方案中生成三个项目。 包含 EdgeAgent 和 EdgeHub 的主模块,此外还有温度传感器模块。 接下来,另行添加两个 IoT Edge 模块。

重要

Visual Studio 创建的 IoT Edge 项目结构与 Visual Studio Code 中的不同。

目前,Azure IoT Edge 开发工具 CLI 不支持创建 Visual Studio 项目类型。 需要使用 Visual Studio IoT Edge 扩展来创建 Visual Studio 项目。

  1. 在 Visual Studio 中,创建新的项目。

  2. 在“创建新项目”中搜索“Azure IoT Edge”。 选择与 IoT Edge 设备的平台和体系结构匹配的项目,然后选择“下一步”。

  3. 在“配置新项目”中输入项目名称并指定位置,然后选择“创建”。

  4. 在“添加模块”中选择要开发的模块类型。 如果有要添加到部署的现有模块,请选择“现有模块”。

  5. 在“模块名称”中输入模块的名称。 选择容器注册表中唯一的名称。

  6. 在“存储库 URL”中提供模块的映像存储库的名称。 Visual Studio 使用localhost:5000/<你的模块名>自动填充模块名。 将其替换为你自己的注册表信息。 如果使用本地 Docker 注册表进行测试,请使用 localhost。 如果使用 Azure 容器注册表,那么请从注册表的设置中使用登录服务器。 登录服务器类似于 <注册表名称>.azurecr.cn。 仅替换字符串的 localhost:5000 部分,使最终结果类似于 <注册表名称>.azurecr.cn/<模块名称>

  7. 选择“添加”,将模块添加到项目中。

    屏幕截图显示了如何添加应用程序和模块。

    注意

    如果你有现有的 IoT Edge 项目,可以通过打开 module.json 文件来更改存储库 URL。 存储库 URL 位于 JSON 文件的“repository”属性中。

现在,已在 Visual Studio 解决方案中创建了一个 IoT Edge 项目和 IoT Edge 模块。

项目结构

在解决方案中有两个项目级别的文件夹,包括主项目文件夹和一个模块文件夹。 例如,你可能有一个名为 AzureIotEdgeApp1 的主项目文件夹和一个名为 IotEdgeModule1 的模块文件夹。 主项目文件夹包含部署清单。

模块项目文件夹包含模块代码文件,该文件名为 Program.csmain.c,具体取决于所选语言。 该文件夹还含有名为 module.json 的文件,用于描述模块的元数据。 包含于此处各种 Docker 文件可提供将模块生成为 Windows 或 Linux 容器所需的信息。

项目的部署清单

要编辑的部署清单名为 deployment.debug.template.json。 该文件是 IoT Edge 部署清单模板,用于定义设备上运行的所有模块,以及这些模块相互通信的方式。 有关部署清单的详细信息,请参阅了解如何部署模块和建立路由

打开此部署模板,可以看到其中包含“edgeAgent”和“edgeHub”这两个运行时模块,以及在此 Visual Studio 项目中创建的自定义模块。 另外,还有名为“SimulatedTemperatureSensor”的第四个模块。 此默认模块会生成用于测试模块的模拟数据。如果不需要此模块,亦可将其删除。 若要了解模拟温度传感器的工作原理,请查看 SimulatedTemperatureSensor.csproj 源代码

设置 IoT Edge 运行时版本

目前,最新的稳定运行时版本是 1.5。 应将 IoT Edge 运行时版本更新为最新的稳定版本或面向设备的相应版本。

  1. 在解决方案资源管理器中,右键单击主项目名称,然后选择“设置 IoT Edge 运行时版本”。

    显示如何查找和选择“设置 IoT Edge 运行时版本”菜单项的屏幕截图。

  2. 使用下拉菜单选择 IoT Edge 设备正在运行的运行时版本,然后选择“确定”以保存更改。 如果未进行更改,选择“取消”可退出。

    目前该扩展不包括针对最新运行时版本的选择。 如果要设置高于 1.2 的运行时版本,请打开 deployment.debug.template.json 部署清单文件。 更改系统运行时模块映像 edgeAgent 和 edgeHub 的运行时版本。 例如,如果要使用 IoT Edge 运行时版本 1.5,请更改部署清单文件中的以下行:

    "systemModules": {
       "edgeAgent": {
        //...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.5"
        //...
       "edgeHub": {
       //...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
       //...
    
  3. 如果更改了版本,请右键单击项目名称并选择“为 IoT Edge 生成部署”以重新生成部署清单。 该操作会基于部署模板生成部署清单,该清单将显示在 Visual Studio 项目的 “config” 文件夹中。

  1. 打开 deployment.debug.template.json 部署清单文件。 部署清单是一个 JSON 文档,用于描述要在目标 IoT Edge 设备上配置的模块。

  2. 更改系统运行时模块映像 edgeAgent 和 edgeHub 的运行时版本。 例如,如果要使用 IoT Edge 运行时版本 1.5,请更改部署清单文件中的以下行:

    "systemModules": {
        "edgeAgent": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-agent:1.5",
        //...
        "edgeHub": {
        //...
            "image": "mcr.microsoft.com/azureiotedge-hub:1.5",
        //...
    

模块基础结构和开发选项

添加新模块后,其已附带随时可用于生成并部署到设备的默认代码,以便无需操作任何代码即可开始测试。 模块代码在模块文件夹中的文件名为 Program.cs(适用于 C#)或 main.c(适用于 C)。

生成默认解决方案后,系统会将“SimulatedTemperatureSensor”模块中的模拟数据路由到模块,该模块会接收输入内容,然后将其发送到 IoT 中心。

准备好使用自己的代码自定义模块模板时,请使用 Azure IoT 中心 SDK 生成模块,以解决 IoT 解决方案的关键需求,例如安全性、设备管理和可靠性。

使用模拟器进行调试

Azure IoT EdgeHub 开发工具提供本地开发和调试体验。 该工具可在没有 IoT Edge 运行时的情况下帮助启动 IoT Edge 模块,以便可在本地创建、开发、测试、运行和调试 IoT Edge 模块和解决方案。 无需将映像推送到容器注册表并将其部署到设备进行测试。

有关详细信息,请参阅 Azure IoT EdgeHub 开发工具

若要初始化 Visual Studio 中的工具,请执行以下操作:

  1. Azure 门户或 Azure CLI 中检索 IoT Edge 设备(在 IoT 中心找到)的连接字符串。

    如果使用 CLI 检索连接字符串,请使用此命令,将“[device_id]”和“[hub_name]”替换为自己的值:

    az iot hub device-identity connection-string show --device-id [device_id] --hub-name [hub_name]
    
  2. 从 Visual Studio 的“工具”菜单中,选择“Azure IoT Edge Tools”>“设置 IoT Edge 模拟器”。

  3. 粘贴连接字符串,然后选择“确定”。

注意

只需在开发计算机上执行一次这些步骤,所得结果将自动应用于所有后续 Azure IoT Edge 解决方案。 如果需要更改为另一个连接字符串,可以再次执行此过程。

生成和调试单个模块

通常,需要先测试和调试每个模块,然后再在具有多个模块的整个解决方案中运行此模块。 使用 IoT Edge 模拟器工具,能够独立地运行单个模块,并通过端口 53000 发送消息。

  1. 在解决方案资源管理器中选择并突出显示模块项目文件夹(例如 IotEdgeModule1)。 将自定义模块设置为启动项目。 在菜单中选择“项目”>“设为启动项目”。

  2. 按 F5 或选择“运行”工具栏按钮,启动单个模块的 IoT Edge 模拟器。 初次运行可能需要 10 到 20 秒。

    显示如何运行模块的屏幕截图。

  3. 如果模块已成功初始化,应该会看到一个 .NET Core 控制台应用窗口。

  4. 设置用于检查模块的断点。

    • 如果在 C# 环境中开发,请在 ModuleBackgroundService.csPipeMessage() 函数中设置断点。
    • 如果是 C 环境,在“main.c”的 InputQueue1Callback() 函数中设置断点。
  5. 可通过发送消息来测试模块。 调试单个模块时,模拟器会侦听默认端口 53000 以获取消息。 若要向模块发送消息,请通过 Git Bash 或 WSL Bash 等命令 shell 运行以下 curl 命令。

    curl --header "Content-Type: application/json" --request POST --data '{"inputName": "input1","data":"hello world"}' http://localhost:53000/api/v1/messages
    

    如果收到错误“URL 中的右大括号/括号不匹配”,请尝试以下命令:

    curl --header "Content-Type: application/json" --request POST --data "{\"inputName\": \"input1\", \"data\", \"hello world\"}"  http://localhost:53000/api/v1/messages
    

    输出控制台、Visual Studio 项目和 Bash 窗口的屏幕截图。

    应触发断点。 可以在 Visual Studio 的“局部变量”窗口中监视变量,在调试器运行时可以找到该窗口。 转到“调试”>“窗口”>“局部变量”。

    在 Bash 或 shell 中,应会看到 {"message":"accepted"} 确认。

    在 .NET 控制台中,应会看到:

    IoT Hub module client initialized.
    Received message: 1, Body: [hello world]
    
  6. 按 Ctrl+F5 或选择“停止”按钮可停止调试 。

生成和调试多个模块

开发完单个模块之后,需要运行并调试具有多个模块的整个解决方案。 使用 IoT Edge模拟器工具,可以运行部署清单中定义的所有模块,包括用于消息路由的模拟 edgeHub。 本例将运行两个自定义模块和温度传感器模拟模块。 来自模拟温度传感器模块的消息会路由到每个自定义模块。

  1. 在“解决方案资源管理器”中,右键单击主项目文件夹,将第二个模块添加到解决方案中。 在菜单中选择“添加”>“新 IoT Edge 模块”。

    显示如何从菜单中添加“新 IoT Edge 模块”的屏幕截图。

  2. Add module 窗口中,为新模块命名,并将存储库 URL 的 localhost:5000 部分替换为 Azure 容器注册表登录服务器,就像你之前所做的那样。

  3. 打开文件 deployment.debug.template.json 会看到新模块已添加到“模块”部分。 EdgeHub 的“路由”部分也已添加新路由,以便将消息从新模块发送到 IoT 中心。 若要将数据从模拟温度传感器发送到新模块,请添加另一个带有 JSON 行的路由。 将 <NewModuleName>(在两个位置)替换为你自己的模块名称。

    "sensorTo<NewModuleName>": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/<NewModuleName>/inputs/input1\")"
    
  4. 右键单击主项目(例如 AzureIotEdgeApp1)并选择“设为启动项目”。 通过将主项目设置为启动项目,会让系统运行解决方案中的所有模块。 包括添加到解决方案的两个模块,以及模拟的温度传感器模块和模拟的 Edge 中心。

  5. 按 F5 或选择“运行”工具栏按钮以运行解决方案。 初次运行可能需要 10 到 20 秒。 请确保没有其他 Docker 容器正在运行,因为它们可能会绑定此项目所需的端口。

  6. 应看到两个 .NET Core 控制台应用窗口,分别对应每个模块。

  7. 设置用于检查模块的断点。

    • 如果在 C# 环境中开发,请在 ModuleBackgroundService.csPipeMessage() 函数中设置断点。
    • 如果是 C 环境,在“main.c”的 InputQueue1Callback() 函数中设置断点。
  8. 在每个模块创建断点,然后按 F5 以同时运行和调试多个模块。 此时应会看到多个 .NET Core 控制台应用窗口,每个窗口表示一个不同的模块。

    带有两个输出控制台的 Visual Studio 的屏幕截图。

  9. 按 Ctrl+F5 或选择“停止”按钮可停止调试 。

生成映像并将其推送到注册表

开发和调试模块后,可以生成模块映像并将其推送到 Azure 容器注册表。 随后可将模块部署到 IoT Edge 设备。

  1. 请将 IoT Edge 主项目设为启动项目,而不是其中的单个模块。

  2. 选择“调试”或“发布”作为配置,以生成模块映像 。

    注意

    如果选择“调试”,Visual Studio 使用 Dockerfile.(amd64|windows-amd64).debug 生成 Docker 映像。 生成容器映像时,它将在该映像中包含 .NET Core 命令行调试器 VSDBG。 对于生产就绪的 IoT Edge 模块,建议使用“发布”配置,此模块可在没有 VSDBG 的情况下使用 Dockerfile.(amd64|windows-amd64)

  3. 如果使用的是专用注册表(如 Azure 容器注册表 (ACR)),请使用以下 Docker 命令登录。 可以从 Azure 门户的注册表的“访问密钥”页中获取用户名和密码。

    docker login azure --cloud-name AzureChinaCloud <ACR login server>
    
  4. 让我们将 Azure 容器注册表登录信息添加到文件 deployment.debug.template.json 中的运行时设置。 可通过两种方式来执行此操作。 可以将注册表凭据添加到 .env 文件(最安全),也可以将它们直接添加到 deployment.debug.template.json 文件中。

    将凭据添加到 .env 文件:

    在解决方案资源管理器中选择“显示所有文件”工具栏按钮。 .env 文件出现。 将 Azure 容器注册表用户名和密码添加到 .env 文件中。 可以在 Azure 门户中 Azure 容器注册表的“访问密钥”页上找到这些凭据。

    屏幕截图中的按钮可以显示解决方案资源管理器中的所有文件。

        DEFAULT_RT_IMAGE=1.2
        CONTAINER_REGISTRY_USERNAME_myregistry=<my-registry-name>
        CONTAINER_REGISTRY_PASSWORD_myregistry=<my-registry-password>
    

    将凭据直接添加到 deployment.debug.template.json

    如果你要将凭据直接添加到部署模板,请将占位符替换为 ACR 管理员用户名、密码和注册表名称。

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.cn"
              }
            }
          }
    

    注意

    本文使用 Azure 容器注册表的管理员登录凭据,其十分适用于开发和测试方案。 为生产方案做好准备后,建议使用最低权限身份验证选项(如服务主体)。 有关详细信息,请参阅管理容器注册表的访问权限

  5. 如果使用的是本地注册表,可运行本地注册表

  6. 最后,在“解决方案资源管理器”中,右键单击主项目文件夹并选择“生成并推送 IoT Edge 模块”,为每个模块生成并推送 Docker 映像。 这可能需要几分钟的时间。 如果在 Visual Studio 的输出控制台中看到 Finished Build and Push IoT Edge Modules.,表示操作已完成。

部署解决方案

生成模块映像并将其推送到 Azure 容器注册表后,可以将解决方案部署到 IoT Edge 设备。 你已经有了一个贯穿本教程的部署清单模板。 让我们基于该模板生成一个部署清单,然后使用 Azure CLI 命令将模块部署到 Azure 中的 IoT Edge 设备。

  1. 右键单击 Visual Studio 解决方案资源管理器中的主项目,然后选择“为 IoT Edge 生成部署”。

    “生成部署”菜单项的位置的屏幕截图。

  2. 转到本地 Visual Studio 主项目文件夹并查看 config 文件夹。 文件路径可能如下所示:C:\Users\<YOUR-USER-NAME>\source\repos\<YOUR-IOT-EDGE-PROJECT-NAME>\config。 在此处可以找到生成的部署清单,例如 deployment.amd64.debug.json

  3. 检查 deployment.amd64.debug.json 文件以确认 edgeHub 架构版本设置为 1.2。

     "$edgeHub": {
         "properties.desired": {
           "schemaVersion": "1.2",
           "routes": {
             "IotEdgeModule2022ToIoTHub": "FROM /messages/modules/IotEdgeModule2022/outputs/* INTO $upstream",
             "sensorToIotEdgeModule2022": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule2022/inputs/input1\")",
             "IotEdgeModule2022bToIoTHub": "FROM /messages/modules/IotEdgeModule2022b/outputs/* INTO $upstream"
           },
           "storeAndForwardConfiguration": {
             "timeToLiveSecs": 7200
           }
         }
       }
    

    提示

    Visual Studio 2022 的部署模板需要 1.2 架构版本。 如果需要设置为 1.1 或 1.0,请等到生成部署后再操作(不要在 deployment.debug.template.json 中更改它)。 默认情况下,生成部署将创建 1.2 架构。 但是,如果需要,可以在将生成的清单 deployment.amd64.debug.json 部署到 Azure 之前手动更改它。

    重要

    部署 IoT Edge 设备后,它当前无法在架构版本为 1.2 的 Azure 门户中正确显示(版本 1.1 即可)。 这是一个已知 bug,即将得到解决。 但是,这不会影响设备,因为它仍在 IoT 中心连接,并且可以随时使用 Azure CLI 进行通信。

    “IoT Edge 设备”页上 Azure 门户错误的屏幕截图。

  4. 现在,让我们使用 Azure CLI 命令部署清单。 打开 Visual Studio“开发人员命令提示符”并更改为“配置”目录。

        cd config
    
  5. 将 IoT Edge 设备的清单部署到 IoT 中心。 该命令将设备配置为使用解决方案中开发的模块。 部署清单是在上一步中创建的,并存储在 config 文件夹中。 在“配置”文件夹中,执行以下部署命令。 将 [device id][hub name][file path] 替换为你的值。 如果 IoT 中心内不存在 IoT Edge 设备 ID,则必须创建它。

        az iot edge set-modules --device-id [device id] --hub-name [hub name] --content [file path]
    

    例如,命令可能如下所示:

    az iot edge set-modules --device-id my-device-name --hub-name my-iot-hub-name --content deployment.amd64.debug.json
    
  6. 运行该命令后,将在命令提示符中看到 JSON 中打印的部署确认。

生成模块 Docker 映像

开发模块后,可以生成模块映像以存储在容器注册表中,以便部署到 IoT Edge 设备。

使用模块的 Dockerfile 生成模块 Docker 映像。

docker build --rm -f "<DockerFilePath>" -t <ImageNameAndTag> "<ContextPath>" 

例如,假设命令 shell 位于项目目录中,且模块名称为 IotEdgeModule1。 若要为本地注册表或 Azure 容器注册表生成映像,请使用以下命令:

# Build the image for the local registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t localhost:5000/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

# Or build the image for an Azure Container Registry

docker build --rm -f "./IotEdgeModule1/Dockerfile.amd64.debug" -t myacr.azurecr.cn/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

推送模块 Docker 映像

将模块映像推送到本地注册表或容器注册表。

docker push <ImageName>

例如:

# Push the Docker image to the local registry

docker push localhost:5000/iotedgemodule1:0.0.1-amd64

# Or push the Docker image to an Azure Container Registry
az acr login --name myacr
docker push myacr.azurecr.cn/iotedgemodule1:0.0.1-amd64

将模块部署到 IoT Edge 设备。

在 Visual Studio 中,打开主项目中的 deployment.debug.template.json 部署清单文件。 部署清单是一个 JSON 文档,用于描述要在目标 IoT Edge 设备上配置的模块。 在部署之前,需要更新 Azure 容器注册表凭据、模块映像以及适当的 createOptions 值。 若要了解 createOption 值的详细信息,请参阅如何配置 IoT Edge 模块的容器创建选项

  1. 如果使用 Azure 容器注册表来存储模块映像,则需要在 “edgeAgent” 设置中将凭据添加到 “deployment.debug.template.json”。 例如,

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_acr_password>",
                "address": "myacr.azurecr.cn"
              }
            }
          }
        },
    //...
    
  2. image 属性值替换为推送到注册表的模块映像名称。 例如,如果为自定义模块 IotEdgeModule1 推送了标记为 myacr.azurecr.cn/iotedgemodule1:0.0.1-amd64 的映像,请使用该标记值替换映像属性值。

  3. 对于部署模板中的每个系统和自定义模块,添加或将 createOptions 替换为字符串化内容。

    例如,IotEdgeModule1 的映像和 createOptions 设置应类似于以下内容:

    "IotEdgeModule1": {
    "version": "1.0.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.cn/iotedgemodule1:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    

使用 IoT Edge Azure CLI set-modules 命令将模块部署到 Azure IoT 中心。 例如,若要将 deployment.debug.amd64.json 文件中定义的模块部署到 IoT Edge 设备 my-device 的 IoT 中心 my-iot-hub,请使用以下命令:

az iot edge set-modules --hub-name my-iot-hub --device-id my-device --content ./deployment.debug.template.json --login "HostName=my-iot-hub.azure-devices.cn;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

提示

可以在 Azure 门户中的“Azure IoT 中心”>“安全设置”>“共享访问策略”下找到 IoT 中心连接字符串。

确认部署到设备

若要检查是否已将 IoT Edge 模块部署到 Azure,请登录到设备或虚拟机(例如通过 SSH 或 Azure Bastion),并运行 IoT Edge 列表命令。

   iotedge list

应会看到在设备或虚拟机上运行的模块列表。

   NAME                        STATUS           DESCRIPTION      CONFIG
   SimulatedTemperatureSensor  running          Up a minute      mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0
   edgeAgent                   running          Up a minute      mcr.microsoft.com/azureiotedge-agent:1.2
   edgeHub                     running          Up a minute      mcr.microsoft.com/azureiotedge-hub:1.2
   IotEdgeModule1              running          Up a minute      myacr.azurecr.cn/iotedgemodule1:0.0.1-amd64.debug
   myIotEdgeModule2            running          Up a minute      myacr.azurecr.cn/myiotedgemodule2:0.0.1-amd64.debug

使用 Docker 远程 SSH 进行调试

Docker 和 Moby 引擎支持与容器的 SSH 连接,让你能使用 Visual Studio 在远程设备上附加和调试代码。

  1. 要远程连接到 Docker,需要根级别权限。 按照以非根用户身份管理 docker 中的步骤操作,以允许连接到远程设备上的 Docker 守护程序。 完成调试后,可能需要从 Docker 组中删除用户。

  2. 按照步骤使用 Visual Studio 在远程设备上附加到 Docker 容器上运行的进程

  3. 在 Visual Studio 中设置自定义模块中的断点。

  4. 命中断点时,可以检查变量、逐步执行代码以及调试模块。

    屏幕截图:在远程设备上附加到 Docker 容器的 Visual Studio(在断点处暂停)。

后续步骤