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


Руководство. Разработка модулей 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.

В этом руководстве показано, как разрабатывать и развертывать код на устройстве IoT Edge. модули Azure IoT Edge позволяют развертывать код, который выполняет бизнес-логику непосредственно на устройстве IoT Edge. В руководстве быстрого старта Развертывание кода на устройстве Linux вы настроили устройство IoT Edge и развернули модуль из Azure Marketplace.

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

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

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

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

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

Модуль IoT Edge, создаваемый в этом руководстве, фильтрует данные температуры, создаваемые устройством. Он отправляет сообщения вверх, только если температура превышает заданное пороговое значение. Этот вид анализа на границе помогает уменьшить объем данных, отправляемых в облако и хранящихся в ней.

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

Компьютер для разработки:

  • Используйте собственный компьютер или виртуальную машину.
  • Убедитесь, что компьютер разработчика поддерживает вложенную виртуализацию для запуска контейнерного движка.
  • Для разработки модулей IoT Edge для устройств Linux можно использовать большинство операционных систем, которые запускают подсистему контейнеров. В этом руководстве используется компьютер Windows, но он также указывает на различия в macOS и Linux.
  • Установите Visual Studio Code
  • Установите Azure CLI.

Устройство Azure IoT Edge:

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

  • Используйте бесплатный или стандартный уровень Azure IoT Hub.

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

Совет

Рекомендации по интерактивной отладке в Visual Studio Code или Visual Studio 2022:

В этом руководстве рассматриваются этапы разработки для Visual Studio Code.

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

В этом руководстве описывается разработка модуля IoT Edge. Модуль IoT Edge — это контейнер с исполняемым кодом. Можно развернуть один или несколько модулей на устройстве IoT Edge. Модули выполняют определенные задачи, такие как прием данных из датчиков, очистка и анализ данных или отправка сообщений в IoT Hub. Для получения дополнительной информации см. Понимание модулей Azure IoT Edge.

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

Совет

Если вы используете IoT Edge для Linux в Windows, целевое устройство в вашем сценарии — это виртуальная машина Linux, а не узел Windows.

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

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

Visual Studio Code Visual Studio 2019/2022
Архитектура устройств Linux Linux AMD64
Linux ARM32v7
Операционная система ARM64
Linux AMD64
Linux ARM32
Операционная система ARM64
службы Azure Azure Functions
Azure Stream Analytics
Azure Machine Learning
Языки C
C#
Java
Node.js
Python
C
C#
Дополнительные сведения Azure IoT Edge для Visual Studio Code Azure IoT Edge Инструменты для Visual Studio 2019
Инструменты Azure IoT Edge для Visual Studio 2022

Установка контейнерного движка

Модули IoT Edge упаковываются в контейнеры, поэтому на компьютере разработки требуется система управления контейнерами, совместимая с Docker, для их создания и управления. Docker Desktop — это популярный выбор для разработки, так как он имеет сильную поддержку функций. Docker Desktop на Windows позволяет переключаться между контейнерами Linux и контейнерами Windows, чтобы можно было разрабатывать модули для различных типов устройств IoT Edge.

Используйте документацию Docker для установки Docker на компьютере разработки:

  • Установите Docker Desktop для Windows. При установке Docker Desktop для Windows вам будет предложено использовать контейнеры Linux или Windows. Этот параметр можно изменить в любое время. В этом руководстве используются контейнеры Linux, так как модули предназначены для устройств Linux. Дополнительные сведения см. в разделе Switch между контейнерами Windows и Linux.

  • Установка Docker Desktop для Mac

  • Дополнительные сведения об установке на нескольких платформах Linux см. в статье о Docker CE. Для Windows Subsystem for Linux (WSL) установите Docker Desktop для Windows.

Настройка средств

Установите разработанное на основе Python средство Azure IoT Edge Dev Tool для создания вашего решения IoT Edge. У вас есть два варианта:

Внимание

Средство Azure IoT Edge tools для Visual Studio Code находится в режиме поддержки. Предпочтительным инструментом разработки является средство командной строки (CLI) Azure IoT Edge Dev Tool.

