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

使用 Visual Studio Code 开发和调试 Azure IoT Edge 模块

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

本文介绍如何使用 Visual Studio Code 以多种语言和多个体系结构开发和调试 IoT Edge 模块。 在开发计算机上,可以使用 Visual Studio Code 在本地或远程模块容器中附加和调试模块。

可以选择 Azure IoT Edge 开发工具 CLI 或者“适用于 VS Code 的 Azure IoT Edge 工具”扩展作为 IoT Edge 开发工具。 使用开头的工具选择器按钮选择用于本文的工具选项。

Visual Studio Code 支持使用以下编程语言编写 IoT Edge 模块:

  • C# 和 C# Azure Functions
  • C
  • Python
  • Node.js
  • Java

Azure IoT Edge 支持以下设备体系结构:

  • X64
  • ARM32
  • ARM64

有关支持的操作系统、语言和体系结构的详细信息,请参阅语言和体系结构支持

使用 Visual Studio Code IoT Edge 扩展时,还可以在 IoT Edge 模拟器中启动和调试模块代码。

还可以使用 Windows 开发计算机并使用 IoT Edge for Linux on Windows (EFLOW) 在 Linux 容器中调试模块。 有关使用 EFLOW 开发模块的详细信息,请参阅教程:使用 IoT Edge for Linux on Windows 通过 Linux 容器开发 IoT Edge 模块

如果你不熟悉 Visual Studio Code 的调试功能,请参阅 Visual Studio Code 调试

先决条件

可以使用运行 Windows、macOS 或 Linux 的计算机或虚拟机作为开发计算机。 在 Windows 计算机上,可以开发 Windows 或 Linux 模块。 若要开发 Linux 模块,请使用符合 Docker Desktop 要求的 Windows 计算机。

首先安装 Visual Studio Code,然后添加以下扩展:

若要生成并部署模块映像,需使用 Docker 生成模块映像,并使用容器注册表来保存模块映像:

  • 安装基于 Python 的 Azure IoT Edge 开发工具,以便设置本地开发环境以调试、运行和测试 IoT Edge 解决方案。 如果尚未这样做,请安装 Python (3.6/3.7/3.8) 和 Pip3,然后通过在终端中运行此命令来安装 IoT Edge 开发工具 (iotedgedev)。

    pip3 install iotedgedev
    

    注意

    如果有多个 Python,包括预安装的 Python 2.7(例如在 Ubuntu 或 macOS 上),请确保使用 pip3 来安装 IoT Edge 开发工具 (iotedgedev)。

    有关设置开发计算机的详细信息,请参阅 iotedgedev 开发设置

特定于你正在开发的语言的安装先决条件:

若要在设备上测试模块,需要:

  • 具有至少一个 IoT Edge 设备的有效 IoT 中心。
  • 物理 IoT Edge 设备或虚拟设备。 若要在 Azure 中创建虚拟设备,请按照适用于 LinuxWindows 的快速入门中的步骤操作。

创建 IoT Edge 模块

以下步骤演示如何使用首选开发语言创建 IoT Edge 模块。 首先创建一个解决方案,然后生成该解决方案中的第一个模块。 每个解决方案可以包含多个模块。

IoT Edge 开发工具将 Azure IoT Edge 开发简化为由环境变量驱动的简单命令。 它可帮助你开始使用 IoT Edge 开发容器和 IoT Edge 解决方案基架进行 IoT Edge 开发,其中包含默认模块和所有必需的配置文件。

  1. 为解决方案创建目录。

    mkdir c:\dev\iotedgesolution
    
  2. 使用 iotedgedev solution init 命令创建解决方案并设置 Azure IoT 中心。 使用以下命令为指定的开发语言创建 IoT Edge 解决方案。

    iotedgedev solution init --template csharp
    

    该解决方案包含一个名为 filtermodule 的默认 C# 模块。

iotedgedev solution init 脚本会提示你完成以下几个步骤:

  • 向 Azure 进行身份验证
  • 选择一个 Azure 订阅
  • 选择或创建资源组
  • 选择或创建 Azure IoT 中心
  • 选择或创建 Azure IoT Edge 设备

