Анализ сообщений MQTT 5.0 02: PUBLISH и PUBACK
Анализ сообщений MQTT 5.0 02: PUBLISH и PUBACK

Добро пожаловать во вторую статью серии сообщений 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, в команде также устанавливаются атрибуты «Интервал истечения сообщения» и «Тема ответа».

Язык кода:mqtt
копировать
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:

Язык кода:mqtt
копировать
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

Эта строка шестнадцатеричных байтов соответствует следующему содержимому сообщения:

01publishpacket.png
01publishpacket.png

Когда мы только изменим параметр QoS в команде MQTTX CLI и установим уровень QoS сообщения на 1, мы увидим, что сервер отвечает сообщением PUBACK после получения PUBLISH. Их данные сообщения:

Язык кода:mqtt
копировать
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,То есть сообщение получено,И есть соответствие от подписчика.

02pubackpacket.png
02pubackpacket.png

продолжать использовать MQTTX CLI Опубликовать QoS 2 сообщение, мы увидим, что между клиентом и сервером произошло два обмена сообщениями, Wireshark сообщит нам, что эти сообщения PUBLISH、PUBREC、PUBREL а также PUBCOMP, и у них одинаковый идентификатор сообщения. 0x11c2

Язык кода:mqtt
копировать
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 Бит состоит из следующих трех полей:

  • DUP(Bit 3): Клиент или сервер выполняет повторную передачу. PUBLISH При отправке сообщения вам необходимо DUP Набор логотипов для 1, что указывает на то, что это полученное повторное сообщение. DUP для 1 из PUBLISH Количество и частота сообщений могут показать качество текущего канала связи.
  • QoS(Bit 2 - 1): используется для указания сообщения из QoS оценка.
  • Retain(Bit 0): Установить для 1, что указывает на то, что текущее сообщение Сохранить сообщение установлено для; 0, это означает, что текущее сообщение является обычной изинформацией.

За ним следует поле оставшейся длины (Remaining length), указывающее количество байтов, оставшихся в текущем сообщении.

ПУБЛИКОВАТЬ структуру сообщения
ПУБЛИКОВАТЬ структуру сообщения

переменный заголовок

Сообщение PUBLISH с измененным заголовком содержит следующие поля по порядку:

  • Название темы(Topic Имя): Это Строка в кодировке UTF-8, используемый для указания, в каком информационном канале должно быть опубликовано сообщение.
  • идентификатор сообщения(Packet Идентификатор): это целое число без знака длиной два байта, используемое для уникальной идентификации передаваемого в данный момент сообщения, только если QoS 等级для 1 или 2 час, идентификатор сообщения будут появляться только в PUBLISH в сообщении.
  • свойство(Properties):下表列出了 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 и т. д.

Структура сообщения PUBACK

фиксированный заголовок

фиксированный Первый байт в заголовке высокий 4 Бит из значения фиксирован для 4 (0b0100), что указывает на то, что это PUBACK сообщение, низкий 4 Биты — это зарезервированные биты, все фиксированные для 0。

За ним следует поле оставшейся длины (Remaining length), указывающее количество байтов, оставшихся в текущем сообщении.

Структура сообщения PUBACK
Структура сообщения PUBACK

переменный заголовок

Сообщение PUBACK с измененным заголовком содержит следующие поля по порядку:

  • идентификатор сообщения(Packet Идентификатор): с PUBLISH Сообщение другое, PUBACK в сообщенииидентификатор сообщение должно присутствовать, оно используется партнером, чтобы указать, кому оно отправлено. QoS для 1 из PUBLISH Сообщение из ответа.
  • код причины(Reason Код): Это одиночный байтиз целое число без знака для К PUBLISH Конец публикации сообщения из указывает результат публикации, например, было ли отказано в публикации из-за несанкционированного доступа для. В следующей таблице перечислены PUBACK. Все сообщения доступны Reason Code:

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 Формат, указанный атрибутом, не соответствует.

  • свойство(Properties):下表列出了 PUBACK Сообщения из всех доступныхсвойство.

Identifier

Property Name

Type

0x1F

Reason String

Строка в кодировке UTF-8

0x26

User Property

Пара строк UTF-8

полезная нагрузка

PUBACK Сообщение не содержит полезного нагрузка。

Структура сообщения PUBREC, PUBREL, PUBCOMP

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 及其ответное сообщениеизпредставлять,в следующей статье,Продолжим изучать структуру и состав сообщений о подписке и отписке.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose