Руководство по разработке модулей IoT Edge с помощью контейнеров Linux с помощью IoT Edge для Linux в Windows

Область применения:IoT Edge 1.4 проверка mark IoT Edge 1.4

Внимание

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

В этом руководстве описывается разработка, отладка и развертывание собственного кода на устройстве IoT Edge с помощью IoT Edge для Linux в Windows и Visual Studio 2022. Вы узнаете наиболее распространенный сценарий разработчика для решений IoT Edge, развернув модуль C# на устройстве Linux. Вы развернете и отладите пользовательский модуль Azure IoT Edge, работающий в контейнере Linux в Windows (EFLOW). Даже если вы планируете использовать другой язык или развертывать службу Azure, сведения об инструментах и концепциях разработки, содержащиеся в этом учебнике, будут для вас полезны.

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

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

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

В этом руководстве описано следующее:

  • Настройка компьютера для разработки.
  • Создание проекта с помощью средств IoT Edge для Visual Studio Code.
  • Создание проекта как контейнера и его сохранение в реестре контейнеров Azure.
  • Развертывание кода на устройстве IoT Edge.

Необходимые компоненты

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

После готовности Visual Studio 2022 вам также потребуются следующие средства и компоненты:

  • Скачайте и установите средства Azure IoT Edge из Visual Studio Marketplace. Вы можете использовать расширение средств Azure IoT Edge для создания и создания решения IoT Edge. Предпочтительное средство разработки — это средство разработки Azure IoT Edge в командной строке (CLI). Расширение включает шаблоны проектов Azure IoT Edge, используемые для создания проекта Visual Studio. В настоящее время необходимо установить расширение независимо от используемого средства разработки.

    Важно!

    Расширение Средств Azure IoT Edge для VS 2022 находится в режиме обслуживания. Предпочтительное средство разработки — это средство разработки Azure IoT Edge в командной строке (CLI).

    Совет

    Если вы используете Visual Studio 2019, скачайте и установите средства Azure IoT Edge для VS 2019 из Visual Studio Marketplace.

Облачные ресурсы.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Основные понятия

В этом учебнике рассказывается о разработке модуля IoT Edge. Модуль IoT Edge, а иногда просто модуль, является контейнером с исполняемым кодом. На устройстве IoT Edge можно развернуть один или несколько модулей. Модули выполняют определенные задачи, такие как прием данных с датчиков, выполнение анализа или очистки данных, или отправки сообщений в центр Интернета вещей. Дополнительные сведения см. в статье Understand Azure IoT Edge modules (Общие сведения о модулях Azure IoT Edge).

При разработке модулей IoT Edge важно понимать разницу между компьютером для разработки и целевым устройством IoT Edge, где в конечном итоге будет развернут модуль. Контейнер, созданный для хранения кода модуля, должен соответствовать операционной системе (ОС) целевого устройства. Например, самый распространенный сценарий — это разработка модуля на компьютере под управлением Windows для его использования на устройстве IoT Edge под управлением Linux. В этом случае операционной системой контейнера будет Linux. При прохождении данного учебника помните о разнице между ОС компьютера разработки и ОС контейнера. В этом руководстве вы будете использовать узел Windows для разработки и виртуальную машину IoT Edge для Linux в Windows (EFLOW) для создания и развертывания модулей.

Этот учебник предназначен для устройств с IoT Edge с контейнерами Linux. Вы можете использовать предпочитаемую операционную систему, пока компьютер разработки может запускать контейнеры Linux. Мы рекомендуем использовать Visual Studio для разработки с помощью контейнеров Linux, поэтому это то, что используется в этом руководстве. Вы также можете использовать Visual Studio Code, хотя между этими двумя средствами есть различия в поддержке. Дополнительные сведения см. в статье "Разработка модулей Azure IoT Edge с помощью Visual Studio Code".

Настройка удаленного подключения к docker-cli и подсистеме Docker

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

Первым шагом является настройка docker-cli на компьютере разработки Windows для подключения к удаленному обработчику Docker.

  1. Скачайте предварительно скомпилированную docker.exe версию docker-cli из docker-cli Chocolatey. Вы также можете скачать официальный проект cli из docker/cli GitHub и скомпилировать его, следуя инструкциям репозитория.
  2. Извлеките docker.exe в каталог на компьютере разработки. Например, C:\Docker\bin
  3. Откройте о компьютере ->Системные сведения ->Расширенные параметры системы
  4. Выберите переменные Advanced ->Environment —> в разделе пользовательских переменных проверка путь
  5. Измените переменную Path и добавьте расположение docker.exe
  6. Открытие сеанса PowerShell с повышенными привилегиями
  7. Убедитесь, что интерфейс командной строки Docker доступен с помощью команды
    docker --version
    

Если все было успешно настроено, предыдущая команда должна выводить версию docker, например Docker версии 20.10.12, сборку e91ed57.

Второй шаг — настроить подсистему Docker виртуальной машины EFLOW для принятия внешних подключений и добавить соответствующие правила брандмауэра.

Предупреждение

Предоставление подсистемы Docker внешним подключениям может повысить риски безопасности. Эта конфигурация должна использоваться только для целей разработки. Не забудьте отменить изменения конфигурацию по умолчанию после завершения разработки.

  1. Откройте сеанс PowerShell с повышенными привилегиями и выполните следующие команды.

    # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    
    # Create a copy of the EFLOW VM _docker.service_ in the system folder.
    Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    
    # Replace the service execution line to listen for external connections.
    Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g'  /etc/systemd/system/docker.service"
    
    # Reload the EFLOW VM services configurations.
    Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    
    # Reload the Docker engine service.
    Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    
    # Check that the Docker engine is listening to external connections.
    Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    

    Ниже приведен пример выходных данных.

    PS C:\> # Configure the EFLOW virtual machine Docker engine to accept external connections, and add the appropriate firewall rules.
    PS C:\> Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT"
    PS C:\>
    PS C:\> # Create a copy of the EFLOW VM docker.service in the system folder.
    PS C:\> Invoke-EflowVmCommand "sudo cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Replace the service execution line to listen for external connections.
    PS C:\> Invoke-EflowVmCommand "sudo sed -i 's/-H fd:\/\// -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375/g' /etc/systemd/system/docker.service"
    PS C:\>
    PS C:\> # Reload the EFLOW VM services configurations.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl daemon-reload"
    PS C:\>
    PS C:\> # Reload the Docker engine service.
    PS C:\> Invoke-EflowVmCommand "sudo systemctl restart docker.service"
    PS C:\>
    PS C:\> # Check that the Docker engine is listening to external connections.
    PS C:\> Invoke-EflowVmCommand "sudo netstat -lntp | grep dockerd"
    tcp6       0      0 :::2375                 :::*                    LISTEN      2790/dockerd
    
  2. Последним шагом является проверка подключения Docker к подсистеме Docker виртуальной машины EFLOW. Сначала вам нужен IP-адрес виртуальной машины EFLOW.

    Get-EflowVmAddr
    

    Совет

    Если виртуальная машина EFLOW была развернута без статического IP-адреса, IP-адрес может измениться в перезагрузке ос узла Windows или изменения в сети. Убедитесь, что вы используете правильный IP-адрес виртуальной машины EFLOW каждый раз, когда вы хотите установить удаленное подключение подсистемы Docker.

    Ниже приведен пример выходных данных.

    PS C:\> Get-EflowVmAddr
    [03/15/2022 15:22:30] Querying IP and MAC addresses from virtual machine (DESKTOP-J1842A1-EFLOW)
     - Virtual machine MAC: 00:15:5d:6f:da:78
     - Virtual machine IP : 172.31.24.105 retrieved directly from virtual machine
    00:15:5d:6f:da:78
    172.31.24.105 
    
  3. Используя полученный IP-адрес, подключитесь к подсистеме Docker виртуальной машины EFLOW и запустите пример контейнера Hello-World. Замените <EFLOW-VM-IP> IP-адресом виртуальной машины EFLOW, полученным на предыдущем шаге.

    docker -H tcp://<EFLOW-VM-IP>:2375 run --rm hello-world
    

    Вы увидите, что контейнер загружается, и после выполнения и вывода следующих данных.

    PS C:\> docker -H tcp://172.31.24.105:2375 run --rm hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    2db29710123e: Pull complete
    Digest: sha256:4c5f3db4f8a54eb1e017c385f683a2de6e06f75be442dc32698c9bbe6c861edd
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    

Создание проекта Azure IoT Edge

Шаблон проекта IoT Edge в Visual Studio создает решение, которое можно развернуть на устройства Azure IoT Edge. Сначала нужно создать решение Azure IoT Edge, а затем сформировать в нем первый модуль. Каждое решение IoT Edge может содержать несколько модулей.

Внимание

Структура проекта IoT Edge, созданная Visual Studio, не совпадает с структурой проекта в Visual Studio Code.

В настоящее время интерфейс командной строки средства разработки Azure IoT Edge не поддерживает создание типа проекта Visual Studio. Для создания проекта Visual Studio IoT Edge необходимо использовать расширение Visual Studio IoT Edge.

  1. В Visual Studio создайте проект .

  2. На странице Создание проекта найдите Azure IoT Edge. Выберите проект, соответствующий платформе (модуль Linux IoT Edge) и архитектуру для устройства IoT Edge, и нажмите кнопку "Далее".

  3. На странице Настройка нового проекта введите имя проекта, укажите расположение, а затем выберите команду Создать.

  4. В окне Добавление модуля выберите тип разрабатываемого модуля. Также можно выбрать Существующий модуль, чтобы добавить в разработку существующий модуль IoT Edge. Укажите имя модуля и репозиторий образов модуля.

  5. В URL-адресе репозитория укажите имя репозитория образов модуля. Visual Studio автоматически заполняет имя модуля с помощью localhost:5000/<имя> модуля. Замените его собственными данными реестра. Используйте localhost , если вы используете локальный реестр Docker для тестирования. Если используется Реестр контейнеров Azure, укажите сервер входа, заданный в параметрах реестра. Значение для сервера входа выглядит так: <имя реестра>.azurecr.io. Замените только часть localhost:5000, чтобы конечный результат выглядел как< имя> модуля реестра.azurecr.io/< your.>

  6. Выберите Добавить, чтобы добавить модуль в проект.

    Снимок экрана: добавление приложения и модуля в решение Visual Studio

    Примечание.

    Если у вас есть существующий проект IoT Edge, можно изменить URL-адрес репозитория, открыв файл module.json . URL-адрес репозитория находится в свойстве репозитория JSON-файла.

Теперь у вас есть проект IoT Edge и модуль IoT Edge в решении Visual Studio.

Структура проекта

В решении есть две папки уровня проекта, включая основную папку проекта и одну папку модуля. Например, у вас может быть основная папка проекта с именем AzureIotEdgeApp1 и папка модуля с именем IotEdgeModule1. Основная папка проекта содержит манифест развертывания.

В папке module содержится файл с кодом модуля, который называется Program.cs или main.c, в зависимости от выбранного языка. В этой папке также содержится файл с именем module.json, описывающий метаданные модуля. В различных файлах Docker предоставлены сведения, необходимые для создания модуля в качестве контейнера Windows или Linux.

Манифест развертывания проекта

Измененный манифест развертывания называется deployment.debug.template.json. Этот файл представляет собой шаблон манифеста развертывания IoT Edge, который определяет все модули, которые выполняются на устройстве вместе с тем, как они взаимодействуют друг с другом. Дополнительные сведения о манифестах развертывания см. в статье Сведения о развертывании модулей и настройке маршрутов.

Если открыть этот шаблон развертывания, отобразятся два модуля среды выполнения, edgeAgent и edgeHub, а также настраиваемый модуль, созданный в этом проекте Visual Studio. Также в нем имеется четвертый модуль — SimulatedTemperatureSensor. Этот модуль по умолчанию генерирует смоделированные данные, которые можно использовать для тестирования модулей. Если он не требуется, его можно удалить. Чтобы увидеть, как работает смоделированный датчик температуры, просмотрите исходный код SimulatedTemperatureSensor.csproj.

Задание версии среды выполнения IoT Edge

В настоящее время последняя стабильная версия среды выполнения — 1.4. Вы должны обновить версию среды выполнения IoT Edge до последней стабильной версии или версии, которую вы хотите использовать для устройств.

  1. В Обозреватель решений щелкните правой кнопкой мыши имя основного проекта и выберите "Задать версию среды выполнения IoT Edge".

    Снимок экрана: поиск и выбор пункта меню с именем Set IoT Edge Runtime version.

  2. Используйте раскрывающееся меню, чтобы выбрать версию среды выполнения, под управлением которой работают ваши устройства IoT Edge, а затем нажмите кнопку OK, чтобы сохранить изменения. Если изменения не были сделаны, нажмите кнопку "Отмена ", чтобы выйти.

    В настоящее время расширение не включает выбор последних версий среды выполнения. Если вы хотите задать версию среды выполнения выше 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",
       //...
    
  3. Если вы изменили версию, повторно создайте манифест развертывания, щелкнув правой кнопкой мыши имя проекта и выбрав "Создать развертывание для IoT Edge". Это создает манифест развертывания на основе шаблона развертывания и отображается в папке конфигурации проекта Visual Studio.

  1. Откройте файл манифеста развертывания 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",
        //...
    

Настройка удаленного экземпляра ядра Docker Visual Studio 2022

Используйте расширение средств Azure IoT Edge и настройте его для использования удаленного ядра Docker, работающего внутри виртуальной машины EFLOW.

  1. Выбор средств —>средства Azure IoT Edge —> параметры инструментов IoT Edge...

  2. Замените значение localhost DOCKER_HOST IP-адресом виртуальной машины EFLOW. Если ВЫ не помните IP-адрес, используйте командлет Get-EflowVmAddr EFLOW PowerShell, чтобы получить его. Если IP-адрес виртуальной машины EFLOW равен 172.20.1.100, новое значение должно быть tcp://172.20.1.100:2375.

    Снимок экрана: параметры инструментов IoT Edge

  3. Выберите ОК

Разработка модуля

