Начало было здесь: Протокол MQTT и открытый проект клиента MQTT на Delphi
Проект клиента MQTT на Delphi дополнился приборной панелью для наблюдения за потоком информации из интернета вещей в реальном времени и генератором периодических публикаций для тестирования MQTT брокеров. Был принят формат JSON для передачи информации, поскольку он является стандартом для интернет-сервисов.
А также посмотрим что может нам предложить IBM Bluemix для организации удаленного наблюдения и управления вещами в интернете.
Что нового
После того как в предыдущей версии клиента была реализована возможность принимать, посылать и подписываться на MQTT пакеты, наступила очередь реализовать генерацию потока сообщений для тестирования работы брокеров MQTT. Другой задачей стало определиться со структурой тела сообщений. Здесь в помощь был привлечен способ структурирования информации, применённый в сервисе IoTF IBM Bluemix. Даже если структурирование, применённое там и не идеальное есть основания некоторое время придерживаться таких правил, поскольку IBM вполне авторитетный бренд.
Структура в данном контексте это то, как в каждом пакете кодируется информация и в каком составе она передается. Нужно решить передаем ли по одной переменной или группами, если группами, то как отделять переменные друг от друга, как отличать переменные, метаданные и прочее, как сопоставлять переменные с их описанием или именами и нужно ли во всех случаях сопровождать переменные именами или достаточно индексов и т.д. Протокол MQTT никак не регламентирует данный вопрос за исключением того, что текстовые данные кодируются в формате UTF8, что в принципе тоже неплохо, ибо позволяет топики называть по-русски.
Интернет гиганты выбрали для решения вопроса структурирования формат JSON, хотя MQTT спокойно перенес бы и XML, и ASN.1 в какой-либо кодировке и другие форматы. JSON, кстати, имеет и несколько спецификаций сжатия, если есть претензии к избыточности текстового формата.
Генерация MQTT трафика
Итак, теперь наш клиент способен посылать пакеты содержащие текстовые данные в формате JSON и кодированные в UTF8. Для этого в нем есть закладка “Периодическая публикация”. Публикация на сленге MQTT означает просто посылку пакета с данными предназначенными другим узлам сети IoT.
На скриншоте каждой строчке в таблице соответствует определенное сообщение. Все сообщения в данном примере имеют одинаковый топик. Здесь политика такая – чем меньше разных топиков, тем меньше нагрузка на брокера по парсингу, поиску и сохранению этих топиков. Топики выбраны в таком формате в каком их примет сервис IoTF IBM Bluemix. В столбце Payload содержится тело сообщения. Оно представлено в формате JSON, но в нем для одной переменной допустимо применение спецификатора формата согласно правилам для функции Format языка Delphi. В данном случае применен спецификатор %g. На его место будет подставлено значение переменной, генерируемой по правилам, указанным в столбцах: Timeout (период посылки сообщения), Function (есть только выбор между случайной величиной и функцией синуса), Min, Max (минимальное и максимальное значение генерируемой величины), Period (период функции синуса, задаваемый в количестве отсчетов), Offs (смещение аргумента функции синуса, задаваемой количеством отсчётов). Столбцы QoS и Retain задают атрибуты MQTT пакета. Поле Enabled указывает будет ли это сообщение активизировано при нажатии кнопки “Стартовать”. Кнопка “Стартовать” становится активной только после установления связи с брокером.
Важно! Сервис IoTF IBM Bluemix очень чувствителен к синтаксису и разрывает связь сразу же в случае если топик каким-то образом не подходит по формату.
В нижней части формы находятся логи: общий, лог отправленных сообщений публикации и лог принятых сообщений публикации. Логи можно очистить или запретить. Запрет логов ускоряет генерацию пакетов и прием пакетов.
Визуализация данных от IoT узлов
Начинать надо с подписки на данные если на них не было сделано постоянной подписки в предыдущей сессии сеанса связи, иначе брокер ничего не пришлет.
В закладке “Подписка списком” нужно записать топики, которые мы хотим получать от брокера. В данном случае записан топик со значением которого будут посылаться сообщения генератором.
Если поле Subscribe помечено, то на топик будет осуществлена подписка после нажатия кнопки “Подписка”. Если значение поля Subscribe не помечено, то будет выполнен отказ от подписки на данный топик при нажатии на кнопку “Подписка”. Опять же операция подписка доступна только после установления связи с брокером.
Еще до подписки можно записать в таблицу визуальных компонентов те переменные, которые мы хотим наблюдать в реальном времени. Для этого надо нажать кнопку “Таблица”.
Столбец “Variable Name” содержит такое же имя переменной (ключ в терминологии JSON) какое записано в сообщении в формате JSON. Поле “Variable Caption” содержит название переменной, отображаемое на визуальном компоненте. Столбец “Widget Class” задает тип визуального компонента. Здесь можно выбрать какую-либо шкалу, LCD/LED стиля надпись или график.
Закончив редактирование таблицы нажимаем кнопку Widgets и расставляем визуальные компоненты в форме. Поначалу все компоненты будут находится в стопке в левом верхнем углу. Надо перетащить и расположить их на форме в желаемой конфигурации. Расположение компонентов запоминается и воспроизводится после следующего открытия формы. Стиль докинга компонентов повторяет стиль IDE RAD Studio или MS Visual Studio.
Если связь с брокером установлена и выполнена подписка, то в случае прихода сообщений с соответствующими переменными в окне визуальных компонентов сразу отразятся их значения.
Все настройки и логи программа сохраняет в JSON файлах на диске, которые можно редактировать вручную.
В репозитарии лежит версия программы с подготовленной и сохраненной в JSON файлах конфигурацией готовой к тестированию с применением брокера Mosquitto включенного локально.
Сам брокер готовый к запуску находится в репозитарии в архиве Mosquitto_broker_projs.zip в директории Mosquitto_1_4_5_bin. Запускать надо файл Run_mosquitto.cmd.
О парсинге JSON
В программе применен сторонний JSON парсер из проекта https://github.com/hgourvest/superobject Несмотря на то, что в RAD Studio XE8 есть встроенный JSON парсер superobject показался интереснее и мощнее с точки зрения возможностей. Программа клиента MQTT при поступлении сообщений производит парсинг тела сообщения и выделяет в нем отдельные пары ключ-значение. Если встречается массив, то он игнорируется поскольку объекты в массиве не имеют имен, и нет механизма (в данной программе) связать их с какой-либо именованной переменной в клиенте. Остальные именованные объекты просматриваются вглубь рекурсивно пока не будут извлечены все пары ключ-значение. Ключ будет являться именем переменной, значения программа будет пытаться привести к числу с плавающей точкой, если не удается, то число приравнивается нулю.
Пробуем приложение IBM IoT Real-Time Insights
Это приложение второе из двух практических приложений, предлагаемых IBM для IoT. Первое — Internet of Things Foundation рассматривалось в предыдущей статье. Есть в каталоге IBM еще несколько демонстрационных приложений для IoT, но они требуют развертывания и запуска на сервере пользовательского кода, что автоматически включает счетчик оплаты.
Но вернемся к IoT Real-Time Insights. Заходим в свой аккаунт. Как всегда, выбираем регион US South. Жмем в верхнем меню Catalog. Спускаемся в самый низ попутно наблюдая массу разных сервисов и приложений у IBM. Видим:
Нажимаем на IoT Real-Time Insights. Это приложение позволяет только наблюдать, управлять напрямую устройствами из него не получится, если только устройства не обладают другими каналами связи помимо MQTT.
При создании поле App: оставляем Leave unbound. Дополнительные приложения не создаем, поскольку за них IBM сразу начинает считать деньги. Поле Plan: оставляем Lite. Так нам все будет бесплатно.
До того у нас должен быть уже создан и активизирован сервис Internet of Things Foundation, в нем уже создано хотя бы одно устройство от имени которого будет посылать пакеты наш клиент MQTT. Это было описано в предыдущей статье.
На домашней странице приложения IoT Real-Time Insights сразу начинаем с подключения источника данных, и это будет созданный ранее нами сервис Internet of Things Foundation. Мы должны знать его кодовое название (Organization ID), API Key и Authentification Token. Если не знаем, то вернуться в Internet of Things Foundation и создать, то чего не знаем.
После подключения на закладке Devices должны отображаться все зарегистрированные нами устройства. В данном случае есть только одно.
Затем надо настроить схемы сообщений. Нажать на Manage Schemas и на плюсик Add new message schema. Это как можно понять настройка расшифровки сообщений от устройства.
Вот пример такой настройки для переменных T, L1, L2, L3.
Переменная L1, например, при редактировании представлялась таким окном.
Настроив схемы можно настроить аналитику. Т.е. по сути правила для формирования отправки сообщений внешним приёмникам сообщений. Самое доступное это отправить email.
Вот так выглядит правило отправки email в случае превышения переменной T значения 24:
А вот такое сообщение на email приходит:
Но центральным пунктом приложения являются приборные панели. Панелей может быть много. Приборные панели состоят из визуальных компонентов отображающих значения переменных, созданных в закладке Manage Schemas в реальном времени. На скриншоте ниже показан пример приборной панели для отображения 4-х переменных: T, L1, L2, L3. Пакеты со значениями переменных генерировались нашим клиентом MQTT. Переменная T генерировалось как случайное число, L1, L2, L3 как функции синуса.
Впечатления от IBM IoT Real-Time Insights.
Пока приложение очень сырое. Окна и диалоги открываются с большими задержками. Построитель приборных панелей ограничен в функциональности, для простых перемещений или изменений размеров надо проходить несколько диалогов. Сами компоненты панелей не имеют никаких редактируемых свойств. Это же относится и к графикам. Графики не имеют истории, и очищаются при малейшем изменении размеров окна. Email-ы приходят не стабильно, и могут подолгу задерживаться.
Но все же это бесплатный сервис, доступный здесь и сейчас и если устройство способно публиковать сообщения в подходящем JSON формате, то стоит иметь в виду такое приложение от IBM.
Проект клиента MQTT находится по прежнему на старом месте: https://github.com/Indemsys/Delphi_MQTT_mosquitto
Комментарии (7)
Indemsys
04.01.2016 00:47А как вы бы предложили охарактеризовать такой проект? Он же ведь действительно открытый и вообще без всякой лицензии. А могут ли быть проекты без лицензии?
Но FreePascal я не использую.
millstone
05.01.2016 19:22Очень хороший проект, спасибо за продолжение.
Относительно Дополнительные приложения не создаем, поскольку за них IBM сразу начинает считать деньги. Загляните в раздел Pricing, там есть калькулятор, который показывает, как сделать так, чтобы насчитанная сумма денег равнялась нулю.Indemsys
05.01.2016 22:58Так я и считал этим калькулятором. Все показывает бесплатно.
Но как только запускаете что-то сделанное в Node RED на Node.js то сразу начинает считать деньги со страшной силой. По 6 Euro за несколько дней.millstone
05.01.2016 23:13Можно подробности в личку. Как и что делали и какой получился рантайм
И, интересно, почему он в US-South в евро считаетIndemsys
06.01.2016 14:49Я сильно не вдавался.
Создал самое простое демо приложение из Internet of Things Foundation Starter
И есть у них Charge Summary и там был всегда 0
И есть Organization Summary, вот там деньги и насчитывало.
toxicdream
06.01.2016 13:34Эх, мне сейчас AMQP-клиент нужен.
MQTT для IBM WebSphere MQ написал лет 5-7 назад, портировав заголовочные файлы.
Повторять тот подвиг лень. Проще обертку сделать над готовыми решениями.
ComodoHacker
Ваш проект интересный. Но вот насчет открытости… Он имел бы больше оснований называться открытым, если бы собирался, к примеру, в FreePascal и не требовал платных компонентов. Не планируете?