Добро пожаловать в третью статью серии сообщений MQTT 5.0. В предыдущей статье мы познакомились с функцией PUBLISH MQTT 5.0 и ее ответным сообщением. Теперь мы представим управляющие сообщения для подписки и отказа от подписки.
В MQTT сообщение SUBSCRIBE используется для инициирования запроса на подписку, а сообщение SUBACK используется для возврата результата подписки. Сообщения UNSUBSCRIBE и UNSUBACK используются при отмене подписки. По сравнению с отменой подписки, операция подписки используется чаще. Однако в этой статье мы все же познакомим вас со структурой и составом сообщений о подписке и отказе от подписки.
Сначала мы используем Wireshark для захвата реального запроса и ответа на подписку MQTT. Здесь мы используем CLI MQTTX для инициирования запроса на подписку на общедоступный сервер MQTT. Следующая команда создаст подписку с демонстрационной темой и максимальным QoS, равным 2:
mqttx sub --hostname broker.emqx.io --mqtt-version 5 --topic demo --qos 2
Ниже приведены данные сообщений SUBSCRIBE и SUBACK, полученные Wireshark:
# SUBSCRIBE
82 0a 05 be 00 00 04 64 65 6d 6f 02
# SUBACK
90 04 05 be 00 02
В среде Linux вы можете сначала использовать команду tcpdump для захвата пакетов, а затем импортировать их в Wireshark для анализа.
Эти оригинальные и неясные данные сообщения, состоящие из шестнадцатеричных байтов, соответствуют следующему содержимому сообщения:
Возможно, вы начинаете задаваться вопросом, как они выполняют преобразование простых команд CLI MQTTX в сложные данные сообщения, или вам интересно, как следует извлекать нужную информацию при захвате сообщения MQTT.
Тогда в следующем ПОДПИСАТЬСЯ, ПОДПИСАТЬСЯ, ОТМЕНИТЬ ПОДПИСКУ, а также ОТПИСАТЬСЯ из Структура сообщений.Во введении на ваши вопросы будут даны ответы.
существовать SUBSCRIBE в сообщении,фиксированный Первый байт в заголовке высокий 4 Значение места должно быть 8 (0b1000) пока низкий 4 Зарезервированные биты должны быть установлены на 2 (0b0010). После первого байта остается оставшаяся длина (Remaining Длина), которое представляет собой переменное целое число в байтах.
Изпеременный заголовок сообщения SUBSCRIBE содержит следующие поля по порядку:
Identifier | Property Name | Type |
---|---|---|
0x0B | Subscription Identifier | Байт переменной длины, целое число |
0x26 | User Property | Пара строк UTF-8 |
SUBSCRIBE Сообщение изполезное Нагрузка содержит одну или несколько пар тематический фильтр/опция подписки. Тематический фильтр – это UTF-8 Закодированная строка, используемая для указания серверу темы, на которую клиент желает подписаться. Опция подписки занимает всего один байт и в настоящее время состоит из следующих четырех опций:
Значение старших 4 битов первого байта сообщения SUBACK равно 9 (0b1001), а младшие 4 бита должны быть установлены в 0.
Изпеременный заголовок SUBACK содержит следующие поля по порядку:
Identifier | Property Name | Type |
---|---|---|
0x1F | Reason String | Строка в кодировке UTF-8 |
0x26 | User Property | Пара строк UTF-8 |
SUBACK Сообщение изполезное файл содержит Reason Code Список, Причина Code Указывает, была ли подписка успешной или причина сбоя. один Reason Code переписываться SUBSCRIBE Тематический фильтр для сообщения, поэтому SUBACK в сообщении Reason Code Порядок должен быть таким же, как SUBSCRIBE в Несколько фильтров тем в последовательном порядке.
В следующей таблице перечислены все коды причин, доступные для сообщений SUBACK:
Value | Reason Code Name | Description |
---|---|---|
0x00 | Granted QoS 0 | Подписка принимается с максимальным уровнем QoS 0. Уровень QoS, предоставляемый сервером, может быть ниже уровня QoS, запрошенного клиентом, что в основном зависит от того, поддерживает ли сервер все QoS или соответствующие настройки разрешений. |
0x01 | Granted QoS 1 | Подписка принимается с максимальным уровнем QoS 1. |
0x02 | Granted QoS 2 | Подписка принимается с максимальным уровнем QoS 2. |
0x80 | Unspecified error | Указывает на неопределенную ошибку. Когда одна сторона не желает раскрывать конкретную причину ошибки другой стороне или в спецификации протокола нет положения, соответствующего текущей ситуации. Reason Code когда, тогда оно будет существоватьв мы воспользуемся этим Reason Code。 |
0x83 | Implementation specific error | Сообщение SUBSCRIBE допустимо, но не принимается текущей реализацией сервера. |
0x87 | Not authorized | У клиента нет разрешения на подписку на эту подписку. |
0x8F | Topic Filter invalid | Фильтр тем имеет правильный формат, но не принимается сервером. Например, уровень фильтров тем превышает максимальное количество, разрешенное сервером. |
0x91 | Packet Identifier in use | Полученный сообщениииз Packet ID толькосуществоватьиспользоваться。 |
0x97 | Quota exceeded | Указывает на превышение лимита квоты. Сервер может ограничить квоту подписки подписчика. Например, клиент может установить до 10 подписок. |
0x9E | Shared Subscriptions not supported | Сервер не поддерживает общие подписки. |
0xA1 | Subscription Identifiers not supported | Сервер не поддерживает идентификаторы подписки. |
0xA2 | Wildcard Subscriptions not supported | Сервер не поддерживает подписки с подстановочными знаками. |
То же, что и сообщение SUBSCRIBE, с той лишь разницей, что значение поля типа сообщения меняется с 8 (0b1000) на 10 (0b1010).
То же, что и сообщение ПОДПИСАТЬСЯ.
UNSUBSCRIBE Сообщение изполезное Нагрузка содержит один или несколько фильтров тем, от которых клиент желает отказаться, и эти фильтры тем также Строка в кодировке UTF-8 и несколько фильтров тем тесно связаны между собой.
Значение старших 4 битов первого байта сообщения UNSUBACK равно 11 (0b1011), а младшие 4 бита должны быть установлены в 0.
UNSUBACK изпеременный заголовок содержит порядковый номер идентификатора сообщенияисвойство Поле,Доступныйизсвойствои SUBACK Сообщения те же самые.
UNSUBACK Сообщение изполезное нагрузка также содержит Reason Code Список, Причина Code Указывает, была ли отписка успешной или причина,по которой она не удалась. Эти Reason Code чтобыпереписываться UNSUBSCRIBE Тематический фильтр сообщения.
В следующей таблице перечислены все коды причин, доступные для сообщений UNSUBACK:
Value | Reason Code Name | Description |
---|---|---|
0x00 | Success | Подписка удалена |
0x11 | No subscription existed | Подписка не существует на сервере. |
0x80 | Unspecified error | Отмена подписки не может быть завершена: сервер либо не желает раскрывать причину, либо не применяется другой код причины. |
0x83 | Implementation specific error | Сообщение UNSUBSCRIBE допустимо, но не принимается текущей реализацией сервера. |
0x87 | Not authorized | У клиента нет разрешения на отмену этой подписки. |
0x8F | Topic Filter invalid | Фильтр тем имеет правильный формат, но не принимается сервером. Например, уровень фильтров тем превышает максимальное количество, разрешенное сервером. |
0x91 | Packet Identifier in use | Полученный сообщениииз Packet ID толькосуществоватьиспользоваться。 |
SUBSCRIBE и SUBACK Сообщение используется для подписки, ОТПИСАТЬСЯ. и UNSUBACK для отказа от подписки,Хотите подписаться или отказаться от подписки на список фильтров тем,Всесуществоватьпереписываться Сообщение изполезное нагрузка Средний, ПОДПИСАТЬСЯ в моиз Каждый фильтр тем связан с набором опций подписки.
Указывает результат запроса Reason Code роды SUBACK и UNSUBACK Сообщение изполезное раздел нагрузки, а это список, один за другим переписывающиеся запросы wиз фильтры тем.
существуют в следующей статье,Мы продолжим изучать MQTT сообщение оби сердца.