Netty реализует высокопроизводительный сервер IOT (Groza) с ручным разрывом протокола MQTT.

задняя часть сервер Netty Интернет вещей

предисловие

Рождение и преимущества

MQTT был разработан в 1999 году Энди Стэнфорд-Кларком (IBM) и Арленом Ниппером (Eurotech, теперь Cirrus Link) для мониторинга нефтепроводов через пустыни. Цель состоит в том, чтобы иметьПротокол с эффективной полосой пропускания, потребляющий очень мало энергии аккумулятора, потому что устройства были подключены через спутниковые каналы связи, которые в то время были очень дорогими. В отличие от HTTP и его парадигмы запрос/ответ, протокол использует архитектуру публикации/подписки. Pub/Sub управляется событиями и отправляет сообщения клиентам. Центральной точкой связи является брокер MQTT, который отвечает за планирование всех сообщений между отправителями и законными получателями. Каждый клиент, который публикует сообщение для брокера, включает тему в сообщение. Субъектом является информация о маршрутизации для прокси. Каждый клиент, который хочет получать сообщения, подписывается на тему, и брокер доставляет клиенту все сообщения с соответствующей темой. Так что клиентам не обязательно знать друг друга, они общаются только по теме. Архитектура поддерживает масштабируемые решения, независимые от производителей и потребителей данных.

Публикация/подписка на архитектуру

Отличие от HTTP заключается в том, что клиенту не нужно извлекать требуемую информацию, но в случае нового контента прокси передаст информацию клиенту. Таким образом, каждый клиент MQTT имеет постоянно открытое TCP-соединение с брокером. Если это соединение при каких-либо обстоятельствах прерывается, MQTT-брокер может буферизовать все сообщения и отправлять их клиенту, когда он вернется в сеть. Как упоминалось ранее, основной концепцией MQTT для отправки сообщений является тема.Тема — это простая строка, которая может иметь несколько уровней иерархии, разделенных косой чертой.Примером темы для отправки данных о температуре в гостиной может бытьдом/гостиная/температура. С одной стороны, клиенты могут подписаться на определенные темы, а с другой стороны, использовать подстановочные знаки. правильнодом/+/температураПодписка приведет к тому, что все сообщения будут отправляться в ранее упомянутую тему.дом/гостиная/температураи любой предмет с произвольными значениями в гостиной, например.дом/кухня/температура. плюс естьодноуровневый подстановочный знак, который допускает произвольные значения только для одной иерархии. Если вам нужно подписаться на несколько уровней, например подписаться на все поддерево, есть такжеМногоуровневый подстановочный знак(#). Он разрешает подписку на все нижележащие уровни иерархии. НапримерДом/#ПодписатьсяhouseВсе темы в начале.

Практичная толпа

Следующее содержимое требует от вас тщательного изучения содержимого протокола MQTT.

Рекомендуемые ресурсы:

Китайская версия протокола MQTT:Известный MLM customer.git books.IO/Mother Tiantian-cai/con…

MQTT Version 3.1.1: docs.oasis-open.org/Мать Тяньтянь/Мать Тяньтянь/V…

Формат управляющего пакета MQTT

Структура управляющего сообщения MQTT

структура Примечание
Fixed header Фиксированный заголовок, все контрольные пакеты содержат
Variable header Переменный заголовок, часть управляющего сообщения содержит
Payload полезная нагрузка, часть управляющего пакета содержит

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

+-----+-----+-----+-----+-----+------+------+------+-------+
|     |     |     |     |     |      |      |      |       |
| Bit |  7  |  6  |  5  |  4  |  3   |  2   |  1   |  0    |
+-----------+-----+-----+------------+------+------+-------+
|     |                       |                            |
|byte1|MQTT ControlPacket type|          Flags             |
+----------------------------------------------------------+
|     |                                                    |
|byte2|          Remaining Length                          |
+----------------------------------------------------------+

Тип контрольного пакета MQTT

название ценность Направление потока пакетов описывать
Reserved 0 запретить резерв
CONNECT 1 клиент на сервер Клиент запрашивает подключение к серверу
CONNACK 2 сервер к клиенту Подтверждение сообщения о подключении
PUBLISH 3 Допускаются оба направления опубликовать новость
PUBACK 4 Допускаются оба направления Получено подтверждение публикации сообщения QoS 1
PUBREC 5 Допускаются оба направления Релиз получен (первый этап гарантированной доставки)
PUBREL 6 Допускаются оба направления Выпуск релиза (гарантированная доставка, второй шаг)
PUBCOMP 7 Допускаются оба направления Публикация сообщения QoS 2 завершена (третий шаг гарантированного взаимодействия)
SUBSCRIBE 8 клиент на сервер Запрос клиентской подписки
SUBACK 9 сервер к клиенту Подтверждение сообщения о запросе на подписку
UNSUBSCRIBE 10 клиент на сервер Запрос клиента на отмену подписки
UNSUBACK 11 сервер к клиенту Подтверждение сообщения об отписке
PINGREQ 12 клиент на сервер запрос сердцебиения
PINGRESP 13 сервер к клиенту ответ сердцебиения
DISCONNECT 14 клиент на сервер Клиент отключается
Reserved 15 запретить резерв

Флаги

управляющее сообщение фиксированный флаг заголовка Bit 3 Bit 2 Bit 1 Bit 0
CONNECT Reserved 0 0 0 0
CONNACK Reserved 0 0 0 0
PUBLISH Used in MQTT 3.1.1 DUP1 QoS2 QoS2 RETAIN3
PUBACK Reserved 0 0 0 0
PUBREC Reserved 0 0 0 0
PUBREL Reserved 0 0 1 0
PUBCOMP Reserved 0 0 0 0
SUBSCRIBE Reserved 0 0 1 0
SUBACK Reserved 0 0 0 0
UNSUBSCRIBE Reserved 0 0 1 0
UNSUBACK Reserved 0 0 0 0
PINGREQ Reserved 0 0 0 0
PINGRESP Reserved 0 0 0 0
DISCONNECT Reserved 0 0 0 0
Bit3 Bit2 Bit1 Bit0
DUP Qos Qos RETAIN
  • DUP = Дублированный флаг распределения для управляющих пакетов
  • QoS = уровень качества обслуживания для пакетов PUBLISH.
  • RETAIN = зарезервированный флаг для пакетов PUBLISH

Примечание:

Уровень качества обслуживания QoS:**Позиция:**1-й байт, биты 2-1. В этом поле указывается качество гарантии уровня обслуживания для распространения сообщений приложения.

значение качества обслуживания Bit 2 Bit 1 описывать
0 0 0 Распространять не более одного раза
1 0 1 хотя бы один раз
2 1 0 распространяется только один раз
- 1 1 зарезервированный бит

Оставшаяся длина

**Позиция:** начинается с байта 2.

Оставшаяся длина указывает количество байтов в оставшейся части текущего пакета, включая переменные заголовки и данные полезной нагрузки. Оставшаяся длина не включает количество байтов, используемых для кодирования самого поля оставшейся длины.

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

Некоторые управляющие сообщения MQTT содержат переменный заголовок. Он находится между фиксированным заголовком и полезной нагрузкой. Содержимое заголовка переменной зависит от типа пакета. Поле Packet Identifier в заголовке переменной существует во многих типах пакетов. Это выполняется в каждом последующем управляющем сообщении MQTT.порванный вручную.

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

Некоторые управляющие сообщения MQTT содержат полезную нагрузку в конце сообщения, которая для PUBLISH является сообщением приложения.

Пакеты управления, содержащие полезную нагрузку

управляющее сообщение Полезная нагрузка
CONNECT необходимость
CONNACK ненужный
PUBLISH по желанию
PUBACK ненужный
PUBREC ненужный
PUBREL ненужный
PUBCOMP ненужный
SUBSCRIBE необходимость
SUBACK необходимость
UNSUBSCRIBE необходимость
UNSUBACK ненужный
PINGREQ ненужный
PINGRESP ненужный
DISCONNECT ненужный

Управляющее сообщение MQTT

CONNECT - подключиться к серверу

После того, как сетевое соединение между клиентом и сервером установлено, первое сообщение, отправляемое клиентом на сервердолженэто сообщение CONNECT.

При сетевом подключении клиент может отправить сообщение CONNECT только один раз. СервердолженОбработайте второе сообщение CONNECT, отправленное клиентом, как нарушение протокола и отключите клиента.

Полезная нагрузка содержит одно или несколько закодированных полей. Включает уникальный идентификатор клиента, тему завещания, сообщение завещания, имя пользователя и пароль. За исключением идентификатора клиента, другие поля являются необязательными, и определяется, нужно ли включать эти поля в заголовок переменной, на основе битов флага.

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

Переменный заголовок сообщения CONNECT содержит четыре поля в следующем порядке: имя протокола, уровень протокола, флаги подключения и подтверждение активности.

Имя протокола

Имя протокола — это имя протокола.MQTTСтрока в кодировке UTF-8. Последующие версии спецификации MQTT не изменят смещение и длину этой строки.

Если имя протокола неверно, серверМожетОтключите клиент, такжеМожетПродолжить обработку сообщения CONNECT в соответствии с какой-либо другой спецификацией. В последнем случае, согласно этой спецификации, серверне можетПродолжайте обрабатывать сообщение CONNECT

Уровень протокола

Клиент представляет версию протокола как 8-битное беззнаковое значение. Для протокола версии 3.1.1 значение поля уровня протокола равно 4 (0x04).

Если обнаружен неподдерживаемый уровень протокола, сервердолженОтветьте на сообщение CONNECT, отправив сообщение CONNACK с кодом возврата 0x01 (неподдерживаемый уровень протокола), а затем отключите клиент.

Подключить флаги

Байт флага соединения содержит некоторые параметры для указания поведения соединения MQTT. Он также указывает, присутствует ли поле в полезной нагрузке.

+-------+---------+----------+--------+------+-------+-------+--------+--------+
|       |         |          |        |      |       |       |        |        |
|  Bit  |    7    |    6     |   5    |  4   |  3    |   2   |   1    |   0    |
+--------------------------------------------+---------------------------------+
|       |User Name|Password  | Will   |              | Will  | Clean  |        |
|       | Flag    | Flag     | Retain |  Will Qos    | Flag  |Session |Reser^ed|
+--------------------------------------------+---------------------------------+
|       |         |          |        |      |       |       |        |        |
| byte8 |    X    |    X     |    X   |   X  |   X   |   X   |   X    |   0    |
+-------+---------+----------+--------+------+-------+-------+--------+--------+

СервердолженУбедитесь, что бит зарезервированного флага (бит 0) управляющего пакета CONNECT равен 0. Если он не равен 0, клиентское соединение должно быть разорвано.

Чистый сеанс Чистый сеанс

**Позиция:** бит 1 байта флага соединения

Этот бит указывает, как обрабатывается состояние сеанса.

Клиенты и серверы могут сохранять состояние сеанса для обеспечения надежной доставки сообщений по сетевым подключениям. Этот флаг используется для управления временем жизни состояния сеанса.

Будет флаг

**Позиция: **Бит 2 флага соединения.

Для параметра Will Flag установлено значение 1, что означает, что если запрос на соединение принят, сообщение Will Messageдолженхранится на сервере и связан с этим сетевым подключением. После закрытия сетевого соединения сервердолженОпубликуйте это сообщение, если только сервер не удалит это сообщение, когда получит сообщение DISCONNECT.

Будет ли QoS Будет ли QoS

**Позиция: **4-й и 3-й биты флага соединения.

Эти два бита используются для указания уровня качества обслуживания, используемого при публикации сообщений.

Сохранит

**Позиция: **Бит 5 флага соединения.

Значение этого бита необходимо указать, если сообщение будет сохранено при его публикации.

Флаг имени пользователя

**Позиция: **бит 7 флага соединения.

Если флаг имени пользователя установлен в 0, полезная нагрузкане можетСодержит поле имени пользователя.

Если флаг имени пользователя установлен в 1, полезная нагрузкадолженСодержит поле имени пользователя.

Флаг пароля Флаг пароля

**Позиция: **Бит 6 флага соединения.

Если флаг пароля установлен на 0, полезная нагрузкане можетСодержит поле пароля.

Если флаг пароля установлен в 1, полезная нагрузкадолженСодержит поле пароля.

Если флаг имени пользователя установлен на 0, флаг пароля такжедолженУстановите на 0.

Оставайтесь на связи

Keep Alive — это временной интервал в секундах, выраженный 16-битным словом, который относится ко времени, когда клиент передает управляющее сообщение, и ко времени, когда отправляется следующее сообщение.Максимальный интервал времени, разрешенный для бездействия.

Клиент несет ответственность за то, чтобы интервал между отправкой управляющих пакетов не превышал значение поддержания активности. Если нет других управляющих пакетов для отправки, клиентдолженОтправьте сообщение PINGREQ.

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

Полезная нагрузка сообщения CONNECT содержит одно или несколько полей с префиксом длины, а флаги в заголовке переменной определяют, включены ли эти поля. если включено,долженПоявляется в следующем порядке: идентификатор клиента, тема завещания, сообщение завещания, имя пользователя, пароль.

Ответ Ответ

  1. Если после установления сетевого соединения сервер не получит сообщение CONNECT в течение разумного времени, сервердолженЗакройте это соединение.
  2. СервердолженПроверьте сообщение CONNECT в соответствии с требованиями раздела 3.1.Если сообщение не соответствует спецификации, сервер напрямую закрывает сетевое соединение, не отправляя сообщение CONNACK [MQTT-3.1.4-1].
  3. СерверМожетУбедитесь, что содержание сообщения CONNECT не соответствует никаким дальнейшим ограничениям,МожетВыполните проверку подлинности и авторизации. Если какая-либо из проверок не пройдена, как описано в разделе 3.2,долженотправить соответствующий ответ CONNACK с ненулевым кодом возврата идолженЗакройте это сетевое соединение.

CONNACK - Подтвердить запрос на подключение

Сервер отправляет сообщение CONNACK в ответ на сообщение CONNECT, полученное от клиента. Первое сообщение, отправляемое сервером клиентудолженэто КОННАК.

Если клиент не получает сообщение CONNACK от сервера в течение разумного времени, клиентдолженЗакройте сетевое соединение.РазумныйВремя зависит от типа приложения и инфраструктуры связи.

поле оставшейся длины

Указывает длину заголовка переменной. Для сообщений CONNACK это значение равно 2.

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

Подключить флаги подтверждения

Первый байтзнак подтверждения подключения, биты 7-1 зарезервированы идолженУстановите на 0. Бит 0 (SP) является флагом текущего сеанса (Session Present).

текущая сессия сессия присутствует

**Позиция: **Бит 0 флага подтверждения соединения.

Подключить Код возврата

**Позиция:** 2-й байт заголовка переменной.

В поле кода возврата соединения используется однобайтовое значение без знака. Если сервер получает действительное сообщение CONNECT, но не может его обработать по какой-либо причине, сервер ДОЛЖЕН попытаться отправить сообщение CONNACK с ненулевым кодом возврата (одна из таблиц). Если сервер отправляет пакет CONNACK с ненулевым кодом возврата, то ондолженЗакройте сетевое соединение.

Таблица 3.1 – Значения кода возврата соединения
ценность ответ кода возврата описывать
0 0x00 Соединение принято Соединение принято сервером
1 0x01 Отказ в соединении, неподдерживаемая версия протокола Сервер не поддерживает уровень протокола MQTT, запрошенный клиентом
2 0x02 В соединении отказано, неполный идентификатор клиента Идентификатор клиента - это правильная кодировка UTF-8, но сервер не разрешает это
3 0x03 В соединении отказано, сервер недоступен Сетевое соединение установлено, но сервис MQTT недоступен
4 0x04 Отказ в подключении, неверное имя пользователя или пароль Неверный формат данных для имени пользователя или пароля
5 0x05 В соединении отказано, авторизация не разрешена Клиент не авторизован для подключения к этому серверу
6-255 резерв

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

Пакеты CONNACK не имеют полезной нагрузки.

ПУБЛИКАЦИЯ – опубликовать сообщение

Управляющее сообщение PUBLISH относится к передаче сообщения приложения от клиента к серверу или от сервера к клиенту.

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

  • DUP = Дублированный флаг распределения для управляющих пакетов
  • QoS = уровень качества обслуживания для пакетов PUBLISH.
  • RETAIN = зарезервированный флаг для пакетов PUBLISH

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

Заголовок переменной содержит имя субъекта и идентификатор сообщения по порядку.

Название темы

Имя темы используется для определения того, в каком информационном канале должны быть опубликованы данные полезной нагрузки.

название темыдолженЭто первое поле заголовка переменной сообщения PUBLISH. Этодолженпредставляет собой строку в кодировке UTF-8, как определено в Разделе 1.5.3.

Название темы в сообщении PUBLISHне можетСодержит подстановочные знаки.

Название темы сообщения PUBLISH, отправляемого сервером подписавшемуся клиентудолженФильтры тем, которые соответствуют этой подписке (в соответствии с процессом сопоставления, определенным в Разделе 4.7).

Идентификатор пакета

Только когда класс QoS равен 1 или 2, поле идентификатора пакета (Packet Identifier) ​​может появиться в пакете PUBLISH. Раздел 2.3.1 содержит дополнительную информацию об идентификаторах сообщений.

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

Полезная нагрузка содержит сообщение приложения, которое необходимо опубликовать.

Содержание и формат данных зависят от приложения. Длина полезной нагрузки вычисляется путем вычитания длины переменного заголовка из значения оставшегося поля длины в фиксированном заголовке. Пакеты PUBLISH, содержащие полезную нагрузку нулевой длины, являются допустимыми.

отклик

Получатель сообщения PUBLISHдолженОтвет отправляется в соответствии с уровнем QoS в сообщении PUBLISH.

уровень качества обслуживания ожидаемый ответ
QoS 0 Не отвечает
QoS 1 ПУБАК сообщение
QoS 2 ПУБРЕК сообщение

PUBACK – подтверждение релиза

Сообщение PUBACK является ответом на сообщение PUBLISH с уровнем QoS, равным 1.

поле оставшейся длины

Указывает длину заголовка переменной. Для пакетов PUBACK это значение равно 2.

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

Содержит идентификатор пакета PUBLISH, ожидающего подтверждения.

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

Пакеты PUBACK не имеют полезной нагрузки.

PUBREC — публикация полученного (QoS 2, первый шаг)

Пакет PUBREC является ответом на пакет PUBLISH класса QoS 2. Это второй пакет, которым обменивается протокол QoS уровня 2.

поле оставшейся длины

Указывает длину заголовка переменной. Его значение равно 2 для пакетов PUBREC.

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

Заголовок переменной содержит идентификатор сообщения PUBLISH, ожидающего подтверждения.

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

Пакеты PUBREC не имеют полезной нагрузки.

Нетти реализация

 MqttMessage pubRecMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.PUBREC, false, MqttQoS.AT_MOST_ONCE, false, 2),
                MqttMessageIdVariableHeader.from(variableHeader.messageId()),
                null);

