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

适用于:是图标IoT Edge 1.1 是 1.2

本文展示了如何使用 Visual Studio 2019 开发和调试 Azure IoT Edge 模块。

适用于 Visual Studio 扩展的 Azure IoT Edge 工具具备以下优势:

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

本文介绍如何使用适用于 Visual Studio 2019 的 Azure IoT Edge 工具开发 IoT Edge 模块。 你还将了解如何将项目部署到 IoT Edge 设备。 目前,Visual Studio 2019 为用 C 和 C# 编写的模块提供支持。 支持的设备体系结构为 Windows X64 和 Linux X64 或 ARM32。 有关支持的操作系统、语言和体系结构的详细信息,请参阅语言和体系结构支持

先决条件

本文假设你使用运行 Windows 的计算机作为开发计算机。 在 Windows 计算机上,可以开发 Windows 或 Linux 模块。

  • 若要使用 Windows 容器开发模块,请使用运行版本为 1809/内部版本 17763 或更高版本的 Windows 计算机。
  • 若要使用 Linux 容器开发模块,请使用满足 Docker Desktop 要求的 Windows 计算机。

在开发计算机上安装 Visual Studio Code。 确保在 Visual Studio 2019 安装中包含“Azure 开发”和“使用 C++ 的桌面开发”工作负荷。 可以修改 Visual Studio 2019 以添加所需的工作负荷。

Visual Studio 2019 准备就绪后,还需要以下工具和组件:

  • 从 Visual Studio 市场中下载并安装 Azure IoT Edge 工具,以在 Visual Studio 2019 中创建 IoT Edge 项目。

    提示

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

  • 在开发计算机上下载并安装 Docker 社区版,以生成和运行模块映像。 将 Docker CE 设置为在 Linux 容器模式或 Windows 容器模式下运行,具体取决于待开发模块的类型。

  • 设置本地开发环境,通过安装 Azure IoT EdgeHub 开发工具,调试、运行和测试 IoT Edge 解决方案。 请安装 Python (3.5/3.6/3.7/3.8) 和 Pip,然后在终端中运行以下命令来安装 iotedgehubdev 包。 确保 Azure IoT EdgeHub 开发工具版本高于 0.3.0。

    pip install --upgrade iotedgehubdev
    
  • 安装 Vcpkg 库管理器,然后安装适用于 Windows 的 azure-iot-sdk-c 包。

    git clone https://github.com/Microsoft/vcpkg
    cd vcpkg
    bootstrap-vcpkg.bat
    
    vcpkg.exe install azure-iot-sdk-c:x64-windows
    vcpkg.exe --triplet x64-windows integrate install
    
  • 创建用于存储模块映像的 Azure 容器注册表Docker Hub 实例。

    提示

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

  • 若要在设备上测试模块,至少需要一个 IoT Edge 设备和一个活动的 IoT 中心。 若要快速创建用于测试的 IoT Edge 设备,请按照 LinuxWindows 快速入门中的步骤进行操作。 如果正在开发计算机上运行 IoT Edge 守护程序,则可能需要停止 EdgeHub 和 EdgeAgent,然后再在 Visual Studio 中开始开发。

检查工具版本

  1. 在“扩展”菜单上,选择“管理扩展” 。 展开" 已安装的工具",Azure IoT Edge Tools找到Visual Studio和Cloud Explorer Visual Studio。

  2. 请记下所安装的版本。 可将此版本与 Visual Studio Marketplace 中的最新版本(Cloud ExplorerAzure IoT Edge)进行比较

  3. 如果你的版本比 Visual Studio Marketplace 上的版本旧,则可在 Visual Studio 中更新工具,如以下部分中所示。

更新工具

  1. 在"管理扩展"窗口中,展开"Visual Studio 市场",选择"Azure IoT Edge Tools"或Cloud Explorer"Visual Studio"更新"。

  2. 下载工具更新后,请关闭 Visual Studio 以触发使用 VSIX 安装程序的工具更新。

  3. 在安装程序中,选择“确定”进行启动,然后选择“修改”以更新工具 。

  4. 更新完成后,请选择“关闭”并重启 Visual Studio 。

创建 Azure IoT Edge 项目

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

