Апрель 2016

Том 31 номер 4

Интернет вещей - Разработка соединенного с Azure IoT-решения в Visual Studio на C++

Марк Гуднер | Апрель 2016

Продукты и технологии:

Visual Studio 2015, Azure IoT Suite, Azure IoT Hub, C++, Raspberry Pi, Arduino, mbed

В статье рассматриваются:

  • настройка Azure IoT Hub;
  • фотоэлемент и три аппаратных варианта: Raspberry Pi, Arduino и mbed;
  • использование данных датчика в сервисах Azure.

В наши дни Интернет вещей (Internet of Things, IoT) повсюду. IoT — понятие, объединяющее множество вещей, но в простейшем случае его можно рассматривать как данные от датчиков, собираемые в облаке для дальнейшей обработки. Это проявляется в многих типах устройств, развертываемых для сбора данных от датчиков, полнофункциональных облачных сервисах для потребления этих данных в требуемых масштабах, анализе больших данных, машинном обучении для обработки этих данных и операций над ними, а также в клиентских приложениях с информативной отчетностью, извлекающих полезные сведения из этих данных.

Как приступить к работе IoT? Вам требуется какое-то устройство, облако и инструменты для написания и развертывания вашего программного решения как на устройствах, так и в облаке.

В этой статье я подробно поясню, как подключить устройство к Azure IoT, используя шаблоны проектов C++ в Visual Studio, которые охватывают наиболее распространенные устройства. Вы узнаете, как подготовить Azure IoT Hub для потребления данных от ваших устройств, и освоите соответствующие сервисы, способные работать с этими данными. Сервисы Azure IoT обеспечивают высочайший уровень гибкости по двум причинам: они безразличны к языку программирования, используемому вами на самом устройстве, а благодаря набору SDK для клиентских устройств Azure IoT поддерживают постоянно растущее количество языков и типов устройств. В этой статье я сосредоточусь на C++ из-за обеспечиваемой им поддержки широкого спектра устройств — от самых малых и экономичных микроконтроллеров до устройств, работающих под управлением полнофункциональных операционных систем, таких как Linux или Windows IoT, а также из-за непревзойденного уровня контроля над низкоуровневой аппаратной функциональностью, предоставляемой разработчикам. Даже если вы не являетесь разработчиком на C++, вы узнаете достаточно, чтобы понять, как развернуть простое приложение на подключенном к сети устройстве и передавать данные в Azure.

Сценарий для этой статьи прост: сбор данных от светочувствительного датчика (фотоэлемента) с устройства в Azure. Моей целью является не создание полного решения, а внимание к основам — к тому, как собирать данные и проверять, получены ли они в облаке. Я покажу, как можно использовать эти данные в других сервисах Azure и как развертывать эти сервисы в рамках вашей подписки Azure. Подробнее о IoT см. по ссылке aka.ms/iotmsdnb16, где вы также найдете другие ссылки на инструменты, рассматриваемые в этой статье, дополнительную документацию, гораздо больше примеров и полностью законченное IoT-приложение Connect the Dots, которое можно легко развернуть в вашей подписке Azure и к которому можно подключать свои устройства.

Сначала я подготовлю Azure IoT Hub, затем напишу некоторый код в Visual Studio для отправки тестовых данных серверной части в Azure. После этого я проделаю то же самое с реальными данными от самых разнообразных устройств и закончу обсуждением сервисов Azure, которые можно использовать с собираемыми вами данными от датчиков.

Azure IoT Suite и Azure IoT Hub

Для облачной части IoT-решения Azure предлагает несколько сервисов, в том числе Azure IoT Hub и комплект Azure IoT Suite, который уменьшает объем предварительной работы и обеспечивает масштабируемость в более долгосрочной перспективе. Azure IoT Hub — это точка подключения для устройств. Этот хаб оптимизирован для поддержки потребления больших объемов данных — важная возможность, учитывая, что развертывание миллионов устройств, отправляющих постоянные обновления, отнюдь не является редкостью. Вы можете выбрать бесплатную редакцию, которая поддерживает до 8000 сообщений в день (идеальна для создания прототипов или персональных проектов), или одну из двух платных редакций: первая из них рассчитана на меньшие проекты, где принимается вплоть до 400 000 сообщений в день, а вторая масштабируется для более крупных реализаций, поддерживая вплоть до 6 миллионов сообщений в день. В зависимости от масштаба создаваемого вами IoT-решения можно развернуть столько IoT-хабов, сколько нужно для поддержки количеств сообщений, требуемых вашим решением. IoT Hub также предоставляет механизмы для управления устройствами и их подготовки с адаптацией под потребности IoT-развертываний и набор SDK с открытым исходным кодом для разработки частей вашего решения, связанных с подключением устройств и управлением сервисами.