Используйте расширения Интернета вещей для Visual Studio Code для разработки модулей IoT Edge. Эти расширения предлагают шаблоны проектов, автоматизируйте создание манифеста развертывания и позволяет отслеживать устройства IoT Edge и управлять ими. В этом разделе описано, как установить Visual Studio Code и расширение Интернета вещей, а затем настроить учетную запись Azure для управления ресурсами IoT Hub из Visual Studio Code.

  1. Установите расширение Azure IoT Edge.
  2. Установите расширение Azure IoT Hub.
  3. После установки расширений откройте палитру команд, выбрав "Просмотреть > палитру команд".
  4. В палитре команд найдите и выберите Azure IoT Hub: выберите IoT Hub. Следуйте инструкциям, чтобы выбрать подписку Azure и IoT Hub.
  5. Откройте раздел обозревателя Visual Studio Code, выбрав значок на панели действий или выбрав View > Explorer.
  6. В нижней части раздела обозревателя разверните свернутое меню Azure IoT Hub / Devices. Вы увидите устройства и IoT Edge устройства, связанные с выбранным в командной панели IoT Hub.

Установка определенных языковых средств

Установите средства, относящиеся к языку, который вы разрабатываете:

  • .NET Core SDK
  • расширение Visual Studio Code для C#

Создание реестра контейнеров

В этом руководстве вы используете расширения Azure IoT Edge и Azure IoT Hub для создания модуля и создания образа контейнера из файлов. Затем вы отправляете этот образ в реестр, в который хранятся образы и управляют ими. Наконец, вы развернете образ из репозитория для запуска на устройстве IoT Edge.

Внимание

Расширение Azure IoT Edge Visual Studio Code находится в режиме обслуживания.

Для хранения образов контейнеров можно использовать любые реестры, совместимые с Docker. Две популярные службы реестра Docker: Azure Container Registry и Docker Hub. В этом руководстве используется Azure Container Registry.

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

  1. На портале Azure выберите Create a resource>Containers>Container Registry.

  2. Укажите следующие обязательные значения для создания реестра контейнеров:

    Поле значение
    Подписка Выберите подписку из раскрывающегося списка.
    Группа ресурсов Используйте одну и ту же группу ресурсов для всех ресурсов для тестирования, создаваемых в ходе IoT Edge кратких и практических руководств; например, IoTEdgeResources.
    Имя реестра Укажите уникальное имя.
    Расположение Выберите расположение рядом с вами.
    Номер SKU Выберите Базовый.
  3. Нажмите кнопку "Рецензирование и создание", а затем "Создать".

  4. Выберите новый реестр контейнеров в разделе Resources домашней страницы портала Azure, чтобы открыть его.

  5. В левой области реестра контейнеров выберите ключи доступа в меню, расположенном в разделе "Параметры".

    Снимок экрана: расположение меню

  6. Включите Администратора с помощью кнопки переключателя и просмотрите имя пользователя и пароль для вашего реестра контейнеров.

  7. Скопируйте значения для сервера входа, имени пользователя и пароля и сохраните их в удобном месте. В этом учебнике вы будете использовать эти значения для предоставления доступа к реестру контейнеров.

Создание проекта модуля

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

Создание шаблона проектов

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

  1. Создайте каталог для вашего решения в нужном месте. Перейдите в каталог iotedgesolution.

    mkdir c:\dev\iotedgesolution
    cd c:\dev\iotedgesolution
    
  2. Используйте команду iotedgedev solution init для создания решения и настройки Azure IoT Hub на выбранном языке разработки:

    iotedgedev solution init --template csharp
    

Команда iotedgedev solution init предлагает выполнить несколько шагов, в том числе:

  • Проверка подлинности в Azure
  • Выбор подписки Azure
  • Выбор или создание группы ресурсов
  • Выбор или создание Azure IoT Hub
  • Выбор или создание устройства Azure IoT Edge

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

  1. Выберите палитру команд view>.
  2. В палитре команд введите и запустите команду Azure IoT Edge: новое решение IoT Edge.
  3. Перейдите к папке, в которой нужно создать новое решение, а затем выберите " Выбрать папку".
  4. Введите название для вашего решения.
  5. Выберите шаблон модуля для предпочитаемого языка разработки. Он станет первым модулем в решении.
  6. Введите имя модуля. Выберите имя, которое будет уникальным в пределах реестра контейнеров.
  7. Введите имя репозитория образов модуля. Visual Studio Code автоматически заполняет имя модуля localhost:5000/<your module name>. Замените его собственными данными реестра. Используйте localhost , если вы используете локальный реестр Docker для тестирования. Если вы используете Azure Container Registry, используйте сервер Login из параметров реестра. Сервер входа выглядит как <реестр с именем>.azurecr.io. Замените только часть localhost:5000, чтобы окончательный результат выглядел как <имя реестра>.azurecr.io/<ваше имя модуля>.

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