提示

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

  1. 在 Visual Studio 的“新建项目”对话框中,搜索并选择“Azure IoT Edge” 项目,然后单击“下一步” 。 在“项目配置”窗口中,输入项目的名称并指定位置,然后选择“创建” 。 默认的项目名称为 AzureIoTEdgeApp1 。

    创建新项目

  2. 在“添加 IoT Edge 应用程序和模块” 窗口中,选择“C# 模块” 或“C 模块” ,然后指定模块名称和模块映像存储库。 Visual Studio localhost:5000/ >模块名称 自动填充模块名称。 将其替换为你自己的注册表信息。 如果使用本地 Docker 注册表进行测试,则可以使用 localhost 。 如果使用 Azure 容器注册表,那么请从注册表的设置中使用登录服务器。 登录服务器看起来类似于 注册表名称 .azurecr.cn。 仅替换字符串的 localhost:5000部分,以便最终结果类似于注册表名称 .azurecr.cn/ 模块名称 。 默认模块名称为“IotEdgeModule1”

    添加应用程序和模块

  3. 选择“确定”创建包含使用 C# 或 C 的模块的 Azure IoT Edge 解决方案。

现在,解决方案中已有 AzureIoTEdgeApp1.Linux.Amd64 项目或 AzureIoTEdgeApp1.Windows.Amd64 项目,还有 IotEdgeModule1 项目。 每个 AzureIoTEdgeApp1 项目都有一个文件,该文件定义要针对 IoT Edge 解决方案生成和部署的模块,并定义模块 之间的路由。 默认解决方案自带一个 SimulatedTemperatureSensor 模块和一个 IotEdgeModule1 模块 。 SimulatedTemperatureSensor 模块向 IotEdgeModule1 模块生成模拟数据,而 IotEdgeModule1 模块中的默认代码直接将收到的消息通过管道传输到 Azure IoT 中心 。

若要了解模拟温度传感器的工作原理,请查看 SimulatedTemperatureSensor.csproj 源代码

