1. Краткое введение

MQTT (Message Queuing Telemetry Transport) — это «легкий» протокол связи, основанный на модели публикации/подписки. Этот протокол построен на протоколе TCP/IP и был выпущен IBM в 1999 году. Самое большое преимущество MQTT заключается в том, что он может обеспечивать обмен сообщениями в реальном времени и надежную доставку для подключенных удаленных устройств при минимальном коде и ограниченной пропускной способности. Как протокол обмена мгновенными сообщениями с низкими накладными расходами и низким потреблением пропускной способности, он широко используется в Интернете вещей, малых устройствах, мобильных приложениях и других областях.

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


2. Спецификации дизайна

Поскольку среда IoT очень специфична, MQTT следует следующим принципам проектирования:

  • (1) Максимально простой, без добавления несущественных функций;
  • (2) Режим публикации/подписки (Pub/Sub), облегчающий передачу сообщений между датчиками;
  • (3) Позволяет пользователям динамически создавать темы с нулевыми затратами на эксплуатацию и обслуживание;
  • (4) Минимизировать объём передачи для повышения эффективности передачи;
  • (5) Учитывать такие факторы, как низкая пропускная способность, высокая задержка и нестабильные сети;
  • (6) Поддержка непрерывного управления сессией;
  • (7) Понимание того, что вычислительная мощность клиента может быть очень низкой;
  • (8) Обеспечение управления качеством обслуживания;
  • (9) Предполагать, что данные неизвестны, не навязывать тип и формат передаваемых данных и сохранять гибкость.

3. Основные особенности

Протокол MQTT предназначен для связи между удалёнными датчиками и управляющими устройствами по низкопропускным, ненадёжным сетям. Он обладает следующими основными особенностями:

  • (1) Использует шаблон сообщений публикация/подписка, чтобы обеспечить публикацию сообщений «один ко многим» и ослабить связность приложений.

    Это очень похоже на XMPP, но MQTT имеет гораздо меньшую избыточность информации, чем XMPP, поскольку XMPP использует для передачи данных текст в формате XML.

  • (2) Передача сообщений, прозрачная по отношению к содержимому полезной нагрузки.

  • (3) Использует TCP/IP для обеспечения сетевых соединений.

    Основной MQTT использует TCP-соединения для передачи данных, но существуют и версии на основе UDP, называемые MQTT-SN. Поскольку эти две версии основаны на разных способах соединения, их преимущества и недостатки, естественно, различаются.

  • (4) Существует три уровня качества обслуживания при публикации сообщений:

    «Не более одного раза»: публикация сообщений полностью зависит от базовой сети TCP/IP. Возможны потеря или дублирование сообщений. Этот уровень можно использовать в таких ситуациях, как данные датчиков окружающей среды; потеря одного показания не имеет значения, потому что вскоре произойдёт повторная отправка. Этот метод в основном используется для push-уведомлений в обычных приложениях. Если ваше умное устройство не в сети, когда отправляется сообщение, push-уведомление не будет получено, и оно не будет получено, когда устройство снова подключится к сети.

    «Как минимум один раз»: гарантирует доставку сообщения, но может происходить дублирование сообщений.

    «Ровно один раз»: гарантирует, что сообщение доставляется ровно один раз. Этот уровень можно использовать в некоторых системах биллинга со строгими требованиями. В системах биллинга дублированные или потерянные сообщения могут привести к неверным результатам. Эта служба публикации сообщений наивысшего качества также может использоваться для push-уведомлений в приложениях мгновенного обмена сообщениями, гарантируя, что пользователи получают сообщение ровно один раз.

  • (5) Малые передачи с минимальными накладными расходами (заголовок фиксированной длины — 2 байта), минимизирующие обмены протокола для сокращения сетевого трафика.

    Именно поэтому во введении говорится, что он очень хорошо подходит для «связи между датчиками и серверами, а также сбора информации в области IoT». Следует знать, что вычислительная мощность и пропускная способность встраиваемых устройств относительно слабы, поэтому использование этого протокола для передачи сообщений идеально подходит.

  • (6) Использует функцию Last Will and Testament для уведомления соответствующих сторон о нештатном отключении клиента.

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

    Testament: механизм завещания, функция которого аналогична Last Will.


4. Принципы протокола MQTT

4.1 Метод реализации протокола MQTT

Реализация протокола MQTT требует связи между клиентом и сервером. Во время связи в протоколе MQTT есть три роли: публикатор, брокер (сервер) и подписчик. При этом и публикатор, и подписчик являются клиентами, брокер сообщений — сервером, а публикатор может одновременно быть и подписчиком.

Сообщения, передаваемые MQTT, делятся на две части: Topic и Payload.

  • (1) Topic можно понимать как тип сообщения. После того как подписчик подпишется, он будет получать содержимое сообщения (payload) этого топика.
  • (2) Payload можно понимать как содержимое сообщения, то есть конкретное содержимое, которое будет использовать подписчик.

4.2 Сетевая передача и прикладные сообщения

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

Когда данные приложения отправляются по сети MQTT, MQTT связывает с ними соответствующий уровень качества обслуживания (QoS) и имя темы.

4.3 MQTT-клиент

Приложение или устройство, использующее протокол MQTT, всегда устанавливает сетевое соединение с сервером. Клиент может:

  • (1) Публиковать информацию, на которую могут подписаться другие клиенты;
  • (2) Подписываться на сообщения, публикуемые другими клиентами;
  • (3) Отменять подписку или удалять сообщения приложения;
  • (4) Отключаться от сервера.