PUBREL — Публикация выпуска (QoS 2, второй шаг)

Сообщение PUBREL является ответом на сообщение PUBREC. Это третий пакет, которым обменивается протокол QoS уровня 2.

Биты 3, 2, 1 и 0 фиксированного заголовка управляющего сообщения PUBREL являются зарезервированными битами.долженустанавливается на 0,0,1,0. СервердолженСчитайте любое другое значение недопустимым и закройте сетевое соединение.

поле оставшейся длины

Указывает длину заголовка переменной. Для пакетов PUBREL это значение равно 2.

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

Заголовок переменной содержит тот же идентификатор сообщения, что и сообщение PUBREC, ожидающее подтверждения.

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

Пакеты PUBREL не имеют полезной нагрузки.

Нетти реализация

MqttMessage pubRecMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.PUBREC, false, MqttQoS.AT_LEAST_ONCE, false, 2),
                MqttMessageIdVariableHeader.from(variableHeader.messageId()),
                null);

PUBCOMP — Публикация завершена (QoS 2, шаг 3)

Сообщение PUBCOMP является ответом на сообщение PUBREL. Это четвертый и последний пакет, которым обменивается протокол QoS класса 2.

поле оставшейся длины

Указывает длину заголовка переменной. Для пакетов PUBCOMP это значение равно 2.

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

