Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр

Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр Подписки
Содержание
  1. Что еще здесь важно.
  2. Mqtt, что это такое ? немного теории
  3. Краткое описание.
  4. Что такое mqtt?
  5. Clean session / durable connections
  6. Esp8266 управление через интернет по протоколу mqtt
  7. Hex / binary
  8. Mosquitto
  9. Mqtt и tcp socket
  10. Mqtt и xmpp
  11. Mqtt и другие соглашения
  12. Mqtt-сервер
  13. Paho: hабота с существующим брокером, доступным через интернет
  14. Python и mqtt
  15. Retained messages
  16. Topics/subscriptions
  17. Wills
  18. Асинхронная реализация публикации / подписки
  19. Аутентификация на транспортном уровне
  20. Безопасность
  21. Будет флаг
  22. Выберите формат данных пользователя
  23. Имя пользователя и пароль
  24. Инструмент отладки mqtt
  25. Использование существующего брокера, подключённого к локальной сети
  26. Качество сообщения (qos)
  27. Настройка mqtt-брокера и подписки
  28. Настройка компьютера
  29. Настройка шлюза
  30. Необходимые инструменты
  31. Облачная платформа с поддержкой mqtt
  32. Открытые проекты
  33. Отправка и получение mqtt-сообщений
  34. Переменный заголовок
  35. Подключение к ibm bluemix
  36. Полезная нагрузка
  37. Пользовательский ид
  38. Порядок установки программного обеспечения
  39. Предварительные требования
  40. Приём mqtt-сообщений на компьютере
  41. Проверка работы c mqtt-брокером, размещённым в интернете
  42. Сертификация
  43. Создание и запуск скрипта на python для публикации mqtt-сообщений
  44. Создание проекта клиента mqtt в delphi
  45. Способ использования клиента
  46. Строка
  47. Таймер keep alive (таймер keep alive)
  48. Тестирование paho
  49. Тип сообщения mqtt (тип сообщения)
  50. Установка mqtt-брокера в локальной сети с использованием mosquitto
  51. Установка mqtt-брокера в локальной сети с использованием paho
  52. Установка paho
  53. Фиксированный заголовок
  54. Формат сообщения mqtt
  55. Итоги и идеи

Что еще здесь важно.

• Устройства первыми устанавливают связь с брокером. Т.е. устройства могут находится за трансляторами сетевых адресов (NAT-ами) и не иметь статических IP адресов и это не помешает связи.

• Может быть применён протокол SSL для шифрации трафика. Но можно работать и без SSL даже с сервисами IBM, что облегчает отладку.

• В исключительно тяжёлых случаях MQTT брокеры позволяют подключаться к ним через протокол WebSocket на 80-й порт.

• Также может быть произвольно изменен порт штатного протокола MQTT.

• И клиент/клиенты с графическим пользовательским интерфейсом и брокер могут находится на одном компьютере. Т.е. решение может быть и абсолютно локальным и масштабироваться в глобальное одним кликом.

• Разные брокеры могут соединяться между собой подписываясь на сообщения друг у друга.

• Концепция топиков хорошо ложится на технологию NoSQL баз данных. С той же целью облачные сервисы склоняют пользователей использовать JSON кодирование данных.

Mqtt, что это такое ? немного теории

Это как раз таки Тема, по поводу которой мы хотим получать или как ни странно отправлять сообщения.

То есть формат общения между участниками выглядит примерно так.

Я как участник хочу сказать всем “мама я покакала”

для этого я создаю топик любого содержания, например: мое_тело/задница/

и сообщаю в этот топик сообщение “мама я покакала”

Брокер получит это сообщение, и передаст всем, кто подписался на тему (топик) мое_тело/задница/

То есть это такая вот упрощенная система смс рассылок с определенными темами.

Формат топика может быть разным и абсолютно любым. В принципе мы можем создать любой топик, и в него передавать сообщения любого содержания. Главное чтобы получатель был подписан на этот топик и знал что делать с информацией полученной из сообщений.

Что касается особенностей топиков, то их не так чтобы много.

Во первых они чувствительны к регистру. То есть топик “мое_тело/задница” и топик “Мое_Тело/Задница” это два разных топика.

Во вторых, топики не создаются не сервере администратором. Они создаются публикаторами и подписчиками которые на них подписаны. Брокер только занимается передачей сообщений и служебной информации.

Зачем нужны разделители в виде “/” ?

Они позволяют выстраивать иерархию. Ну например:

У нас есть в гостиной и в спальне по два выключателя и один в гараже. Для этого мы формируем на выключателях в топики в виде:

В гостиной:

home/livingroom/switch1

home/livingroom/switch2

В спальне:

Краткое описание.

MQTT предельно примитивен: с коротким заголовком, без контроля целостности, не накладывает никаких ограничения на структуру, кодирование или схему данных. Единственное требование к данным в каждом пакете – они должны сопровождаться идентификатором информационного канала.

Этот идентификатор в спецификации называется Topic Name или проще топик. Данные передаются пакетам поверх протокола TCP. Количество данных в пакете может быть от одного байта до 268 435 455 байт. Весьма гибко! Хотя публичные облачные сервисы вводят здесь более жесткие ограничения, до нескольких килобайт.

Протокол MQTT требует обязательного наличия брокера данных. Это центральная идея технологии. Все устройства посылают данные только брокеру и принимают данные тоже только от него. Брокер — это программа, выполняющая функции TCP сервера с динамической базой данных.

База данных брокера в частности содержит таблицу со всеми полученными пакетами с индексацией по топикам этих пакетов. Получив пакет, брокер рассылает его всем устройствам в сети согласно их подписке. Чтобы устройство что-то получило от брокера оно должно подписаться на топик.

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

