Анализ протокола протокола -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,消息体内容是要订阅的主题。