Заголовок переменной содержит тот же идентификатор сообщения, что и сообщение PUBREL, ожидающее подтверждения.

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

Пакеты PUBCOMP не имеют полезной нагрузки.

Нетти реализация

 MqttMessage pubCompMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.PUBCOMP, false, MqttQoS.AT_MOST_ONCE, false, 2),
                MqttMessageIdVariableHeader.from(variableHeader.messageId()),
                null);

ПОДПИСАТЬСЯ - подписаться на тему

Клиент отправляет серверу сообщение SUBSCRIBE для создания одной или нескольких подписок. Каждая подписка регистрирует одну или несколько тем, которые волнуют клиента. Чтобы пересылать сообщения приложений темам, которые соответствуют этим подпискам, сервер отправляет клиенту сообщение PUBLISH. В сообщении SUBSCRIBE также указывается максимальный уровень QoS (для каждой подписки), в соответствии с которым сервер отправляет сообщения приложения клиенту.

поле оставшейся длины

Равен длине заголовка переменной (2 байта) плюс длина полезной нагрузки.

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

Заголовок переменной содержит идентификатор сообщения.

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

Полезная нагрузка сообщения SUBSCRIBE содержит список фильтров тем, представляющих темы, на которые клиент хочет подписаться.

Список тематических фильтров в полезной нагрузке пакета SUBSCRIBEдолженявляется строкой UTF-8, как определено в Разделе 1.5.3 [MQTT-3.8.3-1].