IotEdgeModule1 项目是一个 .NET Core 2.1 控制台应用程序(如果它是 C# 模块)。 它包含 IoT Edge 设备通过 Windows 容器或 Linux 容器运行时所需的 Docker 文件。 module.json 文件描述模块的元数据。 在 Program.csmain.c 文件中可以找到将 Azure IoT 设备 SDK 用作依赖项的实际模块代码。

开发模块

解决方案随附的默认模块代码位于IotEdgeModule1Program.cs (for C#) 或main.c (C) 。 将设置模块和 deployment.template.json 文件,使你能够生成解决方案,将其推送到容器注册表,然后部署到设备以开始测试,而无需修改任何代码。 生成该模块是为了从源中获取输入(在本例中为模拟数据的 SimulatedTemperatureSensor 模块)并将其通过管道传输到 Azure IoT 中心。

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

使用 IoT Edge 设备连接字符串初始化iotegehubdev

  1. 从 Visual Studio Cloud Explorer 的“主连接字符串”中复制 IoT Edge 设备的连接字符串 。 请勿复制非 Egde 设备的连接字符串,IoT Edge 设备的图标不同于非 Edge 设备的图标。

    复制 Edge 设备连接字符串

  2. 在"工具"菜单中,选择Azure IoT Edge Tools安装程序IoT Edge模拟器",粘贴连接字符串,然后单击"确定"。

    打开设置 Edge 连接字符串窗口

  3. 输入第一步中获取的连接字符串,然后选择“确定” 。

注意

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

生成和调试单个模块

通常,需要先测试和调试每个模块,然后再在具有多个模块的整个解决方案中运行此模块。

  1. 在“解决方案资源管理器”中右键单击“IotEdgeModule1”,并从上下文菜单中选择“设为启动项目” 。

    设置启动项目

  2. F5 或单击下面的按钮以运行模块;首次这样做可能需要 10-20 秒。

    运行模块

  3. 如果模块已成功初始化,你应会看到 .NET Core 控制台应用已启动。

    运行中的模块

  4. 如果使用 C# 进行开发,请设置 Program.cs 中 函数中的断点;如果使用 C,则设置 main.c 中的 函数 PipeMessage()PipeMessage()InputQueue1Callback()InputQueue1Callback()。 然后,可以通过在 Git BashWSL Bash shell 中运行以下命令发送消息,来测试断点。 (无法从 PowerShell 或命令提示符运行 curl 命令。)

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

    调试单个模块

    应触发断点。 可在 Visual Studio“局部变量”窗口中监视变量 。

    提示

    也可使用 PostMan 或其他 API 工具发送消息,而不是

  5. 按 Ctrl + F5 或单击“停止”按钮以停止调试 。

构建并调试具有多个模块的 IoT Edge 解决方案

开发完单个模块之后,需要运行并调试具有多个模块的整个解决方案。

  1. 解决方案资源管理器中,右键单击"AzureIoTEdgeApp1"并选择"添加新模块",向解决方案IoT Edge 模块。 第二个模块的默认名称为“IotEdgeModule2”,将充当另一个管道模块 。

  2. 打开 文件 deployment.template.json ,你将看到模块部分中添加deployment.template.json 将 routes 部分替换为以下内容 。 如果自定义了模块名,请确保更新这些名称以匹配模块名。

        "routes": {
          "IotEdgeModule1ToIoTHub": "FROM /messages/modules/IotEdgeModule1/outputs/* INTO $upstream",
          "sensorToIotEdgeModule1": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule1/inputs/input1\")",
          "IotEdgeModule2ToIoTHub": "FROM /messages/modules/IotEdgeModule2/outputs/* INTO $upstream",
          "sensorToIotEdgeModule2": "FROM /messages/modules/SimulatedTemperatureSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/IotEdgeModule2/inputs/input1\")"
        },
    
  3. 右键单击“AzureIoTEdgeApp1”并从上下文菜单中选择“设置为启动项目” 。

  4. 创建断点,然后按 F5 以同时运行和调试多个模块 。 此时应会看到多个 .NET Core 控制台应用窗口,每个窗口表示一个不同的模块。

    调试多个模块

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

生成并推送映像

  1. 请确保启动项目是 AzureIoTEdgeApp1 。 选择“调试”或“发布”作为配置,以生成模块映像 。

    注意

    选择"调试"Visual Studio使用 生成 Docker 映像。 生成容器映像时,它将在该映像中包含 .NET Core 命令行调试器 VSDBG。 对于生产就绪IoT Edge模块,建议使用 Release 配置,该配置使用不带 VSDBG 的 。

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

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    
  3. 如果使用的是专用注册表(如 Azure 容器注册表),则需要将注册表登录信息添加到文件 deployment.template.json 中的运行时设置。 将占位符替换为实际 ACR 管理员用户名、密码和注册表名。

          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "registry1": {
                "username": "<username>",
                "password": "<password>",
                "address": "<registry name>.azurecr.cn"
              }
            }
          }
    
  4. 在“解决方案资源管理器”中右键单击“AzureIoTEdgeApp1”,选择“构建并推送 IoT Edge 模块”,为每个模块构建并推送 Docker 映像 。

部署解决方案

在用于设置 IoT Edge 设备的快速入门文章中,已使用 Azure 门户部署了一个模块。 还可使用 Cloud Explorer for Visual Studio 部署模块。 为方案和 deployment.json 文件准备好部署清单后,接下来只需要选择一个设备来接收部署即可。

  1. 单击"Cloud Explorer"打开Cloud Explorer。 确保已登录到 Visual Studio 2019。

  2. 在 Cloud Explorer 中,展开订阅并找到要部署的 Azure IoT 中心和 Azure IoT Edge 设备 。

  3. 右键单击 IoT Edge 设备,为其创建部署。 导航到为平台配置的部署清单,该清单位于 Visual Studio 解决方案的config文件夹中,例如

  4. 单击“刷新”按钮以查看与 SimulatedTemperatureSensor 模块以及 $edgeAgent$edgeHub 一起运行的新模块。

查看生成的数据

  1. 若要监视特定 IoT Edge 设备的 D2C 消息,请在“Cloud Explorer”的 IoT 中心内选择该消息,然后单击“操作”窗口中的“开始监视内置事件终结点”。

  2. 若要停止监视数据,请选择“操作”窗口中的“停止监视内置事件终结点” 。

后续步骤

若要开发用于 IoT Edge 设备的自定义模块,请参阅了解并使用 Azure IoT 中心 SDK