IoT — понятие, объединяющее множество вещей, но в простейшем случае его можно рассматривать как данные от датчиков, собираемые в облаке для дальнейшей обработки.

Azure IoT Suite предлагает растущий набор полнофункциональных комплексных IoT-решений, заранее сконфигурированных для упрощения процесса разработки. Он включает решения для таких распространенных IoT-проектов, как обслуживание по техническому состоянию (predictive maintenance), использование данных с датчиков машин для предсказания проблем до того, как они возникнут. Решения Azure IoT Suite включают набор заранее сконфигурированных сервисов Azure IoT, в том числе Azure IoT Hub, который можно подготовить для вашей подписки Azure, чтобы вы могли быстро развернуть какое-либо IoT-решение, а затем адаптировать его под уникальные потребности вашего проекта.

Предпочитаете вы использование заранее сконфигурированного решения Azure IoT Suite или развертывание собственного набора сервисов Azure, вы будете применять одни и те же Azure IoT SDK для разработчик аппаратной части своего приложения. В примере, который будет рассматриваться далее, я буду вручную подготавливать некоторые простые сервисы за экземпляром Azure IoT Hub, чтобы продемонстрировать несложное IoT-решение.

Подключение к Azure IoT Hub

Первый шаг — подготовка вашего Azure IoT Hub. Если у вас нет подписки Azure, вы можете создать бесплатную пробную подписку. Покончив с этим, войдите в Azure Portal и выберите New | Internet of Things | Azure IoT Hub, укажите нужные параметры и щелкните New. Выберите свой уровень тарификации (при бесплатном тарифе можно развернуть только один экземпляр IoT Hub на подписку), ответьте на дополнительные запросы и выберите Create (рис. 1).

Создание нового Azure IoT Hub
Рис. 1. Создание нового Azure IoT Hub

Далее убедитесь, что у вас есть Visual Studio 2015 Community Edition или выше с установленными и правильно сконфигурированными инструментами C++. Вам потребуются расширения Visual C++ for Linux Development, Visual C++ for IoT Development, установленный Azure IoT Hub Connected Service и шаблоны Windows IoT Core, если вы планируете ориентироваться на устройство Windows IoT. Вы найдете эти расширения в Visual Studio Gallery или установите из Visual Studio, используя меню Tools | Extensions and Updates. Аналогично примеры для Arduino и mbed требуют использования PlatformIO, чтобы включить поддержку этих плат компиляторами; PlatformIO можно получить на platformio.org.

Теперь создайте проект для подключения к вашему IoT Hub. В Azure IoT SDK есть много примеров, охватывающих этот код, каждый из которых сфокусирован на конкретном протоколе или устройстве. Самый простой способ получить этот код — установить расширение Azure IoT Hub Connected Service, которое в настоящее время поддерживает проекты на C# и C++. Я хочу быстро создать прототип своего кода до работы с устройством, поэтому я буду делать это в Windows. После установки расширения создайте новый Win32-проект в Visual C++.

В этом проекте щелкните правой кнопкой мыши References и выберите Add Connected Service. В появившемся диалоге выберите Azure IoT Hub Connected Service и щелкните кнопку Configure (рис. 2).

Использование расширения Azure IoT Hub Connected Service
Рис. 2. Использование расширения Azure IoT Hub Connected Service

Войдите в учетную запись Azure и вы увидите свой IoT Hub. Выберите его и щелкните Add. Появится список существующих устройств, если вы уже добавили какие-то устройства к IoT Hub; если нет, список будет пуст. Выберите New Device и присвойте ему имя — назовем его ThingOne. Дождитесь его появления и выберите его. Это приведет к скачиванию NuGet-пакета с нужными вам библиотеками и к генерации нового файла, azure_iot_hub.cpp, и соответствующего заголовочного файла azure_iot_hub.h, содержащего вспомогательные функции, которые инкапсулируют самый эффективный код для отправки данных в Azure IoT Hub с необходимой строкой подключения для выбранного вами устройства. Конечно, вам понадобится модифицировать сгенерированный код для обработки сообщений, которые вам нужно отправлять и принимать. На данный момент мы будем отправлять исходное сообщение. Добавьте в код консольного приложения ссылку на новый заголовочный файл и поместите в main вызов функции send_device_to_cloud_message. Ваш код должен выглядеть так:

#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
{
  send_device_to_cloud_message();
  return 0;
}

Затем с помощью IoT Hub Explorer проверьте, что ваши сообщения попадают в IoT Hub. Это кросс-платформенная CLI-утилита на основе Node.js, так что, если она не установлена в вашей системе, установите ее сейчас. Для этого воспользуйтесь npm:

npm install -g iothub-explorer@latest

Теперь в командной строке запустите IoT Hub Explorer, чтобы видеть данные, отправляемые с вашего устройства в Azure IoT Hub. Необходимая команда со строкой подключения и именем устройства находится в комментариях в файле azure_iot_hub.cpp. Чтобы самостоятельно найти эту строку в Azure Portal, выберите свой IoT Hub, щелкните значок ключа в строке Essentials и взгляните на появившуюся панель Shared Access Policies:

iothub-explorer [<connection-string>} monitor-events ThingOne

Вы увидите сообщение, информирующее, что ведется мониторинг событий от устройства. Теперь переключитесь обратно в Visual Studio и начните отладку, нажав F5. Вы должны увидеть событие, принятое в консоли: «Hello Cloud».

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

IOTHUB_CLIENT_HANDLE iothub_client_handle =
  IoTHubClient_CreateFromConnectionString(connection_string, AMQP_Protocol);

Обратите внимание на AMQP_Protocol, применяемый по умолчанию, хотя здесь можно использовать и другие протоколы вроде HTTP и MQTT. Вы также заметите, что код, создающий этот клиент, окружен обработкой ошибок. Само сообщение отправляется сразу после успешного создания клиента:

d::string message = "Hello, Cloud!";
IOTHUB_MESSAGE_HANDLE message_handle =
  IoTHubMessage_CreateFromByteArray((const unsigned char*)message.data(),
  message.size());

И вновь вы увидите обработку ошибок; кроме того, в IoT Hub посылается запрос для подтверждения доставки. Теперь вы можете вносить свои изменения, чтобы отправлять собственное сообщение.

Переходя к использованию реальных датчиков, мы намерены обнаруживать яркость освещения с помощью фоторезистора, также известного как Light Dependent Resistor (LDR), поэтому давайте модифицируем код для отправки сообщения со значением, подходящим в этом сценарии. В заголовочный файл azure_iot_hub.h добавьте int как параметр вызова функции. После этого содержимое заголовочного файла должно выглядеть следующим образом:

// Вставьте вызов этой функции в свой код
void send_device_to_cloud_message(int);

В определении функции send_device_to_cloud_message измените значение сообщения для использования данных от датчика вместо отправки «Hello, Cloud!». Вот пример того, как это можно сделать в формате JSON:

char msgText[1024];
sprintf_s(msgText, sizeof(msgText), "{\"ldrValue\":%d}", ldrValue);
std::string message = msgText;

Для более сложных JSON-данных или других форматов используйте свою любимую C++-библиотеку.

Теперь обновите функцию main для передачи некоторых значений как данных от датчика:

#include "stdafx.h"
#include "azure_iot_hub.h"
int main()
{
  // Реальное значение будет считываться с датчика
  // в более поздних примерах
  int ldrValue = 500;  
  send_device_to_cloud_message(ldrValue);
  return 0;
}

Благодаря тому, что IoT Hub Explorer по-прежнему выполняется, следите за формированием сообщений и запустите проект. Вы увидите новое принятое событие с данными в формате JSON, { ldrValue: 500 }.

Поздравляю! Теперь у вас есть IoT-облако и некоторый код, готовый к связыванию с устройством, к которому подключены датчики.

Устройства и датчики

В качестве датчиков в этом приложении я задействую систему Grove от Seeed Studios. Grove предлагает широкий спектр датчиков со стандартным разъемом, который идентичен интерфейсу плат расширения, подключенными к вашему устройству, что исключает необходимость в макетных платах и каких-либо работ с паяльником, когда вы разрабатываете прототип IoT-решения. Конечно, вы можете использовать какой угодно датчик или вообще обойтись без них, если хотите имитировать данные датчиков в коде устройства.