СервердолженПоддерживаются тематические фильтры, содержащие подстановочные знаки (как определено в Разделе 4.7.1). Если сервер решит не поддерживать тематические фильтры, содержащие подстановочные знаки,долженОтклоняйте любой запрос на подписку, содержащий фильтр с подстановочными знаками [MQTT-3.8.3-2].

За каждым фильтром следует байт, называемый запрошенным QoS. Он дает максимальный уровень QoS, разрешенный сервером для отправки сообщений приложения клиенту.

Полезная нагрузка сообщения SUBSCRIBEдолженСодержит по крайней мере одну пару комбинаций поля тематического фильтра и класса QoS. Пакет SUBSCRIBE без полезной нагрузки является нарушением протокола [MQTT-3.8.3-3]. См. раздел 4.8 для получения информации об обработке ошибок.

Поле Запрошенный максимальный уровень QoS кодируется как один октет, за которым следует имя темы в кодировке UTF-8, и эти комбинации фильтра темы/уровня QoS упаковываются непрерывно.

Текущая версия протокола не использует старшие шесть бит байта запрошенного QoS. Если какие-либо биты в полезной нагрузке отличны от нуля или QoS не равно 0, 1 или 2, сервердолженСообщение SUBSCRIBE считается недействительным, и сетевое соединение закрывается.