Если у пакета нету подписчика, то он отбрасывается. Если подписчик не на связи, то пакет либо сразу стирается в базе брокера, либо ждет подключения подписчика некоторое заданное в конфигурации время. Вариант поведения определяется атрибутом QoS пакета.

Что такое mqtt?

MQTT (Телеметрический транспорт с очередями сообщений, Телеметрический транспорт с очередями сообщений) – это упрощенный протокол связи, основанный на режиме публикации / подписки (публикации / подписки), основанный на протоколе TCP / IP и выпущенный IBM в 1999 году.

, Последняя версия в настоящее время v3.1.1. Наибольшим преимуществом MQTT является то, что он может предоставлять в режиме реального времени и надежную службу сообщений для удаленных устройств с очень небольшим кодом и ограниченной пропускной способностью.

Конечно, при разработке Internet of Things MQTT – не единственный выбор. Протоколы, которые конкурируют с MQTT, включают протоколы XMPP и CoAP. Сравнение и описание будут приведены в конце статьи.

Clean session / durable connections

On connection, a client sets the “clean session” flag, which is
sometimes also known as the “clean start” flag. If clean session is set
to false, then the connection is treated as durable. This means that
when the client disconnects, any subscriptions it has will remain and
any subsequent QoS 1 or 2 messages will be stored until it connects
again in the future. If clean session is true, then all subscriptions
will be removed for the client when it disconnects.

Esp8266 управление через интернет по протоколу mqtt

Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр

Всем привет! В этой статье будет подробно рассказано и показано как буквально за 20 минут свободного времени настроить дистанционное управление модулем esp8266 с помощью приложения на Android по протоколу MQTT.

Идея дистанционного управления и мониторинга всегда будоражила умы увлеченных в электронике и программировании людей. Ведь возможность в любой момент времени получить или отправить нужные данные, не зависимо от своего местоположения, дает широкие возможности. В своих прошлых статьях ( Статья 1 и Статья 2) я пытался рассмотреть несколько доступных и относительно простых вариантах реализации дистанционного управления микроконтроллерами через интернет. Однако время и весь мир не стоит на месте – прогресс продолжает свое неумолимое движение вперед. За это небольшое время приобрел широкую популярность модуль esp8266 который благодаря низкой цене и встроенному wi-fi стал одним из основных составляющих «Умного дома».

На данный момент MQTT является передовым и наиболее популярным протоколом передачи данных между отдельными устройствами в рамках систем «Умного дома». Он обладает рядом преимуществ по отношению к другим протоколам:
— низкое потребление трафика;
— соединение между клиентом и сервером всегда открыто;
— не нагружает интернет канал;
— отсутствие задержек в передаче данных;
— удобная система подписок на топики;
Всё это дает возможность мониторинга и управления в режиме реального времени. Однако MQTT требует наличие своего собственного сервера, который выполняет роль посредника между клиентами сети. Тут есть два выхода либо создавать свой сервер либо использовать сторонние сервисы.

Описываемая система управления состоит из двух основных частей: сервера MQTT (он как правило один) и клиентов, которых может быть довольно много. В нашем случае в качестве клиентов будут выступать приложение на Android и сам модуль esp8266.

Алгоритм работы системы следующий. Клиенты подключаются к серверу и сразу после подключения каждый из них осуществляет подписку на и интересующие его топики. Всё общение между клиентами проходит транзитом через сервер, который перенаправляет данные другим клиентам с учетом их подписок.

MQTT сервер.

В нашем случае мы будем использовать крайне удобный сервис www.cloudmqtt.com у которого есть бесплатный тарифный план (Cute Cat), который полностью покроет потребности для реализации небольшой собственной системы «умного дома».
Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр
Пройдём регистрацию на сайте и получаем необходимые данные для доступа к серверу. При настройке клиентов необходимо использовать обычный Порт ( без SSL и TLS).
Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр

Приложение на Android.

Наше приложение будет выступать в качестве пульта управления для микроконтроллера, а так же будет принимать и отображать всю получаемую информацию от esp8266.

Приложение называется IoT MQTT Dashboard и представляет собой готовый mqtt клиент с небольшим количеством очень удобных виджетов. Более подробно о работе с приложением можно посмотреть на видео.

Esp8266.

Модуль прошивается в среде программирования Arduino, однако хочу заметить что у модуля проблемы с прошивкой в последних версиях Arduino, поэтому рекомендую использовать версию 1.6.4.
Для примера к esp8266 подключены светодиод (5 пин) и датчик температуры ds18b20 (2 пин).
Так как для управления светодиода необходимо получать данные, то esp после подключения должно оформить подписку на соответствующий топик «test/led» иначе все отправленные данные пройдут мимо нашего микроконтроллера.
Для отправки данных температуры подписка не нужно, но при передаче значений температуры необходимо указывать топик в который эти данные пойдут.

Ниже приведен скетч с подробными комментариями.

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

Видео с демонстрацией работы системы управления

Подробная видеоинструкция по настройке системы

Один из вариантов применения управления esp8266 через MQTT протокол

Управление светодиодной лентой через интернет

Если у вас возникли вопросы по данному материалу, то рекомендую посмотреть вторую часть видео, где материал изложен более наглядно.

В архиве находятся скетч и все необходимые библиотеки для прошивки микроконтроллера скетчем из примера.
Обращаю ваше внимание, что библиотека ESP8266WiFi.h не входит в данный архив, она устанавливается через Boards manager в среде Arduino.

Другие подписки:  Как зарегистрироваться на Госуслугах: пошаговая инструкция в 2021 году

АРХИВ

MQTT сервер — www.cloudmqtt.com

Ссылка на приложение IoT MQTT Dashboard — play.google.com/store/apps/details?id=com.thn.iotmqttdashboard&hl=ru

Всем спасибо за внимание.

Hex / binary

