Azure IoT Edge и SQL Edge: перенос облачных нагрузок на «наземные» устройства

  • Tutorial

Azure IoT Edge — это дополнение к IoT Hub, которое позволяет обрабатывать часть данных и обрабатывать события локально, а не в облаке, уменьшать объем передаваемых в облако данных, а также обеспечивать работу системы при пропадании соединения с облаком.


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


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


Также мы настроим IoT Hub в Azure, развернем среду выполнения IoT Edge на Windows 10 IoT и Linux, настроим и подключим к облаку эмулированный датчик; рассмотрим установку и настройку SQL Edge.


Вопросы терминологии


"Край" — калька с английского "edge", возможно, не совсем удачная, но вполне прижившаяся. Означает именно "край" устройства/устройств Интернета вещей, т.е. та наземная часть, которая непосредственно подключается к облаку, но еще не является самим облаком. Термин "вычисления на краю" (калька с "edge computing") уже является устоявшимся, хотя более удачными видятся "периферийные вычисления" или "граничные вычисления". В данном материале мы будем пользоваться именно устоявшимся термином "вычисления на краю".


Вычисления "на краю" — это принцип построения инфраструктуры, при котором вычислительные ресурсы частично перемещаются из дата-центров на периферию и располагаются в непосредственной близости от места создания первичных ("сырых") данных для их первичной обработки перед передачей вышестоящему вычислительному узлу. Таким образом, сбор и анализ данных производится не в централизованной вычислительной среде, а там, где происходит генерация потоков данных. Подробнее.

Проблемы Интернета вещей


Хотя Интернет вещей, поддерживаемый новыми технологиями, бурно развивается, все еще остается актуальным ряд проблем.


Со стороны облака:


  • Высокий объем собираемых данных телеметрии. Действительно, если производится передача данных с наземных устройств в облако без предварительной обработки, оптимизации, объем данных в крупных решениях может быть огромным. Не все наземные устройства могут оптимизировать передаваемые данные или выделять из них только нужные, "прореживать" их. Хотя Azure позволяет принимать и обрабатывать такие объемы данных, оптимизация этих объемов находится в интересах разработчиков, так как позволяет сократить затраты на обслуживание решения: снизится и стоимость хранения данных, и стоимость их передачи, и стоимость вычислительных ресурсов для их обработки;
  • При обработке телеметрии "только в облаке" невозможно быстро отреагировать на некоторые события: время реакции может составлять несколько секунд (время на отправку данных в облако, их обработку, передачу команды обратно на устройство). В некоторых решениях, например, в беспилотных автомобилях, требующих немедленной реакции, в реальном времени, такой сценарий неприемлем;
  • Облако может быть не всегда доступно из-за проблем с Интернет-соединением. Данная сложность должна быть решена разработчиками решения "на краю".

Когда эти проблемы пытаются решить путем обработки данных "на краю", появляются новые сложности:


  • Высокий "порог входа" для разработчиков таких решений. Требуется разработка на всех уровнях: иногда от аппаратного обеспечения до соединения с облаком;
  • Вынужденная необходимость писать собственный код практически для всего, т.е. отсутствие какой-либо стандартизации решения;
  • Ручная настройка и интеграция решения, т.е. в итоге отсутствие какого-либо реального его масштабирования.

Что со всем этим делать?


IoT Edge предлагает изящное решение этих проблем, которое заключается в применении стандартизованного, многофункционального решения, в котором комбинируются лучшие практики с обеих сторон: облака и "края".


Мы по-прежнему получаем все преимущества облака:


  • Возможности удаленного мониторинга и управления;
  • Объединение телеметрии с большого количества устройств Интернета вещей;
  • Практически неограниченные объемы хранилища и вычислительной мощности, например, для искусственного интеллекта и машинного обучения.

Эти преимущества в IoT Edge дополняются возможностями обработки "на краю":


  • Цикл управления с низкой латентностью. Это означает реакцию на внешние события, близкую к реальному времени. Мы говорим именно "близкую", т.к. у термина "реальное время" есть достаточно строгое определение, здесь же "реальное время" употребляется в бытовом понимании. Подробнее о реальном времени можно прочитать здесь;
  • Возможности трансляции протоколов. Не все устройства Интернета вещей поддерживают типовые протоколы для подключения к Azure (обычно речь идет об HTTP, MQTT, AMQP). Например, у устройства интернета вещей вообще может не быть сетевого интерфейса. IoT Edge может выполнять роль универсального шлюза для таких устройств;
  • Возможность "прореживания" данных "на краю": можно отправлять не все данные, а только необходимые, или, например, только информацию о возникающих событиях, тем самым экономить трафик и хранилище в облаке;
  • Возможность не выносить чувствительные данные или интеллектуальную собственность в облако, что может быть актуально для некоторых предприятий в связи с юридическими требованиями.

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


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