4.4 MQTT-сервер

MQTT-сервер также называют «брокером сообщений» (Broker). Он может быть приложением или устройством. Он находится между издателем сообщений и подписчиками и может:

  • (1) Принимать сетевые подключения от клиентов;
  • (2) Принимать информацию приложения, публикуемую клиентами;
  • (3) Обрабатывать запросы клиентов на подписку и отмену подписки;
  • (4) Пересылать сообщения приложений подписанным клиентам.

4.5 Подписки, темы и сессии в протоколе MQTT

1. Подписка

Подписка содержит фильтр тем и максимальный уровень качества обслуживания (QoS). Подписка связана с сессией. Сессия может содержать несколько подписок. Каждая подписка в каждой сессии имеет отдельный фильтр тем.

. Session

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

3. Имя темы

Метка, прикреплённая к сообщению приложения, которая соответствует подпискам на сервере. Сервер отправляет сообщение каждому клиенту, чья подписка соответствует этой метке.

4. Фильтр тем

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

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

Конкретное содержимое, получаемое подписчиком сообщения.

4.6 Методы в протоколе MQTT

MQTT 协议定义了一些方法(也称为动作),用于表示对某些资源的操作。这些资源可以表示预先存在的数据或动态生成的数据,具体取决于服务器实现。通常,资源指服务器上的文件或输出。主要方法包括:

  • (1) Connect。等待与服务器建立连接。
  • (2) Disconnect。等待 MQTT 客户端完成其工作,并与服务器断开 TCP/IP 会话。
  • (3) Subscribe。等待订阅完成。
  • (4) UnSubscribe。等待服务器取消客户端对一个或多个主题的订阅。
  • (5) Publish。MQTT 客户端发送消息请求,并在发送完成后返回到应用程序线程。

5. MQTT 协议报文结构

在 MQTT 协议中,一个 MQTT 报文由三部分组成:固定报头(Fixed header)、可变报头(Variable header)和有效载荷(Payload)。MQTT 报文结构如下:

  • (1) 固定报头。存在于所有 MQTT 报文中,指示报文类型和报文的分组类别标识符。
  • (2) 可变报头。存在于某些 MQTT 报文中。报文类型决定可变报头是否存在及其具体内容。
  • (3) 有效载荷。存在于某些 MQTT 报文中,表示客户端接收到的具体内容。

5.1 MQTT 固定报头

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

5.1.1 Тип пакета MQTT

Расположение: биты 7-4 в байте 1.

Это 4-битное беззнаковое значение. Типы, значения и описания приведены ниже:

5.1.2 Флаги

Расположение: биты 3-0 в байте 1.

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

(1) DUP: Дубликат опубликованного сообщения. Используется для обеспечения надёжной передачи сообщений. Если установлено значение 1, в переменном заголовке ниже добавляется MessageId, и требуется ответ-подтверждение, чтобы гарантировать завершение передачи сообщения, но это нельзя использовать для обнаружения дублирующей отправки сообщения.

(2) QoS: Quality of Service (качество обслуживания) для опубликованных сообщений, т. е. количество раз, которое гарантируется доставка сообщения.

Ø00:最多一次,即:<=1

Ø01:至少一次,即:>=1

Ø10:一次,即:=1

Ø11:预留

(3) RETAIN: Флаг сохранения при публикации. Указывает, что сервер должен сохранить эту переданную информацию. Если появляется новый подписчик, отправить это сообщение ему; если флаг не установлен, удалить его после отправки текущему подписчику.

5.1.3 Оставшаяся длина

Расположение: байт 2.

Второй байт фиксированного заголовка используется для хранения общего размера переменного заголовка и полезной нагрузки, но он не хранится напрямую. Этот байт является расширяемым. Механизм его хранения: первые 7 бит используются для хранения длины, а последний бит используется как идентификатор. Когда последний бит равен 1, это означает, что длины недостаточно и требуется второй байт для продолжения хранения. Например: если вычисленный следующий размер равен 0

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

MQTT-пакет содержит переменный заголовок, который располагается между фиксированным заголовком и полезной нагрузкой. Содержимое переменного заголовка зависит от типа пакета. Чаще всего он используется как идентификатор пакета:

Многие типы пакетов включают поле идентификатора пакета размером 2 байта. К таким типам пакетов относятся: PUBLISH (QoS > 0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

5.3 Тело сообщения полезной нагрузки

Тело сообщения полезной нагрузки — это третья часть MQTT-пакета, содержащая сообщения четырёх типов: CONNECT, SUBSCRIBE, SUBACK, UNSUBSCRIBE:

  • (1) CONNECT: тело сообщения в основном содержит ClientID клиента, подписанную тему, сообщение, а также имя пользователя и пароль.
  • (2) SUBSCRIBE: тело сообщения содержит ряд тем, на которые нужно подписаться, и QoS.
  • (3) SUBACK: тело сообщения — это подтверждение и ответ сервера на темы и QoS, запрошенные в SUBSCRIBE.
  • (4) UNSUBSCRIBE: тело сообщения содержит темы, от подписки на которые нужно отказаться.

Больше материалов

Исходная ссылка: https://blog.csdn.net/qq_28877125/article/details/78325003