Содержание статьи
Интро
В прошлой статье мы собрали сеть из датчиков и андроидофона с использованием BLE (Bluetooth Low Energy, Bluetooth Smart). Мы поюзали SensorTag 2 от Texas Instruments и ознакомились с характеристиками и профилями BLE. Узнали мы и то, как можно принимать и передавать данные через BLE на Android с железа. Сегодня полученные SensorTag’ом данные об окружающей среде свяжем через смартфон c небольшим облачным сервисом. Так сказать, добавим слово Internet в аббревиатуру IoT.
План действий
- Сначала мы принимаем данные от BLE-устройства (SensorTag 2) на телефон.
- Затем мы должны передать данные с нашего андроидофона в облако.
- И наконец, сделать облачный веб-сервис, для того чтобы можно было следить за показателями нашего SensorTag в любой интернетизированной точке мира. В итоге у нас должна получиться система, представленная на рис. 1.
Обзор технологий
У нас уже есть полученные от SensorTag 2 данные, и в приложении SensorTagApp на андроидофоне мы можем наблюдать графики наших характеристик (температура, влажность, давление и прочее). Теперь можно отправить данные в облако, просто сдвинув переключатель Push to Cloud на экране нашего приложения. Мы можем перейти по этой ссылке или нажать на ссылку Open in browser в приложении. После этого нас перекинет на тест-страничку от IBM, на которой нужно будет ввести MAC-адрес (указан в приложении в поле Device ID).
Теперь нажимаем кнопку Go на нашем SensorTag и с радостью наблюдаем показания сенсоров уже в интернете, в облачном сервисе — правда, пока не в нашем. Не беспокойся — до «нашего» облака мы сегодня тоже долетим, просто перед тем, как двигаться дальше, нам надо понять одну вещь: что именно происходит внутри нашего приложения, когда мы отправляем в интернет данные, поступившие на телефон по BLE.
Для этого мы используем протокол MQTT и формат передачи данных JSON.
Протокол MQTT
MQTT (Message Queue Telemetry Transport) — упрощенный протокол сетевого уровня для обмена сообщениями между устройствами. Этот протокол работает поверх стека TCP/IP и разработан для преодоления проблем, связанных с подключением быстро растущего числа датчиков, микрокомпьютеров, приводов, телефонов, планшетов. В настоящее время MQTT — наиболее распространенный протокол для организации IoT-инфраструктуры.
MQTT устроен по принципу издатель/подписчик(publisher/subscriber): издатель (устройства типа publishers) отправляет сообщение, которое публикуется в централизованном сервисе (брокере сообщений), а подписчик (устройства типа subscriber) получает сообщение из брокера. Для использования брокера MQTT необходимо пройти процедуру подписки на определенные темы публикуемых сообщений.
Небольшие накладные расходы, связанные с хорошо продуманным форматом заголовков, позволяют эффективно применять этот протокол для решений интернета вещей. Эксперименты показывают, что протокол обладает незначительными накладными расходами на стороне устройства, благодаря чему расход энергии аккумуляторной батареи снижается и увеличивается количество передаваемых в единицу времени сообщений. В связи с этим мы будем использовать протокол MQTT для транспортировки пакетов данных и команд между андроидофоном и аналитическими средствами облачной платформы.
Стандартные порты для MQTT — это порт 1883 и порт 8883 для MQTT через SSL.
Подробнее о протоколе можно узнать на официальной страничке MQTT.
Формат JSON
JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается независимым от языка и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.
JSON-текст представляет собой (в закодированном виде) одну из двух структур:
- Набор пар ключ — значение. В различных языках это реализовано как объект, запись, структура, словарь, хеш-таблица, список с ключом или ассоциативный массив.
Ключом может быть только строка (регистрозависимая: имена с буквами в разных регистрах считаются разными), значением — любая форма. - Упорядоченный набор значений. Во многих языках это реализовано как массив, вектор, список или последовательность.
Это универсальные структуры данных: как правило, любой современный язык программирования поддерживает их в той или иной форме. Они легли в основу JSON, так как он используется для обмена данными между различными языками программирования.
Вот данные, полученные от SensorTag в формате JSON, которые мы передаем в облако:
{ "topic": "iot-2/type/\"st- app\"/id/b0b448bb0b54/evt/status/fmt/json", "payload": { "d": { "gyro_x": "0,00", "compass_y": "0,00", "humidity": "60,08", "acc_y": "0,00", "object_temp": "27,06", "acc_x": "-0,00", "light": "68,60", "gyro_z": "0,00", "compass_x": "0,00", "ambient_temp": "24,47", "air_pressure": "853,50", "gyro_y": "0,00", "compass_z": "0,00", "acc_z": "-0,00" } }, "deviceId": "b0b448bb0b54", "deviceType": "\"st-app\"", "eventType": "status", "format": "json", "_msgid": "c33238fd.3ccdc8" }
Android-клиент
Наиболее распространенной реализацией протокола MQTT является библиотека Paho MQTT. Библиотека реализована для наиболее популярных языков программирования: C/C++, Java, JavaScript, Python, Lua, Go, C#. Ее мы и используем в приложении.
В нашем приложении в классах IBMIoTCloudProfile и IBMIoTCloudTableRow содержится функциональность для связи с облаком. Посмотрим же на код поближе:
// Импортируем библиотеку Paho MQTT и нужные нам классы для работы c MQTT-протоколом
import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
// Пишем адрес нашего облака, адрес может быть и другой
IBMIoTCloudProfile v.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://quickstart.internetofthings.ibmcloud.com/#/device/" + addrShort + "/sensor/")));
// Номер стандартного порта брокера (нашей облачной платформы) протокола MQTT
public final static String DEF_CLOUD_IBMQUICKSTART_BROKER_PORT = 1883
...
c.brokerPort = 1883;
// Переводим наши данные от SensorTag в формат JSON
public String jsonEncode(String variableName, String Value) {
String tmpString = new String();
tmpString += startString;
tmpString += "\"" + variableName + "\"" + ":" + "\"" + Value + "\"";
tmpString += stopString;
return tmpString;
}
public String jsonEncode(String str) {
String tmpString = new String();
tmpString += startString;
tmpString += str;
tmpString += stopString;
return tmpString;
}
// Публикуем (отправляем) наши данные в облако
public void publishString(String str) {
MqttMessage message = new MqttMessage();
try {
client.publish(config.publishTopic,jsonEncode("Test","123").getBytes(),0,false);
//Log.d("IBMIoTCloudProfile", "Published message :" + message.toString());
}
catch (MqttException e) {
e.printStackTrace();
}
}
Названия классов и функций говорят сами за себя, и ты всегда сможешь посмотреть реализацию MQTT-клиента в коде приложения.
На стороне облака
Хаб/gateway-устройство (андроидофон) формирует пакеты MQTT и передает их в облако для хранения и обработки. Обратно из облака хаб может получать команды для управления устройствами или для себя.
Давай теперь сами создадим свой веб-сервис, чтобы принимать и отображать показания наших сенсоров. Для этого мы будем использовать облачную платформу от IBM — Bluemix, но можно взять и Azure от Microsoft, или AWS от Amazon, или Heroku от... Heroku?! 🙂 В общем — это дело вкуса.
Облачная платформа IBM Bluemix нужна нам для реализации сервисов хранения, аналитической обработки и визуализации данных, полученных из SensorTag и прокачанных через андроидофон.
INFO
Вместо IBM Bluemix можно попробовать и другие облачные технологии, например Heroku или Azure. А наряду с MQTT можно использовать и другие протоколы — например, protobuf (Google) или AllJoyn (AllSeen Alliance).
I’m blue!
Bluemix — это открытое облачное предложение типа PaaS (Platform as a Service) на базе проекта с открытым исходным кодом Cloud Foundry. Эта платформа предназначена для разработки и хостинга приложений, также она упрощает управление инфраструктурой. Она позволяет быстро создавать и развертывать приложения и управлять ими.
Возможности Bluemix
- быстрое и инкрементное составление приложений из сервисов;
- непрерывное внесение изменений в приложения и обеспечение постоянной доступности;
- поддержка высокоспециализированных моделей программирования и сервисов для конкретных рабочих нагрузок;
- встраивание высокой степени управляемости в сервисы и приложения;
- оптимизация и эластичная адаптация к рабочей нагрузке.
Платформа Bluemix достигает описанных целей посредством абстрагирования и скрытия большинства сложностей, традиционно сопутствующих хостингу приложений в облаке и управлению ими в облачной среде. Bluemix может быть использована разработчиками для создания самых разных приложений, включая веб-приложения, мобильные приложения, приложения для работы с большими данными, приложения для разумных устройств и так далее. Она поддерживает разработку на популярных языках программирования и средах разработки. Java-технологии, средства создания серверных частей для мобильных приложений, мониторинг приложений, технологии с открытым исходным кодом — все эти возможности доступны в облаке как сервисы.
Каталог Bluemix содержит почти все необходимое для быстрого начала работы: большое количество шаблонов, заранее сконфигурированных наборов сервисов, примеров кода, готовых к использованию сред исполнения (в том числе Liberty for Java, Node.js, Ruby on Rails), веб-сервисов и сервисов приложений (Data/Session Cache, ElasticMQ, Decision, SSO, Log Analysis, Redis, RabbitMQ, Twilio), мобильных сервисов (в том числе push-уведомлений, Cloud Code, Mobile Application Management, Mobile Quality Assurance), сервисов управления данными (в том числе MongoDB, реляционная база данных от IBM, JSON базы данных от IBM, MySQL, PostgreSQL, MobileData, MobileSync, BLU Data Warehouse, MapReduce), сервисов мониторинга и анализа сервисов DevOps Services (прежнее название JazzHub).
Краткое описание концепций Bluemix
В терминологии Bluemix приложение (application) — это созданный нами весь программный код (исходный код или исполняемые двоичные файлы), который необходимо запустить или на который нужно сослаться в процессе исполнения. Мобильные приложения выполняются за пределами среды Bluemix и используют сервисы, представленные приложениями. В случае веб-приложений приложение — это код, загруженный на платформу Bluemix с целью хостинга. Кроме того, платформа способна осуществлять хостинг программного кода приложения, который мы хотим выполнять на внутреннем сервере в среде на базе контейнера.
Сервис (service) — это код, работающий на платформе Bluemix и предлагающий определенную функциональность, которую могут использовать приложения. Это может быть готовый сервис, используемый непосредственно, например push-уведомления для мобильных приложений или эластичное кеширование для веб-приложения. Мы также можем создавать собственные сервисы в диапазоне от простых служебных функций до сложной бизнес-логики.
Организация (organization) и пространство (space) — это организационные единицы инфраструктуры, способные хранить и отслеживать ресурсы приложения. Организация содержит домены (domain), пространства и пользователей, пространство — приложения и сервисы. По умолчанию используется три пространства: Development (разработка), Production (производство) и Staging (подготовка). Для приложений, которым требуется среда типа PaaS, предоставляются buildpack-пакеты — наборы скриптов для подготовки кода к исполнению на целевой PaaS-платформе.
Buildpack-пакеты, которые включают необходимую нашим приложениям среду исполнения и могут также содержать специализированные инфраструктуры, упрощают развертывание приложения в облаке по сравнению с самостоятельной установкой и конфигурированием среды исполнения.
Использование сервисов в Bluemix включает три этапа:
- Сообщаем платформе Bluemix, что нам требуется новый экземпляр сервиса, и указываем, какое конкретное приложение будет использовать этот новый экземпляр.
- Bluemix автоматически инициализирует новый экземпляр этого сервиса и связывает его с приложением.
- Приложение взаимодействует с сервисом.
Пакеты сервисов (Service bundles) — это коллекции API интерфейсов, используемых в конкретных областях. Например, пакет Mobile Services включает сервисы MobileData, Cloud Code, Push и Mobile Application Management. Доступные сервисы и среды исполнения представлены в каталоге Bluemix. Кроме того, мы можем зарегистрировать и собственные сервисы.
Выбор языка и среды исполнения
IBM Bluemix поддерживает множество платформ и языков программирования серверной части. Мы же выберем Node-RED. Полную информацию о Node-RED можно узнать на сайте. Я выбрал его из-за удобства и несложности настройки (напоминает LabView). У него удобный графический интерфейс программирования, состоящий из блоков JS, описать которые можно путем загрузки JSON-файла. Разумеется, ты можешь использовать и какой-нибудь Node.js :).
Данные из MQTT-пакета поступают в брокер в составе сервиса IoT Foundation. Подписчиком данных является приложение Node-RED, которое позволяет манипулировать ими с помощью простых визуальных средств. Множество примитивных обрабатывающих блоков (нодов) представляют собой JavaScript-приложения, связанные друг с другом потоками данных.
Запускаем облако
Чтобы начать работу с Bluemix, нужно:
- Зайти на сайт.
- Зарегистрироваться и создать учетную запись (кнопки Sign Up или Log in, если уже есть учетная запись). Ниже на странице расположены полезные учебные видеоматериалы.
- При регистрации заполнить все нужные поля (все стандартно). После регистрации на указанный email придет сообщение о регистрации, и нужно будет подтвердить свою учетную запись, перейдя по ссылке, указанной в сообщении.
- После регистрации мы получим доступ к Bluemix для разработки приложений с двумя гигабайтами памяти во время выполнения и контейнер, а также до десяти подготовленных служб Bluemix. Бесплатно и на месяц.
- На панели управления приложениями и службами (вкладка Dashboard) создать IBM cloud service Internet of Things (как сервис) и назвать любым именем.
- Нажать кнопку Launch (теперь у нас есть постоянно запущенная служба, из которой наше приложение будет брать данные).
- Из Dashboard cоздать приложение Node-RED (выбрать node-red app), нажать Start, перейти по ссылке, которая имеет вид наподобие ИмяПриложения.eu-gb.mybluemix.net, и открыть в редакторе (нажать на большую красную кнопку Go to your Node-RED flow editor). Для создания облачного приложения требуется время. У меня это заняло пять минут.
- Справа в верхней части редактора нажать кнопку «бутерброд» -> import -> clipboard.
- Перейти по ссылке на GitHub, на странице найти пункт Steps to import the Node-RED flow и скопировать JSON-текст, который находится в поле в этом пункте.
- Перейти обратно в редактор приложения Node-RED и вставить JSON-текст в поле Paste nodes here в окне Import nodes, нажать Ok (можно было добавить узлы, «перетаскивая» из панели узлов, находящейся слева в редакторе).
- На рабочем пространстве редактора появится наше приложение, состоящее из узлов (nodes), логику которых можно менять, используя JS.
- Щелкнуть на самом левом узле (TI Sensortag, это как раз наша IoT-служба, которую мы запустили ранее) и ввести в поле Device Id наш MAC-адрес SensorTag, например AA:BB:CC:DD:EE:FF без двоеточий.
- Задеплоить (нажать на кнопку Deploy).
Наконец наше облачное приложение запустилось и работает (отключить его можно кнопкой Stop из Dashboard), и теперь, если у нас включен SensorTag, который передает данные на телефон, и есть телефон, который передает данные в интернет, мы можем наблюдать, как у нас в приложении Node-RED на вкладке Debug (справа) приходят наши данные в формате JSON.
Теперь мы можем добавить, например, HTML-страничку и отображать координаты нахождения телефона и данные с датчиков, как описано здесь, из любой точки земного шара, используя адрес нашего приложения (ИмяПриложения.eu-gb.mybluemix.net). Там же приводится несложный пример с узлом twillio, который позволяет отправлять СМС-оповещение (допустим, о превышении температуры) с использованием Twillio API (нужно просто ввести в узел twillio api-key, полученный при регистрации на сайте, номер телефона, на который придет СМС или голосовое оповещение, и сам текст послания). Можно попробовать анализировать данные и строить графики, предсказывая значения параметров с помощью языка R, как описывается здесь. Или сделать что-то свое.
Итоги
Вот мы и создали свой маленький интернет вещей. Облачные и вообще технологии помогут тебе реализовать идеи, сервисы и приложения, которые нужны людям и которых еще не видел мир. Технологии никогда не спят, и спектр их применения постоянно растет. Так что в 2020 году, возможно, из созвездия 50 миллиардов устройств интернета вещей несколько будут и твоими.