Руководство. Разработка модулей IoT Edge с помощью Visual Studio Code

Область применения:IoT Edge 1.4 checkmark IoT Edge 1.4

Важно!

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

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

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

  • Командная строка средства разработки Azure IoT Edge (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.

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

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

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

Совет

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

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

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

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

При разработке модулей IoT Edge важно понимать разницу между компьютером разработки и целевым устройством IoT Edge, в котором развертывается модуль. Контейнер, созданный для хранения кода модуля, должен соответствовать операционной системе (ОС) целевого устройства. Например, самый распространенный сценарий — это разработка модуля на компьютере под управлением Windows для его использования на устройстве IoT Edge под управлением Linux. В этом случае операционной системой контейнера будет 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
Linux ARM64
Linux AMD64
Linux ARM32
Linux ARM64
Службы Azure; Функции Azure
Azure Stream Analytics
Машинное обучение Azure
Языки 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 Desktop для Windows

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

  • Дополнительные сведения об установке на нескольких платформах Linux см. в статье о Docker CE.

    • В подсистеме Windows для Linux (WSL) установите Docker Desktop для Windows.

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

Установите средство разработки Azure IoT Edge на основе Python, чтобы создать решение IoT Edge. Существует два варианта.

Внимание

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

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

  1. Установите расширение Azure IoT Edge .

  2. Установите расширение Центр Интернета вещей Azure.

  3. После установки расширений откройте палитру команд, выбрав "Просмотреть>палитру команд".

  4. В палитре команд снова найдите и выберите Центр Интернета вещей Azure: выберите Центр Интернета вещей. Следуйте инструкциям, чтобы выбрать подписку Azure и Центр Интернета вещей.

  5. Откройте Visual Studio Code в разделе обозревателя, щелкнув значок на панели действий в левой части, или выбрав Вид>Explorer.

  6. В нижней части раздела "Обозреватель" разверните свернутое меню Устройства/Центр Интернета вещей Azure. Вы увидите устройства и устройства IoT Edge, связанные с Центр Интернета вещей, выбранной в палитре команд.

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

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

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

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

Внимание

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

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

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

  1. На портале Azure выберите Создать ресурс>Контейнеры>Реестр контейнеров.

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

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

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

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

    Screenshot of the Access Keys menu location.

  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, чтобы создать решение и настроить Центр Интернета вещей Azure на выбранном языке разработки.

    iotedgedev solution init --template csharp
    

Сценарий инициализации решения iotedgedev предлагает выполнить несколько шагов, включая следующие:

  • Аутентификация в Azure
  • Выбор подписки Azure
  • Выбор или создание группы ресурсов
  • Выбор или создание Центр Интернета вещей Azure
  • Выбор или создание устройства Azure IoT Edge

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

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

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.4. Задайте для системных модулей значение версии 1.4.

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

Предоставление учетных данных реестра агенту IoT Edge

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

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

Примечание.

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

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

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

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

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

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

Примечание.

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

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

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

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

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

  2. В палитре команд выберите целевую архитектуру из списка параметров.

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

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

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

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

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

  1. В обозревателе Visual Studio Code откройте модули>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. Эта переменная устанавливает значение, которое должно быть измеренной температурой, чтобы данные были отправлены в Центр Интернета вещей.

    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 . Манифест развертывания описывает модули, которые необходимо настроить на целевом устройстве IoT Edge. Перед развертыванием необходимо обновить учетные данные Реестр контейнеров Azure и образы модулей соответствующими createOptions значениями. Дополнительные сведения о значениях createOption см. в разделе "Настройка параметров создания контейнера для модулей IoT Edge".

Если вы используете Реестр контейнеров Azure для хранения образа модуля, добавьте свои учетные данные в раздел параметров>реестраCredent edgeAgent>модулей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, выбрав терминал>"Новый терминал".

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

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

В настоящее время шаблон средства iotedgedev предназначен для .NET 7.0. Если вы хотите настроить другую версию .NET, можно изменить файл filtermodule.csproj и изменить значения TargetFramework и PackageReference . Например, для целевого объекта .NET 8.0 файл 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 модуля push

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

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

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

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

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

    az acr login -n <ACR registry name>
    

    Совет

    Если вы вы выполнили вход в любой момент в этом руководстве, повторите docker и Реестр контейнеров Azure выполнить вход, чтобы продолжить.

  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 myacr.azurecr.io, а образ фильтруется:0.0.1-amd64, обновите конфигурацию фильтра следующим образом:

"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 и выберите Build and Push IoT Edge solution (Создать и отправить решение IoT Edge).

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

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

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

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

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

Обратите внимание, что два параметра, которые имели заполнители, теперь содержат соответствующие значения. Раздел registryCredentials содержит имя пользователя и пароль реестра, полученные из env-файла . Фильтрмодул содержит полный репозиторий образов с тегом имени, версии и архитектуры из файла 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 и выберите Build and Push IoT Edge solution (Создать и отправить решение IoT Edge).

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

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

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

Screenshot of where to view both image versions in your container registry.

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

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

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

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

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

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

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

Совет

Вы можете найти Центр Интернета вещей строка подключения включая общий ключ доступа в портал Azure. Перейдите к параметрам Центр Интернета вещей >политики>>общего доступа iothubowner.

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

  2. Щелкните устройство IoT Edge правой кнопкой мыши, а затем выберите Create Deployment for Single Device (Создание развертывания для одного устройства).

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

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

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

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

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

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

  1. В обозревателе Visual Studio Code щелкните правой кнопкой мыши имя устройства IoT Edge, которое вы хотите отслеживать, и выберите Start Monitoring Built-in Event Endpoint (Начать мониторинг встроенной конечной точки событий).

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

    Screenshot showing where to view incoming device to cloud messages.

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

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

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

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

    iotedge list
    

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

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

    iotedge logs <module name>
    

    Модули IoT Edge учитывают регистр.

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

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

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

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

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

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

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

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

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

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

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

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

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