Первоначально MQTT был основан на двоичной реализации, поэтому для пользовательского протокола рекомендуется использовать двоичную реализацию. Хотя интуитивная читаемость теряется, скорость потока может оставаться очень маленькой. На самом деле шестнадцатеричный код не является незнакомым для разработчиков микроконтроллеров, поскольку регистры микроконтроллеров управляются битами, а для связи между чипами также используется шестнадцатеричный / двоичный код.

Mosquitto

– это MQTT-брокер с открытым кодом (лицензия BSD), который реализует протокол MQTT версий 3.1. и 3.1.1. В этом руководстве мы будем рассматривать использование Mosquitto для разворачивания MQTT-брокера в локальной сети.

Mqtt и tcp socket

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

Каждый, кто занимается разработкой встраиваемых систем, должен знать LwIP. LwIP – это набор стека протоколов TCP / IP с открытым исходным кодом для встраиваемых систем. LwIP может гарантировать, что встраиваемые продукты будут выполнять все функции TCP / IP, обеспечивая при этом протокол. Ограниченное потребление стека ресурсов процессора обычно требует только десятков КБ ОЗУ и около 40 КБ ПЗУ для его работы.

Другими словами, пока встроенный продукт использует LwIP, он поддерживает стек протоколов TCP / IP, а затем может использовать протокол MQTT.

Поскольку у протокола TCP есть проблемы с липкими пакетами и подпакетами, вам необходимо настроить протокол при передаче данных. Если передаваемая дейтаграмма превышает MSS (максимальная длина сегмента), вы должны определить поле длины сообщения для протокола, чтобы гарантировать, что принимающая сторона может пройти Буферизируйте сообщение полностью. Простое определение протокола: заголовок сообщения длина сообщения тело сообщения.

Конечно, вам не нужно учитывать эту проблему при использовании протокола MQTT. Эти MQTT уже были рассмотрены. MQTT может отправлять до 256 МБ данных за один раз, не рассматривая проблему субконтрактации липких пакетов.

Короче говоря, TCP и MQTT не противоречат друг другу, но им нужно только иметь дело с большим количеством вещей, основанных на разработке Socket, и большинство встроенных модулей разработки сами предоставляют производителям интерфейс Socket для настройки протокола.

Mqtt и xmpp

Наиболее вероятным конкурентом MQTT является протокол XMPP. XMPP (расширяемый протокол связи и представления) – это открытая технология связи в реальном времени, использующая расширяемый язык разметки (XML) в качестве основного формата для обмена информацией.

Преимущество в том, что протокол зрелый, мощный и расширяемый. В настоящее время он в основном используется во многих системах чата, а в области push-сообщений MQTT и XMPP конкурируют друг с другом. Ниже перечислены соответствующие характеристики MQTT и XMPP:

  • Протокол XMPP основан на тяжелом XML, объем сообщения большой, а взаимодействие громоздкое, хотя фиксированный заголовок протокола MQTT составляет всего два байта, размер сообщения небольшой, а кодирование и декодирование просты;
  • XMPP основан на двухточечной передаче сообщений JID, протокол MQTT основан на модели публикации / подписки на темы, а маршрутизация сообщений более гибкая;
  • Протокол XMPP использует XML для переноса сообщений, и двоичный файл должен быть закодирован в Base64 или обработан иным образом. Протокол MQTT не определяет формат содержимого сообщения и может переносить сообщения различных типов, такие как JSON и двоичные. Разработчики могут определять формат сообщения целевым образом;
  • Протокол MQTT поддерживает отправку и получение сообщений с подтверждением и гарантией QoS и имеет лучшую гарантию надежности сообщений, в то время как основной протокол XMPP не определяет подобный механизм;
  • При разработке встраиваемых устройств большинство из них используют разработку на языке C, и для языка C очень сложно анализировать XML. MQTT основан на двоичной реализации и не определяет формат содержимого сообщения, который может заботиться о разработчиках встроенного языка C, в то время как XMPP основан на XML, разработчикам необходимо взаимодействовать с форматом протокола и не может гибко развиваться.
    Таким образом, во встроенных устройствах MQTT имеет больше преимуществ, чем XMPP, из-за необходимости в интеллектуальном и лаконичном протоколе, который удобен как для разработчиков устройств, так и для разработчиков серверов.

Mqtt и другие соглашения

В настоящее время основные платформы начали поддерживать протокол MQTT. Каковы преимущества MQTT перед другими протоколами? Могут ли устройства IoT использовать другие протоколы? Ниже приводится сравнение между MQTT и другими частями соглашения для вашей справки.

Mqtt-сервер

Если вы не хотите использовать облачную платформу, просто играть в MQTT или просто хотите отслеживать устройство в интрасети, вы можете развернуть сервер MQTT локально. Вот несколько серверов MQTT:

  • Apache-Apollo: прокси-сервер, разработанный на основе ActiveMQ, может поддерживать различные протоколы, такие как STOMP, AMQP, MQTT, Openwire, SSL и WebSockets, а Apollo предоставляет разработчикам фоновые страницы управления для управления и отладки.
  • EMQ: EMQ 2.0, известный как сервер сообщений MQTT с открытым исходным кодом на миллионном уровне, разработан на основе языковой платформы Erlang / OTP, поддерживает крупномасштабные соединения и распределенные кластеры и публикует сервер сообщений MQTT с открытым исходным кодом в режиме подписки.
  • HiveMQ: MQTT-агент уровня предприятия, в основном используемый для корпоративных и новых межмашинных коммуникаций и внутренней передачи M2M, чтобы максимизировать масштабируемость, простоту управления и функции безопасности, а также предоставить бесплатную персональную версию. HiveMQ предоставляет комплект разработки плагинов с открытым исходным кодом.
  • Mosquitto: программное обеспечение брокера сообщений с открытым исходным кодом, которое реализует протокол push-сообщений MQTT v3.1, предоставляя облегченный, принудительный режим, который поддерживает публикуемые / подписываемые сообщения.

