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") уже является устоявшимся, хотя более удачными видятся "периферийные вычисления" или "граничные вычисления". В данном материале мы будем пользоваться именно устоявшимся термином "вычисления на краю". Хотя Интернет вещей, поддерживаемый новыми технологиями, бурно развивается, все еще остается актуальным ряд проблем. Со стороны облака: Когда эти проблемы пытаются решить путем обработки данных "на краю", появляются новые сложности: IoT Edge предлагает изящное решение этих проблем, которое заключается в применении стандартизованного, многофункционального решения, в котором комбинируются лучшие практики с обеих сторон: облака и "края". Мы по-прежнему получаем все преимущества облака: Эти преимущества в IoT Edge дополняются возможностями обработки "на краю": При всем перечисленном уникальность IoT Edge заключается в том, что рабочие нагрузки как бы переносятся из облака непосредственно на IoT Edge, то есть не требуется заниматься разработкой на "краю". Перенос поддерживаемых модулей на Edge происходит непосредственно на портале Azure. Впрочем, при необходимости всегда остается возможность разрабатывать собственный код для выполнения в IoT Edge. Кроме того, в Azure IoT Hub уже есть все средства подключения и удаленного управления для IoT Edge. IoT Edge состоит из трех компонентов: Модуль IoT Edge — это единица исполнения, реализованная в виде Docker-совместимого контейнера, в котором содержится вся необходимая логика. Несколько модулей могут быть настроены на обмен данными друг с другом. Можно разрабатывать собственные модули или "упаковать" некоторые из служб Azure в модули так, что они будут работать на устройстве IoT Edge без подключения к облаку. "Оборачивание" служб Azure в модули позволяет пользоваться всеми преимуществами потоковой аналитики, машинного обучения, распознавания изображений и других сервисов без разработки кода. В Azure Marketplace доступны также готовые модули сторонней разработки. Собственные модули можно разрабатывать на Java, .NET Core 2.0, Node.js, C, Python. Кроме того, контейнеризация логики в виде модулей позволяет динамически встраивать новую логику на системах, где это обычно требует пересборки образа (Yocto Linux). Среда выполнения IoT Edge позволяет выполнять логику (как облачную, так и собственную) на соответствующих устройствах. В качестве устройства обычно применяется компьютер на ARM или Intel/AMD (промышленный или общего назначения) под управлением Linux или Windows, т.е. решение кроссплатформенное. Среда выполнения также отвечает за управление самим IoT Edge и коммуникации. Архитектурно она выполняется в виде фоновой задачи (демона или службы), т.е. устройство можно использовать для каких-либо еще целей, даже в интерактивных сценариях. Среди ее функций также перечислим следующие: Сценариев использования IoT Edge очень много, и выбор — за разработчиками решения "на краю". Обычно среда выполнения используется для развертывания средств сбора и обработки данных с подчиненных ("downstream") устройств, но это только одна из возможностей. Для понимания организации IoT Edge приводим рисунок из документации.  Управлять большим количеством устройств, разнесенных географически, достаточно сложно. Рабочие нагрузки создаются и настраиваются на каком-то одном типе устройств, а затем устанавливаются на все устройства, после чего производится отслеживание их поведения на предмет ошибок. Эти процедуры не могут быть выполнены на каждом устройстве, необходимы средства мониторинга большого количества устройств. К Azure IoT Edge прилагаются облачные средства мониторинга и управления устройствами, которые позволяют:  Маршрутизация сообщений — это механизм обмена сообщениями как между модулями, так и между модулем и облаком в IoT Edge. Данный механизм позволяет надежно изолировать модули друг от друга, а также централизованно управлять соответствующими маршрутами. Каждый модуль имеет входы и выходы, имеющие обозначения типа inputs/inX. Сам IoT Edge имеет поток данных в IoT Hub, обозначается как $upstream. Маршруты описываются SQL-подобным языком: Здесь: Как видим, каждый модуль имеет идентификатор, каждый вход и выход также имеет идентификатор, а источник и приемник сообщений описываются URI специального вида. Пример: Если сейчас вам не совсем понятна эта концепция, она будет объяснена на примере в практической части. Перенос части облачной нагрузки на "край" вынуждает балансировать между гибкостью решения для разных сценариев использования и уровнем защиты, ожидаемым от сервисов Azure. В IoT Edge предприняты меры по обеспечению безопасности всего решения, подробнее о которых можно прочитать здесь. Помимо модулей-контейнеров, IoT Edge может выполнять роль шлюза при подключении устройств к IoT Hub. Когда IoT Edge работает, как шлюз, устройства подключаются к IoT Hub как бы "через" IoT Edge, причем существуют разные варианты такого подключения: Различия можно увидеть наглядно на рисунке:  Применение IoT Edge в качестве шлюза позволяет кэшировать данные от устройств при отсутствии подключения к облаку, а затем, при возобновлении подключения, отправлять накопленные данные в IoT Hub. 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 SQL Edge бесплатен в preview, а в коммерческой эксплуатации его использование позволит оптимизировать стоимость решения по сравнению с классическим SQL Server. Для более глубокого понимания, как это все работает, попробуем настроить IoT Edge и все сопутствующие компоненты. По историческим причинам практические руководства по IoT Edge обычно выполняются на Linux, поэтому в качестве демонстрационной ОС мы выбрали именно Windows 10, а точнее, ее специализированный вариант Windows 10 IoT Enterprise LTSC. Подробнее о совместимости IoT Edge с разными ОС можно прочитать здесь Данная ОС особенно широко используется на интерактивных устройствах типа инфокиосков. Установка IoT Edge на такое устройство позволит совместить функции устройства с функциями самого IoT Edge. Обязательным требованием для выполнения практической части является использование Windows 10 x64, строго версии 1809 (сборка 17763). На других сборках контейнеры Moby, необходимые для функционирования IoT Edge, не поддерживаются. На момент написания материала (август 2020) упомянутая сборка Windows является самой свежей в ветке LTSC. Существует большое количество способов настройки IoT Edge, но для целей обучения мы будем использовать наиболее простые из них. Как обычно, предупреждаем, что инструкции из данного руководства не гарантируют безопасности решения, а предназначены только для обучения, поэтому не рекомендуется использовать их в производстве. Нам понадобится подписка Azure. Если у вас ее нет, оформите пробную совершенно бесплатно. После чего в любом браузере откройте портал Azure, при необходимости зайдите со своей учетной записью. Все дальнейшие инструкции предназначены для английской версии портала, поэтому при необходимости переключите язык в настройках. В верхней строке найдите символ Cloud Shell и кликните его:  Появится окно с командной строкой, в котором мы создадим необходимые ресурсы. Отметим, что также их можно создать в графическом интерфейсе портала. В левом верхнем углу открытого окна выберите Bash. Установите расширения Azure IoT: Выполните команду и убедитесь, что в списке регионов присутствует West Europe. Именно его мы будем использовать для создания тестовых ресурсов, так как географически этот регион ближе всего к нам. Можете использовать любой другой, если он ближе к вам. Создайте группу ресурсов rg-aziotedge-test для экспериментов, выполнив команду Далее нам нужно создать IoT Hub, но его имя должно быть уникальным, поэтому для имени будем пользоваться шаблоном iothub-test-{id}, где вместо {id} подставьте свои инициалы, а также дату выполнения руководства, без знаков препинания и пробелов, т.е. в формате XXYYMMDD, например iothub-test-if200810. Используйте далее тот же id в дальнейшем везде, где встретите {id}. Создайте IoT Hub в группе ресурсов: Создайте в IoT Hub регистрацию для устройства IoT Edge с именем edge1: Получите строку соединения для устройства, которая понадобится для подключения физического устройства к IoT Hub, выполнив команду: Скопируйте значение строки соединения из вывода JSON и сохраните ее в текстовом редакторе для дальнейшего использования. Отметим, что все указанные действия можно выполнить и на портале Azure. На главной странице перейдите в Resource Groups, затем к нашей группе rg-aziotedge-test. В ней найдите только что созданный IoT Hub и кликните по его названию. Слева в меню в разделе Automatic Device Management выберите IoT Edge и в появившемся интерфейсе увидите только что созданную регистрацию для устройства IoT Edge. Кликните на нее и на следующем экране увидите значение Primary Connection String, которое выше мы извлекли при помощи командной строки. В данном случае мы используем ручную регистрацию устройства. Оговоримся, что существует также возможность автоматической массовой регистрации устройств через соответствующий сервис. Так как нам нужна строго определенная версия Windows 10, существует две альтернативы: Для нашего руководства мы будем использовать второй способ. Будем использовать VirtualBox последней версии с пакетом расширения. Самостоятельно загрузите и установите Windows 10 Enterprise LTSC 2019 (1809) здесь или запросите здесь. На втором ресурсе можете также запросить набор скриптов для автоматизации, если будете заниматься глубокой настройкой операционной системы. Установка ничем не отличается от таковой для обычной настольной Windows. В настройках виртуальной машины убедитесь, что включена вложенная (Nested) виртуализация. Создайте пользователя с именем по своему усмотрению. Если в качестве альтернативы для тестовых целей вы хотите использовать виртуальную машину непосредственно в Azure, создайте ее при помощи команды: где {password} — желаемый пароль администратора. К созданной виртуальной машине можно подключиться при помощи RDP. Войдите в Windows 10 с учетной записью, имеющей права администратора. Запустите PowerShell x64 с учетной записью администратора. Убедитесь, что виртуальная машина подключена к Интернет. Чтобы убедиться, что вы запустили 64-разрядную версию PowerShell, выполните команду Выполните следующую команду, чтобы проверить версию Windows на совместимость с IoT Edge, включить возможность использования контейнеров, загрузить среду выполнения контейнеров Moby и самого IoT Edge: Если потребуется перезагрузка машины, согласитесь с этим. Снова войдите в систему и запустите PowerShell x64 от имени администратора. Настройте среду выполнения IoT Edge, выполнив команду: В процессе выполнения команды появится запрос на строку подключения. Введите строку, которую вы ранее сохранили в текстовом редакторе (без кавычек). Убедитесь, что служба IoT Edge работает, выполнив команду При необходимости отладки службы можете получить доступ к ее журналам: Получите список модулей, выполняющихся в IoT Edge, выполнив команду Может потребоваться некоторое время, прежде чем модули начнут отображаться в выводе команды. Отметим, что существует возможность установить среду выполнения Edge и без подключения к интернет. Подробности можно найти здесь. Теперь IoT Edge подключен к IoT Hub. Теперь попробуем установить модуль. Код писать не понадобится, мы будем использовать готовый модуль из 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 от имени администратора. Убедитесь, что все модули, развернутые по команде из облака, выполняются, введя команду  Просмотрите сообщения, которые отправляются симулированным датчиком в облако: Из формата сообщений видно, что наш датчик на самом деле отправляет два значения температуры: системную и внешнюю. Нажмите Ctrl+C, чтобы остановить мониторинг. Перейдите на портал Azure и запустите Cloud Shell. Выполните команду, чтобы увидеть принимаемые сообщения на стороне IoT Hub: Не забудьте заменить {id} на идентификатор, который вы выбрали ранее. Убедитесь, что IoT Hub принимает сообщения, и нажмите Ctrl+C, чтобы остановить мониторинг. Если вы не видите сообщений, перезапустите модуль симулированного датчика на Windows 10. Так как датчик тестовый, модуль отсылает только 500 сообщений и останавливает работу. Перезапустить его можно командой PowerShell: Отметим, что модуль может быть настроен так, чтобы отправлять неограниченное количество сообщений, о чем сказано в журнале самого модуля: Вы можете также попробовать разработать собственный модуль, воспользовавшись руководством. После разработки собственного модуля он попадает в ваше персональное облачное хранилище модулей ("registry"), откуда может быть развернут на устройство IoT Edge тем же способом, которым был развернут модуль симулированного датчика температуры. В модули можно "обернуть" следующие службы Azure: В качестве примера рассмотрим усреднение данных симулированного датчика температуры при помощи Stream Analytics. Данный пример даст вам понимание того, как именно облачная служба "оборачивается" в модуль IoT Edge. При помощи Stream Analytics можно "прореживать" данные на "краю", тем самым уменьшить объем передаваемой в облако телеметрии. Суть настройки сводится к тому, что вначале создается задача Stream Analytics на портале Azure, затем она развертывается на устройство IoT Edge в виде модуля. Пример, который мы рассмотрим, вычисляет среднюю температуру по скользящему 30-секундному окну. Когда среднее значение достигает 70 градусов, модуль генерирует соответствующее предупреждение, которое в производстве можно использовать для выполнения каких-либо действий по предотвращению выхода оборудования из строя. Схематично архитектуру примера можно представить в следующем виде:  Нам понадобится учетная запись хранения для использования с Azure Stream Analytics. Создайте ее на портале Azure, выполнив следующие шаги: Создайте задание Stream Analytics: Настройте задание Stream Analytics: В секции Job Topology выберите Query и замените код на следующий: И нажмите Save query. Данный код отсылает команду reset в выход alert, если средняя температура системы превысила 70 градусов в 30-секундном скользящем окне. Теперь развернем созданное задание на IoT Edge. Когда задание будет добавлено в список модулей, кликните на его название, чтобы просмотреть его структуру. Ознакомьтесь с настройками и нажмите Cancel. Затем перейдите на вкладку Routes. Дополнительно к существующему маршруту необходимо ввести следующие: Данные настройки дополнительно направляют поток сообщений в Stream Analytics, а сообщения с выхода соответствующего задания — в IoT Hub. Нажмите Review + Create, затем Create. Периодически обновляйте страницу (Refresh), пока не увидите, что модуль asa-iotedge-test выполняется. Когда увидите, что модуль выполняется, перейдите к тестовой Windows 10 и перезапустите модуль SimulatedTemperatureSensor: Перейдите к просмотру журнала событий и наблюдайте появление события reset, когда сработают соответствующие условия (для этого понадобится какое-то время). Остановите просмотр журнала, нажав Ctrl+C.  Когда устройство с IoT Edge отключается от сети, сам IoT Edge выполняет три роли: Типовой сценарий работы без сети включает следующие шаги: Отметим, что для работы подчиненных устройств через IoT Edge как через шлюз необходимо, чтобы подчиненные устройства "доверяли" ведущему устройству IoT Edge, что достигается специальной настройкой. Убедимся, что IoT Edge кэширует сообщения от модуля SimulatedTemperatureSensor в отсутствие сети. Для этого отключите от виртуальной машины сетевой кабель и перезапустите модуль командой PowerShell: В Cloud Shell введите команду для мониторинга событий от нашего IoT Edge: Убедитесь, что сообщения не приходят, затем подключите сетевой кабель к виртуальной машине. Вернитесь в Cloud Shell и наблюдайте, что все сообщения, в том числе сгенерированные в отсутствие сети, были успешно доставлены. Интересующихся подробной настройкой отсылаем к детальному описанию, инструкции из которого при желании можно проделать. В настоящий момент SQL Edge находится в preview и поддерживается только на платформах Linux, поэтому для экспериментов настроим Linux-виртуальную машину в Azure с предустановленным IoT Edge. Создайте новый экземпляр IoT Edge и получите строку соединения для него, выполнив в Cloud Shell команды: Сохраните полученную строку подключения. А также создайте виртуальную машину, заменив {password} на выбранный пароль. Используйте надежный пароль. Сразу подключитесь к виртуальной машине прямо из Cloud Shell: где {publicIpAddress} — одноименный параметр из вывода предыдущей команды. При возникновении предупреждения ответьте yes. Введите пароль. Игнорируйте информацию об обновлениях Ubuntu, для нашего тестового сценария это неважно. Убедитесь, что среда выполнения IoT Edge установлена, выполнив команду Если версия установленного IoT Edge меньше 1.0.9, обновите среду выполнения, последовательно выполнив команды: Если возникнет вопрос о сохранении файла конфигурации, ответьте N (сохранить текущую конфигурацию). После обновления перезапустите демон IoT Edge: В ответ на появившийся запрос введите пароль, выбранный вами на этапе создания виртуальной машины. Теперь необходимо подключить IoT Edge к IoT Hub, для чего выполните команду соответственно указав строку подключения. Не удаляйте кавычки. Теперь развернем SQL Edge на наше устройство IoT Edge. Нам также необходимо открыть порт 1433 виртуальной машины для соединения с экземпляром SQL Edge. Для этого: Способы подключения к SQL Edge перечислены здесь. Подчеркнем, что к SQL Edge можно подключиться даже из другого модуля на том же самом экземпляре IoT Edge. Для тестирования подключимся к SQL Edge с локального компьютера. При успешном подключении интерфейс программы примет вид:  Нажмите New Query и введите команду получения версии: Нажмите Run и в области Results ознакомьтесь с результатом выполнения команды:  Создадим базу данных для тестов: И таблицу в ней. Перед тем, как выполнить код создания таблицы, выберите базу данных TestDatabase в списке баз данных:  Создадим таблицу Теперь нажмите 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.