После создания решения эти основные файлы находятся в решении:

  • Папка VSCODE содержит файл конфигурации launch.json.

  • Папка модулей содержит отдельные подпапки для каждого модуля. В каждой вложенной папке файл module.json управляет тем, как создаются и развертываются модули.

  • Env-файл содержит переменные среды. Переменная среды для реестра контейнеров — localhost:5000 по умолчанию.

  • Два файла развертывания модуля ,deployment.template.json и deployment.debug.template.json, перечисляют модули для развертывания на устройстве. По умолчанию список включает в себя IoT Edge системные модули (edgeAgent и edgeHub) и примеры модулей, таких как:

    Примечание.

    Точные установленные модули могут зависеть от выбранного языка.

Установка версии среды выполнения IoT Edge

Последняя стабильная версия IoT Edge системного модуля — 1.5. Задайте для системных модулей значение версии 1.5.

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

Укажите учетные данные реестра агенту IoT Edge

Файл среды хранит учетные данные для реестра контейнеров и предоставляет их среде выполнения IoT Edge. Среде выполнения нужны эти учетные данные для переноса контейнерных образов на устройство IoT Edge.

Расширение IoT Edge пытается извлечь учетные данные реестра контейнеров из Azure и заполнить их в файле среды.

Примечание.

Файл среды создается только в том случае, если вы указали репозиторий образов для модуля. Если вы приняли значения localhost по умолчанию для тестирования и отладки локально, то объявлять переменные среды не требуется.

Проверьте, существуют ли ваши учетные данные. В противном случае добавьте их:

  1. Если Azure Container Registry является реестром, задайте Azure Container Registry имя пользователя и пароль. Получите эти значения из меню Настройки>Ключи доступа на портале Azure.

  2. Откройте ENV-файл в модуле решения.

  3. Добавьте значения username и password, скопированные из реестра контейнеров Azure. Например:

    CONTAINER_REGISTRY_SERVER="myacr.azurecr.io"
    CONTAINER_REGISTRY_USERNAME="myacr"
    CONTAINER_REGISTRY_PASSWORD="<registry_password>"
    
  4. Сохраните изменения в env-файле .

Примечание.

В этом руководстве используются учетные данные администратора для Azure Container Registry, которые удобны для сценариев разработки и тестирования. Когда вы будете готовы к рабочим сценариям, мы рекомендуем использовать вариант аутентификации с минимальными привилегиями, например учетные записи службы или токены, ограниченные репозиторием. Дополнительные сведения см. в разделе Управление доступом к реестру контейнеров.

Целевая архитектура

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

Если вам нужно изменить целевую архитектуру решения, выполните следующие действия.

  1. Откройте палитру команд и найдите Azure IoT Edge: установите целевую платформу по умолчанию для пограничного решения или щелкните значок ярлыка в боковой панели в нижней части окна.
  2. В палитре команд выберите целевую архитектуру из списка параметров.

Целевая архитектура устанавливается при создании образа контейнера на следующем шаге.

Обновление модуля с помощью пользовательского кода

Каждый шаблон включает пример кода, который принимает имитированные данные датчика из модуля SimulatedTemperatureSensor и направляет его в IoT Hub. Пример модуля получает сообщения и передает их. Функциональность конвейера показывает важную концепцию в IoT Edge: как модули взаимодействуют друг с другом.

Каждый модуль может иметь несколько очередей ввода и вывода , объявленных в коде. Центр IoT Edge, работающий на устройстве, направляет сообщения из выходных данных одного модуля в входные данные одного или нескольких модулей. Конкретный код для объявления входных и выходных данных зависит от языков, но концепция одинакова для всех модулей. Дополнительные сведения о маршрутизации между модулями см. в разделе Объявление маршрутов.