Paho: hабота с существующим брокером, доступным через интернет

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

Python и mqtt

Язык программирования

можно использовать для создания MQTT-сообщений. Выбор может пасть именно на Python если, например, код, написанный на этом языке, легко встроить в приложение, или если разработчик хорошо знаком с Python. Иногда этот язык удобно использовать из-за того, что программы, написанные на нём, не нуждаются в компиляции. Они интерпретируются на шлюзе во время выполнения.

Интерпретатор Python входит в стандартный набор предустановленного ПО на шлюзах Intel для интернета вещей, работающих под управлением Wind River Linux. Таким образом, Python-скрипты можно исполнять на шлюзах без дополнительной настройки рабочей среды.

Retained messages

All messages may be set to be retained. This means that the
broker will keep the message even after sending it to all current
subscribers. If a new subscription is made that matches the topic of
the retained message, then the message will be sent to the client.

This
is useful as a “last known good” mechanism. If a topic is only updated
infrequently, then without a retained message, a newly subscribed
client may have to wait a long time to receive an update. With a
retained message, the client will receive an instant update.

Topics/subscriptions

Messages in MQTT are published on topics. There is no need to
configure a topic, publishing on it is enough. Topics are treated as a
hierarchy, using a slash (/) as a separator. This allows sensible
arrangement of common themes to be created, much in the same way as a
filesystem.

Clients can receive messages by creating subscriptions. A
subscription may be to an explicit topic, in which case only messages
to that topic will be received, or it may include wildcards. Two
wildcards are available, or #.

can be used as a wildcard for a single level
of hierarchy. It could be used with the topic above to get information
on all computers and hard drives as follows:

As another example, for a topic of “a/b/c/d”, the following
example subscriptions will match:

The following subscriptions will not match:

# can be used as a wildcard for all remaining levels of
hierarchy. This means that it must be the final character in a
subscription. With a topic of “a/b/c/d”, the following example
subscriptions will match:

Wills

When a client connects to a broker, it may inform the broker that
it has a will. This is a message that it wishes the broker to send when
the client disconnects unexpectedly. The will message has a topic,
QoS and retain status just the same as any other message.

Асинхронная реализация публикации / подписки

Модель публикации / подписки разъединяет отношения между клиентом, который публикует сообщение (издатель), и клиентом, который подписывается на сообщение (подписчик), что означает отсутствие прямой связи между издателем и подписчиком.Эта модель имеет следующие преимущества:

  • Издатели и подписчики должны знать только одного и того же брокера сообщений;
  • Издателям и подписчикам не нужно взаимодействовать напрямую;
  • Издатели и подписчики не должны быть онлайн одновременно.

Благодаря реализации публикации / подписки, MQTT может общаться в обоих направлениях. Другими словами, MQTT поддерживает сервер для управления устройством в обратном порядке, устройство может подписаться на тему, а затем издатель публикует сообщение по теме, устройство может выполнить серию операций после получения сообщения.

Аутентификация на транспортном уровне

Аутентификация на транспортном уровне выглядит следующим образом: после успешного установления связи TLS прокси-сервер MQTT может продолжить отправку клиентского сертификата X509 для аутентификации устройства. Если устройство недопустимо, соединение может быть прервано.

Преимущество использования аутентификации X509 состоит в том, что на транспортном уровне может быть проверена законность устройства, и соединение нелегального устройства может быть заблокировано до отправки сообщения CONNECT, чтобы сэкономить ненужную трату последующих ресурсов.

Безопасность


Учитывайте следующие соображения при создании и запуске Python-скриптов.

  • Если вы пользуетесь встроенным интерпретатором Python, IMA-безопасность не помешает, позволяя интерпретатору выполнять новые скрипты.
  • Если вы встроенным интерпретатором Python не пользуетесь, и, при этом, включена IMA-безопасность, каждый скрипт, перед запуском, необходимо подписать.
  • Если на шлюзе включена система McAffee Embedded Control, скрипт надо добавить в белый список (Whitelist).

В примере, приведённом ниже, мы исходим из того, что ни IMA, ни белые списки на шлюзе не включены.

Будет флаг

В поле «Флаги подключения» заголовка пакета переменной есть три бита «Флаг»: «Флаг воли», «Будет ли QoS» и «Будет сохранен флаг». Эти поля «Воля» используются для мониторинга соединения между клиентом и сервером. Если установлен флаг завещания, должны быть установлены флажки Will QoS и Will Retain, а поля «Тема воли» и «Сообщение воли» также должны быть в теле сообщения.

Что случилось с последней волей? Когда сервер связывается с клиентом, MQTT-сервер выдаст клиенту сообщение Will, когда он обнаружит исключение или истечет время ожидания пульса клиента. Конечно, если сервер получает сообщение DISCONNECT от клиента, он не будет инициировать отправку сообщения Will.

Другие подписки:  Как отменить заказ в Яндекс такси пассажиру и водителю

Выберите формат данных пользователя

Протокол MQTT только реализует формат передаваемого сообщения и не ограничивает пользовательский протокол для следования определенному стилю, поэтому поверх протокола MQTT нам нужно определить набор нашего собственного протокола связи. Например, если издатель публикует на устройстве открытое сообщение, устройство может ответить сообщением и передать код возврата. Использует ли этот формат сообщения двоичный, строковый или JSON-формат? Ниже приводится простая ссылка для выбора.

Имя пользователя и пароль

Протокол MQTT поддерживает отправку имени пользователя и пароля через поля имени пользователя и пароля в сообщении CONNECT.

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

Вообще говоря, достаточно использовать идентификатор клиента, имя пользователя и пароль.Например, облачная платформа OneNET, поддерживающая соединение по протоколу MQTT, использует эти три поля для аутентификации. Если вы чувствуете, что это недостаточно безопасно, вы также можете пройти аутентификацию на транспортном уровне.