创建解决方案后,解决方案中有四个项:

  • .vscode 文件夹包含配置文件 launch.json。

  • 一个 modules 文件夹,包含每个模块的子文件夹 。 在每个模块的子文件夹中,module.json 文件控制模块的构建和部署方式。

  • 一个 .env 文件,列出环境变量 。 默认情况下,容器注册表的环境变量为 localhost。 如果 Azure 容器注册表是你的注册表,则需要设置 Azure 容器注册表用户名和密码。 例如,

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    

    在生产场景中,应使用服务主体来提供对容器注册表(而不是 .env 文件)的访问权限。 有关详细信息,请参阅管理容器注册表的访问权限

    注意

    仅当为模块提供了映像存储库时,才会创建环境文件。 如果接受 localhost 默认值在本地进行测试和调试,则不需要声明环境变量。

  • 名为 deployment.template.json 和 deployment.debug.template 的两个模块部署文件列出了要部署到设备的模块。 默认情况下,该列表包括 IoT Edge 系统模块和两个示例模块:

使用 Visual Studio Code 和 Azure IoT Edge 扩展。 首先创建一个解决方案,然后生成该解决方案中的第一个模块。 每个解决方案可以包含多个模块。

  1. 选择“查看”>“命令面板” 。

  2. 在“命令面板”中,输入并运行 Azure IoT Edge: New IoT Edge Solution 命令。

    运行新的 IoT Edge 解决方案

  3. 浏览到要在其中创建新解决方案的文件夹,然后选择“选择文件夹” 。

  4. 输入解决方案的名称。

  5. 选择首选开发语言的模块模板作为解决方案中的第一个模块。

  6. 输入模块的名称。 选择容器注册表中唯一的名称。

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

    提供 Docker 映像存储库

Visual Studio Code 采用你提供的信息,创建一个 IoT Edge 解决方案,然后在新窗口中加载它。

该解决方案中有四个项:

  • 一个 .vscode 文件夹,包含调试配置 。

  • 一个 modules 文件夹,包含每个模块的子文件夹 。 在每个模块的文件夹中有一个 module.json 文件,用于控制模块的构建和部署方式。 需修改此文件,将模块部署容器注册表从 localhost 更改为远程注册表。 现在,只有一个模块。 但是你可以添加更多模块(如果需要)

  • 一个 .env 文件,列出环境变量 。 默认情况下,容器注册表的环境变量为 localhost。 如果 Azure 容器注册表是你的注册表,则需要设置 Azure 容器注册表用户名和密码。 例如,

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<your_acr_password>"
    

    在生产场景中,应使用服务主体来提供对容器注册表(而不是 .env 文件)的访问权限。 有关详细信息,请参阅管理容器注册表的访问权限

    注意

    仅当为模块提供了映像存储库时,才会创建环境文件。 如果接受 localhost 默认值在本地进行测试和调试,则不需要声明环境变量。

  • 名为 deployment.template.json 和 deployment.debug.template 的两个模块部署文件列出了要部署到设备的模块。 默认情况下,该列表包括 IoT Edge 系统模块和示例模块,包括模拟可用于测试的数据的 SimulatedTemperatureSensor 模块。 有关部署清单如何工作的详细信息,请参阅了解如何使用部署清单部署模块和建立路由。 有关模拟温度模块的工作原理的详细信息,请参阅 SimulatedTemperatureSensor.csproj 源代码

设置 IoT Edge 运行时版本