Конкретное Grove-устройство, которое я показываю здесь в примерах кода, является светочувствительным датчиком (фотоэлементом). Делаю я это отчасти из-за его простоты, поскольку он выдает аналоговый вывод и мне не нужно искать и устанавливать специфическую библиотеку — этот процесс может варьироваться в зависимости от платформы. Во всех примерах этот датчик вставляется в разъем под меткой A0 на плате расширения Grove. Если вы не хотите использовать дополнительную плату и умеете создавать макетные платы, просто подключите LDR к электропитанию, а коннектор аналогового входа вставьте в свою плату.

В отношении аппаратной части решения я намерен охватить три альтернативы: Raspberry Pi, Arduino и mbed. При выборе устройства для IoT-проекта нужно учитывать много факторов, и эти три варианта закрывают собой целый набор разных сценариев применения. Для менее масштабных развертываний ряд готовых устройств может упростить процесс разработки. Однако для более масштабных развертываний эти варианты не столь экономичны. (При развертывании десятков тысяч устройств сокращение стоимости аппаратной части всего на доллар-два даст большую разницу.) Если вы только-только приступаете к освоению IoT, простота разработки, по-видимому, важнее минимизации расходов, но при создании прототипа вы, вероятно, захотите учесть фактор стоимости. Базовая подготовка устройств здесь не рассматривается, но вы найдете ссылки на все необходимые материалы на веб-странице aka.ms/iotmsdnb16. Устройства и датчик, обсуждаемые в этом разделе, показаны на рис. 3.

Raspberry Pi 2 (слева) с подключенными Grove Hat и светочувствительным датчиком, Arduino Yun, базовая плата расширения Grove и плата FRDM 64 mbed (внизу)
Рис. 3. Raspberry Pi 2 (слева) с подключенными Grove Hat и светочувствительным датчиком, Arduino Yun, базовая плата расширения Grove и плата FRDM 64 mbed (внизу)

На момент написания этой статьи расширение Azure IoT Hub Connected Service способно оперировать только двоичными библиотеками для использования в Windows. Microsoft работает над тем, чтобы сделать то же самое и для других платформ. Тем не менее, код, генерируемый этим расширением, функционирует на разных платформах. В следующих подразделах вы будете повторно использовать ранее сгенерированный код для обработки сообщений для Azure IoT Hub. Подраздел для каждого устройства совершенно самостоятелен, поэтому вы можете пропускать подразделы для тех устройств, которые вас не интересуют.

Raspberry Pi Это одноплатный компьютер с процессором ARM и графическим процессором (GPU). Он может выполнять различные вариации Linux, а Raspberry Pi 2 вдобавок поддерживает Windows 10 IoT. Raspberry Pi обеспечивает высокую гибкость: это полноценный компьютер, включающий поддержку сети, USB, GPIO и HDMI (хотя аналоговые датчики не поддерживаются); благодаря энергичному сообществу производителей Интернет изобилует проектами-примерами, и можно быстро получить помощь. Однако эта гибкость не дается даром — он потребляет больше электроэнергии в сравнении с альтернативами, имеющими ограниченные возможности в адаптации. Так что, если вы создаете прототип устройства, у которого не будет доступа к проводным электрическим сетям или которое будет развертываться в больших масштабах, вы, вероятно, предпочтете другую плату.

Для этой статьи я намерен использовать Raspberry Pi в сочетании с платой расширения для коннекторов Grove от Dexter Industries, которая также добавляет поддержку аналоговых сигналов; светочувствительный элемент я подключаю к A0. Я также буду использовать новую систему проектов, недавно выпущенную для Linux (часть расширения Visual C++ for Linux Development), которая позволяет компилировать и отлаживать код на удаленных машинах с Linux. Выберите File | New Project. В узле Visual C++ | Cross Platform укажите Console Application (Linux). При этом будет открыт файл справки, в которой поясняются новые возможности этого типа проектов и описывается, как добавить удаленную машину с Linux в проект. Там же сказано, как получить библиотеки Azure IoT для Linux, и даются некоторые рекомендации по настройке платы расширения (shield) Grove.

Скопируйте сгенерированные файлы из первого проекта в этот. Откройте файл .cpp в решении с именем вашего проекта и добавьте ссылку на azure_iot_hub.h. Теперь обновите код в main, чтобы постоянно считывать с устройства данные датчика рис. 4.