SUBACK - Подтверждение подписки

Сервер отправляет клиенту сообщение SUBACK, чтобы подтвердить, что он получил и обрабатывает сообщение SUBSCRIBE.

Сообщение SUBACK содержит список кодов возврата, которые определяют максимальный уровень QoS, предоставляемый для каждой подписки, запрошенной SUBSCRIBE.

поле оставшейся длины

Равен длине заголовка переменной плюс длина полезной нагрузки.

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

Заголовок переменной содержит идентификатор сообщения SUBSCRIBE, ожидающего подтверждения.

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

Полезная нагрузка содержит список кодов возврата. Каждый код возврата соответствует фильтру темы в ожидающем сообщении SUBSCRIBE. порядок кодов возвратадолженТот же порядок, что и фильтры тем в сообщении SUBSCRIBE.

Bit 7 6 5 4 3 2 1 0
код возврата
byte 1 X 0 0 0 0 0 X X

Допустимые значения кода возврата:

  • 0x00 - максимальное качество обслуживания 0
  • 0x01 — Успех — Макс. QoS 1
  • 0x02 — Успех — Макс. QoS 2
  • 0x80 — сбой

Коды возврата SUBACK, отличные от 0x00, 0x01, 0x02, 0x80, зарезервированы,не можетиспользовать.

