Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:
IoT Edge 1.1
Это важно
Дата окончания поддержки IoT Edge 1.1 была 13 декабря 2022 г.. Чтобы получить сведения о поддержке определенного продукта, службы, технологии или API, перейдите на страницу Политика жизненного цикла поддержки Майкрософт. Дополнительные сведения об обновлении до последней версии IoT Edge см. в статье Update IoT Edge.
В этой статье мы создадим три модуля IoT Edge, которые получают сообщения от подчиненных устройств Интернета вещей, обработаем данные с помощью вашей модели машинного обучения, а затем перенаправим результаты анализа в Центр Интернета вещей.
Центр IoT Edge облегчает обмен данными между модулями. Использование Центра IoT Edge в качестве брокера сообщений сохраняет модули независимо друг от друга. Модулям необходимо указывать только те входы, на которые они принимают сообщения, и выходы, на которые они записывают сообщения.
Мы хотим, чтобы устройство IoT Edge выполнило четыре действия для нас:
- Получение данных от ниспадающих устройств.
- Прогнозирование оставшейся полезной жизни (RUL) для устройства, отправляющего данные.
- Отправьте сообщение с помощью RUL для устройства в Центр Интернета вещей. Эта функция может быть изменена для отправки данных только в том случае, если RUL опускается ниже заданного уровня.
- Сохраните данные устройства нижнего уровня в локальный файл на устройстве для IoT Edge. Этот файл данных периодически отправляется в Центр Интернета вещей для уточнения обучения модели машинного обучения. Использование отправки файлов вместо потоковой передачи постоянных сообщений является более экономичным.
Для выполнения этих задач мы используем три пользовательских модуля:
Классификатор RUL: Модуль turboFanRulClassifier, созданный в Обучении и развертывании модели машинного обучения Azure, является стандартным модулем машинного обучения, который предоставляет входные данные под названием amlInput и выходные данные с именем amlOutput. "amlInput ожидает, что входные данные должны выглядеть точно так же, как те, которые мы отправили в веб-службу на базе ACI." Аналогичным образом ,amlOutput возвращает те же данные, что и веб-служба.
Avro writer: Этот модуль получает сообщения во входных данных avroModuleInput и сохраняет сообщение в формате Avro на диск для последующей отправки в Центр Интернета вещей.
Модуль маршрутизатора: Модуль маршрутизатора получает сообщения от подчиненных устройств, а затем форматирует и отправляет сообщения в классификатор. Затем модуль получает сообщения из классификатора и пересылает сообщение в модуль записи Avro. Наконец, модуль отправляет только прогноз RUL в Центр Интернета вещей.
Входы:
- deviceInput: получает сообщения от подчиненных устройств
- rulInput: получает сообщения из amlOutput.
Выходные данные:
- классифицировать: отправляет сообщения в amlInput
- writeAvro: отправляет сообщения в avroModuleInput.
- toIotHub: отправляет сообщения в $upstream, который передает сообщения в подключенный Центр Интернета вещей.
На следующей схеме показаны модули, входные данные, выходные данные и маршруты Центра IoT Edge для полного решения:
Действия, описанные в этой статье, обычно выполняются разработчиком облака.
В этом разделе руководства вы узнаете, как:
- Создайте модуль IoT Edge из пользовательского кода.
- Создайте образ Docker из пользовательского модуля.
- Перенастройка маршрутизации Центра Интернета вещей для поддержки пользовательских модулей.
- Создание, публикация и развертывание пользовательских модулей.
Предпосылки
Эта статья является частью серии руководств по использованию Машинного обучения Azure в IoT Edge. Каждая статья в серии основана на работе, приведенной в предыдущей статье. Если вы попали непосредственно на эту статью, посетите первую статью в серии.
Создание нового решения IoT Edge
Во время выполнения второй из наших двух блокнотов Azure мы создали и опубликовали образ контейнера, содержащий модель RUL. Машинное обучение Azure, в рамках процесса создания образа, было упаковано так, чтобы этот образ можно было развернуть в виде модуля Azure IoT Edge.
На этом шаге мы создадим решение Azure IoT Edge с использованием модуля "Azure Machine Learning" и направим модуль на изображение, опубликованное с помощью Azure Notebooks.
Откройте сеанс удаленного рабочего стола на виртуальной машине разработки.
Откройте папку C:\source\IoTEdgeAndMlSample в Visual Studio Code.
Щелкните правой кнопкой мыши панель обозревателя (в пустом пространстве) и выберите новое решение IoT Edge.
Примите имя решения по умолчанию EdgeSolution.
Выберите Машинное обучение Azure в качестве шаблона модуля.
Назовите модуль turbofanRulClassifier.
Выберите рабочую область машинного обучения. Эта рабочая область — turboFanDemo, созданная в учебнике: Обучение и развертывание модели машинного обучения Azure
Выберите образ, созданный при запуске записной книжки Azure.
Просмотрите решение и обратите внимание на созданные файлы:
deployment.template.json: Этот файл содержит определение каждого модуля в решении. В этом файле необходимо обратить внимание на три раздела:
Учетные данные реестра: Определяет набор пользовательских реестров контейнеров, которые вы используете в решении. Сейчас он должен содержать реестр из рабочей области машинного обучения, где хранится образ машинного обучения Azure. Вы можете иметь любое количество реестров контейнеров, но для простоты мы будем использовать один реестр для всех модулей.
"registryCredentials": { "<your registry>": { "username": "$CONTAINER_REGISTRY_USERNAME_<your registry>", "password": "$CONTAINER_REGISTRY_PASSWORD_<your registry>", "address": "<your registry>.azurecr.io" } }Модули: В этом разделе содержится набор определяемых пользователем модулей, которые идут с этим решением. Определение модуля turbofanRulClassifier указывает на изображение в реестре контейнеров. При добавлении дополнительных модулей в решение они будут отображаться в этом разделе.
"modules": { "turbofanRulClassifier": { "version": "1.0", "type": "docker", "status": "running", "restartPolicy": "always", "settings": { "image": "turbofandemo2cd74296.azurecr.io/edgemlsample:1", "createOptions": {} } } }Маршруты: в этом руководстве мы будем довольно много работать с маршрутами. Маршруты определяют, как модули взаимодействуют друг с другом. Существующий маршрут, определенный шаблоном, не соответствует необходимой маршрутизации.
turbofanRulClassifierToIoTHubУдалите маршрут."$edgeHub": { "properties.desired": { "schemaVersion": "1.0", "routes": { "turbofanRulClassifierToIoTHub": "FROM /messages/modules/turbofanRulClassifier/outputs/* INTO $upstream" }, "storeAndForwardConfiguration": { "timeToLiveSecs": 7200 } } }
deployment.debug.template.json: этот файл является отладочной версией deployment.template.json. Как правило, этот файл следует синхронизировать с содержимым файла deployment.template.json, но это не требуется для этого руководства.
.env: в этом файле необходимо указать имя пользователя и пароль для доступа к реестру.
CONTAINER_REGISTRY_USERNAME_<your registry name>=<ACR username> CONTAINER_REGISTRY_PASSWORD_<your registry name>=<ACR password>Примечание.
При работе с этим руководством используются учетные данные администратора для Реестра контейнеров Azure, что удобно для сценариев разработки и тестирования. Когда вы будете готовы использовать производственные сценарии, мы рекомендуем вариант проверки подлинности с минимальными правами, такой как учетные записи служб. Дополнительные сведения см. в разделе Управление доступом к реестру контейнеров.
Щелкните правой кнопкой мыши файл deployment.template.json в обозревателе Visual Studio Code и выберите "Создать решение IoT Edge".
Обратите внимание, что эта команда создает папку конфигурации с файлом deployment.amd64.json. Этот файл представляет собой конкретный шаблон развертывания для решения.
Добавление модуля маршрутизатора
Затем мы добавим модуль Маршрутизатора в наше решение. Модуль Маршрутизатора управляет несколькими функциями в нашем решении.
- Получение сообщений от подчиненных устройств: по мере поступления сообщений на устройство IoT Edge с подчиненных устройств модуль маршрутизатора получает сообщение и начинает оркестрацию маршрутизации сообщения.
- Отправьте сообщения в модуль классификатора RUL: когда новое сообщение получено от нижестоящего устройства, модуль Маршрутизатора преобразует сообщение в формат, который ожидает классификатор RUL. Маршрутизатор отправляет сообщение в классификатор RUL для прогнозирования. После того как классификатор сделал прогноз, он отправляет сообщение обратно в модуль Маршрутизатора.
- Отправка сообщений RUL в Центр Интернета вещей: когда маршрутизатор получает сообщения от классификатора, он преобразует сообщение только в необходимые сведения, идентификатор устройства и RUL, а также отправляет сокращенное сообщение в Центр Интернета вещей. Дальнейшее уточнение, которое мы не сделали здесь, будет отправлять сообщения в Центр Интернета вещей только в том случае, если прогноз RUL ниже порогового значения (например, если RUL меньше 100 циклов). Фильтрация таким образом снижает объем сообщений и снижает затраты центра Интернета вещей.
- Отправьте сообщение модулю Avro Writer: чтобы сохранить все данные, отправленные нижестоящим устройством, модуль Маршрутизатора отправляет все сообщение, полученное из классификатора, в модуль Avro Writer, который будет сохранять и отправлять данные с помощью отправки файлов Центра Интернета вещей.
Модуль маршрутизатора — это важный элемент решения, который гарантирует, что сообщения обрабатываются в правильном порядке.
Создание модуля и копирование файлов
Щелкните правой кнопкой мыши папку модулей в Visual Studio Code и выберите "Добавить модуль IoT Edge".
Выберите модуль C# для шаблона модуля.
Назовите модуль turbofanRouter.
При появлении запроса репозитория образов Docker используйте реестр из рабочей области машинного обучения (вы можете найти реестр в узле реестра Credentials файла deployment.template.json). Это значение представляет собой полностью квалифицированный адрес реестра, такой как <ваш_реестр>.azurecr.io/turbofanrouter.
Примечание.
В этой статье мы используем реестр контейнеров Azure, созданный рабочей областью Машинного обучения Azure. Это исключительно для удобства. Возможно, мы создали новый реестр контейнеров и опубликовали там модули.
В терминале с помощью командной строки скопируйте файлы из примера модуля в решение.
copy c:\source\IoTEdgeAndMlSample\EdgeModules\modules\turbofanRouter\*.cs c:\source\IoTEdgeAndMlSample\EdgeSolution\modules\turbofanRouter\Примите запрос на перезапись файла program.cs.
Сборка модуля маршрутизатора
В Visual Studio Code выберите Терминал>Настроить задачу сборки по умолчанию.
Выберите "Создать файл tasks.json" из шаблона.
Выберите .NET Core.
Замените содержимое tasks.json следующим кодом.
{ "version": "2.0.0", "tasks": [ { "label": "build", "command": "dotnet", "type": "shell", "group": { "kind": "build", "isDefault": true }, "args": [ "build", "${workspaceFolder}/modules/turbofanRouter" ], "presentation": { "reveal": "always" }, "problemMatcher": "$msCompile" } ] }Сохраните и закройте tasks.json.
Запустите сборку с помощью
Ctrl + Shift + BТерминала> или команды Выполнить задачу сборки.
Настройка маршрутов модулей
Как упоминалось выше, среда выполнения IoT Edge использует маршруты, настроенные в файлеdeployment.template.json для управления обменом данными между слабо связанных модулей. В этом разделе описано, как настроить маршруты для модуля turbofanRouter. Сначала мы рассмотрим входные маршруты, а затем перейдём к выходным данным.
Входные данные
В методе Init() Program.cs мы регистрируем два обратных вызова для модуля:
await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromLeafDevice, LeafDeviceInputMessageHandler, ioTHubModuleClient); await ioTHubModuleClient.SetInputMessageHandlerAsync(EndpointNames.FromClassifier, ClassifierCallbackMessageHandler, ioTHubModuleClient);Первый обратный вызов прослушивает сообщения, отправленные в приемник deviceInput . На приведенной выше схеме мы видим, что мы хотим перенаправить сообщения с любого нижестоящего устройства на входные данные. В файлеdeployment.template.json добавьте маршрут, который сообщает пограничному концентратору направлять любое сообщение, полученное устройством IoT Edge, которое не было отправлено модулем IoT Edge, во вход с именем deviceInput в модуле turbofanRouter.
"leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")"Затем добавьте маршрут для сообщений из модуля rulClassifier в модуль turbofanRouter:
"classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amloutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")"
Выходы
Добавьте четыре дополнительных маршрута в параметр маршрута $edgeHub для обработки выходных данных из модуля Маршрутизатора.
Program.cs определяет метод SendMessageToClassifier(), который использует клиент модуля для отправки сообщения классификатору RUL с помощью маршрута:
"routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")"SendRulMessageToIotHub() использует клиент модуля для отправки только данных RUL для устройства в Центр Интернета вещей через маршрут:
"routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream"SendMessageToAvroWriter() использует клиент модуля для отправки сообщения с данными RUL, добавленными в модуль avroFileWriter.
"routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")"HandleBadMessage() отправляет сбойные сообщения вверх по потоку в Центр Интернета вещей, где они могут быть направлены позже.
"deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
С учетом всех маршрутов, ваш узел "$edgeHub" должен выглядеть следующим образом в формате JSON:
"$edgeHub": {
"properties.desired": {
"schemaVersion": "1.0",
"routes": {
"leafMessagesToRouter": "FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/deviceInput\")",
"classifierToRouter": "FROM /messages/modules/turbofanRulClassifier/outputs/amlOutput INTO BrokeredEndpoint(\"/modules/turbofanRouter/inputs/rulInput\")",
"routerToClassifier": "FROM /messages/modules/turbofanRouter/outputs/classOutput INTO BrokeredEndpoint(\"/modules/turbofanRulClassifier/inputs/amlInput\")",
"routerToIoTHub": "FROM /messages/modules/turboFanRouter/outputs/hubOutput INTO $upstream",
"routerToAvro": "FROM /messages/modules/turbofanRouter/outputs/avroOutput INTO BrokeredEndpoint(\"/modules/avroFileWriter/inputs/avroModuleInput\")",
"deadLetter": "FROM /messages/modules/turboFanRouter/outputs/deadMessages INTO $upstream"
},
"storeAndForwardConfiguration": {
"timeToLiveSecs": 7200
}
}
}
Примечание.
Добавление модуля turbofanRouter создал следующий дополнительный маршрут: turbofanRouterToIoTHub": "FROM /messages/modules/turbofanRouter/outputs/* INTO $upstream Удалите этот маршрут, оставив только указанные выше маршруты в файле deployment.template.json.
Добавить модуль Avro Writer
Модуль Avro Writer имеет две обязанности в нашем решении для хранения сообщений и отправки файлов.
Храните сообщения: когда модуль Avro Write получает сообщение, оно записывает сообщение в локальную файловую систему в формате Avro. Мы используем связывание с помощью монтирования, которое монтирует каталог (в данном случае /data/avrofiles) в путь в контейнере модуля. Это подключение позволяет модулю записывать данные в локальный путь (/avrofiles) и иметь эти файлы, доступные непосредственно с устройства IoT Edge.
Отправка файлов: модуль Avro Writer использует функцию отправки файлов Центра Интернета вещей Azure для отправки файлов в учетную запись хранения Azure. После успешной отправки файла модуль удаляет файл с диска.
Создание модулей и копирование файлов
В Visual Studio Code выберите Вид>Палитра команд, а затем найдите и выберите Python: Интерпретатор.
Выберите установленный Python версии 3.7 или более поздней.
Щелкните правой кнопкой мыши папку модулей в Visual Studio Code и выберите "Добавить модуль IoT Edge".
Выберите Модуль Python.
Присвойте модулю
avroFileWriterимя.При появлении запроса репозитория образов Docker используйте тот же реестр, что и при добавлении модуля маршрутизатора.
Скопируйте файлы из примера модуля в решение.
copy C:\source\IoTEdgeAndMlSample\EdgeModules\modules\avroFileWriter\*.py C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avroFileWriter\Согласитесь на перезапись файла main.py.
Обратите внимание, что filemanager.py и schema.py были добавлены в решение и main.py были обновлены.
Примечание.
При открытии файла Python может появиться запрос на установку pylint. Чтобы пройти этот урок, вам не нужно устанавливать линтер.
Привязка подключения для файлов данных
Как упоминалось ранее, модуль записи зависит от наличия точки связывания для записи файлов Avro в файловую систему устройства.
Добавление каталога на устройство
На портале Azure запустите виртуальную машину устройства IoT Edge, если она не запущена. Подключитесь к нему с помощью SSH. Для подключения требуется DNS-имя, которое можно скопировать на странице обзора виртуальной машины на портале Azure.
ssh -l <user>@<vm name>.<region>.cloudapp.azure.comПосле входа создайте каталог, в который будут храниться сохраненные сообщения нижестоящего устройства.
sudo mkdir -p /data/avrofilesОбновите разрешения каталога, чтобы сделать его записываемым контейнером.
sudo chmod ugo+rw /data/avrofilesУбедитесь, что каталог теперь имеет разрешение на запись (w) для пользователя, группы и владельца.
ls -la /data
Добавление каталога в модуль
Чтобы добавить каталог в контейнер модуля, мы изменим файлы Dockerfile, связанные с модулем avroFileWriter. Существует три файла Dockerfile, связанные с модулем: Dockerfile.amd64, Dockerfile.amd64.debug и Dockerfile.arm32v7. Эти файлы должны храниться в синхронизации, если мы хотим выполнить отладку или развертывание на устройстве arm32. В этой статье основное внимание уделяется только Dockerfile.amd64.
На виртуальной машине разработки откройте файл C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\Dockerfile.amd64 .
Измените файл таким образом, чтобы он выглядел следующим образом:
FROM ubuntu:xenial WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/* RUN pip3 install --upgrade pip COPY requirements.txt ./ RUN pip install -r requirements.txt COPY . . RUN useradd -ms /bin/bash moduleuser RUN mkdir /avrofiles && chown moduleuser /avrofiles USER moduleuser CMD [ "python3", "-u", "./main.py" ]Команды
mkdirиchownинструктируют процесс сборки Docker создать каталог верхнего уровня с именем /avrofiles в образе, а затем сделать moduleuser владельцем этого каталога. Важно, чтобы эти команды вставлялись после добавления пользователя модуля в образ с помощью командыuseraddи перед переключением контекста на moduleuser (USER moduleuser).При необходимости внесите соответствующие изменения в Dockerfile.amd64.debug и Dockerfile.arm32v7.
Добавить конфигурацию привязки в avroFileWriter
Последним шагом создания привязки является обновление файлов deployment.template.json (и deployment.debug.template.json) с помощью сведений о привязке.
Откройте deployment.template.json.
Измените определение модуля для avroFileWriter, добавив
Bindsпараметр, который указывает каталог контейнера /avrofiles на локальный каталог на периферийном устройстве. Определение модуля должно соответствовать следующему примеру:"avroFileWriter": { "version": "1.0", "type": "docker", "status": "running", "restartPolicy": "always", "settings": { "image": "${MODULES.avroFileWriter}", "createOptions": { "HostConfig": { "Binds": [ "/data/avrofiles:/avrofiles" ] } } } }
Привязка подключения для доступа к config.yaml
Нам нужно добавить еще один бинд для модуля записи. Эта привязка предоставляет модулю доступ к чтению строки подключения из файла /etc/iotedge/config.yaml на устройстве IoT Edge. Нам нужна строка подключения, чтобы создать IoTHubClient, чтобы можно было вызвать метод upload_blob_async для отправки файлов в Центр Интернета вещей. Действия по добавлению этой привязки похожи на те, которые описаны в предыдущем разделе.
Обновление прав доступа к каталогу
Подключитесь к устройству IoT Edge с помощью SSH.
ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.comДобавьте разрешение на чтение в файл config.yaml.
sudo chmod +r /etc/iotedge/config.yamlПроверьте правильность установки разрешений.
ls -la /etc/iotedge/Убедитесь, что права доступа для config.yaml: -r--r--r--.
Добавление каталога в модуль
На компьютере разработки откройте файл Dockerfile.amd64 .
Добавьте в файл дополнительный набор
mkdirиchownкоманды, чтобы он выглядел следующим образом:FROM ubuntu:xenial WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends libcurl4-openssl-dev python3-pip libboost-python1.58-dev libpython3-dev && rm -rf /var/lib/apt/lists/\* RUN pip3 install --upgrade pip COPY requirements.txt ./ RUN pip install -r requirements.txt COPY . . RUN useradd -ms /bin/bash moduleuser RUN mkdir /avrofiles && chown moduleuser /avrofiles RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig USER moduleuser CMD "python3", "-u", "./main.py"]Внесите соответствующие изменения в Dockerfile.amd64.debug и Dockerfile.arm32v7.
Обновление конфигурации модуля
Откройте файл deployment.template.json.
Измените определение модуля для avroFileWriter, добавив вторую строку
Bindsв параметр, указывающий каталог контейнера (/app/iotconfig) в локальный каталог на устройстве (/etc/iotedge)."avroFileWriter": { "version": "1.0", "type": "docker", "status": "running", "restartPolicy": "always", "settings": { "image": "${MODULES.avroFileWriter}", "createOptions": { "HostConfig": { "Binds": [ "/data/avrofiles:/avrofiles", "/etc/iotedge:/app/iotconfig" ] } } } }Внесите соответствующие изменения в deployment.debug.template.json.
Установка зависимостей
Модуль записи зависит от двух библиотек Python, fastavro и PyYAML. Нам нужно установить зависимости на нашем компьютере разработки и указать процессу сборки Docker установить их на образе модуля.
PyYAML
На машине для разработки откройте файл
C:\source\IoTEdgeAndMlSample\EdgeSolution\modules\avoFileWriter\requirements.txtи добавьте "pyyaml" на новой строке файла.azure-iothub-device-client~=1.4.3 pyyamlОткройте файл Dockerfile.amd64 и добавьте
pip installкоманду для обновления средств установки.FROM ubuntu:xenial WORKDIR /app RUN apt-get update && \ apt-get install -y --no-install-recommends libcurl4-openssl-dev python3-pip libboost-python1.58-dev libpython3-dev && \ rm -rf /var/lib/apt/lists/\* RUN pip3 install --upgrade pip RUN pip install -U pip setuptools COPY requirements.txt ./ RUN pip install -r requirements.txt COPY . . RUN useradd -ms /bin/bash moduleuser RUN mkdir /avrofiles && chown moduleuser /avrofiles RUN mkdir -p /app/iotconfig && chown moduleuser /app/iotconfig USER moduleuser CMD [ "python3", "-u", "./main.py" ]В командной строке установите pyyaml на компьютер разработки.
pip install pyyaml
Fastavro
В requirements.txtдобавьте fastavro после pyyaml.
azure-iothub-device-client~=1.4.3 pyyaml fastavroУстановите fastavro на компьютер разработки.
pip install fastavro
Перенастройка Центра Интернета вещей
Введя устройство и модули IoT Edge в систему, мы изменили наши ожидания о том, какие данные будут отправляться в центр и для какой цели. Нам нужно перенастроить маршрутизацию в концентраторе, чтобы справиться с новой реальностью.
Примечание.
Перед развертыванием модулей мы перенастроим концентратор, так как некоторые из параметров концентратора, в частности отправка файлов, должна быть правильно настроена для правильного запуска модуля avroFileWriter.
Настройка маршрута для сообщений RUL в Центре Интернета вещей
При использовании маршрутизатора и классификатора мы ожидаем получать регулярные сообщения, содержащие только идентификатор устройства и прогноз RUL для устройства. Мы хотим перенаправить данные RUL в собственное расположение хранилища, где можно отслеживать состояние устройств, создавать отчеты и оповещения о пожарах по мере необходимости. В то же время мы хотим, чтобы все данные, которые продолжают отправляться непосредственно устройством нижнего уровня, еще не подключенным к нашему устройству IoT Edge, продолжали маршрутизироваться в текущее место хранения.
Создание маршрута сообщения RUL
Найдите нужный Центр Интернета вещей на портале Azure.
В меню слева в разделе "Параметры Концентратора" выберите маршрутизацию сообщений.
На вкладке "Маршруты" нажмите кнопку "Добавить".
Назовите маршрут RulMessageRoute.
Выберите Добавить конечную точку справа от селектора Endpoint и выберите Хранилище.
На странице "Добавление конечной точки хранилища " назовите конечную точку ruldata.
Щелкните Выберите контейнер.
На странице учетных записей хранения найдите учетную запись хранения, которую вы используете в рамках этого руководства, которая называется как iotedgeandml<unique suffix>.
Выберите контейнер ruldata и нажмите кнопку "Выбрать".
На странице "Добавить конечную точку хранилища " нажмите кнопку "Создать ", чтобы создать конечную точку хранилища.
Вернитесь на страницу "Добавление маршрута " для запроса маршрутизации, замените
trueследующим запросом:IS_DEFINED($body.PredictedRul) AND NOT IS_DEFINED($body.OperationalSetting1)Разверните раздел "Тест" и раздел "Текст сообщения ". Замените текст сообщения этим примером ожидаемых сообщений:
{ "ConnectionDeviceId": "aaLeafDevice_1", "CorrelationId": "b27e97bb-06c5-4553-a064-e9ad59c0fdd3", "PredictedRul": 132.62721409309165, "CycleTime": 64.0 }Выберите "Тестовый маршрут". Если тест выполнен успешно, появится сообщение "Сообщение совпадает с запросом".
Нажмите кнопку Сохранить.
Обновление маршрута turbofanDeviceDataToStorage
Мы не хотим направлять новые данные прогнозирования в старое расположение хранилища, поэтому обновите маршрут, чтобы предотвратить его.
На странице маршрутизации сообщений Центра Интернета вещей перейдите на вкладку "Маршруты ".
Выберите turbofanDeviceDataToStorage или любое имя, которое вы предоставили исходному маршруту данных устройства.
Обновление запроса маршрутизации до
IS_DEFINED($body.OperationalSetting1)Разверните раздел "Тест" и раздел "Текст сообщения ". Замените сообщение этим примером ожидаемых сообщений:
{ "Sensor13": 2387.96, "OperationalSetting1": -0.0008, "Sensor6": 21.61, "Sensor11": 47.2, "Sensor9": 9061.45, "Sensor4": 1397.86, "Sensor14": 8140.39, "Sensor18": 2388.0, "Sensor12": 522.87, "Sensor2": 642.42, "Sensor17": 391.0, "OperationalSetting3": 100.0, "Sensor1": 518.67, "OperationalSetting2": 0.0002, "Sensor20": 39.03, "DeviceId": 19.0, "Sensor5": 14.62, "PredictedRul": 212.00132402791962, "Sensor8": 2388.01, "Sensor16": 0.03, "CycleTime": 42.0, "Sensor21": 23.3188, "Sensor15": 8.3773, "Sensor3": 1580.09, "Sensor10": 1.3, "Sensor7": 554.57, "Sensor19": 100.0 }Выберите "Тестовый маршрут". Если тест выполнен успешно, появится сообщение "Сообщение совпадает с запросом".
Выберите Сохранить.
Настройка передачи файлов
Настройте функцию отправки файлов Центра Интернета вещей, чтобы модуль записи файлов мог отправлять файлы в хранилище.
В меню слева в Центре Интернета вещей в разделе "Параметры Центра" выберите "Отправить файл".
Выберите контейнер службы хранилища Azure.
Выберите учетную запись хранения из списка.
Выберите контейнер, который начинается с azureml-blobstore, дополненного guid, и нажмите Выбрать.
Выберите Сохранить. Портал уведомляет вас о завершении сохранения.
Примечание.
Мы не включаем уведомление о загрузке для этого руководства, но ознакомьтесь с разделом Получение уведомления о загрузке файла для получения информации о том, как обрабатывать уведомление о загрузке файлов.
Сборка, публикация и развертывание модулей
Теперь, когда мы внесли изменения конфигурации, мы готовы создать образы и опубликовать их в реестре контейнеров Azure. Процесс сборки использует файл deployment.template.json, чтобы определить, какие модули необходимо создать. Параметры для каждого модуля, включая версию, находятся в файле module.json в папке модуля. Процесс сборки сначала запускает построение Docker на Docker-файлах, которые соответствуют текущей конфигурации, обнаруженной в файле module.json, для создания образа. Затем он публикует образ в реестре из файла module.json с тегом версии, соответствующим одному в файле module.json. Наконец, он создает манифест развертывания для конкретной конфигурации (например, deployment.amd64.json), который будет развернут на устройстве IoT Edge. Устройство IoT Edge считывает сведения из манифеста развертывания и на основе инструкций скачивает модули, настраивает маршруты и задает все нужные свойства. Этот метод развертывания имеет два побочных эффекта, которые следует учитывать:
Задержка развертывания: так как среда выполнения IoT Edge должна распознать изменение требуемых свойств, прежде чем начать перенастройку, это может занять некоторое время после развертывания модулей, пока среда выполнения не выберет их и начнет обновлять устройство IoT Edge.
Версии модуля имеют значение: если вы публикуете новую версию контейнера модуля в реестре контейнеров, используя те же теги версий, что и предыдущий модуль, среда выполнения не скачивает новую версию модуля. Он сравнивает тег версии локального образа и нужный образ из манифеста развертывания. Если эти версии соответствуют, среда выполнения не предпринимает никаких действий. Поэтому важно увеличить версию модуля при каждом развертывании новых изменений. Увеличьте версию, изменив свойство версии под свойством тега в файле module.json для изменяющегося модуля. Затем создайте и опубликуйте модуль.
{ "$schema-version": "0.0.1", "description": "", "image": { "repository": "<your registry>.azurecr.io/avrofilewriter", "tag": { "version": "0.0.1", "platforms": { "amd64": "./Dockerfile.amd64", "amd64.debug": "./Dockerfile.amd64.debug", "arm32v7": "./Dockerfile.arm32v7" } }, "buildOptions": [] }, "language": "python" }
Сборка и публикация
На виртуальной машине разработки запустите Docker, если она не запущена.
В Visual Studio Code запустите новый терминал с помощью командной строки и войдите в реестр контейнеров Azure (ACR).
На портале Azure можно найти необходимые значения имени пользователя, пароля и сервера входа. Имя реестра контейнеров имеет формат "turbofandemo<unique id>". В меню слева в разделе "Параметры" выберите "Ключи доступа ", чтобы просмотреть их.
docker login -u <ACR username> -p <ACR password> <ACR login server>
- В Visual Studio Code щелкните правой кнопкой мыши deployment.template.json и выберите команду "Сборка и отправка решения IoT Edge".
Просмотр модулей в реестре
После успешного завершения сборки мы сможем использовать портал Azure для просмотра опубликованных модулей.
Откройте реестр контейнеров Azure для этого руководства. Имя реестра контейнеров имеет формат "turbofandemo<unique id>".
В меню слева в разделе "Службы" выберите репозитории.
Обратите внимание, что созданные модули avrofilewriter и turbofanrouter отображаются как репозитории.
Выберите turbofanrouter и обратите внимание, что вы опубликовали один образ, помеченный как 0.0.1-amd64.
Развертывание модулей на устройстве IoT Edge
Мы создали и настроили модули в нашем решении, теперь мы развернем модули на устройстве IoT Edge.
В Visual Studio Code щелкните правой кнопкой мыши файл deployment.amd64.json в папке конфигурации.
Выберите "Создать развертывание для одного устройства".
Выберите устройство IoT Edge aaTurboFanEdgeDevice.
Обновите панель устройств Центра Интернета вещей Azure в обозревателе Visual Studio Code. Вы должны увидеть, что три новых модуля развернуты, но еще не запущены.
Снова обновите его через несколько минут, и вы увидите, что модули выполняются.
Примечание.
Процесс запуска и стабилизации работы модулей может занять несколько минут. В течение этого времени модули могут запускаться и останавливаться при попытке установить подключение с модулем концентратора IoT Edge.
Диагностика сбоев
В этом разделе мы рассмотрим несколько методов для понимания того, что произошло с модулем или модулями. Часто сбой можно сначала обнаружить по статусу в Visual Studio Code.
Определение неудачных модулей
Visual Studio Code: Просмотрите панель устройств Центра Интернета вещей Azure. Если большинство модулей находятся в состоянии выполнения, но один остановлен, необходимо изучить этот остановленный модуль дальше. Если все модули находятся в остановленном состоянии в течение длительного периода времени, он также может указывать на сбой.
Портал Azure: Перейдите на страницу вашего IoT-хаба в портале и откройте страницу сведений об устройстве (в разделе IoT Edge, выберите ваше устройство), где вы можете обнаружить, что модуль сообщил об ошибке или ни разу не отправил никаких данных в IoT-хаб.
Диагностика с устройства
Авторизовавшись на устройстве IoT Edge (виртуальная машина Linux в нашем случае), вы можете получить доступ к значительной информации о состоянии ваших модулей. Основным механизмом, который мы используем, являются команды Docker, которые позволяют проверять контейнеры и образы на устройстве.
Войдите на устройство IoT Edge:
ssh -l <user>@IoTEdge-<extension>.<region>.cloudapp.azure.comПеречислите все запущенные контейнеры. Мы ожидаем увидеть контейнер для каждого модуля с именем, соответствующим модулю. Кроме того, эта команда отображает точный образ контейнера, включая версию, чтобы вы могли сопоставить его с вашими ожиданиями. Вы также можете перечислить изображения, заменив в команде "container" на "image".
sudo docker container lsПолучите журналы контейнера. Эта команда выводит все, что было записано в StdErr и StdOut в контейнере. Эта команда работает для контейнеров, которые были запущены, а затем остановились по какой-то причине. Также полезно понять, что происходит с контейнерами edgeAgent или edgeHub.
sudo docker container logs <container id>Проверка контейнера. Эта команда предоставляет тонну сведений об изображении. Данные можно фильтровать в зависимости от того, что вы ищете. Например, если вы хотите узнать, правильны ли привязки в avroFileWriter, можно использовать следующую команду:
sudo docker container inspect -f "{{ json .Mounts }}" avroFileWriter | python -m json.toolПодключитесь к работающему контейнеру. Эта команда может быть полезной, если вы хотите проверить контейнер во время её работы.
sudo docker exec -it avroFileWriter bash
Очистка ресурсов
Это руководство является частью набора, в котором каждая статья основывается на работе, выполняемой в предыдущих. Подождите с очисткой ресурсов, пока не завершите последний урок.
Дальнейшие действия
В этой статье мы создали решение IoT Edge в Visual Studio Code с тремя модулями: классификатором, маршрутизатором и средством записи и отправки файлов. Мы настраиваем маршруты, чтобы модули могли взаимодействовать друг с другом на пограничном устройстве. Мы изменили конфигурацию пограничного устройства и обновили Файлы Dockerfile, чтобы установить зависимости и добавить привязку подключений к контейнерам модулей.
Затем мы обновили конфигурацию Центра Интернета вещей для маршрутизации сообщений на основе типа и обработки отправки файлов. При этом мы развернули модули на устройстве IoT Edge и обеспечили правильность работы модулей.
Перейдите к следующей статье, чтобы начать отправку данных и просмотреть решение в действии.