Каждый управляющий пакет MQTT содержит фиксированный заголовок. В таблице 4 приведен фиксированный формат заголовка.
Таблица 4 - Фиксированный формат заголовка
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Байт 1 | Тип управляющего пакета MQTT | Флаги, определенные для каждого типа управляющего пакета MQTT | ||||||
Байт 2... | Остаток байтов |
5.2.1 Тип управляющего пакета MQTT
Позиция: байт 1, биты 7-4.
Значения, представленные в виде 4-разрядной величины без знака, приведены в таблице 5.
Таблица 5 - Типы управляющих пакетов
Название | Значение | Направление потока | Описание |
Зарезервировано | 0 | Запрещено | Зарезервировано |
CONNECT | 1 | Клиент - Сервер | Запрос Клиента на подключение к Серверу |
CONNACK | 2 | Сервер - Клиент | Подтверждение подключения |
PUBLISH | 3 | Клиент - Сервер или Сервер - Клиент | Опубликовать сообщение |
PUBACK | 4 | Клиент - Сервер или Сервер - Клиент | Подтверждение публикации |
PUBREC | 5 | Клиент - Сервер или Сервер - Клиент | Получение публикации (часть 1 механизма гарантированной поставки) |
PUBREL | 6 | Клиент - Сервер или Сервер - Клиент | Сообщение для публикации отправлено (часть 2 механизма гарантированной поставки |
PUBCOMP | 7 | Клиент - Сервер или Сервер - Клиент | Публикация сообщения окончена (часть 3 механизма гарантированной поставки) |
SUBSCRIBE | 8 | Клиент - Сервер | Запрос подписки от Клиента |
SUBACK | 9 | Сервер - Клиент | Подтверждение подписки |
UNSUBSCRIBE | 10 | Клиент - Сервер | Запрос об отказе от подписки |
UNSUBACK | 11 | Сервер - Клиент | Подтверждение отказа от подписки |
PINGREQ | 12 | Клиент - Сервер | Запрос PING |
PINGRESP | 13 | Сервер - Клиент | Ответ PING |
DISCONNECT | 14 | Клиент - Сервер | Сообщение об отключении Клиента |
Зарезервировано | 15 | Запрещено | Зарезервировано |
5.2.2 Флаги
Остальные биты [3-0] байта 1 в фиксированном заголовке содержат флаги, специфичные для каждого типа управляющего пакета MQTT, как приведено в таблице 6. Если в таблице 6 бит флага отмечен, как "Зарезервировано", то он зарезервирован для будущего использования и ДОЛЖЕН быть установлен в значение, указанное в данной таблице [MQTT-5.2.2-1]. Если полученный пакет содержит неверные флаги, получатель ДОЛЖЕН прервать сетевое соединение [MQTT-5.2.2-2]. Более подробная информация об обработке ошибок приведена в подразделе 7.8.
Таблица 6 - Биты флагов
Управляющий пакет | Фиксированные флаги заголовков | Бит 3 | Бит 2 | Бит 1 | Бит 0 |
CONNECT | Зарезервировано | 0 | 0 | 0 | 0 |
CONNACK | Зарезервировано | 0 | 0 | 0 | 0 |
PUBLISH | Используется в MQTT 3.1.1 | DUP | QoS | QoS | RETAIN |
PUBACK | Зарезервировано | 0 | 0 | 0 | 0 |
PUBREC | Зарезервировано | 0 | 0 | 0 | 0 |
PUBREL | Зарезервировано | 0 | 0 | 1 | 0 |
PUBCOMP | Зарезервировано | 0 | 0 | 0 | 0 |
SUBSCRIBE | Зарезервировано | 0 | 0 | 1 | 0 |
SUBACK | Зарезервировано | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | Зарезервировано | 0 | 0 | 1 | 0 |
UNSUBACK | Зарезервировано | 0 | 0 | 0 | 0 |
PINGREQ | Зарезервировано | 0 | 0 | 0 | 0 |
PINGRESP | Зарезервировано | 0 | 0 | 0 | 0 |
DISCONNECT | Зарезервировано | 0 | 0 | 0 | 0 |
______________
DUP = Повторная доставка управляющего пакета PUBLISH
QoS = Качество услуги передачи PUBLISH
RETAIN = Флаг сохранения пакета PUBLISH
В пункте 6.3.1 приведено описание DUP, QoS и RETAIN в составе управляющего пакета PUBLISH.
5.2.3 Остаток байтов
Позиция: начинается с байта 2.
Остаток байтов - это количество байтов, оставшихся в текущем пакете, включая данные в переменном заголовке и полезную нагрузку. В это число не входят байты, используемые для кодирования самого числа оставшихся байтов, указанного в фиксированном заголовке.
Число оставшихся в данном пакете байтов кодируется с использованием схемы кодирования с переменной длиной, которая использует один байт для значений до 127. Более крупные величины обрабатываются следующим образом. Наименее значимые семь бит каждого байта кодируют данные, а самый старший бит используется для указания, что в представлении присутствуют следующие байты. Таким образом, каждый байт кодирует 128 значений и "бит продолжения". Максимальное количество байтов в поле "Остаток байтов" равно четырем.
Пример - Десятичное число 64 кодируется как один байт, десятичное значение 64, шестнадцатеричное 0x40. Десятичное число 321 (= 65+2*128) кодируется как два байта, наименее значимые указываются первыми. Первый байт равен 65+128=193. Обратите внимание, что верхний бит установлен для указания хотя бы одного следующего байта. Второй байт равен 2.
Примечание - Кодирование остатка байтов позволяет приложениям отправлять управляющие пакеты размером до 268435455 (256 МБ). Представление этого числа в закодированном виде: 0xFF, 0xFF, 0xFF, 0x7F.