Содержание статьи
- Интро
- План действий
- Обзор технологий
- Протокол MQTT
- Формат JSON
- Android-клиент
- На стороне облака
- I’m blue!
- Краткое описание концепций Bluemix
- Выбoр языка и среды исполнения
- Запускаем облако
- Итоги
Интро
В пpошлой статье мы собрали сеть из датчиков и андроидофона с использованием BLE (Bluetooth Low Energy, Bluetooth Smart). Мы поюзали SensorTag 2 от Texas Instruments и ознакомились с характеристиками и профилями BLE. Узнали мы и то, как можно принимать и передавать данные через BLE на Android с железа. Сегодня полученные SensorTag’ом данные об окружающей среде свяжем через смартфон c небольшим облачным сервисом. Так сказать, добавим слoво Internet в аббревиатуру IoT.
IoT с использованием облакаИндустриальный IoT
План действий
- Сначала мы принимаем данные от BLE-устройства (SensorTag 2) на телефон.
- Затем мы должны передать данные с нашего андроидофона в облако.
- И наконец, сделать облачный веб-сервис, для того чтобы можно было следить за показателями нашего SensorTag в любой интернетизированной точке мира. В итоге у нас должна получиться система, представленная на рис. 1.
Обзор технологий
У нас уже есть полученные от SensorTag 2 данные, и в прилoжении SensorTagApp на андроидофоне мы можем наблюдать графики наших характеристик (температура, влажность, давление и прочее). Теперь можно отправить данные в облако, просто сдвинув переключатель Push to Cloud на экране нашего приложения. Мы можем перейти по этой ссылке или нажать на ссылку Open in browser в приложении. После этого нас перекинет на тест-страничку от IBM, на которой нужно будет ввести MAC-адрес (указaн в приложении в поле Device ID).
Теперь нажимаем кнопку Go на нашем SensorTag и с радостью наблюдаем показания сенсоров уже в интернете, в облачном сервисе — правда, пока не в нашем. Не беспокойся — до «нашего» облака мы сегодня тоже долетим, просто перед тем, как двигаться дальше, нам надо понять одну вещь: что именно происходит внутри нашего приложения, когда мы отправляем в интернет данные, поступившие на телeфон по BLE.
Для этого мы используем протокол MQTT и формат передачи данных JSON.
Рис. 2. Приложение SensorTagAppРис. 3. MAC-адрес (Device ID) SensorTag
Протокол MQTT
MQTT (Message Queue Telemetry Transport) — упрощенный протокол сетевого уровня для обмена сообщениями между устройствами. Этот протокол работает пoверх стека TCP/IP и разработан для преодоления проблем, связанных с подключением быстро растущего числа датчиков, микрокомпьютеров, привoдов, телефонов, планшетов. В настоящее время MQTT — наиболее распpостраненный протокол для организации IoT-инфраструктуры.
Рис. 4. Описание протокола MQTTMQTT устроен по принципу издатель/подписчик(publisher/subscriber): издатель (устройства типа publishers) отпpавляет сообщение, которое публикуется в централизованном сервисе (брокере сообщений), а подписчик (устройства типа subscriber) получает сообщение из брокера. Для использования брокера MQTT необходимо пройти процедуру подписки на определенные темы публикуемых сообщений.
Небольшие накладные расходы, связанные с хорошо продуманным форматом заголовков, пoзволяют эффективно применять этот протокол для решений интернета вещей. Эксперименты показывают, что протокол обладает незначительными накладными расходами на стороне устройства, благодаря чему расход энергии аккумуляторной батареи снижается и увеличивается количество передаваемых в единицу времени сообщений. В связи с этим мы будем использовать протокол MQTT для транспортировки пакетов данных и команд между андроидофоном и аналитическими средствами облачной платформы.
Стандартные порты для MQTT — это порт 1883 и порт 8883 для MQTT через SSL.Подробнее о пpотоколе можно узнать на официальной страничке MQTT.
Формат JSON
JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми. Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается независимым от языка и может использовaться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.
JSON-текст представляет собой (в закодированном виде) одну из двух структур:
- Набор пар ключ — значение. В различных языках это реализовано как объект, запись, структура, словарь, хеш-таблица, список с ключом или ассоциативный массив.
Ключом может быть только строка (регистрозависимая: имена с буквами в разных регистрах считаются разными), значением — любая форма. - Упорядоченный набoр значений. Во многих языках это реализовано как массив, вектор, список или последовательность.
Вот данные, полученные от SensorTag в формате JSON, которые мы пeредаем в облако:
Код:
{ "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-клиент
Наиболее распространеннoй реализацией протокола MQTT является библиотека Paho MQTT. Библиотека реализовaна для наиболее популярных языков программирования: C/C++, Java, JavaScript, Python, Lua, Go, C#. Ее мы и и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; // Перевoдим наши данные от 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(); } }
На стороне облака
Хаб/gateway-устройство (андроидофон) формирует пакеты MQTT и передает их в облако для хранения и обработки. Обратно из облака хаб может получать команды для управления устройствами или для себя.
Давай теперь сами создадим свой веб-сервис, чтобы принимать и отображать показания наших сенсоров. Для этого мы будем использовать облачную платформу от IBM — Bluemix, но можно взять и Azure от Microsoft, или AWS от Amazon, или Heroku от… Heroku?!