Пример кода C#, который поставляется с шаблоном проекта, использует класс ModuleClient из пакета SDK IoT Hub для .NET.

  1. В обозревателе Visual Studio Code откройте modules > filtermodule > ModuleBackgroundService.cs.

  2. filtermodule Перед пространством имен добавьте три using инструкции для типов, которые используются позже:

    using System.Collections.Generic;     // For KeyValuePair<>
    using Microsoft.Azure.Devices.Shared; // For TwinCollection
    using Newtonsoft.Json;                // For JsonConvert
    
  3. temperatureThreshold Добавьте переменную в ModuleBackgroundService класс. Эта переменная задает значение, которое измеряемая температура должна превышать для отправки данных в IoT Hub.

    static int temperatureThreshold { get; set; } = 25;
    
  4. Добавьте классы MessageBody, Machine и Ambient. Эти классы определяют ожидаемую схему текста входящего сообщения.

    class MessageBody
    {
        public Machine machine {get;set;}
        public Ambient ambient {get; set;}
        public string timeCreated {get; set;}
    }
    class Machine
    {
        public double temperature {get; set;}
        public double pressure {get; set;}
    }
    class Ambient
    {
        public double temperature {get; set;}
        public int humidity {get; set;}
    }
    
  5. Найдите функцию ExecuteAsync. Эта функция создает и настраивает объект ModuleClient, позволяющий модулю подключаться к локальной среде выполнения Azure IoT Edge для отправки и получения сообщений. После создания ModuleClient код считывает temperatureThreshold значение из желаемых свойств двойника модуля. Код регистрирует обратный вызов для получения сообщений из центра IoT Edge через конечную точку с именем input1.

    Замените вызов ProcessMessageAsync метода новым, который обновляет имя конечной точки и метод, который вызывается при поступлении входных данных. Кроме того, добавьте SetDesiredPropertyUpdateCallbackAsync метод для обновлений требуемых свойств. Чтобы внести это изменение, замените последнюю строку ExecuteAsync метода следующим кодом:

    // Register a callback for messages that are received by the module.
    // await _moduleClient.SetInputMessageHandlerAsync("input1", PipeMessage, cancellationToken);
    
    // Read the TemperatureThreshold value from the module twin's desired properties
    var moduleTwin = await _moduleClient.GetTwinAsync();
    await OnDesiredPropertiesUpdate(moduleTwin.Properties.Desired, _moduleClient);
    
    // Attach a callback for updates to the module twin's desired properties.
    await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertiesUpdate, null);
    
    // Register a callback for messages that are received by the module. Messages received on the inputFromSensor endpoint are sent to the FilterMessages method.
    await _moduleClient.SetInputMessageHandlerAsync("inputFromSensor", FilterMessages, _moduleClient);
    
  6. Добавьте метод OnDesiredPropertiesUpdate в класс ModuleBackgroundService. Этот метод получает обновления о требуемых свойствах из двойника модуля и обновляет переменную так, чтобы она соответствовала этим свойствам temperatureThreshold. У каждого модуля есть собственный модуль-двойник, что позволяет настроить код, выполняемый в модуле, непосредственно из облака.

    static Task OnDesiredPropertiesUpdate(TwinCollection desiredProperties, object userContext)
    {
        try
        {
            Console.WriteLine("Desired property change:");
            Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    
            if (desiredProperties["TemperatureThreshold"]!=null)
                temperatureThreshold = desiredProperties["TemperatureThreshold"];
    
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error when receiving desired property: {0}", exception);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error when receiving desired property: {0}", ex.Message);
        }
        return Task.CompletedTask;
    }
    
  7. FilterMessages Добавьте метод. Этот метод вызывается всякий раз, когда модуль получает сообщение из центра IoT Edge. Он отфильтровывает сообщения о температуре ниже порогового значения, настроенного с помощью двойника модуля. Он также добавляет MessageType свойство в сообщение со значением Alert.

    async Task<MessageResponse> FilterMessages(Message message, object userContext)
    {
        var counterValue = Interlocked.Increment(ref _counter);
        try
        {
            ModuleClient moduleClient = (ModuleClient)userContext;
            var messageBytes = message.GetBytes();
            var messageString = Encoding.UTF8.GetString(messageBytes);
            Console.WriteLine($"Received message {counterValue}: [{messageString}]");
    
            // Get the message body.
            var messageBody = JsonConvert.DeserializeObject<MessageBody>(messageString);
    
            if (messageBody != null && messageBody.machine.temperature > temperatureThreshold)
            {
                Console.WriteLine($"Machine temperature {messageBody.machine.temperature} " +
                    $"exceeds threshold {temperatureThreshold}");
                using (var filteredMessage = new Message(messageBytes))
                {
                    foreach (KeyValuePair<string, string> prop in message.Properties)
                    {
                        filteredMessage.Properties.Add(prop.Key, prop.Value);
                    }
    
                    filteredMessage.Properties.Add("MessageType", "Alert");
                    await moduleClient.SendEventAsync("output1", filteredMessage);
                }
            }
    
            // Indicate that the message treatment is completed.
            return MessageResponse.Completed;
        }
        catch (AggregateException ex)
        {
            foreach (Exception exception in ex.InnerExceptions)
            {
                Console.WriteLine();
                Console.WriteLine("Error in sample: {0}", exception);
            }
            // Indicate that the message treatment is not completed.
            var moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
            // Indicate that the message treatment is not completed.
            ModuleClient moduleClient = (ModuleClient)userContext;
            return MessageResponse.Abandoned;
        }
    }
    
  8. Сохраните файл ModuleBackgroundService.cs .

  9. В обозревателе Visual Studio Code откройте файл deployment.template.json в рабочей области решения IoT Edge.

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

    Найдите routes раздел в двойнике модуля $edgeHub. Обновите sensorTofiltermodule маршрут, чтобы заменить input1 на inputFromSensor:

    "sensorTofiltermodule": "FROM /messages/modules/tempSensor/outputs/temperatureOutput INTO BrokeredEndpoint(\"/modules/filtermodule/inputs/inputFromSensor\")"
    
  11. Добавьте двойник модуля filtermodule в манифест развертывания. Вставьте следующее содержимое JSON в нижней части modulesContent раздела после двойника модуля $edgeHub :

       "filtermodule": {
           "properties.desired":{
               "TemperatureThreshold":25
           }
       }
    
  12. Сохраните файл deployment.template.json.

