Ставьте лайк и подписывайтесь, ваша поддержка очень много значит для меня. 🔥 Привет, я Сяо Пэн. Эта статья была включена в GitHub · AndroidFamily[1] середина.
Привет всем, меня зовут Сяо Пэн.
MQTT является издательской базой - Модель подпискиновостипередачапротокол,Существующие IoT и мобильные приложения имеют более широкий спектр применения. Если ваша цель — занять должность инженера среднего и старшего уровня,MQTT Возможно, хорошая изюминка. Недавно я также обнаружил, что многие кандидаты пишут себя в своих резюме. "привычный MQTT Соглашение», но большинство людей только понимают или использовали его.
В этой статье я обсужу с вами MQTT согласованный Принцип работы & Формат сообщения протокола & основнойхарактеристика,О практической части мы поговорим в следующей статье. Если я могу помочь,Обязательно поставь лайк и добавь внимание,Дайте Сяо Пэну немного творческой мотивации.
Дорожная карта обучения:
MQTT (Message Queuing Telemetry Транспорт, телеметрия очереди сообщений) это своего рода TCP/IP Протокол прикладного уровня семейства протоколов. MQTT протокол специально предназначен для оборудования с низкой производительностью & Разработан для сценариев с нестабильными условиями сети, что делает MQTT Он широко используется в ограниченных сценариях, таких как Интернет вещей и мобильные приложения.
В настоящее время MQTT в основном разделен на две основные версии:
MQTT основано на публикации - Модель подписки (pub/sub) Протокол обмена сообщениями с запросами - Модель ответа другая, релиз - Модель подписки Есть три основные роли:publisher & subscriber & subscriber:
Когда клиент публикует сообщение в теме, брокер распространяет сообщение среди всех клиентов, подписанных на эту тему. Обычно клиенты не хранят сообщения; как только сообщения отправляются этим клиентам, они удаляются из брокера. Кроме того, сохранение сообщений, постоянные соединения и качество обслуживания QoS могут привести к тому, что сообщения будут временно храниться на брокере.
выпускать - Модель подписки позволяет информацияизвыпускать ВОЗиподписка ВОЗ解耦,Основные проявлениядляпространственная развязкаи Развязка по времени:
Изображение цитируется по https://juejin.cn/post/6976441705067184135[4] —— cxuan С
характеристика | Протокол MQTT | HTTP-протокол |
---|---|---|
транспортный уровень | TCP | TCP или UDP |
модель распределения | выпускать - Модель подписки | Модель запрос-ответ |
Отношения распределения | 1 пара 0/1/Н | 1 к 1 |
Безопасность данных | Используйте SSL/TLS | Не обязательно HTTPS |
шифрование | Прикладной уровень надежно шифрует полезную нагрузку | Нетсуществовать Прикладной уровеньшифрование |
Размер заголовка сообщения | меньше | Больше |
Сценарии Интернета вещей и мобильных приложений характеризуются низкой производительностью оборудования и нестабильными условиями сети, в то время как Протокол MQTTСразуда Специальная иглаверно Такой экологический дизайниз,основнойсуществовать Преимущества в четырех аспектах:
Вывод: среди этих трех протоколов нет абсолютного победителя, а лучший протокол зависит от конкретных потребностей и ограничений. Но если мы посмотрим только на основные условия пропускной способности, батареи и функционального разнообразия, MQTT Среди них есть более доминирующий выбор. Например,наш IM Продукты в App Конец принят MQTT согласованныйвыполнить,исуществовать Web Потому что есть хорошие WebSocket основе способностей, поэтому WebSocket передача инфекции MQTT отформатировать сообщение.
MQTT Согласованная расчетная характеристика содержит элемент «Доставка с высокой надежностью», требуется обеспечить надежность базовой транспортной системы. уровеньпротокол,потому чтоэтот TCP Протокол, TLS Протокол,вебсокет соглашение может быть таким MQTT базовый протокол. без связи UDP Протокол потеряет или переупорядочит данные и не сможет удовлетворить MQTT согласованныйпередача инфекциинуждаться。
Сообщение MQTT состоит из трех частей:
Структура сообщения MQTT | описывать | длина |
---|---|---|
Фиксированный заголовок | Присутствует во всех сообщениях MQTT. | от 2 до 5 байт |
Переменный заголовок | Присутствует в некоторых сообщениях MQTT. | 0 или N байт |
Полезная нагрузка | Присутствует в некоторых сообщениях MQTT. | 0 или N байт |
1. Фиксированный заголовок
все MQTT Сообщения содержит фиксированный заголовок, фиксированный заголовок по типу Состоит из трех частей: сообщения, флаг и оставшаяся длина. Фиксированная длина заголовкадля 2 ~ 5 байт, в зависимости от “Оставшийсядлина(Remaining Length)” по размеру,Оставшаяся длина означает оставшуюся часть прежнего номера избайта.,Включает переменный заголовок, полезную нагрузку и здлина.,Но оно не включает в себя оставшееся поле длины из байта.
намекать: Как определить количество оставшейся длиныизбайт, используя однозначную из обозначений префикс изда.
Фиксированный формат заголовка следующий:
Тип сообщения MQTT (тип пакета управления MQTT) описывается следующим образом:
Тип сообщения | ценить | Направление потока сообщений | описывать | требуется полезная нагрузка |
---|---|---|---|---|
Reserved | 0 | запретить | бронировать | / |
CONNECT | 1 | => | Клиент запрашивает соединение с сервером | ✔ |
CONNACK | 2 | <= | Подтверждение сообщения CONNECT | ✖ |
PUBLISH | 3 | <==> | Опубликовать информацию о клиенте | Необязательный |
PUBACK | 4 | <==> | ПУБЛИКОВАТЬ подтверждение сообщения (QoS 1) | ✖ |
PUBREC | 5 | <==> | выпуститьReceive прибытиять (первый шаг для обеспечения доставки) | ✖ |
PUBREL | 6 | <==> | выпусквыпуск (гарантированная доставка, второй шаг) | ✖ |
PUBCOMP | 7 | <==> | выпускComplete (гарантированная доставка, шаг 3) | ✖ |
SUBSCRIBE | 8 | => | Клиент подписывается на сообщения | ✔ |
SUBACK | 9 | <= | ПОДПИСАТЬСЯ, подтверждение сообщения | ✔ |
UNSUBSCRIBE | 10 | => | Клиент отписывается | ✔ |
UNSUBACK | 11 | <= | UNПОДПИСАТЬСЯ, подтверждение сообщения | ✖ |
PINGREQ | 12 | => | запрос пульса | ✖ |
PINGRESP | 13 | <= | PINGREQ Подтверждение сообщения | ✖ |
DISCONNECT | 14 | => | Клиент отключается | ✖ |
Reserved | 15 | запретить | бронировать | / |
2. Переменный заголовок
Содержимое переменного заголовка у разных сообщений разное, но есть относительно общее поле:
3. Загрузка
Некоторые сообщения MQTT содержат полезные данные. Для сообщений PUBLISH полезными данными являются сообщения приложения.
В предыдущем разделе мы упоминали, что MQTT Фиксированные заголовки сообщений будут отмечены MQTT Тип сообщения(MQTT Control Packet type) , в этом Фестивале давайте обсудим эти типы подробно. сообщения。
MQTT Соединение всегда происходит в client и broker между, два client Они не будут воспринимать друг друга. При запросе соединения клиент Пойду в broker отправлять CONNECT
Сообщение о соединении, брокер Ответим после подтверждения соединения CONNACK
Сообщение о подтверждении подключения. После того как соединение установлено, оно остается открытым до тех пор, пока client отправлять DISCONNECT
отключитьсясообщение о соединенияииили Соединение было нештатно прервано.
Соединение запроса CONNECT:
CONNECT
да client отправлять Давать broker первое сообщение и в соединении клиент Отправлять только один раз CONNECT
информация,отправитьиз Второго CONNECT
Сообщение будет broker Считайте это нарушением протокола и отключитесь. существовать CONNECT
В ., в основном включает в себя следующее содержимое:
CleanSession
Флаг определяет, будет ли использоваться постоянное соединение (когда CleanSession = 0
означает постоянное соединение), постоянно в постоянном состоянии сеанс,broker Состояние сеанса будет сохранено для непостоянных сеансов, брокер; не будет храниться client любой контент,Подробности см. в разделе 4.2 · Статус сеанса;“Will”
темаиз client。кроме того,这条воляинформация Вы также можете установитьданетдлябронироватьинформация(Will Retain
логотип) и Уровень качества обслуживания(Will Qos
)。Подтверждение подключения CONNACK:
CONNACK
сообщение для подтверждения CONNECT
информация.CONNECT
да client отправлять Давать broker Первое сообщение соответственно брокера отправлять Давать client из Первая информация должна быть да CONNACK
информация. существовать CONNACK
В ., в основном включает в себя следующее содержимое:
SessionPresent
Знак означает «когда фронт» broker да Нет, держится client изпостоянный сеанс。когда broker Получен один непостоянный сеанссоединять(CleanSession = 1
),SessionPresent изценитьвсегдадля 0;икогда broker Получен одинпостоянный сеанссоединять(CleanSession = 0
),но SessionPresent ценить зависит broker данетхранилище Понятно ClientId изсостояние сеанса;Конкретный выбор цен таков:
код возврата | описывать |
---|---|
0 | Соединение принято |
1 | В соединении отказано, недопустимая версия протокола |
2 | Соединение отклонено, идентификатор отклонен |
3 | Соединение отклонено, сервер недоступен |
4 | Соединение отклонено,имя Неправильный пароль для пользователяили |
5 | Соединение отклонено, несанкционировано |
ОТКЛЮЧИТЬ Отключить:
DISCONNECT
Новости по client отправлять Давать broker,используется дляотключитьсясоединять。Информация DISCONNECT отсутствует заголовок переменной и полезная нагрузка,Информация об ответе-подтверждении отсутствует.,Указывает на чистую операцию отключения.。отключитьсясоединятьназад,client Больше нельзя удалить CONNECT
Новости за пределами новостей, брокер Также необходимо отбросить информацию о времени предыдущего сеанса.
MQTT основано на публикации Модель подпискиизпротокол,существовать После установления связи,client Вы можете спросить broker подписка заинтересована в изодинили несколько тем.
3.2.1 ПОДПИСАТЬСЯ Подписка
SUBSCRIBE
Новости по client отправлять Давать broker,используется для подпискиинтересные изтемы,SUBSCRIBE
В основном сообщение содержит следующее содержание:
SUBSCRIBE
информацияиз Полезная нагрузка должна содержать как минимум один фильтр тем, каждый фильтр состоит из одного Topic и QoS Состав, а именно QoS назначенный назначенный client Принять измакс OoS оценка.3.2.2 Подтверждение подписки на СУБАКТ
SUBACK
сообщение для подтверждения SUBSCRIBE
информация.SUBACK
В основном сообщение содержит следующее содержание:
Конкретный выбор цен таков:
код возврата | описывать |
---|---|
0x00 | Подписка прошла успешно, максимальное качество обслуживания равно 0. |
0x01 | Подписка прошла успешно, максимальное значение QoS – 1. |
0x02 | Подписка прошла успешно, максимальное значение QoS – 2. |
0x80 | Подписка не удалась |
3.2.3 ОТПИСАТЬСЯ Отменить подписку
UNSUBSCRIBE
Новости по client отправлять Давать broker,используется для Отписаться Нетзаинтересованныйизтема,UNSUBSCRIBE
В основном сообщение содержит следующее содержание:
3.2.4 UNSUBACK Подтверждение отмены подписки
UNSUBACK
сообщение для подтверждения UNSUBSCRIBE
информация.UNSUBACK
Сообщение очень простое, содержит только уникальный идентификатор пакета (расположенный в заголовке переменной).
когда MQTT client Во время подключения к broker Затем вы можете отправитьинформацию, каждый PUBLISH
Сообщения содержат topic ,broker будет основано на topic Отправить информациюотправлять заинтересованным из клиент. Кроме того, каждое сообщение содержит Payload,Payload даTrue выдача информации приложения, полезная нагрузка содержимого и формата определяется уровнем приложения, протоколом Уровень MQTT не волнует.
3.3.1 PUBLISH выпускать
PUBLISH
Сообщения можно отправлять через client отправлять Давать брокер или через broker отправлять Давать клиент, используемый для транспортировки сообщений прикладного уровня. ПУБЛИКОВАТЬ В основном сообщение содержит следующее содержание:
PUBLISH
информация Передачаиз Гарантированный уровень доставки,Разделен на три уровня,Конкретный вид 4.3 Фестиваль · выпускать Качество обслуживания:PUBLISH
информацияданетдлябронироватьинформация,когда client отправлять Давать broker из PUBLISH информацияотметка RETAIN = 1 Когда, брокер встречахранилище Долженинформация,когдановыйиз клиента при регистрации подписки,И при сопоставлении информационной темы,Долженбронироватьинформациявстречаотправлять Даватьподписка ВОЗ,Конкретный вид 4.4 Фестиваль · бронироватьинформация;PUBLISH
/ PUBREL
информацияданетдляповторитьотправлятьинформация. Протокол MQTT определяет два типа Повторной передача сообщенияизсцена,Конкретный вид 4.5 Фестиваль · ретрансляция сообщения;PUBLISH
В сообщениижитьсуществовать;PUBLISH
информацияизнагрузкадаTrue выдача информации приложения, полезная нагрузка содержимого и формата определяется уровнем приложения, протоколом Уровень MQTT не волнует. Кроме того, длина полезных данных равна: оставшейся длине в фиксированном заголовке (Remaining Lenght)- Переменная длина заголовка, длина полезной нагрузки также может быть равна нулю.3.3.2 выпускатьподтверждать
PUBLISH информацияиз Получатель требует отправить ответ на подтверждение, другое QoS иерархический PUBLISH Ответ на сообщение отличается:
выпускать Уровень качества обслуживания QoS | ожидаемый ответ подтверждения |
---|---|
QoS 0 | Нет подтверждения |
OoS 1 | ПУБАК-сообщение |
OoS 2 | Сообщение PUBREC Сообщение PUBREL Сообщение PUBCOMP |
когда client и broker Если в течение определенного периода времени нет взаимодействия с данными, клиент встречаотправлять PINGREQ
зондовое сообщение,используется для определяет, является ли соединение нормальным, и решает, следует ли да закрыть соединение. MQTT согласованный Механизм поддержания активности。
3.4.1 Сообщение об обнаружении PINGREQ
PINGREQ Новости по client отправлять Давать broker。
3.4.2 Подтверждение обнаружения PINGRESP
PINGRESP Новости по broker отправлять Давать клиент, представитель client дажить活из。
MQTT тема по сути да своего рода «форма обращения»,используется для распространения прикладного уровня информации о прибытии клиентов. MQTT темада Иерархическая структура, подобная файловой системе,использовать “/” косая черта в качестве разделителя.
4.1.1 Спецификации формата темы
4.1.2 Подстановочные знаки тем
Когда клиент подписывается на тему, он может подписаться на определенную тему (например, "группа/группа123"), вы также можете использовать "Подстановочный знак" 来同часподписка Несколькотема。нуждаться注意изда:существоватьвыпускатьинформациячас Нет允许использоватьтема Подстановочный знак,client Каждый выпуск информации может быть выпущен только по одной теме.
+
да одноуровневый подстановочный знак, можно использовать одноуровневый подстановочный знак для любого уровня одной темы, но может соответствовать только одному уровню. Например:тема | Пример соответствия темы |
---|---|
group/+/123 | group/vip/123group/temp/123 |
#
да Многоуровневый подстановочный знак, многоуровневый подстановочный знак может соответствовать нескольким последовательным уровням. Следует отметить, что многоуровневые подстановочные знаки могут использоваться только в качестве длятемаиз последнего 1 уровня. Например:тема | Пример соответствия темы |
---|---|
group/# | groupgroup/123group/vip/123group/temp/123 |
4.1.3 $SYS тема
SYS темада broker По умолчанию брокер создается только для чтения. Кроме того, брокер. По умолчанию ни одна тема не создается, все темы да создаются только клиентом, подписавшимся или выключающимся из, ни одна тема да не является постоянной. о SYS темаиз Подробнее введениесуществовать здесь[5]
4.1.4 темаизжизненный цикл
когда client Подключиться к broker Когда вы можете использовать постоянное или непостоянное соединение, это можно сделать через CONNECT
В сообщениииз CleanSession Флаг для принятия решения из(когда CleanSession = 0
указывает на постоянное соединение). Для постоянных сеансов брокер Состояние сеанса будет сохранено для непостоянных сеансов, брокер; не будет храниться client любого содержания. Статус сеанса в основном включает в себя следующее содержимое:
4.2.1 Состояние сеанса, сохраненное на стороне клиента
PUBLISH
информация;PUBLISH
информация.4.2.2 Состояние сеанса, хранящееся на стороне сервера
PUBLISH
информация;PUBLISH
информация;PUBLISH
информация;PUBLISH
информация.намекать: бронироватьинформация Нет属Всостояние сеанса, существование не будет удалено после завершения сеанса, брокер просмотры шражухранилищбронировать прямойприезжать коз client удалить.
QoS 0 иерархический PUBLISH
информацияиз Возможности доставки полностью опираются на нижний транспортный уровень,QoS 1 и QoS 2 Уровни начинают повышаться на прикладном уровне. PUBLISH
информацияиз Возможности доставки. Если информация о моменте потеряна, окончание отправки будет повторено раньше, чем отправлено из PUBLISH
Сообщение (ДУП = 1), получатель получает информацию о прибытии, а также отправляет подтверждающую ответную информацию.
4.3.1 QoS 0 · Отправка не более одного раза
существовать QoS 0 изиерархический PUBLISH
В сообщении Нет包含包唯一标识。отправлять ВОЗНет考虑информация Достигайте результатов,Ресивер тоже не отвечает. Получатель может получить информацию о прибытии не более одного раза.,Также возможно, что вам не удастся собрать приезжать сразу.
4.3.2 OoS 1 · Отправить хотя бы один раз
существовать QoS 1 иерархический PUBLISH
В Почта содержит уникальный идентификатор посылки, при отправке всегда будет использоваться эта информация. «Не подтверждено» сообщение до соответствующего PUBACK
Подтвердите сообщение. Конкретный поток сообщений выглядит следующим образом:
намекать: 实际новостипередачадасуществовать client и broker осуществляется между 4 Эти шаги упрощают передачу отправка между сторонами и получателями.
PUBLISH
(QoS = 1, DUP = 0, <PID>)информация;PUBLISH
сообщение и ответить на PUBACK
(<PID>)подтверждатьинформация;PUBACK
информацию и удалить информацию о приложении без сохранения.4.3.3 QoS2 · Отправляется ровно один раз
QoS 2 да Высочайшее качество обслуживания, гарантирующее, что информация не будет потеряна или дублирована, недостаток да увеличит стоимость. существовать QoS 2 иерархический PUBLISH
В .. содержит уникальный идентификатор пакета, который всегда будет использоваться при отправке. «Не подтверждено» сообщение, пока не получите соответствующее PUBCOMP
Подтвердите сообщение.
PUBLISH
(QoS = 2, DUP = 0, <PID>)информация;PUBLISH
информация,ихранилищеинформация;PUBREC
(<PID>)информация;PUBREC
информация,иотправлять PUBREL
(<PID>)информация;PUBCOMP
(<PID>)информация;PUBCOMP
информацию и удалить информацию о приложении без сохранения.когда client выпускатькто-тотемановости Когда, брокер распространим эту информацию среди всех, кто подписался на эту темуиз клиент, то это сообщение будет отправлено с broker Можно установить на удалении. RETAIN
бронировать логотип установить PUBLISH информациядлябронироватьинформация,broker встреча хранит информацию о последнем бронировании, когда это было в последний раз? client 注册подпискачас,И при сопоставлении информационной темы,Долженбронироватьинформациявстречаотправлять Даватьподписка ВОЗ。Нужно обратить внимание на: брокера Только для каждой темы сохранится последняя бронироватьинформация, новый сборник приезжатьиз RETAIN = 1 новости будут освещать оригинальную бронировать информацию;
постоянный сеанс & Уровень качества обслуживания & бронироватьинформация都встреча影响новыйподписка ВОЗданет接受информация,Подвести Итог Следующая таблица:
отметка DUP = 1
новостида被повторитьотправлятьновости,MQTT Повторная передача сообщения имеет 2 Сценарий:
На что следует обратить внимание: DUP Логотип правильный OoS > 0 новостиэффективный,все QoS = 0 новости DUP Флаг должен быть установлен на 0;
TCP Протокол имеет механизм повторной передачи сообщений. Почему? Протокол MQTTкроме Повторная передача сообщениямеханизм? TCP согласованный报文重传механизмдаверновсе TCP Эффективный механизм ретрансляции сообщений, при этом MQTT согласованный Повторная передача Механизм сообщения действителен только для одной части информации и используется для достижения более надежной гарантии доставки новостей. Хотя TCP В обычных обстоятельствах протокол существует может гарантировать отсутствие потери пакетов, но это не так. Все еще бывают ситуации, когда время ожидания истекает или соединение прерывается. и MQTT согласованный QoS 1 и QoS 2 Требуются более надежные возможности доставки, и доставка должна быть гарантирована даже после повторного подключения клиента. потому что чтоэтот,Протокол MQTT также определяет одну Повторную передача сообщениямеханизм。
Пока что о MQTT согласованный Принцип работы & Формат сообщения протокола & Представлены основные характеристики и другое содержимое. Я знаю, что ты сможешь это сделать MQTT Меня больше интересует практическое применение согласованного. В следующей статье я познакомлю вас с его реализацией. MQTT согласованный IM обслуживание, пожалуйста, обратите внимание.
Я, да Сяо Пэн, возьму вас на сбор знаний системы Android.
[1]
GitHub · AndroidFamily: https://github.com/pengxurui/AndroidFamily
[2]
MQTT v3: http://mqtt.p2hp.com/mqtt311
[3]
MQTT v5: http://mqtt.p2hp.com/mqtt-5-0
[4]
https://juejin.cn/post/6976441705067184135: https://juejin.cn/post/6976441705067184135
[5]
здесь: https://github.com/mqtt/mqtt.org/wiki/SYS-Topics
[6]
MQTT Официальный сайт: https://mqtt.org/
[7]
Протокол Китайская версия MQTT: http://mqtt.p2hp.com/mqtt311
[8]
MQTT Protocol Guide: http://www.steves-internet-guide.com/mqtt
[9]
Протокол Что такое MQTTда? Эта статья расскажет вам! : https://juejin.cn/post/6976441705067184135
[10]
Android push-сообщение MQTT Реальный бой: https://www.jianshu.com/p/73436a5cf855
[11]
Battle of The Protocols (HTTP vs. Websockets vs. MQTT): https://www.linkedin.com/pulse/internet-things-http-vs-websockets-mqtt-ronak-singh-cspo/