Инструмент отладки mqtt

Зная MQTT основных платформ, и вы также можете развернуть сервер MQTT в интрасети, тогда что, если рядом нет средства отладки, стоит ли писать на своем любимом языке? Конечно, нет. Средство отладки MQTT может рассмотреть возможность использования MQTT client-HiveMQ client-HiveMQ Websockets Client, который является браузерным MQTT-клиентом на основе WebSocket, который поддерживает подписку и публикацию тем.

Использование существующего брокера, подключённого к локальной сети

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

Если брокер вы пока не настраивали, существует несколько способов обзавестись простым MQTT-брокером для тестирования приложения. Сейчас мы их рассмотрим. Обратите внимание на то, что здесь мы не касаемся вопросов настройки серверов или сетей. Кроме того, из приведённых ниже вариантов работы с существующими брокерами или способов настройки новых, вам понадобится лишь один. Поэтому, выбрав его и настроив систему, так же можете переходить к разделу о настройке шлюза.

Качество сообщения (qos)

Существует три уровня качества сообщений MQTT: QoS 0, QoS 1 и QoS 2.

  • QoS 0: распределить максимум один раз. Доставка сообщений полностью зависит от базовой сети TCP / IP. Протокол не определяет ответы и повторные попытки. Сообщение будет доставлено на сервер только один раз или вообще не будет.
  • QoS 1: распределить хотя бы один раз. Прием сообщения сервером подтверждается сообщением PUBACK. Если канал связи или отправляющее устройство ненормально или сообщение подтверждения не получено в течение указанного времени, отправитель повторно отправит сообщение с битом DUP, установленным в заголовке сообщения.
  • QoS 2: распространяется только один раз. Это самый высокий уровень доставки сообщений. Потеря и дублирование сообщений недопустимы. Существуют дополнительные издержки для использования этого уровня качества обслуживания.
    Следующие три примера обеспечивают более глубокое понимание вышеупомянутых трех уровней качества передачи.

Например, текущая популярная интеллектуальная блокировка общего велосипеда, интеллектуальная блокировка, может периодически использовать качественное сообщение QoS уровня 0, чтобы запросить сервер отправить текущую позицию велосипеда. Неважно, не получил ли сервер его.

В любом случае, через некоторое время он будет отправлен снова. После этого пользователь может запросить местоположение окружающего велосипеда через приложение и обнаружить, что велосипед необходимо разблокировать. В это время можно использовать качественное сообщение QoS уровня 1.

Приложение для мобильного телефона непрерывно отправляет сообщение разблокировки в замок велосипеда, чтобы обеспечить возможность получения сообщения для разблокировки велосипеда. Наконец, после использования велосипеда пользователю необходимо отправить платежную форму, которая может использовать качественные сообщения QoS уровня 2, чтобы гарантировать, что данные передаются только один раз, в противном случае пользователь будет платить больше.

Настройка mqtt-брокера и подписки

В предыдущем разделе мы установили на компьютере Paho и протестировали его работу. Теперь рассмотрим особенности MQTT-брокеров. Наша цель – работающий брокер, который может принимать сообщения от издателей и отправлять их подписчикам. Существует несколько вариантов организации взаимодействия с брокером, все они подходят для, того, чтобы воспроизвести то, о чём мы расскажем ниже.

  • Уже настроенный брокер, расположенный в локальной сети или в интернете (в облаке). Такой подход позволит использовать существующий брокер. Этот брокер должен быть готов к приёму и отправке сообщений. При этом у вас должна быть возможность создавать на нём нужные темы, если таковые пока не созданы.
  • Новый брокер в локальной сети, созданный с использованием Paho. Этот брокер будет работать на компьютере. При этом, будет ли это тот же компьютер, который принимает сообщения от шлюза, или другой, особой роли не играет. Для создания брокера можно воспользоваться соответствующими библиотеками Paho для Python.
  • Новый брокер в локальной сети, созданный с использованием Mosquitto. Такой брокер тоже будет работать на компьютере, но для его создания нужно будет воспользоваться Mosquitto.

Настройка компьютера

Рассмотрим настройку компьютера, который планируется использовать для подписки на сообщения с некоей тестовой темой на MQTT-брокере в интернете. После того, как компьютер подпишется на тему, сообщения, опубликованные с этой темой, будут доставлены ему.

Для того, чтобы настроить компьютер, нужно будет, во-первых, установить Paho и сопутствующее ПО, во-вторых, протестировать систему, подключившись к брокеру.

Настройка шлюза

Займёмся настройкой шлюза. Она включает в себя два основных шага:

Необходимые инструменты


Нам понадобится среда разработки

MS Visual Studio 2021

. В ней будет компилироваться проект

и все вспомогательные проекты от которых зависит

. Альтернативно

под

Windows

можно компилировать с помощью пакета

Cygwin

, но Visual Studio показался удобней.

Облачная платформа с поддержкой mqtt

В настоящее время на облачных платформах Baidu, Alibaba и Tencent постепенно появляются наборы для разработки IoT: во внутреннем тесте платформы Tencent QQ IoT, в общедоступной бета-версии набора Alibaba Cloud IoT, обе должны подать заявку на пробную версию, в то время как набор Baidu Cloud IoT MQTT поддерживается и может быть испытан бесплатно в течение определенного периода времени. В дополнение к BAT мы представим некоторые другие облачные платформы IoT, которые поддерживают MQTT.

  • Облачная платформа OneNET: OneNET – это открытая платформа для PaaS IoT, созданная China Mobile. Платформа может помочь разработчикам легко реализовать доступ к устройствам и подключение устройств, быстро завершить разработку и развертывание продуктов, а также предоставить комплексные решения Интернета вещей для интеллектуального оборудования и продуктов для умного дома. Облачная платформа OneNET была официально запущена в октябре 2021 года.
  • Cloud Bus: Cloud Bus – это кроссплатформенная двусторонняя система связи в реальном времени, которая предоставляет услуги связи в реальном времени для Интернета вещей, приложений и Интернета. Yunba основана на MQTT, поддерживает протокол Socket.IO и поддерживает RESTful API.