ОТПИСАТЬСЯ - отписаться

Клиент отправляет сообщение UNSUBSCRIBE на сервер, чтобы отказаться от подписки на тему.

Биты 3, 2, 1 и 0 фиксированного заголовка сообщения UNSUBSCRIBE зарезервированы.долженУстановите 0,0,1,0 соответственно.

который:

  • DUP = Дублированный флаг распределения для управляющих пакетов:false
  • QoS = уровень качества обслуживания для пакетов PUBLISH:Qos1(распространяется хотя бы один раз)
  • RETAIN = зарезервированный флаг для пакетов PUBLISH:false

СервердолженСчитайте любое другое значение недопустимым и закройте сетевое соединение.

поле оставшейся длины

Равен длине заголовка переменной плюс длина полезной нагрузки.

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

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

Полезная нагрузка сообщения UNSUBSCRIBE содержит список фильтров тем, от которых клиент хочет отказаться. Тематические фильтры в пакетах UNSUBSCRIBEдолженупакованы непрерывно.

Полезная нагрузка сообщения UNSUBSCRIBEдолженСодержит как минимум один фильтр сообщений. Пакет UNSUBSCRIBE без полезной нагрузки является нарушением протокола.

отклик

Тематические фильтры, предоставляемые пакетами UNSUBSCRIBE (с подстановочными знаками или без них)долженСравнивает посимвольно с текущим набором тематических фильтров, хранящихся на сервере для этого клиента. Если какой-либо из фильтров точно совпадает, то его (серверная) собственная подписка будет удалена, иначе дальнейшая обработка невозможна.

Если сервер удаляет подписку:

  • ЭтодолженПрекратить отправку любых новых сообщений этому клиенту.
  • ЭтодолженЗавершите распространение всех сообщений QoS 1 и QoS 2, которые начали отправляться клиенту.
  • ЭтоМожетПродолжайте отправлять любые существующие кэшированные сообщения, готовые к рассылке клиентам.

СервердолженОтправить пакет UNSUBACK в ответ на запрос клиента UNSUBSCRIBE. ОТМЕНИТЬ сообщениедолженСодержит тот же идентификатор сообщения, что и сообщение UNSUBSCRIBE. Даже если подписки на темы не удалены, сервердолженОтправить ответ UNSUBACK.

Если сервер получает пакет UNSUBSCRIBE, содержащий несколько тематических фильтров, ондолженОбработайте это сообщение, как если бы была получена серия нескольких сообщений UNSUBSCRIBE, за исключением того, что их ответы объединены в одно сообщение UNSUBACK.

