Некоторые типы управляющих пакетов MQTT содержат компонент переменного заголовка. Он находится между фиксированным заголовком и полезной нагрузкой. Содержимое переменного заголовка зависит от типа управляющего пакета. Поле "Идентификатор пакета" переменного заголовка является общим для нескольких типов пакетов.
5.3.1 Идентификатор пакета
В таблице 8 приведены байты идентификатора пакета.
Таблица 8 - Байты идентификатора пакета
Бит | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Байт 1 | Идентификатор пакета MSB | |||||||
Байт 2 | Идентификатор пакета LSB |
Компонент переменного заголовка для многих типов управляющих пакетов включает в себя поле идентификатора пакета из 2 байтов. Такими управляющими пакетами являются PUBLISH (где QoS >0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.
Управляющие пакеты SUBSCRIBE, UNSUBSCRIBE и PUBLISH (в случаях, когда QoS >0) ДОЛЖНЫ содержать ненулевой 16-разрядный идентификатор пакета [MQTT-5.3.1-1]. Каждый раз, когда Клиент отправляет новый пакет одного из этих типов, он ДОЛЖЕН назначить ему неиспользуемый в настоящее время идентификатор пакета [MQTT-5.3.1-2]. Если Клиент повторно отправляет конкретный управляющий пакет, он ДОЛЖЕН использовать тот же идентификатор пакета в последующих повторных отправках этого пакета. Идентификатор пакета становится доступным для повторного использования после того, как Клиент обработал соответствующий пакет подтверждения. В случае QoS 1 PUBLISH - это соответствующий PUBACK; в случае QoS 2 - это PUBCOMP. Для SUBSCRIBE или UNSUBSCRIBE - это соответствующий SUBACK или UNSUBACK [MQTT-5.3.1-3]. Те же условия применяются к Серверу, когда он отправляет PUBLISH с QoS>0 [MQTT-5.3.1-4].
Пакет PUBLISH НЕ ДОЛЖЕН содержать идентификатор пакета, если его значение QoS установлено на 0 [MQTT-5.3.1-5].
Пакеты PUBACK, PUBREC или PUBREL ДОЛЖНЫ содержать тот же идентификатор пакета, что и первоначально отправленный пакет PUBLISH [MQTT-5.3.1-6]. Аналогично SUBACK и UNSUBACK ДОЛЖНЫ содержать идентификатор пакета, который использовался в соответствующем пакете SUBSCRIBE и UNSUBSC IBE, соответственно [MQTT-5.3.1-7].
Управляющие пакеты, требующие идентификатор пакета, приведены в таблице 9.
Таблица 9 - Управляющие пакеты, содержащие идентификатор пакета
Управляющий пакет | Поле идентификатора пакета |
CONNECT | НЕТ |
CONNACK | НЕТ |
PUBLISH | ДА (если QoS >0) |
PUBACK | ДА |
PUBREC | ДА |
PUBREL | ДА |
PUBCOMP | ДА |
SUBSCRIBE | ДА |
SUBACK | ДА |
UNSUBSCRIBE | ДА |
UNSUBACK | ДА |
PINGREQ | НЕТ |
PINGRESP | НЕТ |
DISCONNECT | НЕТ |
Клиент и Сервер назначают идентификаторы пакетов независимо друг от друга. В результате пары Клиент-Сервер могут участвовать в параллельных обменах сообщений с использованием одинаковых идентификаторов пакетов.
Пример - Клиент может отправить пакет PUBLISH с идентификатором пакета 0x1234, а затем получить другой пакет PUBLISH с идентификатором пакета 0x1234 со своего Сервера, прежде чем он получит PUBACK по отправленному PUBLISH.
Клиент | Сервер |
Идентификатор пакета PUBLISH = 0x1234 --- |