Кроме того, в Azure IoT Hub уже есть все средства подключения и удаленного управления для IoT Edge.


Архитектура IoT Edge


IoT Edge состоит из трех компонентов:


  • Модули — это контейнеры, в которых выполняются службы Azure, сторонние службы, или ваш собственный код. Модули можно развернуть на устройство IoT Edge, и они будут выполняться локально;
  • Среда выполнения — работает на каждом устройстве IoT Edge и управляет всеми модулями на этом устройстве;
  • Облачный интерфейс — позволяет удаленно наблюдать и управлять устройством IoT Edge. Фактически на самом устройстве производится только начальная настройка, а все дальнейшее управление — через Azure.

Подключение Azure IoT Edge недоступно в редакции IoT Hub Basic.

Модули IoT Edge


Модуль IoT Edge — это единица исполнения, реализованная в виде Docker-совместимого контейнера, в котором содержится вся необходимая логика. Несколько модулей могут быть настроены на обмен данными друг с другом. Можно разрабатывать собственные модули или "упаковать" некоторые из служб Azure в модули так, что они будут работать на устройстве IoT Edge без подключения к облаку.


"Оборачивание" служб Azure в модули позволяет пользоваться всеми преимуществами потоковой аналитики, машинного обучения, распознавания изображений и других сервисов без разработки кода. В Azure Marketplace доступны также готовые модули сторонней разработки.


Собственные модули можно разрабатывать на Java, .NET Core 2.0, Node.js, C, Python.


Кроме того, контейнеризация логики в виде модулей позволяет динамически встраивать новую логику на системах, где это обычно требует пересборки образа (Yocto Linux).


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


Среда выполнения IoT Edge позволяет выполнять логику (как облачную, так и собственную) на соответствующих устройствах. В качестве устройства обычно применяется компьютер на ARM или Intel/AMD (промышленный или общего назначения) под управлением Linux или Windows, т.е. решение кроссплатформенное.


В качестве примера: для небольших объемов данных вполне подойдет компьютер типа Raspberry Pi, а для значительных, возможно, понадобится и промышленный сервер.

Среда выполнения также отвечает за управление самим IoT Edge и коммуникации. Архитектурно она выполняется в виде фоновой задачи (демона или службы), т.е. устройство можно использовать для каких-либо еще целей, даже в интерактивных сценариях.


Среди ее функций также перечислим следующие:


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

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


Для понимания организации IoT Edge приводим рисунок из документации.



Облачный интерфейс IoT Edge


Управлять большим количеством устройств, разнесенных географически, достаточно сложно. Рабочие нагрузки создаются и настраиваются на каком-то одном типе устройств, а затем устанавливаются на все устройства, после чего производится отслеживание их поведения на предмет ошибок. Эти процедуры не могут быть выполнены на каждом устройстве, необходимы средства мониторинга большого количества устройств.


К Azure IoT Edge прилагаются облачные средства мониторинга и управления устройствами, которые позволяют:


  • Создать и настроить рабочую нагрузку для какого-либо типа устройства;
  • Развернуть ее на набор устройств;
  • Отследить результаты ее работы "в полях".


Маршрутизация сообщений


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


Каждый модуль имеет входы и выходы, имеющие обозначения типа inputs/inX. Сам IoT Edge имеет поток данных в IoT Hub, обозначается как $upstream. Маршруты описываются SQL-подобным языком:


FROM <source> WHERE <condition> INTO <sink>

Здесь:


  • source — источник сообщений, например, /messages/modules/{module_id}/outputs/{output_id};
  • condition — выражение, включающее свойства или тело сообщения;
  • sink — назначение (приемник) сообщений.

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


Пример:


FROM /messages/modules/module1/outputs/*
WHERE sensorType="pressure"
INTO $upstream

Если сейчас вам не совсем понятна эта концепция, она будет объяснена на примере в практической части.


Безопасность


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


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


IoT Edge как шлюз


Помимо модулей-контейнеров, IoT Edge может выполнять роль шлюза при подключении устройств к IoT Hub.


IoT Hub — это PaaS решение, облачный концентратор для двусторонней коммуникации между устройствами Интернета вещей и облаком.

Когда IoT Edge работает, как шлюз, устройства подключаются к IoT Hub как бы "через" IoT Edge, причем существуют разные варианты такого подключения:


  • Прозрачное подключение (transparent) — применяется для устройств, которые могут подключаться и напрямую к IoT Hub по протоколам HTTP, MQTT, AMQP. В этом случае шлюз является "прозрачным" для подключения;
  • Преобразование протокола (protocol translation) — известен также как непрозрачный шлюз. Применяется для устройств, которые не могут быть подключены к IoT Hub без шлюза в связи с тем, что не поддерживают один из протоколов HTTP, MQTT, AMQP. Сам IoT Edge "понимает" протоколы этих устройств и преобразует данные этих устройств в формат, понятный IoT Hub. При этом все данные с точки зрения IoT Hub идут от самого IoT Edge;
  • Преобразование удостоверений (identity translation) — от предыдущего варианта отличается тем, что каждое подчиненное устройство (т.е. подключенное к IoT Edge) имеет свой идентификатор, а данные, с точки зрения IoT Hub, идут от устройств, а не от шлюза.

Различия можно увидеть наглядно на рисунке:



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


Azure SQL Edge


Azure SQL Edge (в настоящее время находится в preview) — это движок базы данных, предназначенный для использования совместно с IoT Edge. В основе SQL Edge лежит Microsoft SQL Server Database Engine, т.е. SQL Edge построен на той же базе, что и SQL Server и Azure SQL Database. Для работы с ним используется тот же язык, T-SQL.


SQL Edge доступен в виде модуля на Azure Marketplace в двух редакциях: стандартная, для производства, с ограничением в 8 ядер и 64 ГБ памяти, и редакция для разработки (developer), с ограничением в 4 ядра и 32 ГБ памяти.



Из преимуществ SQL Edge отметим:


  • Возможности потоковой обработки данных, подобно Azure Stream Analytics;
  • Возможности машинного обучения и искусственного интеллекта путем интеграции открытого формата ONNX (Open Neural Network Exchange). Подробнее;
  • Возможность синхронизации с Azure Blob storage с использованием Azure Data Factory и Azure SQL Database;
  • Резервное копирование и восстановление данных, репликация.

Azure SQL Edge бесплатен в preview, а в коммерческой эксплуатации его использование позволит оптимизировать стоимость решения по сравнению с классическим SQL Server.


Практика


Для более глубокого понимания, как это все работает, попробуем настроить IoT Edge и все сопутствующие компоненты.


По историческим причинам практические руководства по IoT Edge обычно выполняются на Linux, поэтому в качестве демонстрационной ОС мы выбрали именно Windows 10, а точнее, ее специализированный вариант Windows 10 IoT Enterprise LTSC. Подробнее о совместимости IoT Edge с разными ОС можно прочитать здесь


Windows 10 IoT Enterprise LTSC (Long-term Servicing Channel) — специализированная ОС для встраиваемых устройств. Выпуски данной редакции ОС поддерживаются в течение 10 лет после релиза, а также имеют специализированные возможности встраивания, такие, как фильтры записи на диск, фильтр клавиатуры, замена оболочки и т. д. (https://www.quarta-embedded.ru/we/10/, https://habr.com/ru/company/quarta/blog/279521/), а стоят раза в 3 дешевле "настольных" аналогов.

Данная ОС особенно широко используется на интерактивных устройствах типа инфокиосков. Установка IoT Edge на такое устройство позволит совместить функции устройства с функциями самого IoT Edge.


Обязательным требованием для выполнения практической части является использование Windows 10 x64, строго версии 1809 (сборка 17763). На других сборках контейнеры Moby, необходимые для функционирования IoT Edge, не поддерживаются. На момент написания материала (август 2020) упомянутая сборка Windows является самой свежей в ветке LTSC.


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


Подготовка облачных ресурсов


Нам понадобится подписка Azure. Если у вас ее нет, оформите пробную совершенно бесплатно.


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


В верхней строке найдите символ Cloud Shell и кликните его:



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


В левом верхнем углу открытого окна выберите Bash.


Установите расширения Azure IoT:


az extension add --name azure-iot

Выполните команду


az account list-locations -o Table

и убедитесь, что в списке регионов присутствует West Europe. Именно его мы будем использовать для создания тестовых ресурсов, так как географически этот регион ближе всего к нам. Можете использовать любой другой, если он ближе к вам.


Создайте группу ресурсов rg-aziotedge-test для экспериментов, выполнив команду


az group create --name rg-aziotedge-test --location westeurope -o json

Далее нам нужно создать IoT Hub, но его имя должно быть уникальным, поэтому для имени будем пользоваться шаблоном iothub-test-{id}, где вместо {id} подставьте свои инициалы, а также дату выполнения руководства, без знаков препинания и пробелов, т.е. в формате XXYYMMDD, например iothub-test-if200810. Используйте далее тот же id в дальнейшем везде, где встретите {id}.


Создайте IoT Hub в группе ресурсов:


az iot hub create --name iothub-test-{id} -g rg-aziotedge-test --sku S1 --location westeurope -o json

Создайте в IoT Hub регистрацию для устройства IoT Edge с именем edge1:


az iot hub device-identity create --device-id edge1 --edge-enabled --hub-name iothub-test-{id} --auth-method shared_private_key

Получите строку соединения для устройства, которая понадобится для подключения физического устройства к IoT Hub, выполнив команду:


az iot hub device-identity show-connection-string --device-id edge1 --hub-name iothub-test-{id}

Скопируйте значение строки соединения из вывода JSON и сохраните ее в текстовом редакторе для дальнейшего использования.


Отметим, что все указанные действия можно выполнить и на портале Azure. На главной странице перейдите в Resource Groups, затем к нашей группе rg-aziotedge-test. В ней найдите только что созданный IoT Hub и кликните по его названию.


Слева в меню в разделе Automatic Device Management выберите IoT Edge и в появившемся интерфейсе увидите только что созданную регистрацию для устройства IoT Edge. Кликните на нее и на следующем экране увидите значение Primary Connection String, которое выше мы извлекли при помощи командной строки.


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


Подготовка Windows 10


Так как нам нужна строго определенная версия Windows 10, существует две альтернативы:


  • Используем для устройства IoT Edge виртуальную машину в самой Azure, считая, что это наше локальное устройство;
  • Установим Windows 10 на виртуальную машину локально.

Для нашего руководства мы будем использовать второй способ. Будем использовать VirtualBox последней версии с пакетом расширения.


Самостоятельно загрузите и установите Windows 10 Enterprise LTSC 2019 (1809) здесь или запросите здесь. На втором ресурсе можете также запросить набор скриптов для автоматизации, если будете заниматься глубокой настройкой операционной системы.


При скачивании необходимо выбрать дистрибутив "ISO — LTSC"

Установка ничем не отличается от таковой для обычной настольной Windows. В настройках виртуальной машины убедитесь, что включена вложенная (Nested) виртуализация. Создайте пользователя с именем по своему усмотрению.


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


az vm create --resource-group rg-aziotedge-test --name EdgeVM --image MicrosoftWindowsDesktop:Windows-10:rs5-pro:latest --admin-username azureuser --admin-password {password} --size Standard_DS1_v2

где {password} — желаемый пароль администратора.


К созданной виртуальной машине можно подключиться при помощи RDP.


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


Войдите в Windows 10 с учетной записью, имеющей права администратора. Запустите PowerShell x64 с учетной записью администратора.


Убедитесь, что виртуальная машина подключена к Интернет.


Чтобы убедиться, что вы запустили 64-разрядную версию PowerShell, выполните команду


(Get-Process -Id $PID).StartInfo.EnvironmentVariables["PROCESSOR_ARCHITECTURE"]

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


. {Invoke-WebRequest -useb https://aka.ms/iotedge-win} | Invoke-Expression; Deploy-IoTEdge

Если потребуется перезагрузка машины, согласитесь с этим.


Снова войдите в систему и запустите PowerShell x64 от имени администратора. Настройте среду выполнения IoT Edge, выполнив команду:


. {Invoke-WebRequest -useb https://aka.ms/iotedge-win} | Invoke-Expression; `
Initialize-IoTEdge -ContainerOs Windows

В процессе выполнения команды появится запрос на строку подключения. Введите строку, которую вы ранее сохранили в текстовом редакторе (без кавычек).


Убедитесь, что служба IoT Edge работает, выполнив команду


Get-Service iotedge

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


. {Invoke-WebRequest -useb https://aka.ms/iotedge-win} | Invoke-Expression; Get-IoTEdgeLog

Получите список модулей, выполняющихся в IoT Edge, выполнив команду


iotedge list

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


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


Теперь IoT Edge подключен к IoT Hub.


Установка тестового модуля на IoT Edge


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


Модуль, который мы установим, симулирует показания датчика температуры и нескольких дополнительных датчиков. Для быстрого старта мы используем именно симуляцию датчика, однако при необходимости вы можете доработать модуль для подключения реального датчика. Исходный код модуля открыт.


Чтобы установить модуль из Azure Marketplace, выполните следующие шаги.


На портале Azure перейдите к вашему IoT Hub и из меню слева в разделе Automatic Device Management выберите IoT Edge. В появившемся интерфейсе выберите edge1.


В панели вверху выберите Set Modules.



В секции IoT Edge Modules нажмите Add и выберите Marketplace Module из выпадающего меню.



В появившемся окне введите Simulated Temperature Sensor и выберите появившийся модуль.


Убедитесь, что модуль SimulatedTemperatureSensor был добавлен в секцию, с желаемым статусом (Desired status) running.


Внизу страницы нажмите Next: Routes.


На следующем шаге, на закладке Routes, будет предложено настроить маршруты для сообщений модуля. Маршруты определяют, как сообщения пересылаются между модулями и IoT Hub. Маршруты определяются с использованием пар имя-значение. На странице уже заполнены два маршрута.


Стандартный маршрут с названием route отсылает все сообщения от всех модулей в IoT Hub ($upstream). Второй маршрут с названием SimulatedTemperatureSensorToIoTHub был создан автоматически, когда вы добавили модуль из Marketplace. Это маршрут отсылает все сообщения только от модуля SimulatedTemperatureSensor в IoT Hub. Стандартный маршрут в нашем случае избыточный, поэтому удалите его, нажав на значок корзины справа от него. Результат показан ниже на рисунке.



Выберите Next: Review + create, чтобы перейти к следующему шагу.


На появившейся вкладке Review + create будет показан файл в формате JSON, который определяет все модули и их настройки, которые будут развернуты на устройстве IoT Edge. Обратите внимание, что помимо самого модуля SimulatedTemperatureSensor включены также два модуля среды выполнения, edgeAgent, edgeHub. Ознакомьтесь с файлом и выберите Create.


Обратите внимание: Хотя вы только что настроили развертывание для вашего IoT Edge устройства, это еще не привело к загрузке каких-либо данных на это устройство. Вместо этого устройство периодически опрашивает IoT Hub на наличие новых команд. Если устройство находит обновленные инструкции по развертыванию, оно применяет их. Соответствующие модули (точнее, их образы, т.е. набор двоичных файлов) загружаются из облака, а затем запускаются локально. Поэтому сразу после применения новых настроек, перейдя на страницу вашего IoT Edge, вы не увидите, что новые модули выполняются сразу. Вместо этого нужно подождать несколько минут, нажать кнопку Refresh в верхней части страницы, и все модули перейдут в состояние running, как показано на рисунке:



Просмотр данных от датчика


Перейдите к тестовой Windows 10 и запустите консоль PowerShell x64 от имени администратора.


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


iotedge list


Просмотрите сообщения, которые отправляются симулированным датчиком в облако:


iotedge logs SimulatedTemperatureSensor -f

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


Нажмите Ctrl+C, чтобы остановить мониторинг.


Перейдите на портал Azure и запустите Cloud Shell. Выполните команду, чтобы увидеть принимаемые сообщения на стороне IoT Hub:


az iot hub monitor-events --hub-name iothub-test-{id} --device-id edge1

Не забудьте заменить {id} на идентификатор, который вы выбрали ранее.


Убедитесь, что IoT Hub принимает сообщения, и нажмите Ctrl+C, чтобы остановить мониторинг.


Если вы не видите сообщений, перезапустите модуль симулированного датчика на Windows 10. Так как датчик тестовый, модуль отсылает только 500 сообщений и останавливает работу. Перезапустить его можно командой PowerShell:


iotedge restart SimulatedTemperatureSensor

Отметим, что модуль может быть настроен так, чтобы отправлять неограниченное количество сообщений, о чем сказано в журнале самого модуля:


To change this, set the environment variable MessageCount to the number of messages that should be sent (set it to -1 to send unlimited messages).

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


Оборачивание служб Azure в модули


В модули можно "обернуть" следующие службы Azure:



В качестве примера рассмотрим усреднение данных симулированного датчика температуры при помощи Stream Analytics. Данный пример даст вам понимание того, как именно облачная служба "оборачивается" в модуль IoT Edge.


При помощи Stream Analytics можно "прореживать" данные на "краю", тем самым уменьшить объем передаваемой в облако телеметрии. Суть настройки сводится к тому, что вначале создается задача Stream Analytics на портале Azure, затем она развертывается на устройство IoT Edge в виде модуля.


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


Схематично архитектуру примера можно представить в следующем виде:



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


  1. На портале Azure из меню выберите Create a resource, затем Storage, затем Storage account.
  2. Укажите следующие значения: Resource group: rg-aziotedge-test, Name: asatest{id}, Region: West Europe, Replication: LRS, оставив остальные по умолчанию.
  3. Нажмите Review + create, затем Create.

Создайте задание Stream Analytics:


  1. На портале Azure из меню выберите Create a resource, затем Internet of Things, затем Stream Analytics job.
  2. Укажите следующие значения: Job name: asa-iotedge-test, Resource group: rg-aziotedge-test, Location: West Europe, Hosting environment: Edge.
  3. Нажмите Create. По завершению нажмите Go to resource.
  4. Слева в секции Configure выберите Storage account settings, нажмите Add storage account и выберите учетную запись хранения, созданную ранее (asatest{id}). В области Container введите имя контейнера (на ваш выбор, например, asa) и нажмите Save.

Настройте задание Stream Analytics:


  1. В меню слева в секции Job topology выберите Inputs, затем Add stream input, а в выпадающем меню Edge Hub. В качестве Input alias введите temperature, Event serialization format: JSON, Encoding: UTF-8, Event compression type: None. Нажмите Save.
  2. Аналогично добавьте Output с названием alert, оставив другие значения полей по умолчанию.

В секции Job Topology выберите Query и замените код на следующий:


SELECT  
    'reset' AS command
INTO
   alert
FROM
   temperature TIMESTAMP BY timeCreated
GROUP BY TumblingWindow(second,30)
HAVING Avg(machine.temperature) > 70

И нажмите Save query.


Данный код отсылает команду reset в выход alert, если средняя температура системы превысила 70 градусов в 30-секундном скользящем окне.


Теперь развернем созданное задание на IoT Edge.


  1. На портале Azure перейдите к созданному ранее IoT Edge.
  2. Нажмите в верхней части окна Set modules, затем ниже Add и выберите Azure Stream Analytics Module и в появившемся окне выберите вашу подписку и задание asa-iotedge-test. Нажмите Save.

Когда задание будет добавлено в список модулей, кликните на его название, чтобы просмотреть его структуру. Ознакомьтесь с настройками и нажмите Cancel. Затем перейдите на вкладку Routes.


Дополнительно к существующему маршруту необходимо ввести следующие:


Имя Значение
alertsToCloud FROM /messages/modules/asa-iotedge-test/* INTO $upstream
alertsToReset FROM /messages/modules/asa-iotedge-test/* INTO BrokeredEndpoint("/modules/SimulatedTemperatureSensor/inputs/control")
telemetryToAsa FROM /messages/modules/SimulatedTemperatureSensor/* INTO BrokeredEndpoint("/modules/asa-iotedge-test/inputs/temperature")

Данные настройки дополнительно направляют поток сообщений в Stream Analytics, а сообщения с выхода соответствующего задания — в IoT Hub.


Нажмите Review + Create, затем Create. Периодически обновляйте страницу (Refresh), пока не увидите, что модуль asa-iotedge-test выполняется.


Когда увидите, что модуль выполняется, перейдите к тестовой Windows 10 и перезапустите модуль SimulatedTemperatureSensor:


iotedge restart SimulatedTemperatureSensor

Перейдите к просмотру журнала событий и наблюдайте появление события reset, когда сработают соответствующие условия (для этого понадобится какое-то время).


iotedge logs -f SimulatedTemperatureSensor

Остановите просмотр журнала, нажав Ctrl+C.



Работа без сети и в качестве шлюза


Когда устройство с IoT Edge отключается от сети, сам IoT Edge выполняет три роли:


  • Кэширование сообщений от подчиненных (downstream) устройств. При появлении сети кэшированные сообщения будут отправлены в IoT Hub;
  • Эмуляция поведения IoT Hub для аутентификации модулей и подчиненных устройств для обеспечения их бесперебойной работы;
  • Обеспечение коммуникации между подчиненными устройствами, которая при наличии сети происходит через IoT Hub.

Типовой сценарий работы без сети включает следующие шаги:


  1. Настройка устройств. Сам IoT Edge имеет встроенную поддержку работы без сети. Но для того, чтобы подчиненные устройства могли также работать без сети, пользуясь IoT Edge, необходимо определить соотношение ведущий-подчиненный между ними. Тогда подчиненные устройства будут отсылать все свои сообщения чере ведущий IoT Edge. Соответствующая настройка выполняется на портале, кнопка Manage Child Devices или с применением команд Cloud Shell.
  2. Синхронизация с IoT Hub. Предыдущий шаг выполняется в панели управления IoT Edge на портале Azure. Для того, чтобы IoT Edge получил соответствующие настройки, он изначально должен быть подключен к сети и должен хотя бы единожды получить настройки от IoT Hub.
  3. Отключение от сети. После этого (при правильной настройке) подчиненные устройства работают уже с IoT Edge так, как с IoT Hub. Все сообщения от подчиненных устройств в отсутствие сети сохраняются в IoT Edge. Время хранения может быть определено свойством timeToLiveSecs из набора свойства модуля $edgeHub. Максимальное значение — примерно 68 лет, т.е. практически ограничено лишь объемом памяти устройства, на котором выполняется IoT Edge. Значение по умолчанию — 2 часа.
  4. Повторное подключение к сети и повторная синхронизация с IoT Hub. При этом сохраненные сообщения отправляются в IoT Hub. Также происходит синхронизация свойств устройств.

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


Убедимся, что IoT Edge кэширует сообщения от модуля SimulatedTemperatureSensor в отсутствие сети. Для этого отключите от виртуальной машины сетевой кабель и перезапустите модуль командой PowerShell:


iotedge restart SimulatedTemperatureSensor

В Cloud Shell введите команду для мониторинга событий от нашего IoT Edge:


az iot hub monitor-events --hub-name iothub-test-{id} --device-id edge1

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


Вернитесь в Cloud Shell и наблюдайте, что все сообщения, в том числе сгенерированные в отсутствие сети, были успешно доставлены.


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


SQL Edge


В настоящий момент SQL Edge находится в preview и поддерживается только на платформах Linux, поэтому для экспериментов настроим Linux-виртуальную машину в Azure с предустановленным IoT Edge.


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

Создайте новый экземпляр IoT Edge и получите строку соединения для него, выполнив в Cloud Shell команды:


az iot hub device-identity create --device-id edge2 --edge-enabled --hub-name iothub-test-{id} --auth-method shared_private_key
az iot hub device-identity show-connection-string --device-id edge2 --hub-name iothub-test-{id}

Сохраните полученную строку подключения.


А также создайте виртуальную машину, заменив {password} на выбранный пароль. Используйте надежный пароль.


az vm create --resource-group rg-aziotedge-test --name vm-edge2 --image microsoft_iot_edge:iot_edge_vm_ubuntu:ubuntu_1604_edgeruntimeonly:latest --admin-username azureuser --admin-password {password} --size Standard_DS1_v2 --authentication-type password

Сразу подключитесь к виртуальной машине прямо из Cloud Shell:


ssh azureuser@{publicIpAddress}

где {publicIpAddress} — одноименный параметр из вывода предыдущей команды.


При возникновении предупреждения ответьте yes. Введите пароль. Игнорируйте информацию об обновлениях Ubuntu, для нашего тестового сценария это неважно.


Убедитесь, что среда выполнения IoT Edge установлена, выполнив команду


iotedge version

Если версия установленного IoT Edge меньше 1.0.9, обновите среду выполнения, последовательно выполнив команды:


curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9/libiothsm-std_1.0.9-1_ubuntu16.04_amd64.deb -o libiothsm-std.deb && sudo dpkg -i ./libiothsm-std.deb
curl -L https://github.com/Azure/azure-iotedge/releases/download/1.0.9/iotedge_1.0.9-1_ubuntu16.04_amd64.deb -o iotedge.deb && sudo dpkg -i ./iotedge.deb

Если возникнет вопрос о сохранении файла конфигурации, ответьте N (сохранить текущую конфигурацию).


После обновления перезапустите демон IoT Edge:


systemctl restart iotedge

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


Теперь необходимо подключить IoT Edge к IoT Hub, для чего выполните команду


sudo /etc/iotedge/configedge.sh "{строка подключения}"

соответственно указав строку подключения. Не удаляйте кавычки.


Теперь развернем SQL Edge на наше устройство IoT Edge.


  1. Перейдите на портал Azure и из главного меню выберите Create a resource.
  2. В поле Search the Marketplace введите Azure SQL Edge и нажмите Enter.
  3. Кликните на Azure SQL Edge — Preview в результатах, выберите вариант Developer и нажмите Create.
  4. На странице Target Devices for IoT Edge Module укажите следующие настройки: Subscription: ваша подписка, IoT Hub: iothub-test-{id}, IoT Edge Device Name: edge2. Нажмите Create.
  5. На странице Set Modules on device перейдите к секции модулей и кликните на модуль AzureSQLEdgePreview.
  6. На вкладке Environment Variables укажите желаемые значения для переменных окружения. Полный список доступен здесь. Укажите SA_PASSWORD: пароль администратора (используйте надежный пароль), MSSQL_LCID: идентификатор языка для SQL Server (1049 для русского языка), MSSQL_COLLATION: параметры сортировки (оставьте значение по умолчанию).
  7. На вкладке Module Settings установите значение Restart Policy: always и Desired Status: running. Нажмите Update.
  8. Нажмите Review + create, затем Create.
  9. Снова перейдите к IoT Edge и дождитесь завершения развертывания.

Нам также необходимо открыть порт 1433 виртуальной машины для соединения с экземпляром SQL Edge. Для этого:


  1. На портале Azure перейдите в группу ресурсов rg-aziotedge-test.
  2. Найдите группу безопасности vm-edge2NSG. Она была создана автоматически при развертывании виртуальной машины.
  3. Слева в разделе Settings кликните Inbound security rules, затем Add.
  4. В поле Destination port ranges введите значение 1433, Protocol: TCP, Name: SQL, Action: Allow. Остальные значения оставьте по умолчанию. Нажмите Add.

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


  1. Загрузите и установите Azure Data Studio.
  2. В области Start нажмите New Connection.
  3. Server: введите IP-адрес виртуальной машины. Authentication type: SQL Login, User name: sa, Password: пароль SQL Edge, выбранный ранее. Нажмите Connect.

При успешном подключении интерфейс программы примет вид:



Нажмите New Query и введите команду получения версии:


SELECT @@VERSION

Нажмите Run и в области Results ознакомьтесь с результатом выполнения команды:



Создадим базу данных для тестов:


CREATE DATABASE TestDatabase;

И таблицу в ней. Перед тем, как выполнить код создания таблицы, выберите базу данных TestDatabase в списке баз данных:



Создадим таблицу


CREATE TABLE CUSTOMERS( 
   ID   INT              NOT NULL, 
   NAME VARCHAR (20)     NOT NULL, 
   AGE  INT              NOT NULL, 
   ADDRESS  CHAR (25) , 
   SALARY   DECIMAL (18, 2),        
   PRIMARY KEY (ID));

Теперь нажмите Run. Убедитесь, что код выполнился без ошибок:



Если вы знакомы с языком T-SQL, можете продолжить эксперименты.


Как видим, работа с SQL Edge не отличается от работы с SQL Server. Более детально о совместимости можно прочитать здесь. Отметим, что мы не рассматривали на практике следующие расширенные возможности SQL Edge:



Дополнительные инструкции по созданию end-to-end решения на базе SQL Edge находятся здесь.


Выводы


В завершение практической части просто удалите группу ресурсов rg-aziotedge-test во избежание дополнительных расходов.


В данном материале мы рассмотрели базовые возможности IoT Edge и SQL Edge. Мы развернули и настроили IoT Edge и на системе Windows, и на системе Linux.


Вы можете продолжить изучение облачных технологий Microsoft в части Интернета вещей, выполнив лабораторные работы.


Если у вас еще остались вопросы по облачным технологиям Microsoft и Интернету вещей — обращайтесь к нам в Кварта Технологии.


Автор статьи — Сергей Антонович, ведущий инженер Кварта Технологии. Связаться с ним можно по адресу sergant (at) quarta.ru.

Кварта Технологии
Дистрибутор и интегратор встраиваемых технологий

Комментарии 0

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

Самое читаемое