Открытые проекты

Выбор MQTT брокеров довольно большой. Но как ни странно удобных клиентов с оконным пользовательским интерфейсом под Windows практически нет. А клиент такой для освоения протокола MQTT просто необходим поскольку за рамками спецификаций находится много практических нюансов работы брокеров и все их надо как-то изучать и тестировать.

Было решено реализовать MQTT клиента на Delphi.

Google для Delphi может предложить только компонент TMQTTClient. Но это старый и не рабочий компонент. Большинство других клиентов, написанных на языках Java, Erlang, Haskell, Javscript в Delphi интегрировать весьма проблематично.


Нашелся единственный подходящий проект –

Написан на чистом C-и. Компилируется под разные операционные системы. Имеет скрипты генерации проекта для Visual Studio. На выходе под Windows получаем dll файлы с реализацией функциональности клиента и брокера. Применение C-и обнадёживает по части быстродействия. А динамические библиотеки, написанные на C-и легко подключаются к программам на Delphi.

Сам Delphi в лице Embarcadero RAD Studio XE8 весьма мощный инструмент для создания гибких и удобных пользовательских интерфейсов под Windows особенно если он вооружён пакетами DevExpress, TeeChart, RxLib, FireDAC и др.

Отправка и получение mqtt-сообщений

Теперь, когда у нас есть готовый к работе MQTT-брокер, настроены компьютер и шлюз, всё готово к тому, чтобы создать скрипт на Python, который будет заниматься публикацией сообщений.

Здесь мы воспользуемся образцами кода из поставки Paho для создания простого скрипта, который можно будет модифицировать позже в соответствии с нуждами конкретного проекта. Скрипт можно создать и непосредственно на шлюзе, и на компьютере. Если скрипт создан на компьютере, его надо будет скопировать на шлюз и запустить там.

Переменный заголовок

Заголовок переменной в основном включает имя протокола, версию протокола, флаги подключения, таймер Keep Alive, сохранение кода возврата, код возврата подключения, название темы и т. Д. Частично объяснить.

Подключение к ibm bluemix

Первое что надо сделать это получить акаунт в Bluemix
Получив акаунт, мы заходим в свою панель управления на Bluemix . Здесь сразу надо переключиться на регион US South. Для этого щелкаем в правом верхнем углу по пиктограме акаунта и меняем значение в поле Region. Всего есть три региона, но имеено US South дает возможность испытать большинство сервисов. Далее надо создать Space. Вид экрана должен быть как на криншоте ниже. Здесь создана организация INDEMSYS и Space INDEMSYS SPACE.
Протокол MQTT и открытый проект клиента MQTT на Delphi / ХабрCATALOG в верхнем меню. Спускаемся в самый низ и выбираем Internet of Things Foundation.
Протокол MQTT и открытый проект клиента MQTT на Delphi / ХабрCreate
Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр

Internet of Things Foundation – это сервис включающий брокера MQTT и пользовательский интерфейс к нему. После создания в появившемся окне нажимаем кнопку с надписью Launch dashboard.

Это панель управления IoT. Теперь надо создать устройства. Нажимаем Add device. В появляющихся диалогах создаем тип устройства (Create device type) Даем ему имя Type1, остальные поля не заполняем для упрощения. Жмем Next -> Next -> Create -> Next. Даем имя устройству Device1. Далее Next -> Next -> Next -> Add. В результате получаем такое окно:
Протокол MQTT и открытый проект клиента MQTT на Delphi / ХабрMQTT брокеру Bluemix .
Испытаем сможет ли к нему подключиться наш клиент. Вводим реквизиты в окно клиента.
Протокол MQTT и открытый проект клиента MQTT на Delphi / Хабр

Полезная нагрузка

Полезная нагрузка буквально интерпретируется как нагрузка, которая может сбивать с толку, и фактически может пониматься как тело сообщения.

Когда тип сообщения, отправляемого MQTT, – это CONNECT (соединение), PUBLISH (публикация), SUBSCRIBE (подписка), SUBACK (подтверждение подписки), UNSUBSCRIBE (отписаться), происходит загрузка.

Пользовательский ид

Клиент MQTT может отправлять до 65535 символов в качестве идентификатора клиента (Client Identifier). Как правило, можно использовать MAC-адрес или серийный номер чипа встроенного чипа. Хотя использование идентификации клиента для аутентификации может быть ненадежным, в определенных закрытых средах этого может быть достаточно

Другие подписки:  Отписка от рассылки. Как остаться друзьями с подписчиком

Порядок установки программного обеспечения

Mosquitto зависит от нескольких сторонних проектов, это:

OpenSSL v 1.0.2e

. Источник –

Предварительные требования

  • В этом примере используется шлюз, который работает под управлением Wind River Linux 7 с Wind River Intelligent Device Platform XT 3.1. Если на вашем шлюзе используется другая ОС, процесс его настройки может отличаться от того, который приведён здесь.
  • Операционная система шлюза должна быть собрана с использованием параметра —withtemplate=feature/mqtt в настройках. Подробности об этом смотрите здесь.
  • Шлюз должен быть подключён к той же самой сети, что и MQTT-брокер, при условии, что брокер размещён в локальной сети.
  • Если вы пользуетесь MQTT-брокером, который размещён в интернете, и применяете файрвол, он не должен блокировать порты 1883, 8883, 8884, и 8885.

Приём mqtt-сообщений на компьютере