UNSUBACK - Подтверждение отказа от подписки

Сервер отправляет клиенту сообщение UNSUBACK, чтобы подтвердить получение сообщения UNSUBSCRIBE.

поле оставшейся длины

Указывает длину переменного заголовка, который равен 2 для пакетов UNSUBACK.

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

Заголовок переменной содержит идентификатор сообщения UNSUBSCRIBE, ожидающего подтверждения.

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

Пакеты UNSUBACK не имеют полезной нагрузки.

Нетти реализация

MqttUnsubAckMessage unsubAckMessage = (MqttUnsubAckMessage)MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.UNSUBACK, false, MqttQoS.AT_MOST_ONCE, false, 2),
 MqttMessageIdVariableHeader.from(msg.variableHeader().messageId()),
 null);

PINGREQ – запрос сердцебиения

Клиент отправляет сообщение PINGREQ на сервер. Используется для:

  1. Сообщите серверу, что клиент активен, когда никакие другие управляющие пакеты не отправляются от клиента к службе.
  2. Запрашивающий сервер отправляет ответ, подтверждающий, что он активен.
  3. Используйте сеть, чтобы убедиться, что сетевое соединение не потеряно.

Этот пакет используется при обработке Keep Alive.

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

Пакеты PINGREQ не имеют переменных заголовков.

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

Пакеты PINGREQ не имеют полезной нагрузки.

отклик

СервердолженОтправьте пакет PINGRESP в ответ на запрос клиента.Pingreq сообщение

Нетти реализация

 MqttMessage pingReqMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.PINGREQ, false,MqttQoS.AT_MOST_ONCE, false, 0),
                null,
                null);

PINGRESP - реакция сердцебиения

Сервер отправляет пакет PINGRESP в ответ на пакет PINGREQ клиента. Указывает, что сервер все еще жив. Этот пакет используется в обработке Keep Alive.

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

Пакеты PINGRESP не имеют переменных заголовков.

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

Пакеты PINGRESP не имеют полезной нагрузки.

Нетти реализация

MqttMessage pingRespMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.PINGREQ, false,MqttQoS.AT_MOST_ONCE, false, 0),
                null,
                null);

РАЗЪЕДИНИТЬ - отключить

Пакет DISCONNECT — это последний управляющий пакет, отправленный клиентом на сервер. Указывает, что клиент корректно отключился.

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

Пакеты DISCONNECT не имеют переменных заголовков.

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

Пакеты DISCONNECT не имеют полезной нагрузки.

отклик

После того, как клиент отправит сообщение DISCONNECT:

  • долженЗакройте сетевое соединение.
  • не можетЗатем через это сетевое соединение отправляются любые управляющие сообщения.

Когда сервер получает сообщение DISCONNECT:

  • долженОтбрасывает любые неопубликованные сообщения Will, связанные с текущим соединением.
  • долженЗакройте сетевое соединение, если клиент еще этого не сделал.

Нетти реализация

MqttMessage disConnectMessage = MqttMessageFactory.newMessage(
 new MqttFixedHeader(MqttMessageType.DISCONNECT, false,MqttQoS.AT_MOST_ONCE, false,0),
                null,
                null);

разное

На этом подробное объяснение реализации Netty высокопроизводительного IoT-сервера (Groza) на протоколе MQTT заканчивается.

Оригинал не просто, если вы чувствуете себя хорошо, я надеюсь дать рекомендацию! Ваша поддержка - самая большая мотивация для моего письма!

Следующее поможет вам продвигать сервер IOT, на котором Netty реализует протокол MQTT.

Уведомление об авторских правах:

Автор: Му Шувэй

Источник блога сада:блог woo woo woo.cn на.com/Sanshenghu…

источник на гитхабе:GitHub.com/Саншэншу…    

Источник личного блога:sanshengshui.github.io/