Введение в MQTT
Протокол MQTT (MQ Telemetry Transport) — это упрощенный сетевой протокол, разработанный IBM в 1999 г. Он использует модель связи «публикация-подписка» и имеет три основные особенности:
- Использовать двоичный формат кодирования содержимого сообщения, поэтому полезные нагрузки, такие как двоичные данные, JSON и изображения, могут быть легко переданы.
- Заголовок протокола очень компактен, взаимодействие с протоколом также простое., чтобы убедиться, что трафик передачи по сети очень мал.
- Поддерживает 3 уровня QoS (качество обслуживания), что удобно приложению гибко выбирать под нужды разных сценариев.
Протокол MQTT очень подходит для удаленных устройств с ограниченной вычислительной мощностью, низкой пропускной способностью сети и нестабильными сигналами, поэтому он стал стандартом сетевого протокола де-факто для систем IoT.
Собственный «ген» MQTT очень мощный
Как «первый язык» устройств IoT, протокол MQTT является не только экологическим совершенством MQTT, но и отличным дизайном самого протокола MQTT, который также является важным фактором.
Подходит для большинства сценариев приложений Интернета вещеймодель публикации-подписки.
Используя модель публикации-подписки, протокол MQTT имеет много преимуществ, например, позволяет данным датчика запускать ряд действий; временное отключение, вызванное нестабильностью сети, не повлияет на работу; удобно динамически регулировать масштаб системы в соответствии с потребностями. , и т.д. Это позволяет удовлетворить потребности большинства сценариев IoT.
Способен удовлетворить потребности устройств с ограниченными ресурсами в Интернете вещейлегкийхарактеристика.
MQTT — этоЛегкийЭто важная причина его популярности в системах IoT. В конце концов, большое количество IoT-устройств — это устройства с ограниченными вычислительными ресурсами и низкой пропускной способностью сети. Эта «легкость» проявляется двояко.
С одной стороны, сообщения MQTT используютдвоичный формат кодирования, а не буквальное представление протокола HTTP. В этом тексте, передаваемом по протоколу HTTP, каждый символ занимает 1 байт. А если вы используете протокол MQTT, один байт может представлять много контента. На изображении ниже показан формат фиксированного заголовка MQTT длиной всего 2 байта:
Первый байт делится на 4 старших бита (4-7) и младшие 4 бита (0-3); младшие 4 бита являются битами идентификации пакета данных, каждый из которых может представлять различные значения; Старшие 4 бита являются идентификационными битами для различных типов пакетов. Второй байт указывает общее количество байтов в заголовке пакета и теле сообщения, а старший бит указывает на наличие третьего байта, который вместе со вторым байтом указывает общее количество байтов. Если есть третий байт, то его старший бит указывает, есть ли четвертый байт, вместе со вторым байтом и третьим байтом указывают общее количество байтов. И так далее, также может быть четвертый байт, пятый байт, но эта часть представляет собой количество байтов в заголовке переменной и теле сообщения,Только до пятого байта, поэтому максимальная длина пакета, которую можно представить, составляет 256 МБ.
Например, пакет типа CONNECT, запрашивающий установление соединения, требует 14 байтов в заголовке, а заголовок пакета типа PUBLISH опубликованного сообщения имеет только от 2 до 4 байтов.
С другой стороны, это находит свое отражение в конкретныхДизайн потока взаимодействия очень прост, поэтому в MQTT очень мало интерактивных типов сообщений.
Как видно из таблицы, MQTT 3.1.1 определяет всего 14 типов пакетов данных, которым соответствуют значения от 1 до 14 в старших 4 битах первого байта.
Следите за устройствами IoTНизкое энергопотреблениеОптимальный дизайн для требований.
В дополнение к тому, чтобы сделать протокол достаточно легким, протокол MQTT также уделяет большое внимание оптимизированному дизайну с низким энергопотреблением, что в основном отражается на оптимизации энергопотребления и времени связи.
Например, протокол MQTT имеетМеханизм поддержания активности. Его функция заключается в том, чтобы позволить обеим сторонам вовремя обнаружить, когда соединение между Клиентом и Брокером прерывается, и восстановить соединение MQTT для обеспечения надежной передачи тематических сообщений. Принцип работы этого механизма заключается в том, что и Клиент, и Брокер оценивают, передается ли сообщение между двумя сторонами в течение определенного периода времени, исходя из продолжительности времени, определенного Keepalive. Эта продолжительность времени поддержания активности устанавливается, когда клиент устанавливает соединение.Если время превышает эту продолжительность времени и две стороны не получают новые пакеты данных, определяется, что соединение разорвано.
Хотя Keepalive требует, чтобы пакеты данных передавались в течение определенного периода времени, реальная ситуация такова, что Клиент и Брокер не могут постоянно передавать тематические сообщения, что нам делать?
Решение для протокола MQTT состоит в том, что определены два типа сообщений, PINGREQ и PINGRESP. Ни у одного из них нет переменных заголовков и тела сообщения, что означает, что они имеют размер всего 2 байта. Клиент и Брокер могут выполнять требования механизма Keepalive, отправляя сообщения PINGREQ и PINGRESP соответственно. Я думаю, вы также поняли, что было бы пустой тратой энергии и сетевых ресурсов продолжать отправлять сообщения, подобные этому, «тупо» на регулярной основе. Поэтому, если в течение времени Keepalive происходит передача данных между Клиентом и Брокером, механизм Keepalive также засчитает ее, поэтому нет необходимости судить по отправке сообщений PINGREQ и PINGRESP.
В дополнение к механизму Keepalive функция повторяющихся тем в MQTT 5.0 также может помочь нам сэкономить сетевые ресурсы. Когда клиент повторно отправляет сообщение по теме, он может установить длину имени темы на 0 со второго раза, чтобы брокер автоматически обрабатывал сообщение в соответствии с последней темой. Такая ситуация очень характерна для сенсорных устройств, поэтому данная функция очень удобна в работе.
Для постоянно меняющейся сетевой среды в Интернете вещейДоступно несколько уровней качества обслуживания.
Протокол MQTT разработан с 3 различными уровнями QoS (качество обслуживания). Вы можете гибко выбирать в соответствии со сценарием, чтобы обеспечить надежную связь в различных средах.
**Что такое QoS? **Относится к переговорам между взаимодействующими сторонами о надежности передачи сообщений.
Уровень качества обслуживания 0, сообщение отправляется только один раз и может быть потеряно;
Уровень качества обслуживания 1, отправитель получит обратную связь, чтобы гарантировать доставку сообщения, но сообщение может быть повторено.
Качество обслуживания уровня 2, через несколько взаимодействий между отправителем и получателем, чтобы гарантировать, что есть одно и только одно сообщение.
Можно видеть, что процесс QoS 0 и QoS 1 относительно прост, в то время как QoS 2 имеет относительно сложный процесс для обеспечения одной и только одной надежной передачи. Обычно QoS 2 имеет 4 взаимодействия PUBLISH, PUBREC, PUBREL и PUBCOMP. Что касается «нештатной ситуации», то отправителю необходимо повторно отправить сообщение. Например, если сообщение PUBREC не получено в течение определенного периода времени, сообщение PUBLISH необходимо отправить снова. Обратите внимание, однако, что флаг «дублировать» в сообщении в это время должен быть установлен в 1, чтобы получатель мог правильно его обработать. Аналогичным образом, если сообщение PUBCOMP не получено, отправителю необходимо снова отправить сообщение PUBREL.
Поддержка растущего значения приложений IoTБезопасность данных.
Говоря о безопасной передаче, сначала нам нужно проверить, есть ли у Клиента разрешение на доступ к MQTT Broker. Для управления доступом Клиента MQTT предоставляетИмя пользователя ПарольМеханизмы. В процессе установления соединения он может фильтровать действительные запросы на соединение, оценивая правильность имени пользователя и пароля. Однако сам по себе этот механизм не может гарантировать безопасность данных при обмене данными по сети. Потому что при передаче открытым текстом не только данные устройства, но даже имена пользователей и пароли могут быть перехвачены другими из сети и просочились, поэтому другие могут маскироваться под законные устройства для отправки данных. Поэтому нам также необходима поддержка технологии шифрования связи. Протокол MQTT поддерживает зашифрованную связь SSL/TLS. С шифрованием SSL/TLS,MQTTпревратится вMQTTS. Это чем-то похоже на отношения между HTTP и HTTPS.
Опыт MQTT
Простой опыт работы с MQTT с помощью hbmqtt
Первым шагом является установкаhbmqtt, который представляет собой программное обеспечение MQTT Broker на основе Python с открытым исходным кодом, которое включает только некоторые инструменты, которые нам нужно использовать. По сравнению с другими вариантами, это программное обеспечение очень просто установить, поскольку оно доступно в репозиториях Python PYPI, поэтому вы можете установить его с помощью команды pip. Это также является основной причиной выбора его использования. Однако следует отметить, что hbmqtt основан наPython3Реализовано, поэтому здесь используется инструмент pip3.
pip3 install hbmqtt
После завершения установки мы можем использовать предоставленный в hbmqtthbmqtt_subиhbmqtt_pubЭти два инструмента командной строки исчезли. По имени вы также должны видеть, что hbmqtt_sub может действовать как подписчик, а hbmqtt_pub может действовать как издатель сообщений.
Что касается брокера между подписчиками и издателями, то есть MQTT Broker, мы используем бесплатную и открытую платформу Eclipse.Онлайн-брокерСлужить. Откройте ссылку, вы можете увидеть вводную информацию о порте, поддерживаются как зашифрованные, так и незашифрованные методы, а также есть реализация на основе Websocket, которая очень полезна для интерфейсных веб-приложений.
Мы сначала используем незашифрованный метод порта 1883, а затем определяем тему (Topic) для передачи сообщения. Тема определяет категорию сообщения и используется для фильтрации сообщений. Например, сообщение, которое мы будем тестировать позже, может быть установлено как "/mqtt/test".
Далее мы можем подписаться на это сообщение темы, введя следующую команду в терминальном интерфейсе компьютера:
hbmqtt_sub --url mqtt://test.mosquitto.org:1883 -t /mqtt/test
Теперь мы запускаем другой терминальный интерфейс и публикуем "/mqtt/testсообщение темы:
hbmqtt_pub --url mqtt://test.mosquitto.org:1883 -t /mqtt/test -m Hello,World!
Создайте свой собственный MQTT-брокер, чтобы получить всесторонний опыт
использоватьVerneMQкак MQTT-брокер
Первый шаг — установить VerneMQ с помощью докера.
docker run -p 1883:1883 -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" --name vernemqtt -d vernemq/vernemq
Второй шаг — использовать VSCode для подключения VerneMQ и установки плагина VsMqtt.
Реализация кода клиента MQTT (Client), вы можете использоватьEclipse Pahoпроект.