company_banner

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

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



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

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

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



    Запитать это устройство можно от разъема 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, то это довольно ограничивает выполняемые задачи. Будущее за интернетом вещей.

    Напоминаем, что это полная версия статьи из журнала Хакер. Ее автор — Алексей Соммер.
    Microsoft 518,85
    Microsoft — мировой лидер в области ПО и ИТ-услуг
    Поделиться публикацией
    Комментарии 4
    • +1
      Это квадратик
      — кубик :)
      • 0
        Это как микроскопом гвозди забивать…
        • 0
          Чем esp8266 не угодил?
          • 0

            Как-то дороговато за такое примитивное устройство…

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

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