После того, как шлюз опубликует сообщение с какой-нибудь темой, а брокер сообщение получит, он отправит сообщение всем MQTT-клиентам, которые подписаны на тему.

Для публикации, учитывая настройки нашего скрипта, достаточно выполнить на шлюзе команду python my-pub.py. При её выполнении сообщение «Hello» будет отправлено брокеру, а с него попадёт компьютер. На компьютере же, учитывая то, что на нём открыто окно терминала, ожидающее сообщений от MQTT-брокера, будет принято сообщение такого содержания:

mytopic 0 Hello

Рассмотрим его структуру:

mytopic: название темы.
0: качество обслуживания
Hello: сообщение

Проверка работы c mqtt-брокером, размещённым в интернете


Процедура проверки работоспособности ПО, установленного на шлюзе, и сетевого соединения, повторяет процедуру проверки компьютера.

Сертификация

MQTT поддерживает два уровня аутентификации:

  • Прикладной уровень: MQTT поддерживает идентификацию клиента, аутентификацию по имени пользователя и паролю;
  • Транспортный уровень: Транспортный уровень может использовать TLS, в дополнение к шифрованной связи, он также может использовать сертификаты X509 для аутентификации устройства.

Создание и запуск скрипта на python для публикации mqtt-сообщений

1.

Перейдите в папку

examples

, содержащую образцы кода для Paho:

cd org.eclipse.paho.mqtt.python-1.1/examples

2.

Скопируйте и переименуйте скрипт

pub-single.py

cp pub-single.py my-pub.py

3.

Отредактируйте файл

my-pub.py

, изменив его последнюю строку таким образом, чтобы сообщение отправлялось существующему MQTT-брокеру и при его отправке использовалась тема, которая была задана тогда, когда мы занимались настройкой компьютера на приём MQTT-сообщений (мы назвали тему «mytopic»):

publish.single("mytopic","Hello", hostname="<broker_location>")

Рассмотрим устройство этой команды:

— "mytopic": название темы, существующей на брокере.
— "Hello": содержание сообщения
— "<broker_location>": адрес MQTT-брокера.

test.mosquitto.org

4. Если подготовкой скрипта my-pub.py вы занимались на компьютере, скопируйте его на шлюз.

5. Запустите my-pub.py на шлюзе для передачи с него сообщения заданному MQTT- брокеру с темой mytopic:

python my-pub.py

Создание проекта клиента mqtt в delphi

Чтобы интегрировать в Delphi библиотеку mosquitto.dll надо создать модуль объявлений функций библиотеки на Object Pascal. Для этого была выполнена конвертация файла mosquitto.h в файл MOSQUITTO.PAS.

Проект клиента очень простой, состоит всего из 4-х файлов с исходными текстами. Клиент демонстрирует подключение и отключение, формирование завещания (Will), посылку данных пакетом PUBLISH брокеру, прием данных пакетом PUBLISH от брокера, подписку и отказ от подписки.

Способ использования клиента

Запускаем файл TMQTTC.exe.Для того чтобы было с кем обмениваться сообщениями запускаем тестового брокера командой Run_mosquitto.cmd в директории Mosquitto_1_4_5_bin. Для удобства брокер сконфигурирован на подключение без SSL и проверки пароля. Заполняем поля как на скриншоте.

Пароль и имя пользователя не обязательны. В навигаторе нажимаем кнопку фиксации изменений, чтобы сохранить данные в таблице. После чего нажимаем кнопку Connect.После соединения становятся доступны команды публикации и подписки. Команды PING клиент Mosquitto генерирует автоматически.

Строка

Для разработчиков микроконтроллеров строка также является опцией. Например, команда AT, передаваемая через последовательный порт, основана на строковой связи. Использование строк удобно для чтения людьми, но для опытных разработчиков языка строки по-прежнему не лучший выбор, и я боюсь, что пары ключ-значение являются лучшей формой.

Таймер keep alive (таймер keep alive)

Клиент MQTT может установить интервал пульса (Keep Alive Timer), что означает, что сообщение отправляется в течение каждого интервала пульса. Если в течение этого периода времени нет сообщений, связанных с бизнес-данными, клиент отправит сообщение PINGREQ, и, соответственно, сервер вернет сообщение PINGRESP для подтверждения.

Если сервер не получит сообщение от клиента в течение полутора (1,5) интервалов пульса, он отключится от клиента. Максимальное время интервала сердцебиения может быть установлено приблизительно на 18 ч. Значение 0 означает, что клиент не отключается.

Тестирование paho

Протестируйте Python-скрипт, использующий Paho, а заодно – и подключение к MQTT-брокеру, подписавшись на активную тему. Например, если вас интересует брокер, размещённый в интернете, для тестирования можно воспользоваться брокером

test.mosquitto.org

. Это позволит проверить и сетевое соединение, и работу программного обеспечения.

1. Перейдите в директорию с примерами для Paho:

cd org.eclipse.paho.mqtt.python/examples

2.

Измените скрипт

sub.py

, отредактировав строки

mqttc.connectmqttc.subscribe

mqttc.connect("test.mosquitto.org", 1883, 60) 
mqttc.subscribe("#", 0)

Рассмотрим эти команды:

Mqttc.connect

— test.mosquitto.org: Адрес MQTT-брокера, к которому мы хотим подключиться.
— 1883: Порт, который используется для MQTT-сообщений.
— 60: Тайм-аут в секундах
Mqttc.subscribe

— #: подстановочный символ, который указывает на то, что мы подписались на все темы брокера.
— 0: запрошенный уровень качества обслуживания (Quality of Service, QoS).

3.

Запустите скрипт:

python sub.py


Если сетевое соединение и программа работают правильно, от MQTT-брокера

test.mosquitto.org

начнут поступать сообщения. Их содержание нас сейчас не интересует. Если ничего не приходит, проверьте как следует подключение к интернету и отредактированные строки скрипта