在创建部署资产时,IoT Edge 扩展默认为 IoT Edge 运行时的最新稳定版本。 目前,最新稳定版本是 1.4 版。 如果要为运行 1.1 长期支持版本或 1.0 早期版本的设备开发模块,请更新 Visual Studio Code 中的 IoT Edge 运行时版本以进行匹配。

  1. 选择“查看”>“命令面板” 。

  2. 在命令面板中,输入并运行“Azure IoT Edge: Set default IoT Edge runtime version”命令。

  3. 从列表中选择 IoT Edge 设备正在运行的运行时版本。

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

    ...
    "systemModules": {
       "edgeAgent": {
       ...
          "image": "mcr.microsoft.com/azureiotedge-agent:1.4",
       ...
       "edgeHub": {
       ...
          "image": "mcr.microsoft.com/azureiotedge-hub:1.4",
       ...
    
  4. 选择新的运行时版本后,部署清单会动态更新以反映对运行时模块映像所做的更改。

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

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

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

添加其他模块

若要将更多模块添加到解决方案,请更改为模块目录。

cd modules

从命令面板运行命令 Azure IoT Edge: Add IoT Edge Module。 也可以右键单击 Visual Studio Code 资源管理器视图中的“模块”文件夹或 deployment.debug.template.json 文件,然后选择“添加 IoT Edge 模块” 。

  1. 安装 .NET IoT Edge C# 模板

    dotnet new -i Microsoft.Azure.IoT.Edge.Module
    
  2. 在“模块”文件夹中创建一个新目录文件夹并将目录更改为新文件夹。 例如先使用 mkdir SampleModule,然后使用 cd SampleModule

  3. 使用 IoT Edge .NET 模板添加新的 C# 模块。 例如,以下命令添加了名为 SampleModule 的新模块,并将 module.json 配置为将 myacr.azurecr.io/samplemodule 用作映像存储库。

    dotnet new aziotedgemodule --name SampleModule --repository myacr.azurecr.io/samplemodule
    

    该命令在当前目录中创建模块,并使用存储库信息配置 module.json 文件。

开发模块

解决方案附带的默认 C# 模块代码位于以下位置:

modules/<你的模块名称>/Program.cs

示例模块的设计使你能够生成解决方案,将其推送到容器注册表,然后部署到设备以开始测试,而无需修改任何代码。 示例模块从源(在此示例中为模拟数据的 SimulatedTemperatureSensor 模块)获取输入并通过管道将其传送到 IoT 中心。

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

使用 IoT Edge 模拟器在没有容器的情况下进行调试

模块需要在默认模块代码中使用“ModuleClient”对象,以便它可以启动、运行和路由消息。 还将使用默认输入通道“input1”在模块接收消息时执行操作 。

设置 IoT Edge 模拟器

IoT Edge 模块需要 IoT Edge 环境才能运行和调试。 可以在开发计算机上使用 IoT Edge 模拟器,而不是运行完整的 IoT Edge 安全子系统和运行时。 可以模拟设备以调试具有多个模块的解决方案,也可以模拟单模块应用程序。

选项 1:模拟 IoT Edge 解决方案:

  1. 在左侧的“资源管理器”选项卡中,展开“Azure IoT 中心”部分 。 右键单击 IoT Edge 设备 ID,然后选择“设置 IoT Edge 模拟器”以使用设备连接字符串启动模拟器。
  2. 通过读取集成终端中的进度详细信息,可以看到 IoT Edge 模拟器已成功设置。

选项 2:模拟单个 IoT Edge 模块:

  1. 在 Visual Studio Code 命令面板中,运行“Azure IoT Edge: 启动单模块的 IoT Edge 中心模拟器”命令。

  2. 提供要使用模块进行测试的任何输入的名称。 如果使用的是默认示例代码,则使用值“input1”。

  3. 该命令触发“iotedgehubdev”CLI,然后启动 IoT Edge 模拟器并测试实用程序模块容器 。 如果模拟器已成功以单模块模式启动,则可以在集成终端中看到类似如下的输出。 输出包含一个示例 curl 命令,用于将消息发送到模拟器。 稍后将使用 curl 命令。

    D:\Workspaces\EdgeSolution>iotedgehubdev start -i "input1"
    ...
    

    可以使用 Visual Studio Code 中的 Docker 资源管理视图来查看模块的运行状态。

    屏幕截图显示 VS Code 的“Docker 资源管理器”窗格中的模拟器模块状态。

    edgeHubDev 容器是本地 IoT Edge 模拟器的核心。 它可以在没有 IoT Edge 安全守护程序的情况下在开发计算机上运行,并为本机模块应用或模块容器提供环境设置。 “input”容器公开 REST API 以帮助将消息桥接到模块上的目标输入通道 。

在启动模式下调试模块

模拟器成功启动后,可以调试模块代码。

准备环境以进行调试,在模块中设置断点,并选择要使用的调试配置。

在 Visual Studio Code 集成终端中,将目录更改为 <你的模块名称> 文件夹,然后运行以下命令以构建 .Net Core 应用程序

dotnet build

打开 Program.cs 文件并添加断点。

通过从左侧菜单中选择调试图标或按 Ctrl+Shift+D,导航到 Visual Studio Code 的“调试”视图。 从下拉列表中选择调试配置“<你的模块名称> 本地调试(.NET Core)” 。

注意

如果 .NET Core TargetFrameworklaunch.json 中的程序路径不一致,则需要手动更新 launch.json 中的程序路径以匹配 .csproj 文件中的 TargetFramework,以便 Visual Studio Code 可以成功启动此程序。

  1. 选择“开始调试”或按“F5”开始调试会话。

  2. 在 Visual Studio Code 集成终端中,运行以下命令向模块发送“Hello World”消息 。 这是在前面的步骤中设置 IoT Edge 模拟器时所显示的命令。

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

    注意

    如果使用的是 Windows,请确保 Visual Studio Code 集成终端的 shell 为 Git Bash 或 WSL Bash 。 无法从 PowerShell 或命令提示符运行 curl 命令。

    提示

    还可以使用 PostMan 或其他 API 工具(而不是 curl)来发送消息。

  3. 在 Visual Studio Code 调试视图中,将在左侧面板中看到变量。

  4. 若要停止调试会话,请选择“停止”按钮或按“Shift + F5”,然后在命令面板中运行“Azure IoT Edge: 停止 IoT Edge 模拟器”以停止模拟器并清除。

使用 IoT Edge 模拟器在附加模式下进行调试

默认解决方案包含两个模块,一个是模拟的温度传感器模块,另一个是管道模块。 模拟的温度传感器向管道模块发送消息,然后将消息通过管道传送到 IoT 中心。 在创建的模块文件夹中,有适用于不同容器类型的多个 Docker 文件。 使用以扩展名“.debug”结尾的任何文件来生成用于测试的模块 。

目前,仅支持以附加模式进行调试,如下所示:

  • C# 模块(包括 Azure Functions 的模块)支持在 Linux amd64 容器进行调试
  • Node.js 模块支持在 Linux amd64、arm32v7 容器以及 Windows amd64 容器中进行调试
  • Java 模块支持在 Linux amd64 和 arm32v7 容器中进行调试

提示

可以通过单击 Visual Studio 代码状态栏中的项目来切换 IoT Edge 解决方案的默认平台的选项。

为 IoT Edge 解决方案设置 IoT Edge 模拟器

在开发计算机上,可以启动 IoT Edge 模拟器(而不是安装 IoT Edge 安全守护程序)以运行 IoT Edge 解决方案。

  1. 在左侧的“资源管理器”选项卡中,展开“Azure IoT 中心”部分 。 右键单击 IoT Edge 设备 ID,然后选择“设置 IoT Edge 模拟器”以使用设备连接字符串启动模拟器。

  2. 通过读取集成终端中的进度详细信息,可以看到 IoT Edge 模拟器已成功设置。

生成和运行用于调试的容器并在附加模式下进行调试

  1. 打开模块文件 (Program.csapp.jsApp.java<your module name>.cs) 并添加断点。

  2. 在 Visual Studio Code 资源管理器视图中,右键单击解决方案的 deployment.debug.template.json 文件,然后选择“在模拟器中构建并运行 IoT Edge 解决方案” 。 可以在同一窗口中监视所有模块容器日志。 还可以导航到 Docker 视图以监视容器状态。

    监视变量

  3. 导航至 Visual Studio Code 调试视图,并选择模块的调试配置文件。 调试选项名称应类似于“<你的模块名称> 远程调试”

  4. 选择“开始调试”或按“F5” 。 选择要附加到的进程。

  5. 在 Visual Studio Code 调试视图中,将在左侧面板中看到变量。

  6. 若要停止调试会话,请先选择停止按钮或按“Shift + F5”,然后从命令面板中选择“Azure IoT Edge: 停止 IoT Edge 模拟器”。

注意

上面的示例展示了如何调试容器上的 IoT Edge 模块。 它为模块的容器 createOptions 设置添加了公开的端口。 完成模块的调试后,建议为可用于生产的 IoT Edge 模块删除那些公开的端口。

对于使用 C# 编写的模块(包括 Azure Functions),此示例基于 Dockerfile.amd64.debug 的调试版本,在生成容器映像时这将在容器映像中包括 .NET Core 命令行调试器 (VSDBG)。 对于生产就绪的 IoT Edge 模块,建议在调试完 C# 模块后在不使用 VSDBG 的情况下直接使用 Dockerfile。

使用 IoT Edge 运行时调试模块

每个模块文件夹中都有多个适用于不同容器类型的 Docker 文件。 使用以扩展名“.debug”结尾的任何文件来生成用于测试的模块 。

使用此方法调试模块时,模块在 IoT Edge 运行时之上运行。 IoT Edge 设备和 Visual Studio Code 可位于同一台计算机上;更常见的情况是,Visual Studio Code 位于开发计算机上,IoT Edge 运行时和模块在另一台物理计算机上运行。 若要从 Visual Studio Code 进行调试,必须:

  • 设置 IoT Edge 设备,使用 .debug Dockerfile 生成 IoT Edge 模块,然后将其部署到 IoT Edge 设备。
  • 更新 launch.json,使 Visual Studio Code 能够附加到远程计算机上的容器中的进程。 此文件位于工作区中的 .vscode 文件夹内,每当添加用于支持调试的新模块时,此文件都会更新。
  • 使用远程 SSH 调试附加到远程计算机上的容器。

生成模块并将其部署到 IoT Edge 设备

在 Visual Studio Code 中,打开 deployment.debug.template.json 部署清单文件。 部署清单是一个 JSON 文档,用于描述要在目标 IoT Edge 设备上配置的模块。 在部署之前,需要使用正确的 createOptions 值更新 Azure 容器注册表凭据和模块映像。 若要了解 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.io"
              }
            }
          }
        },
    ...
    
  2. 为列出的每个系统和自定义模块的 createOptions 值添加或替换以下字符串化内容。 请根据需要更改这些值。

    "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    

    例如,filtermodule 配置应类似于以下内容:

    "filtermodule": {
    "version": "1.0",
    "type": "docker",
    "status": "running",
    "restartPolicy": "always",
    "settings": {
        "image": "myacr.azurecr.io/filtermodule:0.0.1-amd64",
        "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
    }
    
  1. 在 Visual Studio Code 命令面板中,运行“Azure IoT Edge: Build and Push IoT Edge solution”命令。
  2. 选择解决方案的 deployment.debug.template.json 文件。
  3. 在 Visual Studio Code 资源管理器视图的“Azure IoT 中心设备”部分中,右键单击 IoT Edge 设备名称进行部署,然后选择“为单个设备创建部署”。

    提示

    若要确认已选择的设备为 IoT Edge 设备,请选择它以展开模块列表并验证是否存在“$ edgeHub”和“$ edgeAgent” 。 每个 IoT Edge 设备都包含这两个模块。

  4. 导航到解决方案的“config”文件夹,选择 deployment.debug.amd64.json 文件,然后选择“选择 Edge 部署清单” 。

可以通过在终端中运行 docker ps 命令来检查容器状态。 如果 Visual Studio Code 和 IoT Edge 运行时在同一台计算机上运行,则还可以在 Visual Studio Code Docker 视图中检查状态。

重要

如果对映像使用专用注册表(如 Azure 容器注册表 (ACR)),可能需要完成身份验证才能推送映像。 使用 docker login <ACR login server>az acr login --name <ACR name> 进行身份验证。

生成模块 Docker 映像

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

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

例如,若要为本地注册表或 Azure 容器注册表生成映像,请使用以下命令:

# Build the image for the local registry

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

# Or build the image for an Azure Container Registry

docker build --rm -f "./modules/filtermodule/Dockerfile.amd64.debug" -t myacr.azurecr.io/filtermodule:0.0.1-amd64 "./modules/filtermodule"

推送模块 Docker 映像

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

docker push <ImageName>

例如:

# Push the Docker image to the local registry

docker push localhost:5000/filtermodule:0.0.1-amd64

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

将模块部署到 IoT Edge 设备。

使用 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.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<SharedAccessKey>"

提示

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

调试模块

打开开发语言的模块文件并添加断点:

将断点添加到文件 Program.cs

若要调试远程设备上的模块,可以在 VS Code 中使用远程 SSH 调试。

若要启用 VS Code 远程调试,请安装远程开发扩展。 有关 VS Code 远程调试的详细信息,请参阅 VS Code 远程开发

有关如何在 VS Code 中使用远程 SSH 调试的详细信息,请参阅使用 SSH 进行远程开发

在 Visual Studio Code 调试视图中,选择模块的调试配置文件。 默认情况下,.debug Dockerfile、模块的容器 createOptions 设置和 launch.json 文件配置为使用 localhost。

选择“开始调试”或选择 F5 。 选择要附加到的进程。 在 Visual Studio Code 调试视图中,将在左侧面板中看到变量。

使用 Docker 远程 SSH 进行调试

Docker 和 Moby 引擎支持与容器的 SSH 连接,允许在连接到远程设备的 VS Code 中进行调试。 需要满足以下先决条件才能使用此功能。

配置 Docker SSH 隧道

  1. 按照 Docker SSH 隧道中的步骤在开发计算机上配置 SSH 隧道。 SSH 隧道需要公钥/私钥对身份验证和定义远程设备终结点的 Docker 上下文。

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

  3. 在 Visual Studio Code 中,使用命令面板 (Ctrl+Shift+P) 发出 Docker Context: Use 命令,以激活指向远程计算机的 Docker 上下文。 此命令使 VS Code 和 Docker CLI 都使用远程计算机上下文。

    提示

    所有 Docker 命令都使用当前上下文。 请记住在完成调试后将上下文更改回默认值。

  4. 若要验证远程 Docker 上下文是否处于活动状态,请列出远程设备上正在运行的容器:

    docker ps
    

    输出应列出远程设备上运行的容器,如下所示:

    PS C:\> docker ps        
    CONTAINER ID   IMAGE                                                             COMMAND                   CREATED        STATUS         PORTS                                                                                                                                   NAMES
    a317b8058786   myacr.azurecr.io/filtermodule:0.0.1-amd64                         "dotnet filtermodule…"    24 hours ago   Up 6 minutes                                                                                                                                           filtermodule
    d4d949f8dfb9   mcr.microsoft.com/azureiotedge-hub:1.4                            "/bin/sh -c 'echo \"$…"   24 hours ago   Up 6 minutes   0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5671->5671/tcp, :::5671->5671/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 1883/tcp   edgeHub
    1f0da9cfe8e8   mcr.microsoft.com/azureiotedge-simulated-temperature-sensor:1.0   "/bin/sh -c 'echo \"$…"   24 hours ago   Up 6 minutes                                                                                                    
                                           tempSensor
    66078969d843   mcr.microsoft.com/azureiotedge-agent:1.4                          "/bin/sh -c 'exec /a…"    24 hours ago   Up 6 minutes                                                                                                    
                                           edgeAgent
    
  5. 在 .vscode 目录中,通过打开 VS Code 中的文件,将新配置添加到 launch.json。 选择“添加配置”,然后选择模块的匹配远程附加模板。 例如,以下配置适用于 .NET Core。 将 PipeArgs 中 -H 参数的值更改为设备 DNS 名称或 IP 地址。

    "configurations": [
    {
      "name": "Remote Debug IoT Edge Module (.NET Core)",
      "type": "coreclr",
      "request": "attach",
      "processId": "${command:pickRemoteProcess}",
      "pipeTransport": {
        "pipeProgram": "docker",
        "pipeArgs": [
          "-H",
          "ssh://user@my-device-vm.eastus.cloudapp.azure.com:22",
          "exec",
          "-i",
          "filtermodule",
          "sh",
    
    

"-c" ], "debuggerPath": "~/vsdbg/vsdbg", "pipeCwd": "${workspaceFolder}", "quoteArgs": true }, "sourceFileMap": { "/app": "${workspaceFolder}/modules/filtermodule" }, "justMyCode": true }, ```

远程调试模块

  1. 在 VS Code 调试视图中,选择调试配置远程调试 IoT Edge 模块 (.NET Core)。

  2. 选择“开始调试”或选择 F5 。 选择要附加到的进程。

  3. 在 Visual Studio Code 调试视图中,将在左侧面板中看到变量。

  4. 在 VS Code 中设置自定义模块中的断点。

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

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

注意

上面的示例展示了如何调试远程容器上的 IoT Edge 模块。 它添加了远程 Docker 上下文,并更改了远程设备上的 Docker 权限。 完成模块调试后,将 Docker 上下文设置为默认,并从用户帐户中删除权限。

有关使用 Raspberry Pi 设备的示例,请参阅此 IoT 开发人员博客文章

后续步骤

生成模块后,了解如何从 Visual Studio Code 部署 Azure IoT Edge 模块

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