В наш век многие задумывались о создании своего стартапа. Но разработать какой-то интересный и полезный продукт своими силами зачастую сложно. Отчасти для экономии сил, можно использовать облако. В частности, для проектов интернета вещей в облаке можно найти достаточное количество сервисов. Что же такое «Интернет вещей» и как его можно продуктивно использовать? Обо всём этом читайте под катом.
Примечание: мы продолжаем серию публикаций полных версий статей из журнала Хакер. Орфография и пунктуация автора сохранены.
Интернет вещей — это не просто умный дом или умное предприятие. Эксперты прогнозируют что в ближайшее время миллиарды устройств будут решать самые различные задачи в самых разнообразных областях. Да они уже решают множество задач.
Давайте для примера разберем самую стереотипную задачу: устройство, оборудованное каким-либо датчиком, отправляет данные снимаемые с этого датчика в облако. Самый простейший пример устройства, снимающего данные с датчика света (фоторезистра) вы можете увидеть на следующем фото:
Запитать это устройство можно от разъема micro USB. «На борту» платы Genuino MKR1000 находится встроенный Wi-Fi модуль. Стоимость платы около 35 USD. Замена одного датчика на другой как правило не особо усложняет схему. В ней, как вы можете заметить, используется резистор, который стабилизирует снимаемый сигнал и не дает различным помехам на него повлиять. Но об этом есть довольно много специализированной литературы. Сейчас же о другом.
Давайте рассмотрим следующую функциональную схему работы устройства с облаком Azure, которую вполне можно назвать типичной:
На ней устройство взаимодействует с 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 можно использовать бесплатно. Имя хабу придумываем любое произвольное.
Hint: У IoT хаба есть возможность получать с устройства файлы. Эту возможность иногда используют в виде легального хака. Данные с нескольких устройств передаются одному главному устройству, которое уже сохраняет их в текстовый файл определенного формата и отправляет его в облако.
Теперь нам нужно создать виртуальное устройство в облаке Azure, которое будет соответствовать нашему реальному устройству. По-английски это устройство называют device-twin, что означает устройство двойник.
Раньше создать такое устройство можно было с помощью Windows desktop утилиты Device Explorer. Скачать ее можно по следующей ссылке, найдя наиболее свежий файлик
Сейчас не нужно заморачиваться и можно создать двойник устройства прямо на портале Azure найдя в настройках хаба Device Explorer.
Кликнув на созданное устройство в Device Explorer-е можно открыть сведения об устройстве. Из них необходимо взять строку подключения – первичный ключ. Ее мы будем использовать в коде Arduino.
В качестве аутентификации Azure IoT хаб использует два варианта: SSL + SAS или SSL + X.509 сертификат. Но ресурсов Arduino хватает только на первый вариант. Все-таки это устройство с малым энергопотреблением и не обладает большими достаточными вычислительными возможностями.
Выходит, что нам в любом случае необходимо прошить нашу плату SSL сертификатом.
Сделать это можно с помощью кроссплатформенной утилиты WiFi101 Firmware Updater или же с помощью функционала, встроенного в Arduino IDE.
Но перед этим необходимо совершить несколько подготовительных мероприятий в Arduino IDE.
Установить библиотеку WiFi101
После ее установки в IDE появятся примеры использования этой библиотеки. Один из этих примеров под названием FirmwareUpdater необходимо открыть и записать на плату. Сначала открываем:
Затем устанавливаем и выбираем нашу плату (платы для IoT пока что не входят в комплект поставки IDE по умолчанию).
Открываем менеджер плат и ищем необходимую плату. В моем случае это MKR1000.
После установки в том же самом пункте меню необходимо пометить используемую плату.
И выбрать порт на котором она находится:
Последовательные клики на меню Sketch – Upload загрузят скетч на плату. Теперь можно прошивать.
Первый вариант открыть в IDE меню Tools – WiFi101 FirmwareUpdater, нажать Add domain и добавить URL IoT хаба.
После чего нажать «Upload Certificates to WiFi module».
Или же открыть отдельную утилиту WiFi101 Firmware Updater, ввести адрес хаба (в моем случае ArduinoAzureHub.azure-devices.net) в верхнее текстовое поле и нажать кнопку Fetch.
Произойдет загрузка сертификата на компьютер. После этого нужно выбрать COM порт к которому подключено устройство и нажать появившуюся кнопку «Upload certificates».
Устанавливаем следующие библиотеки точно так же, как мы устанавливали недавно библиотеку WiFi101:
Скачиваем исходный код и в папке
В файле
Код скетча становится рабочим и его можно загружать в Arduino.
Следующий код описывает модель:
Пример это, конечно же, только отправная точка для вашего проекта. Шаблон, который можно изменить под свои требования. Я предпочитаю удалять созданные Actions и создать свои. Моя заготовка кода в виде gist размещена на github.
Модель у меня с двумя полями, хранящими имя устройства и число, снятое с датчика и одним событием:
Код экшена в моем случае такой:
Он включает или отключает светодиод, в зависимости от того получено ли значением параметра light целое число 1 или 0.
Срабатывает событие если на плату отправить следующий JSON:
Если вы найдете в коде следующую переменную:
В код
Здесь с аналогового пина под номером 1 подключенного к Arduino каждую секунду снимаются данные. Эти данные отправляются в облако в виде строки deviceId (имени устройства) и самих данных в виде целого числа iotdata.
Давайте для примера будем сохранять данные в базе 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.
Ну и уже в этом окне можно будет создать таблицу.
Один момент, о котором обязательно нужно упомянуть. По умолчанию доступ к SQL Servery в Azure и соответственно к его базе данных закрыт со всех IP адресов из соображений безопасности. То есть даже зная имя пользователя и пароль к базе подключится нельзя. Необходимо зайти на портал Azure и добавить текущий IP в список разрешенных.
Шутка по поводу того, что в IoT буква S отвечает за Security, в данном случае не работает.
Вторым по популярности сервисом Azure для интернета вещей является Stream Analytics. Если мы хотим сохранить данные из IoT хаба в базу данных, то нам нужен этот сервис.
Создается он очень просто. Достаточно придумать название и выбрать группу ресурсов с регионом.
В результате получится такое вот окно:
Нажав на квадрат со входными данными можем придумать псевдоним входным данным и заполнить анкету в которой укажем наш IoT хаб в качестве источника.
И нужно аналогично настроить выходные данные кликнув на квадратике с ними:
Теперь можно создать запрос, который будет перекидывать данные из IoT хаба в базу. Это квадратик между входными и выходными данными. В моем примере запрос довольно простой:
SELECT
iotdata, deviceId, System.Timestamp as eventtime
INTO dataout
FROM
indata
Как вы можете заметить язык запроса довольно похож на SQL. В данном случае и в базе данных и в коде Arduino есть поля iotdata (целочисленное) и deviceId (строка). Кроме того в базе данных создано поле eventtime типа datetime. И в это поле записывается значение времени на момент совершения перемещения из входящего источника в приемник.
Скачав и установив бесплатную утилиту Power BI можно подключиться к базе данных SQL Server-а и получить представление этих данных в виде графика или диаграммы. Сама утилита не сложнее чем Excel. Хотя в названии и содержит серьезные слова. BI означает Business Intelligence.
Далее небольшой мануал в пояснениях и скриншотах.
Кнопка «Получить данные» — «Дополнительные сведению…»
Вводим адрес нашего сервера и имя базы данных. Эти данные задаются при создании базы данных SQL Server-а.
А также имя пользователя и пароль для доступа к базе данных.
Выделяем необходимую таблицу.
И в результате можем получить подобный график.
В результате у нас получился пример того, как можно получить доступ к данным снятым с платы находясь при этом в любой точке планеты. При желании можно не только получать данные от устройства, но и отправлять на него данные/команды.
Облачные технологии интернета вещей позволяют создавать проекты при минимуме программирования. Большую часть времени занимает администрирование и конфигурирование.
Различных примеров локальных проектов, созданных на платформе Arduino, да и на других платформах достаточно много. Но если девайс доступен только по wi-fi или Bluetooth, то это довольно ограничивает выполняемые задачи. Будущее за интернетом вещей.
Напоминаем, что это полная версия статьи из журнала Хакер. Ее автор — Алексей Соммер.
Примечание: мы продолжаем серию публикаций полных версий статей из журнала Хакер. Орфография и пунктуация автора сохранены.
Интернет вещей — это не просто умный дом или умное предприятие. Эксперты прогнозируют что в ближайшее время миллиарды устройств будут решать самые различные задачи в самых разнообразных областях. Да они уже решают множество задач.
Давайте для примера разберем самую стереотипную задачу: устройство, оборудованное каким-либо датчиком, отправляет данные снимаемые с этого датчика в облако. Самый простейший пример устройства, снимающего данные с датчика света (фоторезистра) вы можете увидеть на следующем фото:
Запитать это устройство можно от разъема micro USB. «На борту» платы Genuino MKR1000 находится встроенный Wi-Fi модуль. Стоимость платы около 35 USD. Замена одного датчика на другой как правило не особо усложняет схему. В ней, как вы можете заметить, используется резистор, который стабилизирует снимаемый сигнал и не дает различным помехам на него повлиять. Но об этом есть довольно много специализированной литературы. Сейчас же о другом.
Давайте рассмотрим следующую функциональную схему работы устройства с облаком Azure, которую вполне можно назвать типичной:
На ней устройство взаимодействует с 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 хаба есть возможность получать с устройства файлы. Эту возможность иногда используют в виде легального хака. Данные с нескольких устройств передаются одному главному устройству, которое уже сохраняет их в текстовый файл определенного формата и отправляет его в облако.
Создание device-twin и получение SAS
Теперь нам нужно создать виртуальное устройство в облаке Azure, которое будет соответствовать нашему реальному устройству. По-английски это устройство называют device-twin, что означает устройство двойник.
Раньше создать такое устройство можно было с помощью Windows desktop утилиты Device Explorer. Скачать ее можно по следующей ссылке, найдя наиболее свежий файлик
SetupDeviceExplorer.msi
или с помощью кроссплатформенной утилиты iothub-explorer, установить которую можно с помощью NPM (Node.js Package Manager).Сейчас не нужно заморачиваться и можно создать двойник устройства прямо на портале Azure найдя в настройках хаба Device Explorer.
Кликнув на созданное устройство в Device Explorer-е можно открыть сведения об устройстве. Из них необходимо взять строку подключения – первичный ключ. Ее мы будем использовать в коде Arduino.
Прошивка платы Arduino SSL сертификатом
В качестве аутентификации Azure IoT хаб использует два варианта: SSL + SAS или SSL + X.509 сертификат. Но ресурсов Arduino хватает только на первый вариант. Все-таки это устройство с малым энергопотреблением и не обладает большими достаточными вычислительными возможностями.
Выходит, что нам в любом случае необходимо прошить нашу плату SSL сертификатом.
Сделать это можно с помощью кроссплатформенной утилиты WiFi101 Firmware Updater или же с помощью функционала, встроенного в Arduino IDE.
Но перед этим необходимо совершить несколько подготовительных мероприятий в Arduino IDE.
Установить библиотеку WiFi101
После ее установки в IDE появятся примеры использования этой библиотеки. Один из этих примеров под названием FirmwareUpdater необходимо открыть и записать на плату. Сначала открываем:
Затем устанавливаем и выбираем нашу плату (платы для IoT пока что не входят в комплект поставки IDE по умолчанию).
Открываем менеджер плат и ищем необходимую плату. В моем случае это MKR1000.
После установки в том же самом пункте меню необходимо пометить используемую плату.
И выбрать порт на котором она находится:
Последовательные клики на меню Sketch – Upload загрузят скетч на плату. Теперь можно прошивать.
Первый вариант открыть в IDE меню Tools – WiFi101 FirmwareUpdater, нажать Add domain и добавить URL IoT хаба.
После чего нажать «Upload Certificates to WiFi module».
Или же открыть отдельную утилиту WiFi101 Firmware Updater, ввести адрес хаба (в моем случае ArduinoAzureHub.azure-devices.net) в верхнее текстовое поле и нажать кнопку Fetch.
Произойдет загрузка сертификата на компьютер. После этого нужно выбрать COM порт к которому подключено устройство и нажать появившуюся кнопку «Upload certificates».
Написание скетча и использование 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.
Ну и уже в этом окне можно будет создать таблицу.
Один момент, о котором обязательно нужно упомянуть. По умолчанию доступ к SQL Servery в Azure и соответственно к его базе данных закрыт со всех IP адресов из соображений безопасности. То есть даже зная имя пользователя и пароль к базе подключится нельзя. Необходимо зайти на портал Azure и добавить текущий IP в список разрешенных.
Шутка по поводу того, что в IoT буква S отвечает за Security, в данном случае не работает.
Stream Analytics
Вторым по популярности сервисом Azure для интернета вещей является Stream Analytics. Если мы хотим сохранить данные из IoT хаба в базу данных, то нам нужен этот сервис.
Создается он очень просто. Достаточно придумать название и выбрать группу ресурсов с регионом.
В результате получится такое вот окно:
Нажав на квадрат со входными данными можем придумать псевдоним входным данным и заполнить анкету в которой укажем наш IoT хаб в качестве источника.
И нужно аналогично настроить выходные данные кликнув на квадратике с ними:
Теперь можно создать запрос, который будет перекидывать данные из 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.
Далее небольшой мануал в пояснениях и скриншотах.
Кнопка «Получить данные» — «Дополнительные сведению…»
Вводим адрес нашего сервера и имя базы данных. Эти данные задаются при создании базы данных SQL Server-а.
А также имя пользователя и пароль для доступа к базе данных.
Выделяем необходимую таблицу.
И в результате можем получить подобный график.
Заключение
В результате у нас получился пример того, как можно получить доступ к данным снятым с платы находясь при этом в любой точке планеты. При желании можно не только получать данные от устройства, но и отправлять на него данные/команды.
Облачные технологии интернета вещей позволяют создавать проекты при минимуме программирования. Большую часть времени занимает администрирование и конфигурирование.
Различных примеров локальных проектов, созданных на платформе Arduino, да и на других платформах достаточно много. Но если девайс доступен только по wi-fi или Bluetooth, то это довольно ограничивает выполняемые задачи. Будущее за интернетом вещей.
Напоминаем, что это полная версия статьи из журнала Хакер. Ее автор — Алексей Соммер.
roboter