Рис. 4. Считывание данных датчика, используя Raspberry Pi

#include "azure_iot_hub.h"
#include <unistd.h>
#include "grovepi.h"
int main()
{
  int ldrValue;
  while(1) {
    ldrValue = analogRead(0);
    send_device_to_cloud_message(ldrValue);
    sleep(5);
  }
  return 0;
}

Теперь можно запустить приложение из Visual Studio. Она скопирует ваши файлы исходного кода в указанное место на Pi, скомпилирует их и запустит. Как и в любом другом коде в Visual Studio, вы можете устанавливать точки прерывания. Когда код будет выполняться, вы увидите событие, принимаемое IoT Hub Explorer, как и в случае имитируемых данных, { ldrValue: 1013 }.

Эта поддержка Linux не ограничена только Raspberry Pi; она работает и с другими устройствами на основе Linux вроде Intel Edison, BeagleBone или любыми удаленными машинами под управлением Linux.

Другой вариант — Windows 10 IoT Core на Raspberry Pi 2. Информацию о том, как приступить к работе в таком варианте, см. на windowsondevices.com. После установки инструментария выберите File | New Project, затем раскройте узел Visual C++ Windows и укажите Blank App (Universal Windows). Добавьте в проект ссылку на Windows IoT Extensions for the UWP. На момент написания статьи для UWP требовались дополнительные этапы подготовки. Пожалуйста, прочитайте комментарии в сгенерированном файле azure_iot_hub.cpp в случае, если они все еще требуются. В прикладной код MainPage.xaml.cpp добавьте ссылку на включаемый файл azure_iot_hub.h.

Во включаемый файл MainPage.xaml.h добавьте следующие закрытые объявления:

private:
  const int readPin = 4;
  Windows::Devices::Gpio::GpioPin ^pin_;

Этот код иллюстрирует, как напрямую считывать данные из GPIO-контакта (pin), используя UWP API. Пожалуйста, проверьте на aka.ms/iotmsdnb16 наличие обновлений, касающихся применения платы расширения Grove Pi с C++. Обновите определение функции и реализацию для передачи значений от датчика в виде JSON-объекта, как в более раннем примере.

Затем обновите реализацию MainPage в MainPage.xaml.cpp:

MainPage::MainPage()
{
  int ldrValue;
  auto gpio = GpioController::GetDefault();
  pin_ = gpio->OpenPin(readPin);
  pinValue = (int) pin_->Read();
  send_device_to_cloud_message(ldrValue);
}

Убедитесь, что Azure IoT Hub прослушивает ваше устройство, затем скомпилируйте и разверните. Вы увидите потоковую передачу JSON-сообщений со значениями от вашего фотоэлемента. Отладка работает так, как вы и могли ожидать, поскольку целевым устройством является другая машина с Windows. Когда устройство с Windows IoT является вашей целью, никакой специальной настройки не нужно.

Arduino Эта плата встречается в проектах производителей чаще, чем любые другие. Из-за ее широкого распространения многие другие поставщики добавили для своих плат поддержку Arduino IDE. Среди производителей датчиков уровень поддержки примерно такой же высокий, и они предлагают библиотеки, которые можно легко включать в Arduino IDE. Сами платы имеют общие разъемы, которые предоставляют разнообразные цифровые и аналоговые входы и выходы в общем для добавляемых плат расширения форм-факторе, таких как базовая плата расширения Grove. Этот форм-фактор был принят многими другими поставщиками плат. Существует большой выбор плат Arduino/Genuino (от микроконтроллеров с малым энергопотреблением до мощных чипов ARM), а также имеется богатая экосистема плат от сторонних поставщиков. Поскольку это открытая аппаратная платформа, для нее доступны все принципиальные схемы, что делает ее превосходной платформой для использования в крупномасштабных развертываниях.

Однако не во все платы Arduino встроена поддержка сетей, поэтому вам понадобится либо выбрать ту, где есть поддержка сетей, либо использовать плату расширения, которая добавляет поддержку сетей в ваше устройство. Вставьте базовую плату расширения Grove и подключите светочувствительный элемент к порту с меткой A0.

