Поделиться через


Отладка модулей Azure IoT Edge с помощью Visual Studio Code

Применимо к:IoT Edge 1.5 флажок IoT Edge 1.5

Внимание

IoT Edge 1.5 LTS — это поддерживаемый выпуск. IoT Edge 1.4 LTS достиг срока окончания службы 12 ноября 2024 года. Если вы используете более ранний выпуск, ознакомьтесь с Update IoT Edge.

В этой статье объясняется, как использовать Visual Studio Code для отладки модулей IoT Edge на нескольких языках. На компьютере разработки используйте Visual Studio Code для подключения и отладки модуля в локальном или удаленном контейнере модуля.

В этой статье приведены шаги для двух средств разработки IoT Edge.

  • Azure IoT Edge инструмент разработчика командной строки (CLI). Этот инструмент предпочтителен для разработки.
  • расширение Azure IoT Edge Tools для Visual Studio Code. Расширение находится в режиме обслуживания.

Выберите версию средства с помощью кнопки селектора инструментов в начале этой статьи.

Visual Studio Code поддерживает написание модулей IoT Edge на следующих языках программирования:

  • C# и C# Azure Functions
  • С
  • Python
  • Node.js
  • Java

Azure IoT Edge работает с этими архитектурами устройств:

  • AMD64
  • ARM32v7
  • ARM64

Дополнительные сведения о поддерживаемых операционных системах, языках и архитектурах см. в разделе Поддержка языков и архитектур.

При использовании расширения Visual Studio Code IoT Edge можно также запустить и отладить код модуля в симуляторе IoT Edge.

Вы также можете использовать компьютер разработки Windows и модули отладки в контейнере Linux с помощью IoT Edge для Linux в Windows (EFLOW). Дополнительные сведения об использовании EFLOW для разработки модулей см. в статье Tutorial: разработка модулей IoT Edge с помощью контейнеров Linux с помощью IoT Edge для Linux в Windows.

Если вы не знакомы с возможностями отладки Visual Studio Code, ознакомьтесь с Visual Studio Code отладкой.

Предварительные требования

Вы можете использовать компьютер или виртуальную машину под управлением Windows, macOS или Linux в качестве компьютера разработки. На Windows компьютерах можно разрабатывать модули Windows или Linux. Для разработки модулей Linux используйте компьютер Windows, соответствующий требованиям для Docker Desktop.

Чтобы установить необходимые средства для разработки и отладки, выполните инструкции по Develop Azure IoT Edge с помощью руководства Visual Studio Code.

Установите Visual Studio Code.

Добавьте следующие расширения:

Чтобы выполнить отладку модуля на устройстве, вам потребуется:

  • Активный «IoT Hub» с по крайней мере одним устройством «IoT Edge».
  • Физическое IoT Edge устройство или виртуальное устройство. Создайте виртуальное устройство в Azure, выполнив действия в quickstart для Linux.
  • Кастомный модуль IoT Edge. Чтобы создать пользовательский модуль, выполните действия, описанные в руководстве Develop Azure IoT Edge с помощью Visual Studio Code.

Отладка без контейнера с помощью симулятора IoT Edge

Симулятор IoT Edge — это средство, которое выполняется на компьютере разработки и имитирует поведение одного IoT Edge устройства. Вы можете использовать симулятор IoT Edge для разработки и тестирования модулей IoT Edge без физического устройства или полной среды выполнения устройства IoT Edge.

В следующих шагах отладки предполагается, что вы уже создали пользовательский модуль. Если вы не создали пользовательский модуль, выполните действия, описанные в руководстве Develop Azure IoT Edge с помощью Visual Studio Code.

Отладка модуля без контейнера недоступна при использовании C или Python.

Отладка в режиме подключения с помощью симулятора IoT Edge

Отладка в режиме присоединения недоступна для C или Python.

Отладка модуля с помощью среды выполнения IoT Edge

Каждая папка модуля содержит несколько файлов Docker для разных типов контейнеров. Используйте любой файл, заканчивающийся расширением .debug , чтобы создать модуль для тестирования.

