Просто чтобы понять MQTT соглашение

Анализ протокола протокола -MQTT MQTT (MQTT структура пакета)

协议就是通信双方的一个约定,
即,表示第1位传输的什么、第2位传输的什么……。
在MQTT协议中,一个MQTT数据包由:
固定头(Fixed header)、 可变头(Variable header)、 消息体(payload)三部分构成

Структура пакета MQTT

* 固定头(Fixed header),存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识
* 可变头(Variable header),存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容
* 消息体(Payload),存在于部分MQTT数据包中,表示客户端收到的具体内容

1 MQTT Железы

MQTT железа присутствует во всех пакетах, следующая структура:

Немного 7 6 5 4 3 2 1 0
байт 1 типы пакетов MQTT Конкретно определить различные типы пакетов данных MQTT
байт 2 ... остальная длина

1.1 типов пакетов MQTT

Расположение : байты 1, биты 7-4.
Фазы в 4-битовых значений без знака, следующих типов:

имя значение направление потока описание
Зарезервированный 0 Недоступен Зарезервированные биты
CONNECT 1 Клиент-сервер Клиент запрашивает сервер для подключения к
CONNACK 2 Сервер для клиента Подтверждение соединения
ПУБЛИКОВАТЬ 3 Двусторонний сообщение для печати
PUBACK 4 Двусторонний Опубликовано подтверждение
PUBREC 5 Двусторонний Сообщение получено (часть 1 гарантия прибытия)
PUBREL Шесть пар взяточничества релиз Release (часть 2 гарантия прибытие)
PUBCOMP 7 Двусторонний Выпуск полностью (часть 3 прибытия гарантии)
ПОДПИСЫВАТЬСЯ 8 Клиент-сервер Подписаться на запросы клиентов
SUBACK 9 Сервер для клиента подписка Подтверждение
UNSUBSCRIBE 10 Клиент-сервер Запрос на подписку
UNSUBACK 11 Сервер для клиента Отказаться подтверждение
PINGREQ 12 Клиент-сервер PING запросы
PINGRESP 13 Сервер для клиента PING ответ
ОТКЛЮЧИТЬ 14 Клиент-сервер отключать
Зарезервированный 15 Недоступен Зарезервированные биты

1.2 флаг

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

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

пакет флаг Бит 3 Бит 2 Бит 1 Бит 0
CONNECT Зарезервированные биты 0 0 0 0
CONNACK Зарезервированные биты 0 0 0 0
ПУБЛИКОВАТЬ MQTT 3.1.1 Использование DUP1 QoS2 QoS2 RETAIN3
PUBACK Зарезервированные биты 0 0 0 0
PUBREC Зарезервированные биты 0 0 0 0
PUBREL Зарезервированные биты 0 0 0 0
PUBCOMP Зарезервированные биты 0 0 0 0
ПОДПИСЫВАТЬСЯ Зарезервированные биты 0 0 0 0
SUBACK Зарезервированные биты 0 0 0 0
UNSUBSCRIBE Зарезервированные биты 0 0 0 0
UNSUBACK Зарезервированные биты 0 0 0 0
PINGREQ Зарезервированные биты 0 0 0 0
PINGRESP Зарезервированные биты 0 0 0 0
ОТКЛЮЧИТЬ Зарезервированные биты 0 0 0 0
  • DUP: опубликовать копию сообщения. Используется для обеспечения надежной передачи сообщения, если установлено значение 1, увеличивается в следующем MESSAGEID больше, и требует подтверждения ответа на сообщение, чтобы убедиться, что передача завершена, но не для обнаружения повторно переданного сообщения.
  • QoS: Качество пресс-релизе службы, а именно: обеспечить, чтобы количество доставки сообщений
    • 00: не более одного раза, а именно: <= 1
    • 01: по крайней мере один раз, а именно:> = 1
    • 10: один раз, а именно: 1 =
    • 11: Зарезервировано
  • RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

1.3 剩余长度(Remaining Length)

位置:byte 1。

固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为 1时,表示长度不足,需要使用二个字节继续保存。 例如:计算出后面的大小为0

2 MQTT可变头

MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是做为包的标识:

Bit 7 6 5 4 3 2 1 0
byte 1 包标签符(MSB)
byte 2 … 包标签符(LSB)

很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

3 Payload消息体

  • Payload消息体位MQTT数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息 有消息体:

    • CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
    • SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
    • SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
    • UNSUBSCRIBE,消息体内容是要订阅的主题。

рекомендация

отblog.51cto.com/14263015/2429561