Компиляция и загрузка решения

Вы обновили код модуля и шаблон развертывания, чтобы понять некоторые основные понятия развертывания. Теперь вы готовы создать образ контейнера модуля и отправить его в реестр контейнеров.

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

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

"registryCredentials": {
    "myacr": {
        "username": "myacr",
        "password": "<your_acr_password>",
        "address": "myacr.azurecr.io"
    }
}

Добавьте или замените следующий строковый контент значением createOptions для каждой системы (edgeHub и *edgeAgent) и пользовательского модуля (filtermodule и tempSensor). При необходимости измените значения:

"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\"}]}}}"
}

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

Откройте интегрированный терминал Visual Studio Code, выбрав Terminal > Новый терминал.

dotnet publish Используйте команду для создания образа контейнера для архитектуры Linux и amd64. Измените каталог на каталог filtermodule в проекте и выполните dotnet publish команду.

dotnet publish --os linux --arch x64 /t:PublishContainer

В настоящее время шаблон средства iotedgedev предназначен для .NET 7.0, который перестал поддерживаться в мае 2024 года. Обновите проект до целевого .NET версии 8.0 (LTS, поддерживаемая до ноября 2026 г.), изменив файл filtermodule.csproj и изменив значения TargetFramework и PackageReference. Файл filtermodule.csproj должен выглядеть следующим образом:

<Project Sdk="Microsoft.NET.Sdk.Worker">
    <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
    </PropertyGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.Azure.Devices.Client" Version="1.42.0" />
        <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    </ItemGroup>
</Project>

Пометьте образ Docker сведениями реестра контейнеров, версией и архитектурой. Замените myacr собственным именем реестра:

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.1-amd64

Отправить образ Docker модуля

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

  1. Войдите в Docker с помощью учетных данных Azure Container Registry (ACR):

    docker login -u <ACR username> -p <ACR password> <ACR login server>
    

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

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

    az acr login -n <ACR registry name>
    

    Совет

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

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

    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. Replace myacr with your Azure Container Registry name.
    
    az acr login --name myacr
    docker push myacr.azurecr.io/filtermodule:0.0.1-amd64
    

Обновление шаблона развертывания

Обновите шаблон развертывания deployment.template.json с местоположением образа в реестре контейнеров. Например, если вы используете Azure Container Registry myacr.azurecr.io и образ filtermodule:0.0.1-amd64, то обновите конфигурацию 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\"}]}}}"
    }
}