Базовые проекты Arduino называются скетчами (sketches) и включают папку, содержащую файл с тем же именем, заканчивающимся на «.ino». Это просто C++-файл. Arduino IDE скрывает большую часть сложности с помощью своих библиотек Wiring API. Существует уйма онлайновых руководств, охватывающих базовую подготовку и использование Arduino; если вам нужны конкретные ссылки на такие руководства, посетите Arduino.cc или aka.ms/iotmsdnb16. Если вам нужна более полная функциональность Visual Studio, но вы хотите оставаться внутри экосистемы Arduino и использовать формат .ino, то Visual Micro предоставляет расширение, которое переносит большую часть функций управления платой и библиотеками из Arduino IDE в Visual Studio.

Чтобы напрямую использовать C++ вместо формата скетчей .ino, убедитесь, что вы установили расширение Visual C++ for IoT Development, и создайте новый проект. Затем из Visual C++ | Cross Platform выберите проект Blank Application (IoT). При этом будет открыт файл справки, в которой поясняются новые возможности этого типа проектов. Прочитайте эти инструкции, чтобы понять, как добавить и сконфигурировать вашу плату в проекте.

В файле readme в проекте описываются инициализация PlatformIO для использования с Arduino and импорт необходимых библиотек Azure IoT. Скопируйте файл azure_iot_hub.h из первого упражнения в папку lib, а файл azure_iot_hub.cpp — в папку src:

#include "azure_iot_hub.h"
int lightSensorPin = 0;
int ldrValue;
void loop()
{
  ldrValue = analogRead(lightSensorPin);
  send_device_to_cloud_message(ldrValue);
  delay(2000);
}

Теперь вы можете компилировать и развертывать свой код на этой плате. Убедитесь, что Azure IoT Hub Explorer выполняется, чтобы видеть сообщения, посылаемые с платы. Также поддерживается отладка. Ее подготовка зависит от конкретной платы, так что, пожалуйста, прочитайте справочный файл, включаемый в проект.

mbed Платформа ARM mbed — еще один прекрасный выбор. Это операционная система для микроконтроллеров на базе ARM, которая предоставляет стандартную инфраструктуру для разработки и поддерживается широким спектром макетных плат, поставляемых многими производителями электроники на основе ARM. Все эти поставщики по-разному подходят к производству заказных схем (custom designs). Для масштабных развертываний mbed является отличной отправной точкой. В Microsoft мы работали с платами от Freescale, Marvel, STMicro и другими. Однако здесь богатство выбора тоже может затруднить понимание того, откуда следует начать, но превосходное онлайновое сообщество на mbed.org может помочь вам в этом. Учтите, что вы не найдете в сети столько онлайновых проектов в стиле производителей для mbed, как для Raspberry Pi или Arduino. Каждый поставщик ARM, производящий mbed-плату, предлагает свое руководство для начала работы; настоятельно рекомендую воспользоваться прежде всего им.

Для этой статьи я намерен использовать плату Freescale Freedom K64F, поскольку у нее есть встроенная поддержка Ethernet, что резко упрощает подключение к Интернету. В комплекте с этой платой поставляются заголовочные файлы, подходящие и для Arduino, поэтому можно будет использовать ту же базовую плату расширения Grove для подключения датчиков. Подключите светочувствительный элемент к контакту с меткой A0.

И вновь, как в случае в Raspberry Pi и Arduino, я буду использовать поддержку микроконтроллеров в Visual Studio. Убедитесь, что вы установили расширение Visual C++ for IoT Development, и создайте новый проект. Затем из Visual C++ | Cross Platform выберите проект Blank Application (IoT). При этом будет открыт файл справки, в которой поясняются новые возможности этого типа проектов. Прочитайте эти инструкции, чтобы понять, как добавить и сконфигурировать вашу плату в проекте.

Для этого проекта я задействую PlatformIO в качестве средства компиляции. PlatformIO — гибкая система, которая поддерживает множество разных платформ микроконтроллеров. Пожалуйста, прочитайте файл readme в проекте, чтобы понять, как инициализировать PlatformIO для использования с mbed и импорта необходимых библиотек Azure IoT. Скопируйте файл azure_iot_hub.h из первого упражнения в папку lib, а файл azure_iot_hub.cpp — в папку src:

Обновите код своей программы, как показано на рис. 5.

Рис. 5. Считывание данных от датчика с помощью mbed

#include "azure_iot_hub.h"
#include "mbed.h"
AnalogIn lightSensorPin(A0);
float ldrSensorValue;
int ldrValue
int main()
{  while(1) {
    ldrSensorValue = lightSensorPin.read();
    ldrValue = (int) (ldrSensorValue * 1000);
    send_device_to_cloud_message(ldrValue);
    delay(2000);
  }
}

