Интернет вещей: Arduino в связке с облаком

в 11:00, , рубрики: azure, microsoft, Microsoft Azure, Microsoft SQL Server, sql, Блог компании Microsoft, Разработка для интернета вещей

В наш век многие задумывались о создании своего стартапа. Но разработать какой-то интересный и полезный продукт своими силами зачастую сложно. Отчасти для экономии сил, можно использовать облако. В частности, для проектов интернета вещей в облаке можно найти достаточное количество сервисов. Что же такое «Интернет вещей» и как его можно продуктивно использовать? Обо всём этом читайте под катом.

Интернет вещей: Arduino в связке с облаком - 1

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

Интернет вещей — это не просто умный дом или умное предприятие. Эксперты прогнозируют что в ближайшее время миллиарды устройств будут решать самые различные задачи в самых разнообразных областях. Да они уже решают множество задач.

Давайте для примера разберем самую стереотипную задачу: устройство, оборудованное каким-либо датчиком, отправляет данные снимаемые с этого датчика в облако. Самый простейший пример устройства, снимающего данные с датчика света (фоторезистра) вы можете увидеть на следующем фото:

Интернет вещей: Arduino в связке с облаком - 2

Запитать это устройство можно от разъема micro USB. «На борту» платы Genuino MKR1000 находится встроенный Wi-Fi модуль. Стоимость платы около 35 USD. Замена одного датчика на другой как правило не особо усложняет схему. В ней, как вы можете заметить, используется резистор, который стабилизирует снимаемый сигнал и не дает различным помехам на него повлиять. Но об этом есть довольно много специализированной литературы. Сейчас же о другом.

Давайте рассмотрим следующую функциональную схему работы устройства с облаком Azure, которую вполне можно назвать типичной:

Интернет вещей: Arduino в связке с облаком - 3

На ней устройство взаимодействует с IoT хабом. IoT хаб на русский язык переводят как Центр интернета вещей. Это название вполне себе передает его суть, так как для взаимодействия с устройствами используется, как правило, этот сервис. Он может как получать данные с устройств, так и отправлять им сообщения/команды.

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

Детальное сравнение центра Интернета вещей Azure и концентраторов событий Azure доступно по ссылке.

IoT hub поддерживает такие протоколы, как MQTT, MQTT через WebSocket, AMQP, AMQP через WebSocket и HTTP. Event hub поддерживает AMQP, AMQP через WebSocket и HTTP.

Вы можете написать код, который формирует сообщение по правилам протокола и отправляет его, но лучше использовать SDK. Формирование сообщения по протоколу HTTP с платы Arduino я уже рассматривал в этой статье.

Этот код работает, но далек от идеала. В этой же статье рассматривалось конфигурирование IoT хаба и сопряжение устройства.

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

Создание IoT hub

Создаем IoT hub на одно устройство. При использовании одного устройства IoT hub можно использовать бесплатно. Имя хабу придумываем любое произвольное.

Hint: У IoT хаба есть возможность получать с устройства файлы. Эту возможность иногда используют в виде легального хака. Данные с нескольких устройств передаются одному главному устройству, которое уже сохраняет их в текстовый файл определенного формата и отправляет его в облако.

Интернет вещей: Arduino в связке с облаком - 4

Создание device-twin и получение SAS

Теперь нам нужно создать виртуальное устройство в облаке Azure, которое будет соответствовать нашему реальному устройству. По-английски это устройство называют device-twin, что означает устройство двойник.

Раньше создать такое устройство можно было с помощью Windows desktop утилиты Device Explorer. Скачать ее можно по следующей ссылке, найдя наиболее свежий файлик SetupDeviceExplorer.msi или с помощью кроссплатформенной утилиты iothub-explorer, установить которую можно с помощью NPM (Node.js Package Manager).

Сейчас не нужно заморачиваться и можно создать двойник устройства прямо на портале Azure найдя в настройках хаба Device Explorer.

Интернет вещей: Arduino в связке с облаком - 5

Кликнув на созданное устройство в Device Explorer-е можно открыть сведения об устройстве. Из них необходимо взять строку подключения – первичный ключ. Ее мы будем использовать в коде Arduino.

Прошивка платы Arduino SSL сертификатом

В качестве аутентификации Azure IoT хаб использует два варианта: SSL + SAS или SSL + X.509 сертификат. Но ресурсов Arduino хватает только на первый вариант. Все-таки это устройство с малым энергопотреблением и не обладает большими достаточными вычислительными возможностями.

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

Сделать это можно с помощью кроссплатформенной утилиты WiFi101 Firmware Updater или же с помощью функционала, встроенного в Arduino IDE.

Но перед этим необходимо совершить несколько подготовительных мероприятий в Arduino IDE.