sub.py

4. Для остановки скрипта воспользуйтесь сочетанием клавиш Ctrl-C на клавиатуре.

Тип сообщения mqtt (тип сообщения)

Первый байт в фиксированном заголовке пакета содержит флаги подключения, которые используются для различения типов сообщений MQTT. Протокол MQTT имеет 14 различных типов сообщений (как показано в таблице 2), которые можно просто разделить на соединение и завершение, публикацию и подписку, механизм сообщений QoS 2 и различные подтверждения ACK. Что касается содержания каждого типа сообщений, я не буду здесь подробно останавливаться.

Таблица 2

Установка mqtt-брокера в локальной сети с использованием mosquitto


Этот метод, снова, подразумевает использование компьютера разработчика в качестве брокера, размещённого в локальной сети. Но на этот раз мы будем пользоваться Mosquitto.

Подробности о Mosquitto можно узнать здесь. Кроме того, конструкция вида <mosquitto_command> –help позволяет получать справку по командам этого пакета. Для того, чтобы запустить процесс MQTT-брокера на компьютере, выполните следующие шаги.

1. Откройте новое окно терминала Linux. Брокер будет исполняться в этом окне, при этом на том же самом компьютере можно получать MQTT-сообщения, только приходить они будут в другое окно терминала.

2. Установите Mosquitto, если вы еще этого не сделали.

sudo apt-get install mosquitto

3.

Установка mqtt-брокера в локальной сети с использованием paho

Воспользуйтесь этим методом, если хотите, чтобы ваш компьютер играл роль MQTT-брокера, размещённого в локальной сети. Здесь нам понадобятся установленные ранее Python-библиотеки Paho. Процедура настройки, в целом, аналогична уже рассмотренной. Однако, нужно обратить внимание на то, что компьютер и шлюз должны быть в одной и той же локальной сети, и на то, что начало взаимодействия с брокером (в скрипте

sub.py

) выглядит так:

mqttc.connect("localhost", 1883, 60) 
mqttc.subscribe("mytopic", 0)

То есть, подключаемся мы не к серверу в интернете, а к локальному хосту, к сетевому интерфейсу «внутренней петли» компьютера. Обычно localhost используется как псевдоним для IP-адреса 127.0.0.1.

Если подписаться на тему mytopic, обратившись к локальному хосту, автоматически будет запущен локальный MQTT-брокер и на нём будет создана такая тема. Если теперь шлюз опубликует сообщение с темой mytopic, обратившись к компьютеру по его IP-адресу, это сообщение будет отправлено в терминал Linux, в котором исполняется скрипт sub.py, оформивший подписку на эту тему.

Установка paho

1.

Загрузите

tar.gz

-архив со свежей версией Paho с

. В нашем случае это был файл

org.eclipse.paho.mqtt.python-1.1.tar.gz

2. Поместите этот файл в выбранную директорию.

3. Распакуйте архив. Например, такой командой:

tar -xf org.eclipse.paho.mqtt.python-1.1.tar.gz

4.

Содержимое архива окажется в папке, имя которой совпадает с его именем. Перейдите в эту папку, и, если нужно, переименуйте её.

cd org.eclipse.paho.mqtt.python-1.1

5.

Выполните следующие команды python:

python setup.py install

Теперь Paho установлен на компьютере.

Фиксированный заголовок

Фиксированный заголовок сообщения MQTT имеет по крайней мере два байта, причем первый байт содержит биты флага, такие как тип сообщения и уровень QoS. Второй байт начинается с поля оставшейся длины, которое представляет собой общую длину заголовка переменной, за которым следует полезная нагрузка сообщения. Это поле может содержать до четырех байтов.

Максимальное значение одного байта в оставшемся поле длины – двоичное 0b0111 1111, шестнадцатеричное 0x7F. Другими словами, максимальная длина, которую может описать один байт, составляет 127 байтов. Почему не 256 байтов? Поскольку протокол MQTT предусматривает, что если восьмой бит (старший бит) одного байта равен 1, это означает, что в будущем будут байты, а восьмой бит действует как «бит продолжения».

Например, число 64 кодируется как один байт, десятичное представление – 64, а шестнадцатеричное представление – 0 × 40. Число 321 (65 2 * 128) кодируется как два байта, наименее важный размещается первым, первый байт равен 65 128 = 193 (0xC1), второй байт равен 2 (0x02), Значит 2 × 128.

Поскольку протокол MQTT позволяет отображать оставшуюся длину только до четырех байтов (как показано в таблице 1), а максимальное значение последнего байта может быть только 0x7F, но не 0xFF, максимальная длина сообщения, которое может быть отправлено, составляет 256 МБ вместо 512 МБ.

Таблица 1

Формат сообщения mqtt

Заголовок каждого командного сообщения MQTT содержит фиксированный заголовок, а некоторые сообщения содержат переменный заголовок и полезную нагрузку. Формат сообщения следующий:

Фиксированный заголовок сообщения | Переменный заголовок сообщения | Загрузить

Итоги и идеи

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

  • Если в системе имеются датчики, шлюз может считывать их показания и публиковать в виде MQTT-сообщений.
  • MQTT-сообщения хорошо походят для передачи неких сведений, предназначенных для хранения в облачной или локальной базе данных. Если этот сценарий соответствует системе, над которой вы работаете, рассмотрите его.
  • Увеличьте полезную нагрузку, которую несут сообщения, возможно – за счёт использования более сложной структуры сообщений и тем.
  • Поэкспериментируйте с функциями Paho, которые позволяют отправлять несколько сообщений одной командой.
  • Повысьте безопасность системы обмена MQTT-сообщениями за счёт шифрования, аутентификации клиентов, использования белых списков или других средств.
Оцените статью
Подписки Help
Добавить комментарий