Теперь вы можете компилировать и развертывать свой код на этой плате. Убедитесь, что Azure IoT Hub Explorer выполняется, чтобы видеть сообщения, посылаемые с платы. Также поддерживается отладка. Ее подготовка зависит от конкретной платы, так что, пожалуйста, прочитайте справочный файл, включаемый в проект.

Использование данных от датчиков в сервисах Azure

Научившись получать данные от датчика, поступающие с устройства, и отправлять их в Azure, вы можете использовать их с любым доступным сервисом Azure. Здесь эталонная реализация в Azure IoT Suite или в проекте Connect the Dots поможет вам понять возможности и то, как разные вещи соединяются друг с другом.

В качестве примера можно обрабатывать информацию реального времени, поступающую через IoT Hubs и применять ее как входные данные для других сервисов. Здесь весьма распространенный шаблон — обнаружение аномальных отклонений и уведомление. Чтобы настроить этот тип оповещений, вы должны были бы создать сервис Stream Analytics, который принимает на входе данные от IoT Hub. Затем вам следовало бы определить место вывода результатов этой работы, например в Storage Blob или PowerBI, и определить запрос, который разбирает данные, поступающие со входа, и, скажем, ищет значения, превышающие заданный порог. После этого любые совпадения посылались бы в определенное место вывода (рис. 6).

Простейший анализ потока данных
Рис. 6. Простейший анализ потока данных

Вы могли бы задействовать Storage Blob в качестве входа для логики приложения, которое затем посылало бы SMS-оповещение, или в случае PowerBI оно могло бы использоваться как информационная панель, которая почти в реальном времени сообщает о меняющихся условиях. Сервисы машинного обучения также предоставляют богатые возможности для извлечения ценной информации из колоссальных объемов данных от датчиков. Собираемую информацию можно анализировать в реальном времени или как данные за определенные периоды. Это лишь несколько примеров. С помощью сервисов Azure, доступных для дальнейшей обработки ваших данных и формирования отчетов по ним, вы можете реализовать любые требования вашего IoT.

Следует отметить один момент. IoT Hubs применимы везде, где применимы Event Hubs. Если вы обнаруживаете, что сервис, который вы пытаетесь задействовать, не поддерживает IoT Hub, то должны получить совместимое имя Event Hub. Перейдите в свой IoT Hub на Azure Portal и выберите Messaging. Под параметрами Device to Cloud вы увидите совместимое имя и конечную точку Event Hub.

Использование всех преимуществ IoT-данных всегда требует применения нескольких сервисов. Шаблоны Azure Resource Manager (ARM) могут помочь справиться с этой сложностью. Эти шаблоны, написанные в формате JSON, определяют сервисы Azure для развертывания, в том числе порядок и место развертывания, используемые значения и т. д., и они позволяют быстро развертывать полный набор сервисов для создания серверной части IoT в облаке. Данные шаблоны применяются в IoT Suite для развертывания решения в специфические подписки Azure. Поскольку шаблоны являются просто JSON-файлами, вы также можете отслеживать их в своей системе контроля версий для использования в будущих развертываниях, скажем, при переходе от прототипа к производственному развертыванию.

Ваше будущее с IoT

Вы можете сыграть свою роль в создании Интернета вещей. Если вы еще не начали идти по этому пути, надеюсь, что эта статья подогреет ваш интерес. Если вы уже годами работаете с устройствами Arduino и Raspberry Pi, то, возможно, вы найдете преимущества в новых средствах Visual Studio C++, представленных здесь. Если вы не являетесь разработчиком на C++, то не исключено, что эти новые средства сделают C++ гораздо более дружелюбным.

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

Не забывайте заходить на aka.ms/iotmsdnb16за дополнительными ресурсами и для продолжения освоения IoT.


Марк Гуднер (Marc Goodner) — менеджер программ, занимается инструментарием для IoT в группе Visual Studio и является активным участником Microsoft Garage Maker Community. Ценит качественный солодовый виски.

Выражаю благодарность за рецензирование статьи экспертам Microsoft Оливеру Блошу (Olivier Bloch) и Артуру Лаксбергу (Artur Laksberg).


Discuss this article in the MSDN Magazine forum