В обозревателе Visual Studio Code щелкните правой кнопкой мыши на файле deployment.template.json и выберите Собрать и Отправить решение IoT Edge.

Команда сборки и отправки запускает три операции. Во-первых,в решении создается папка с именем config, которая содержит полный манифест развертывания на основе информации из шаблона развертывания и других файлов решения. Во-вторых, выполняется docker build для сборки образа контейнера на основе соответствующего файла "dockerfile" для целевой архитектуры. Затем выполняется docker push для передачи репозитория образов в реестр контейнеров.

Этот процесс может занять несколько минут в первый раз, но это быстрее при следующем выполнении команд.

Необязательно. Обновление модуля и образа

При внесении изменений в код модуля необходимо перестроить и отправить образ модуля в реестр контейнеров. Чтобы обновить образ сборки и контейнера, выполните действия, описанные в этом разделе. Этот раздел можно пропустить, если вы не внесите никаких изменений в код модуля.

Откройте файл deployment.amd64.json в папке созданной конфигурации. Имя файла отражает целевую архитектуру, поэтому она отличается, если вы выбрали другую архитектуру.

Обратите внимание, что два параметра, которые ранее имели заполнители, теперь содержат соответствующие значения. В разделе registryCredentials содержатся ваше имя пользователя и пароль реестра, извлеченные из файла .env. У filtermodule находится полный репозиторий образов с тегами имени, версии и архитектуры из файла module.json.

  1. Откройте файл module.json в папке filtermodule.

  2. Измените номер версии для образа модуля. Например, увеличьте номер версии исправления так "version": "0.0.2" , как если бы вы сделали небольшое исправление в коде модуля.

    Совет

    Версии модулей позволяют управлять версиями и проверять изменения на небольшом наборе устройств перед развертыванием обновлений в рабочей среде. Если перед построением и принудительной отправкой вы не увеличите версию модуля, перезапишите репозиторий в реестре контейнеров.

  3. Сохраните изменения в файле module.json .

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

# Build the container image for Linux and amd64 architecture.

dotnet publish --os linux --arch x64

# For local registry:
# Tag the image with version 0.0.2, x64 architecture, and the local registry.

docker tag filtermodule localhost:5000/filtermodule:0.0.2-amd64

# For Azure Container Registry:
# Tag the image with version 0.0.2, x64 architecture, and your container registry information. Replace **myacr** with your own registry name.

docker tag filtermodule myacr.azurecr.io/filtermodule:0.0.2-amd64

Щелкните правой кнопкой мыши файл deployment.template.json и снова выберите Сборка и отправка решения IoT Edge.

Снова откройте файл deployment.amd64.json. Обратите внимание, что система сборки не создает новый файл при повторном запуске команды сборки и отправки. Скорее, одно и то же обновление файла для отражения изменений. Теперь изображение filtermodule указывает на версию 0.0.2 контейнера.

Чтобы дополнительно проверить, что сделала команда сборки и отправки, откройте портал Azure и перейдите в реестр контейнеров. В реестре контейнеров выберите репозитории, а затем filtermodule. Убедитесь, что обе версии образа отправляются в реестр.

Снимок экрана: где можно просмотреть обе версии образа в реестре контейнеров.

Устранение неполадок

Если вы сталкиваетесь с ошибками при создании и отправке образа вашего модуля, это часто связано с настройкой Docker на вашем компьютере для разработки. Чтобы просмотреть конфигурацию, выполните следующие проверки:

  • Вы выполнили команду docker login, используя учетные данные, скопированные из реестра контейнеров? Эти учетные данные отличаются от тех, которые вы используете для входа в Azure.
  • Правильно ли указан репозиторий контейнеров? У вас есть правильное имя реестра контейнеров и правильное имя модуля? Откройте файл module.json в папке filtermodule, чтобы проверить. Значение репозитория должно совпадать с <именем> реестра.azurecr.io/filtermodule.
  • Если для модуля используется другое имя, отличное от filtermodule , это имя согласовано во всем решении?
  • Ваш компьютер использует тот же тип контейнеров, который вы создаете? Это руководство предназначено для устройств Linux IoT Edge, поэтому в Visual Studio Code должно быть указано amd64 или arm32v7 на боковой панели, и Docker Desktop должен использовать контейнеры Linux.

