Добро пожаловать во вторую статью серии сообщений MQTT 5.0. В предыдущей статье мы представили сообщения CONNECT и CONNACK MQTT 5.0. Теперь мы представим сообщение PUBLISH, используемое для доставки сообщений приложения в MQTT, и его ответное сообщение.
Независимо от того, публикует ли клиент сообщение на сервер или сервер пересылает сообщение подписчику, необходимо использовать сообщения PUBLISH. Тема, определяющая направление потока сообщений, фактическое содержимое сообщения и уровень QoS, включены в пакет PUBLISH.
В процессе передачи сообщений между клиентом и сервером, помимо сообщения PUBLISH, также используются четыре сообщения: PUBACK, PUBREC, PUBREL и PUBCOMP. Они используются для реализации механизмов сообщений QoS 1 и QoS 2 MQTT. соответственно. В этой статье мы подробнее рассмотрим, из чего состоят эти пять сообщений.
Мы используем CLI MQTTX для публикации трех сообщений с разными уровнями QoS на общедоступном сервере MQTT и используем инструмент Wireshark для захвата сообщений MQTT, передаваемых между клиентом и сервером. В среде Linux вы можете использовать команду tcpdump для захвата. сообщения, а затем импортируйте их в анализ Wireshark.
Ниже приведена команда CLI MQTTX, используемая в этом примере. Чтобы отобразить поля атрибутов сообщения PUBLISH, в команде также устанавливаются атрибуты «Интервал истечения сообщения» и «Тема ответа».
mqttx pub --hostname broker.emqx.io --mqtt-version 5 \ --topic request --qos 0 --message "This is a QoS 0 message" \ --message-expiry-interval 300 --response-topic response
Ниже приведено сообщение PUBLISH с QoS 0, отправленное CLI MQTTX и захваченное Wireshark:
30 31 00 07 72 65 71 75 65 73 74 10 02 00 00 01 2c 08 00 08 72 65 73 70 6f 6e 73 65 54 68 69 73 20 69 73 20 61 20 51 6f 53 20 30 20 6d 65 73 73 61 67 65
Эта строка шестнадцатеричных байтов соответствует следующему содержимому сообщения:
Когда мы только изменим параметр QoS в команде MQTTX CLI и установим уровень QoS сообщения на 1, мы увидим, что сервер отвечает сообщением PUBACK после получения PUBLISH. Их данные сообщения:
Client -- PUBLISH (32 33 00 .. ..) -> Server
Client <- PUBACK (40 04 64 4a 10 00) -- Server
В это время первый байт сообщения PUBLISH изменяется с 0x30 на 0x32, указывая, что это сообщение QoS 1.
PUBACK Как видите, структура сообщения относительно проста. Reason Code для 0x10
,Указывает, что сообщение получено,но нет совпаденияизподписчик。一旦有人订阅了 request
тема, тогда PUBACK в сообщении Reason Code станет 0x00
,То есть сообщение получено,И есть соответствие от подписчика.
продолжать использовать MQTTX CLI Опубликовать QoS 2 сообщение, мы увидим, что между клиентом и сервером произошло два обмена сообщениями, Wireshark сообщит нам, что эти сообщения PUBLISH、PUBREC、PUBREL а также PUBCOMP, и у них одинаковый идентификатор сообщения. 0x11c2
:
Client -- PUBLISH (34 33 00 .. ..) -> Server
Client <- PUBREC (50 04 11 c2 10 00) -- Server
Client -- PUBREL (62 03 11 c2 00) -> Server
Client <- PUBCOMP (70 04 11 c2 00 00) -- Server
Как по данным сообщения, состоящим из шестнадцатеричных байтов, точно узнать, является ли это PUBLISH сообщение, его QoS Насколько он реагирует на сообщениикод Что такое причина? Следующее введение к этим сообщениям ответит на эти вопросы.
PUBLISH Сообщение фиксировано В заголовке первый байт старший 4 Бит из значения фиксирован для 3 (0b0011), низкий 4 Бит состоит из следующих трех полей:
За ним следует поле оставшейся длины (Remaining length), указывающее количество байтов, оставшихся в текущем сообщении.
Сообщение PUBLISH с измененным заголовком содержит следующие поля по порядку:
Identifier | Property Name | Type |
---|---|---|
0x01 | Payload Format Indicator | одиночный байт |
0x02 | Message Expiry Interval | четырехбайтовое целое число |
0x23 | Topic Alias | двухбайтовое целое число |
0x08 | Response Topic | Строка в кодировке UTF-8 |
0x09 | Correlation Data | двоичные данные |
0x26 | User Property | Пара строк UTF-8 |
0x0B | Subscription Identifier | Байт переменной длины, целое число |
0x03 | Content Type | Строка в кодировке UTF-8 |
Фактическое содержимое сообщения приложения, которое мы отправляем, хранится в PUBLISH Сообщение изполезное нагрузки, он может передавать сообщения приложения в любом формате, например JSON、ProtoBuf и т. д.
фиксированный Первый байт в заголовке высокий 4 Бит из значения фиксирован для 4 (0b0100), что указывает на то, что это PUBACK сообщение, низкий 4 Биты — это зарезервированные биты, все фиксированные для 0。
За ним следует поле оставшейся длины (Remaining length), указывающее количество байтов, оставшихся в текущем сообщении.
Сообщение PUBACK с измененным заголовком содержит следующие поля по порядку:
Value | Reason Code Name | Description |
---|---|---|
0x00 | Success | Сообщение принято. |
0x10 | No matching subscribers | Сообщение было принято, но на данный момент подходящих подписчиков нет. |
0x80 | Unspecified error | Указывает на неопределенную ошибку. Если одна сторона не желает раскрывать конкретную причину ошибки другой стороне или в спецификации протокола нет кода причины, который мог бы соответствовать текущей ситуации, она будет использовать этот код причины в сообщении. |
0x83 | Implementation specific error | PUBLISH Сообщение допустимо, но не принимается текущей реализацией получателя. |
0x87 | Not authorized | PUBLISH Сообщение не прошло проверку разрешений сервера. Возможно, текущий клиент не имеет соответствующего разрешения на публикацию сообщений. |
0x90 | Topic Name invalid | Имя темы имеет правильный формат, но не принимается принимающей стороной. |
0x91 | Packet identifier in use | PUBLISH в сообщении Packet ID используется, это обычно означает, что состояние сеанса клиента и сервера не совпадают или что реализация одной стороны неверна. |
0x97 | Quota exceeded | Указывает на превышение лимита квоты. Сервер может ограничить квоту отправки издателя, например максимальное количество пересылок в день. 1000 сообщение. Когда квота издателя будет исчерпана, сервер PUBACK Используйте это в сообщении с подтверждением Reason Code Напомните другому человеку. |
0x99 | Payload format invalid | выражатьполезная нагрузкаиз Формати Payload Format Indicator Формат, указанный атрибутом, не соответствует. |
Identifier | Property Name | Type |
---|---|---|
0x1F | Reason String | Строка в кодировке UTF-8 |
0x26 | User Property | Пара строк UTF-8 |
PUBACK Сообщение не содержит полезного нагрузка。
PUBREC、PUBREL и PUBCOMP Структура сообщения PUBACK По сути то же самое, основная разница между ними фиксированный Поле типа сообщения из значения в заголовке, а также можно использовать изкод причины。
Поле типа сообщения из значения для 5 (0b0101), что указывает на то, что это PUBREC сообщение; значение для 6 (0b0110), значит, это PUBRELсообщение; значение для 7 (0b0111), значит это PUBCOMP сообщение.
PUBREC 作для QoS 2 поток сообщений PUBLISH сообщение подтверждения сообщения, которое может использовать код причины с PUBACK Абсолютно последовательный. ПУБРЕЛЬ и PUBCOMP Коды причин, доступные для сообщения, следующие:
Identifier | Reason Code Name | Description |
---|---|---|
0x00 | Success | Зависит от QoS 2 Отправитель сообщения PUBREL Когда оно возвращается в сообщении, это означает, что сообщение было выпущено, то есть сообщение не будет повторно передаваться в будущем. от QoS 2 Получающая сторона сообщения находится по адресу PUBREC сообщение中返回час,выражать消息中使用изидентификатор сообщениябыл выпущен,Теперь отправитель может использовать этот идентификатор сообщения для отправки новой информации. |
0x92 | Packet Identifier not found | Свидетельствует о получении неизвестного идентификатора сообщения, это обычно означает, что текущее состояние сеанса сервера и клиента не совпадает. |
PUBLISH в сообщениитемарешил сообщениеизпоток К,QoS Он определяет надежность сообщения, а также определяет, какие сообщения будут использоваться для передачи. сообщение для QoS 1 Сообщение, ПУБРЕК, ПУБРЕК и PUBCOMP сообщение для QoS 2 информация. качество обслуживания больше, чем 0 Сообщение также должно содержать идентификатор сообщения для корреляции. PUBLISH Сообщение и оно и з ответ сообщение.
PUBLISH сообщениеизполезная нагрузкаНет ограничений на типы данных,Таким образом, мы также можем передавать любой формат информации о приложении.,свойствоМожет удовлетворить нас в большем количестве сценариевизнуждаться,Например, псевдоним темы может уменьшить размер каждого сообщения.,Интервал истечения срока действия сообщения может быть установлен для своевременности и срока действия набора сообщений и т.д.
PUBLISH сообщениеизответное сообщениеКроме КОтправитель указывает, что сообщение было получено не,Еще можно пройти Reason Code Даны дальнейшие указания по публикации результатов. Поэтому, когда подписчик не может получить сообщение, мы также можем получить ответ через издателя. сообщениикод Причина устранения этой проблемы.
Вышеупомянутое верно MQTT PUBLISH 及其ответное сообщениеизпредставлять,в следующей статье,Продолжим изучать структуру и состав сообщений о подписке и отписке.