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: тело сообщения содержит темы, от подписки на которые нужно отказаться.
Больше материалов
- Протокол MQTT 3.1.1:https://www.example.com/manual/mqtt/protocol/MQTT-3.1.1-CN.html
- Протокол MQTT 3.1.1 PDF:https://www.example.com/manual/mqtt/protocol/MQTT-3.1.1-CN.pdf
Исходная ссылка: https://blog.csdn.net/qq_28877125/article/details/78325003