Развертывание модулей на устройстве

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

Используйте команду IoT Edge Azure CLI set-modules для развертывания модулей в Azure IoT Hub. Например, чтобы развернуть модули, определенные в файле deployment.template.json в IoT Hub my-iot-hub для устройства IoT Edge my-device, используйте следующую команду. Замените значения hub-name, device-id и login в строке подключения IoT Hub на собственные.

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

Совет

Найдите строку подключения IoT Hub, включая общий ключ доступа, в портале Azure. Перейдите к IoT Hub и выберите параметры Security > политики общего доступа > iothubowner.

  1. В обозревателе Visual Studio Code в разделе Azure IoT Hub разверните узел Devices, чтобы просмотреть список устройств Интернета вещей.

  2. Щелкните правой кнопкой мыши устройство IoT Edge, на которое нужно развернуть, а затем выберите Создать развертывание для одного устройства.

  3. В проводнике перейдите в папку ​​config и выберите файл deployment.amd64.json.

    Не используйте файл deployment.template.json, у которого нет учетных данных реестра контейнеров или значений образов модуля. Если вы нацелены на устройство Linux ARM32, имя манифеста развертывания deployment.arm32v7.json.

  4. Разверните меню Модули для своего устройства, чтобы просмотреть список развернутых и запущенных модулей. Нажмите кнопку обновления. На устройстве должны отображаться новые модули tempSensor и filtermodule .

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

Просмотр сообщений с устройства

Пример кода модуля получает сообщения через входную очередь и отправляет их через выходную очередь. Манифест развертывания настраивает маршруты, которые отправляют сообщения в filtermodule из tempSensor, а затем перенаправляет сообщения из filtermodule в IoT Hub. Расширения Azure IoT Edge и Azure IoT Hub позволяют просматривать сообщения по мере поступления IoT Hub с устройства.

  1. В обозревателе Visual Studio Code выберите устройство IoT Edge, которое вы хотите отслеживать, а затем выберите Start Monitoring Built-in Event Endpoint.

  2. Просмотрите окно вывода в Visual Studio Code, чтобы увидеть сообщения, поступающие в IoT Hub.

    Снимок экрана окна вывода Visual Studio Code, показывающего сообщения от устройств к облаку.

Просмотр изменений на устройстве

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

Эти команды предназначены для устройства IoT Edge, а не для компьютера разработки. Если вы используете виртуальную машину для устройства IoT Edge, подключитесь к нему. В Azure перейдите на страницу сведений виртуальной машины и выберите Connect для доступа к SSH-подключению.

  • Просмотрите все модули, развернутые на вашем устройстве, и проверьте их состояние:

    iotedge list
    

    Вы увидите четыре модуля: два модуля среды выполнения IoT Edge, tempSensor и filtermodule. Все четыре должны быть перечислены как находящиеся в рабочем состоянии.

  • Просмотрите журналы для определенного модуля:

    iotedge logs <module name>
    

    Имена модулей учитывают регистр букв.

    Журналы tempSensor и filtermodule показывают сообщения, которые они обрабатывают. Модуль edgeAgent запускает другие модули, поэтому журналы содержат сведения о манифесте развертывания. Если модуль не указан или не запущен, проверьте журналы edgeAgent на наличие ошибок. Модуль edgeHub управляет взаимодействием между модулями и IoT Hub. Если модули выполняются, но сообщения не приходят в IoT Hub, проверьте журналы edgeHub на наличие ошибок.

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

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

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

Отменить удаление Azure ресурсов и групп ресурсов невозможно. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали IoT Hub внутри существующей группы ресурсов с ресурсами, которые нужно сохранить, удалите только сам IoT Hub ресурс, а не группу ресурсов.

Чтобы удалить ресурсы:

  1. Войдите на портал Azure, а затем выберите группы Resource.
  2. Выберите имя группы ресурсов, содержащей IoT Edge тестовые ресурсы.
  3. Просмотрите список ресурсов, содержащихся в группе ресурсов. Если вы хотите удалить их все, щелкните Удалить группу ресурсов. Если вы хотите удалить только некоторые из них, выберите каждый ресурс, чтобы удалить их по отдельности.

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

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

Переходите к следующим руководствам, чтобы узнать, как Azure IoT Edge позволяет развертывать облачные службы Azure для обработки и анализа данных на периферии.