При отладке модулей с помощью этого метода модули выполняются поверх среды выполнения IoT Edge. Устройство IoT Edge и Visual Studio Code может работать на одном компьютере, но обычно Visual Studio Code выполняется на компьютере разработки, а среда выполнения и модули IoT Edge выполняются на другом физическом компьютере. Отладка из Visual Studio Code:

  • Настройте устройство IoT Edge, создайте модули IoT Edge с помощью .debug Dockerfile, а затем разверните на устройстве IoT Edge.
  • Обновите launch.json, чтобы Visual Studio Code мог подключиться к процессу в контейнере на удаленном компьютере. Этот файл можно найти в папке .vscode в вашей рабочей области. Он обновляется каждый раз, когда вы добавляете новый модуль, поддерживающий отладку.
  • Используйте удаленную отладку SSH для подключения к контейнеру на удаленном компьютере.

Создание и развертывание модуля на устройстве IoT Edge

В Visual Studio Code откройте файл манифеста развертывания deployment.debug.template.json. Манифест deployment описывает модули, которые необходимо настроить на целевом IoT Edge устройстве. Перед развертыванием обновите учетные данные Azure Container Registry и образы модулей, используя корректные значения createOptions. Дополнительные сведения о значениях createOption см. в разделе Как настроить параметры создания контейнеров для модулей IoT Edge.

  1. Если вы используете Azure Container Registry для хранения образа модуля, добавьте учетные данные в секцию edgeAgent>settings>registryCredentials в deployment.debug.template.json. Замените myacr собственным именем реестра в обоих местах и укажите пароль и адрес сервера входа. Например:

    "modulesContent": {
    "$edgeAgent": {
      "properties.desired": {
        "schemaVersion": "1.1",
        "runtime": {
          "type": "docker",
          "settings": {
            "minDockerVersion": "v1.25",
            "loggingOptions": "",
            "registryCredentials": {
              "myacr": {
                "username": "myacr",
                "password": "<your_azure_container_registry_password>",
                "address": "myacr.azurecr.io"
              }
            }
          }
        },
    ...
    
  2. Добавьте или замените следующее преобразованное в строку содержимое в значение createOptions для каждой системы (edgeHub и edgeAgent) и пользовательского модуля (например, модуль filtermodule). При необходимости измените значения.

    "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: создание и отправка решения IoT Edge.
  2. Выберите файл deployment.debug.template.json для вашего решения.
  3. В разделе Azure IoT Hub>Devices представления обозревателя Visual Studio Code щелкните правой кнопкой мыши имя устройства IoT Edge для развертывания, а затем выберите Создание развертывания для одного устройства.

    Совет

    Чтобы убедиться, что выбранное устройство является IoT Edge устройством, выберите его, чтобы развернуть список модулей и проверить наличие $edgeHub<>/c0> и $edgeAgent. Каждое IoT Edge устройство включает эти два модуля.

  4. Перейдите к папке config решения, выберите файл deployment.debug.amd64.json, а затем щелкните Select Edge Deployment Manifest (Выбрать манифест развертывания Edge).

Проверьте состояние контейнера с устройства или виртуальной машины, выполнив docker ps команду в терминале. Вы увидите контейнер, указанный после выполнения команды. Если Visual Studio Code и среда выполнения IoT Edge выполняются на том же компьютере, проверьте состояние в представлении Docker Visual Studio Code.

Внимание

Если вы используете частный реестр, например Azure Container Registry для образов, может потребоваться пройти проверку подлинности для отправки образов. Используйте docker login <Azure Container Registry login server> или az acr login --name <Azure Container Registry name> для проверки подлинности.

Вход в Docker

Предоставьте учетные данные реестра контейнеров Docker, чтобы он смог отправить образ контейнера в хранилище в реестре.

  1. Войдите в Docker с помощью учетных данных Azure Container Registry, сохраненных после создания реестра.

    docker login -u <Azure Container Registry username> -p <Azure Container Registry password> <Azure Container Registry login server>
    

    Возможно, вы получите предупреждение системы безопасности, рекомендуемое использовать --password-stdin. Хотя это рекомендуемая практика для рабочих сценариев, она выходит за рамки этого руководства. Дополнительные сведения см. в описании команды docker login в справочнике.

  2. Войдите в Azure Container Registry. Может потребоваться установить Azure CLI, чтобы использовать команду az. Эта команда запрашивает ваше имя пользователя и пароль, указанные в реестре контейнеров в Настройках>Параметры доступа.

    az acr login -n <Azure Container Registry name>
    

Совет

Если вас выкинуло из системы в любой момент во время этого руководства, повторите шаги входа в Docker и Azure Container Registry, чтобы продолжить.

Образ сборочного модуля Docker

Используйте Dockerfile модуля для создания образа Docker.

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

Например, чтобы создать образ для локального реестра или Azure Container Registry, используйте следующие команды:

# 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"

Образ push-модуля 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 Hub. Например, чтобы развернуть модули, определенные в файле deployment.debug.template.json, в IoT Hub my-iot-hub для устройства IoT Edge my-device, используйте следующую команду:

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>"

Совет

Ключ общего доступа IoT Hub можно найти в портале Azure в настройках безопасности вашего IoT Hub >Security settings>Shared access policies>iothubowner.

Отладка модуля

Для отладки модулей на удаленном устройстве используйте отладку удаленного SSH в Visual Studio Code.

Включите удаленную отладку Visual Studio Code путем установки расширения Remote Development. Дополнительные сведения о удалённой отладке в Visual Studio Code см. в разделе Visual Studio Code удалённой разработки.

Дополнительные сведения об использовании удаленной отладки SSH в Visual Studio Code см. в статье Remote Development using SSH.

В представлении отладки Visual Studio Code выберите файл конфигурации отладки для модуля. По умолчанию Dockerfile, параметры контейнера createOptions модуля и launch.json файл используют localhost.

Нажмите кнопку "Начать отладку " или "F5", а затем выберите процесс для присоединения. В представлении отладки Visual Studio Code на левой панели отображаются переменные.

Отладка с помощью удаленного SSH Docker

Движки Docker и Moby поддерживают SSH-подключения к контейнерам, что позволяет выполнять отладку в Visual Studio Code, подключённой к удалённому устройству. Прежде чем использовать эту функцию, необходимо выполнить следующие предварительные требования.

Предварительные требования для удаленной отладки SSH могут отличаться в зависимости от используемого языка. В следующих разделах описана настройка .NET. Дополнительные сведения о других языках см. в "Удаленная разработка с помощью SSH" для общего представления. Сведения о настройке удаленной отладки включены в разделы отладки для каждого языка в документации Visual Studio 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, указывающий на удаленный компьютер. Эта команда позволяет Visual Studio 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.5                            "/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.5                          "/bin/sh -c 'exec /a…"    24 hours ago   Up 6 minutes                                                                                                    
                                           edgeAgent
    
  5. В каталоге .vscode откройте launch.json в Visual Studio Code и добавьте новую конфигурацию. Выберите "Добавить конфигурацию" и выберите соответствующий шаблон удаленного подключения для модуля. Например, следующая конфигурация используется для .NET Core. Измените значение параметра -H в PipeArgs на 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. В представлении отладки Visual Studio Code выберите модуль отладки Remote Debug IoT Edge Module (.NET Core).

  2. Выберите Начать отладку или нажмите клавишу F5. Выберите процесс, к которому нужно подключиться.

  3. В представлении отладки Visual Studio Code отображаются переменные на левой панели.

  4. В Visual Studio Code установите точки останова в пользовательском модуле.

  5. При попадании в точку останова можно проверить переменные, выполнить пошаговое выполнение кода и выполнить отладку модуля.

    Скриншот Visual Studio Code, подключенного к контейнеру Docker на удаленном устройстве, приостановленном в точке останова.

Примечание.

В предыдущем примере показано, как отлаживать модули IoT Edge на удаленных контейнерах. В этом примере добавляется удаленный контекст Docker и изменяются права доступа Docker на удаленном устройстве. После завершения отладки модулей задайте контекст Docker по умолчанию и удалите привилегии из учетной записи пользователя.

См. эту запись блога разработчика Интернета вещей, например с помощью устройства Raspberry Pi.

Следующие шаги

После сборки модуля вы узнаете, как развернуть модули Azure IoT Edge.

Чтобы разрабатывать модули для устройств IoT Edge, изучите и используйте пакеты SDK Azure IoT Hub.