При добавлении нового модуля он поставляется с кодом по умолчанию, готовым к сборке и развертыванию на устройстве, чтобы можно было начать тестирование, не затрагивая код. Код модуля находится в папке module в файле Program.cs (для C#) или main.c (для C).

Решение по умолчанию создается таким образом, что смоделированные данные из модуля SimulatedTemperatureSensor направляются в ваш модуль, который принимает ввод и отправляет его в центр Интернета вещей.

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

Сборка и отправка одного модуля

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

  1. В Обозреватель решений выберите и выделите папку проекта модуля (например, myIotEdgeModule). Задайте пользовательский модуль в качестве запускаемого проекта. Выберите "Набор проектов" в качестве начального проекта> в меню.

  2. Для отладки модуля Linux C# необходимо обновить файл Dockerfile.amd64.debug , чтобы включить службу SSH. Обновите файл Dockerfile.amd64.debug, чтобы использовать следующий шаблон: Dockerfile для модуля AZURE IoT Edge AMD64 C# с поддержкой удаленной отладки.

    Примечание.

    В случае выбора конфигурации Отладка Visual Studio будет использовать Dockerfile.(amd64|windows-amd64).debug для сборки образов Docker. Это включает отладчик командной строки .Net Core VSDBG в образе контейнера при его создании. Для модулей IoT Edge, готовых для рабочей среды, мы советуем выбрать конфигурацию Выпуск, которая использует Dockerfile.(amd64|windows-amd64) без VSDBG.

    Предупреждение

    Убедитесь, что последняя строка шаблона ENTRYPOINT ["dotnet", "IotEdgeModule1.dll"] имя библиотеки DLL соответствует имени проекта модуля IoT Edge.

    Снимок экрана: настройка шаблона Dockerfile

  3. Чтобы установить подключение SSH к модулю Linux, необходимо создать ключ RSA. Откройте сеанс PowerShell с повышенными привилегиями и выполните следующие команды, чтобы создать новый ключ RSA. Сохраните ключ RSA в той же папке модуля IoT Edge, а имя ключа — id_rsa.

    ssh-keygen -t RSA -b 4096 -m PEM
    

    Снимок экрана: создание ключа SSH

  4. Если вы используете частный реестр, например Реестр контейнеров Azure (ACR), используйте следующую команду Docker, чтобы войти в него. Получить имя пользователя и пароль можно на странице Ключи доступа реестра на портале Microsoft Azure. Если вы используете локальный реестр, вы можете выполнить команду запуска локального реестра.

    docker -H tcp://<EFLOW-VM-IP>:2375 login -u <ACR username> -p <ACR password> <ACR login server>
    
  1. В обозревателе решений щелкните правой кнопкой мыши папку project и выберите пункт Создать и отправить модули IoT Edge, чтобы создать и отправить образ Docker для каждого модуля.

  2. Если вы используете частный реестр, например Реестр контейнеров Azure, необходимо добавить данные для входа в реестр к параметрам среды выполнения, которые находятся в файле deployment.template.json. Замените значения заполнителей фактическим именем администратора ACR, паролем и именем реестра.

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

    Примечание.

    При работе с этой статьей используются учетные данные администратора для Реестра контейнеров Azure, что удобно для сценариев разработки и тестирования. Но после перехода в рабочую среду рекомендуется использовать для проверки подлинности вариант с минимальными правами, например субъект-службу. Дополнительные сведения см. в разделе Управление доступом к реестру контейнеров.

  3. Для доступа к службе SSH модуля необходимо предоставить порт 22. В этом руководстве в качестве порта узла используется 10022, но вы можете указать другой порт, который будет использоваться в качестве порта SSH для подключения к модулю Linux C#. Необходимо добавить сведения о порту SSH в параметр createOptions этого параметра модуля Linux, который находится в файле deployment.debug.template.json.

         "createOptions": {
            "HostConfig": {
               "Privileged": true,
               "PortBindings": {
                     "22/tcp": [
                        {
                           "HostPort": "10022"
                        }
                     ]
               }
            }
         }
    
  4. В Обозреватель решений щелкните правой кнопкой мыши папку проекта и выберите команду "Создать развертывание для IoT Edge", чтобы создать новый json развертывания IoT Edge.

  5. Откройте Cloud Explorer, щелкнув Просмотр>Cloud Explorer. Войдите в Visual Studio 2019.

  6. В Cloud Explorer разверните подписку, найдите Центр Интернета вещей Azure и устройство Azure IoT Edge, которое нужно развернуть.

  7. Щелкните правой кнопкой мыши устройство IoT Edge и выберите команду "Создать развертывание". Перейдите к манифесту отладки развертывания, настроенном для платформы, расположенной в папке конфигурации в решении Visual Studio, например deployment.amd64.json.

Образ Docker модуля сборки

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

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

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

Например, предположим, что командная оболочка находится в каталоге проекта, а имя модуля — 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.io/iotedgemodule1:0.0.1-amd64 "./IotEdgeModule1"

Образ Docker модуля push

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

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.io/iotedgemodule1:0.0.1-amd64

Разверните модуль на устройстве IoT Edge.

В Visual Studio откройте файл манифеста развертывания deployment.debug.template.json в основном проекте. Манифест развертывания — это документ JSON, описывающий модули для настройки на целевом устройстве IoT Edge. Перед развертыванием необходимо обновить учетные данные Реестр контейнеров Azure, образы модулей и соответствующие createOptions значения. Дополнительные сведения о значениях createOption см. в разделе "Настройка параметров создания контейнера для модулей IoT Edge".

  1. Если вы используете Реестр контейнеров Azure для хранения образа модуля, необходимо добавить учетные данные в deployment.debug.template.json в параметры edgeAgent. Например,

    "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. Замените значение свойства изображения именем образа модуля, отправленного в реестр. Например, если вы принудили изображение, помеченное myacr.azurecr.io/iotedgemodule1:0.0.1-amd64 для пользовательского модуля IotEdgeModule1, замените значение свойства изображения значением тега.

  3. Добавьте или замените значение createOptions строковым содержимым для каждого системного и пользовательского модуля в шаблоне развертывания.

    Например, образ IotEdgeModule1 и параметры createOptions будут похожи на следующие:

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

Используйте команду набора модулей Azure CLI IoT Edge для развертывания модулей в Центр Интернета вещей Azure. Например, чтобы развернуть модули, определенные в файле deployment.debug.amd64.json, в Центр Интернета вещей my-iot-hub для устройства IoT Edge используйте следующую команду:

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

  1. В Cloud Обозреватель щелкните правой кнопкой мыши пограничное устройство и обновите его, чтобы увидеть новый модуль, работающий вместе с $edgeAgent и модулями $edgeHub.

Отладка решения

  1. Использование и повышение привилегий сеанса PowerShell выполняют следующие команды.

    1. Получите идентификатор модуля на основе имени, используемого для модуля Linux C#. Обязательно замените <заполнитель имени модуля iot-edge-module> на имя модуля.

      $moduleId = Invoke-EflowVmCommand "sudo docker ps -aqf name=<iot-edge-module-name>"
      
    2. Убедитесь, что $moduleId правильно. Если переменная пуста, убедитесь, что используется правильное имя модуля.

    3. Запуск службы SSH в контейнере Linux

      Invoke-EflowVmCommand "sudo docker exec -it -d $moduleId service ssh start"
      
    4. Откройте порт SSH модуля на виртуальной машине EFLOW (в этом руководстве используется порт 10022)

      Invoke-EflowVmCommand "sudo iptables -A INPUT -p tcp --dport 10022 -j ACCEPT"
      

    Предупреждение

    По соображениям безопасности при каждой перезагрузке виртуальной машины EFLOW правило таблицы IP-адресов удаляется и возвращается к исходным параметрам. Кроме того, служба SSH модуля должна быть запущена вручную.

  2. После успешного запуска службы SSH выберите Debug ->Attach to Process, задайте для типа Подключение ion значение SSH и целевой объект Подключение ion в IP-адрес виртуальной машины EFLOW. Если вы не знаете IP-адрес виртуальной Get-EflowVmAddr машины EFLOW, можно использовать командлет PowerShell. Сначала введите IP-адрес и нажмите клавишу ВВОД. Во всплывающем окне введите следующие конфигурации:

    Поле значение
    Hostname Использование IP-адреса виртуальной машины EFLOW
    порт. 10022 (Или тот, который использовался в конфигурации развертывания)
    Username root
    Тип проверки подлинности Private Key
    Файл закрытого ключа Полный путь к id_rsa, созданному на предыдущем шаге
    Парольная фраза Парольная фраза, используемая для ключа, созданного на предыдущем шаге

    Снимок экрана: подключение к удаленной системе

  3. После успешного подключения к модулю с помощью SSH можно выбрать процесс и выбрать "Присоединить". Для модуля C# необходимо выбрать метод dotnet и подключиться к управляемому (CoreCLR). В первый раз может потребоваться от 10 до 20 секунд.

    Снимок экрана: подключение процесса пограничного модуля.

  4. Задайте точку останова для проверки модуля.

    • При разработке в C#задайте точку останова PipeMessage() в функции в ModuleBackgroundService.cs.
    • Если для разработки используется C, задайте точку остановка в функции InputQueue1Callback() в файле main.c.
  5. Выходные данные SimulatedTemperatureSensor должны быть перенаправлены на входные данные1 пользовательского модуля Linux C#. Точка останова должна быть активирована. Вы можете просмотреть переменные в окне Локальные элементы Visual Studio.

    Снимок экрана: отладка одного модуля

  6. Нажмите клавиши CTRL+F5 или выберите кнопку "Остановить", чтобы остановить отладку.

Очистка ресурсов

Если вы планируете перейти к следующей рекомендуемой статье, можно сохранить созданные и повторно используемые ресурсы и конфигурации. Это же устройство IoT Edge также можно использовать в качестве тестового устройства.

В противном случае вы можете удалить локальные конфигурации и ресурсы Azure, созданные в рамках этой статьи, чтобы избежать расходов.

Удаление ресурсов Azure

Удаление ресурсов и групп ресурсов Azure является необратимым. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали центр Интернета вещей в группе ресурсов, содержащей ресурсы, которые нужно сохранить, удалите только ресурс Центра Интернета вещей, не удаляя всю группу ресурсов.

Удаление ресурсов:

  1. Войдите на портал Azure и щелкните Группы ресурсов.

  2. Выберите группу ресурсов, содержащую тестовые ресурсы IoT Edge.

  3. Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить их все, щелкните Удалить группу ресурсов. Если вы хотите удалить только некоторые из них, щелкните нужные ресурсы отдельно.

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

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