Установить библиотеку WiFi101

Интернет вещей: Arduino в связке с облаком - 6

Интернет вещей: Arduino в связке с облаком - 7

После ее установки в IDE появятся примеры использования этой библиотеки. Один из этих примеров под названием FirmwareUpdater необходимо открыть и записать на плату. Сначала открываем:

Интернет вещей: Arduino в связке с облаком - 8

Затем устанавливаем и выбираем нашу плату (платы для IoT пока что не входят в комплект поставки IDE по умолчанию).

Интернет вещей: Arduino в связке с облаком - 9

Открываем менеджер плат и ищем необходимую плату. В моем случае это MKR1000.

Интернет вещей: Arduino в связке с облаком - 10

После установки в том же самом пункте меню необходимо пометить используемую плату.

Интернет вещей: Arduino в связке с облаком - 11

И выбрать порт на котором она находится:

Интернет вещей: Arduino в связке с облаком - 12

Последовательные клики на меню Sketch – Upload загрузят скетч на плату. Теперь можно прошивать.

Первый вариант открыть в IDE меню Tools – WiFi101 FirmwareUpdater, нажать Add domain и добавить URL IoT хаба.

Интернет вещей: Arduino в связке с облаком - 13

После чего нажать «Upload Certificates to WiFi module».

Или же открыть отдельную утилиту WiFi101 Firmware Updater, ввести адрес хаба (в моем случае ArduinoAzureHub.azure-devices.net) в верхнее текстовое поле и нажать кнопку Fetch.

Произойдет загрузка сертификата на компьютер. После этого нужно выбрать COM порт к которому подключено устройство и нажать появившуюся кнопку «Upload certificates».

Интернет вещей: Arduino в связке с облаком - 14

Написание скетча и использование Azure IoT library for the Arduino

Устанавливаем следующие библиотеки точно так же, как мы устанавливали недавно библиотеку WiFi101:

  • AzureIoTHub
  • AzureIoTUtility
  • AzureIoTProtocol_HTTP
  • RTCZero

Скачиваем исходный код и в папке examples находим проект simplesample_http, в котором можно найти код для samd (Atmel SAMD Based boards).

В файле iot_configs.h c присваиваем значению IOT_CONFIG_CONNECTION_STRING значение строки подключения, которую мы получили на портале Azure. Заполняем значения IOT_CONFIG_WIFI_SSID и IOT_CONFIG_WIFI_PASSWORD соответственно названием вашей точки доступа Wi-Fi и ее паролем.

Код скетча становится рабочим и его можно загружать в Arduino.

Следующий код описывает модель:

DECLARE_MODEL(ContosoAnemometer,
WITH_DATA(ascii_char_ptr, DeviceId),
WITH_DATA(int, WindSpeed),
WITH_DATA(float, Temperature),
WITH_DATA(float, Humidity),
WITH_ACTION(TurnFanOn),
WITH_ACTION(TurnFanOff),
WITH_ACTION(SetAirResistance, int, Position)
);

WITH_DATA описывает данные, которые могут быть отправлены с устройства. WITH_ACTION описывает события, которые могут произойти при получении устройством каких-то команд.

Пример это, конечно же, только отправная точка для вашего проекта. Шаблон, который можно изменить под свои требования. Я предпочитаю удалять созданные Actions и создать свои. Моя заготовка кода в виде gist размещена на github.

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

BEGIN_NAMESPACE(IoTSample);
DECLARE_MODEL
(LightSensorDataModel, 
WITH_DATA(ascii_char_ptr, deviceId), 
WITH_DATA(int, iotdata),
WITH_ACTION(DuckAction, int, light)
);
END_NAMESPACE(IoTSample);  

Код экшена в моем случае такой:

EXECUTE_COMMAND_RESULT DuckAction(LightSensorDataModel* device, int light)
{
    digitalWrite(2, light);
    return EXECUTE_COMMAND_SUCCESS;
}

Он включает или отключает светодиод, в зависимости от того получено ли значением параметра light целое число 1 или 0.

Срабатывает событие если на плату отправить следующий JSON:

{"Name" : "DuckAction", "Parameters" : {"light":1}}

Если вы найдете в коде следующую переменную: unsigned int minimumPollingTime = 9;, то сможете изменить задержку опроса новых сообщений. Иначе выражаясь то, как часто устройство проверяет не появились ли для него новые сообщения. Значение указано в секундах.

В код void simplesample_http_run(void) я добавляю следующий код:

while (1)
{
   myIoTdata->deviceId = "ArduinoAzureTwin";
   myIoTdata->iotdata = analogRead(1); 
   unsigned char* destination;
   size_t destinationSize;
   if (SERIALIZE(&destination, &destinationSize, myIoTdata->deviceId, myIoTdata->iotdata) != CODEFIRST_OK)
   {
       (void)printf("Failed to serializern");
   }
   else
   {
        sendMessage(iotHubClientHandle, destination, destinationSize);
   }
   IoTHubClient_LL_DoWork(iotHubClientHandle);
   ThreadAPI_Sleep(1000);
}
DESTROY_MODEL_INSTANCE(myIoTdata);

Здесь с аналогового пина под номером 1 подключенного к Arduino каждую секунду снимаются данные. Эти данные отправляются в облако в виде строки deviceId (имени устройства) и самих данных в виде целого числа iotdata.

Подключение других сервисов Azure

Давайте для примера будем сохранять данные в базе SQL Server. Azure поддерживает множество форматов данных, но думается мне, что SQL Server это самый популярный формат. Хотя для хранения JSON данных в больших объемах и подошел бы, пожалуй, больше формат NOSQL. Цены на базы SQL Server-а начинаются от 5 USD в месяц. То есть за эти деньги можно получить вполне себе функциональную облачную базу размером 2 Gb.

Так как мануал по созданию баз довольно объемный, но никаких особых нюансов нет, то оставлю ссылку на официальный мануалы: создание базы данных SQL Azure на портале Azure и создание таблицы в базе данных с помощью SQL Server Data Tools.

Зачастую, если у вас уже установлена Visual Studio, то ничего дополнительно устанавливать не нужно.

Самый простой способ открыть базу данных для редактирования это в меню Visual Studio выбрать View – Server Explorer. Здесь можно подключиться к подписке Azure и открыть базу в SQL Server Object Explorer.

Интернет вещей: Arduino в связке с облаком - 15

Ну и уже в этом окне можно будет создать таблицу.

Интернет вещей: Arduino в связке с облаком - 16

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

Интернет вещей: Arduino в связке с облаком - 17

Шутка по поводу того, что в IoT буква S отвечает за Security, в данном случае не работает.

Stream Analytics

Вторым по популярности сервисом Azure для интернета вещей является Stream Analytics. Если мы хотим сохранить данные из IoT хаба в базу данных, то нам нужен этот сервис.

Создается он очень просто. Достаточно придумать название и выбрать группу ресурсов с регионом.

В результате получится такое вот окно:

Интернет вещей: Arduino в связке с облаком - 18

Нажав на квадрат со входными данными можем придумать псевдоним входным данным и заполнить анкету в которой укажем наш IoT хаб в качестве источника.

Интернет вещей: Arduino в связке с облаком - 19

И нужно аналогично настроить выходные данные кликнув на квадратике с ними:

Интернет вещей: Arduino в связке с облаком - 20

Теперь можно создать запрос, который будет перекидывать данные из IoT хаба в базу. Это квадратик между входными и выходными данными. В моем примере запрос довольно простой:

SELECT

iotdata, deviceId, System.Timestamp as eventtime

INTO dataout

FROM

indata

Как вы можете заметить язык запроса довольно похож на SQL. В данном случае и в базе данных и в коде Arduino есть поля iotdata (целочисленное) и deviceId (строка). Кроме того в базе данных создано поле eventtime типа datetime. И в это поле записывается значение времени на момент совершения перемещения из входящего источника в приемник.

Power BI

Скачав и установив бесплатную утилиту Power BI можно подключиться к базе данных SQL Server-а и получить представление этих данных в виде графика или диаграммы. Сама утилита не сложнее чем Excel. Хотя в названии и содержит серьезные слова. BI означает Business Intelligence.

Далее небольшой мануал в пояснениях и скриншотах.

Кнопка «Получить данные» — «Дополнительные сведению…»

Интернет вещей: Arduino в связке с облаком - 21

Интернет вещей: Arduino в связке с облаком - 22

Вводим адрес нашего сервера и имя базы данных. Эти данные задаются при создании базы данных SQL Server-а.

Интернет вещей: Arduino в связке с облаком - 23

А также имя пользователя и пароль для доступа к базе данных.

Интернет вещей: Arduino в связке с облаком - 24

Выделяем необходимую таблицу.

Интернет вещей: Arduino в связке с облаком - 25

И в результате можем получить подобный график.

Интернет вещей: Arduino в связке с облаком - 26

Заключение

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

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

Различных примеров локальных проектов, созданных на платформе Arduino, да и на других платформах достаточно много. Но если девайс доступен только по wi-fi или Bluetooth, то это довольно ограничивает выполняемые задачи. Будущее за интернетом вещей.

Напоминаем, что это полная версия статьи из журнала Хакер. Ее автор — Алексей Соммер.

Автор: sahsAGU

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js