для чего нужен mqtt брокер
Протокол MQTT: концептуальное погружение
Протокол Message Queuing Telemetry Transport (MQTT) используется в течение многих лет, но сейчас он особенно актуален благодаря взрывному росту IoT: и потребительские, и промышленные устройства внедряют распределённые сети и граничные вычисления (edge computing), а устройства с постоянной трансляцией данных становятся частью повседневной жизни.
Это означает, что лёгкие, открытые и доступные протоколы со временем станут ещё важнее. В этой статье приводится концептуальное погружение в MQTT: как он работает, как используется сейчас и как будет использоваться в будущем.
Небольшое вступление
MQTT — это протокол обмена сообщениями по шаблону издатель-подписчик (pub/sub). Первоначальную версию в 1999 году опубликовали Энди Стэнфорд-Кларк из IBM и Арлен Ниппер из Cirrus Link. Они рассматривали MQTT как способ поддержания связи между машинами в сетях с ограниченной пропускной способностью или непредсказуемой связью. Одним из первых вариантов его использования было обеспечение контакта фрагментов нефтепровода друг с другом и с центральными звеньями через спутники.
С учётом суровых условий эксплуатации протокол сделан маленьким и лёгким. Он идеален для устройств слабой мощности и с ограниченным временем автономной работы. К их числу сейчас относятся и вездесущие смартфоны, и постоянно растущее число датчиков и подключённых устройств.
Таким образом, MQTT стал протоколом для потоковой передачи данных между устройствами с ограниченной мощностью CPU и/или временем автономной работы, а также для сетей с дорогой или низкой пропускной способностью, непредсказуемой стабильностью или высокой задержкой. Именно поэтому MQTT известен как идеальный транспорт для IoT. Он построен на протоколе TCP/IP, но есть ответвление MQTT-SN для работы по Bluetooth, UDP, ZigBee и в других сетях IoT, отличных от TCP/IP.
MQTT — не единственный в своём роде протокол обмена сообщениями pub/sub в реальном времени, но он уже получил широкое распространение в различных средах, которые зависят от межмашинной связи. Среди его сверстников — Web Application Messaging Protocol, Streaming Text-Oriented Messaging Protocol и Alternative Message Queueing Protocol.
MQTT — логичный выбор для разработчиков, которые хотят создавать приложения с надёжной функциональностью и широкой совместимостью с подключёнными к интернету устройствами и приложениями, включая браузеры, смартфоны и устройства IoT.
Как работает MQTT: основы
Система связи, построенная на MQTT, состоит из сервера-издателя, сервера-брокера и одного или нескольких клиентов. Издатель не требует каких-либо настроек по количеству или расположению подписчиков, получающих сообщения. Кроме того, подписчикам не требуется настройка на конкретного издателя. В системе может быть несколько брокеров, распространяющих сообщения.
MQTT предоставляет способ создания иерархии каналов связи — своего рода ветвь с листьями. Всякий раз, когда у издателя есть новые данные для распространения среди клиентов, сообщение сопровождается примечанием контроля доставки. Клиенты более высокого уровня могут получать каждое сообщение, в то время как клиенты более низкого уровня могут получать сообщения, относящиеся только к одному или двум базовым каналам, «ответвляющимся» в нижней части иерархии. Это облегчает обмен информацией размером от двух байт до 256 мегабайт.
Пример того, как можно настроить клиент для подключения через брокера MQTT:
Любые данные, опубликованные или полученные брокером MQTT, будут закодированы в двоичном формате, поскольку MQTT является бинарным протоколом. Это означает, что для получения исходного содержимого нужно интерпретировать сообщение. Вот как это выглядит с помощью Ably и JavaScript:
Брокеры MQTT иногда могут накапливать сообщения, связанные с каналами, у которых нет текущих подписчиков. В этом случае сообщения будут либо отброшены, либо сохранены, в зависимости от инструкций в управляющем сообщении. Это полезно в тех случаях, когда новым абонентам может потребоваться самая последняя записанная точка данных, вместо того, чтобы ждать следующей отправки.
Примечательно, что MQTT передаёт учётные данные безопасности открытым текстом, иначе не поддерживается аутентификация или функции безопасности. Вот где вступает в игру фреймворк SSL, помогая защитить передаваемую информацию от перехвата или иной подделки.
Кроме того, в MQTT можно использовать аутентификацию Ably на токенах, если вы вообще не хотите раскрывать свой ключ API фактическому клиенту MQTT (в случае MQTT без SSL токены обязательны, чтобы предотвратить передачу ключей API открытым текстом). Пример аутентификации через токены:
Функциональность MQTT: более глубокое погружение
Согласно IBM, MQTT обладает следующими свойствами:
Одной из отличительных характеристик MQTT является уникальное понимание каналов: каждый из них обрабатывается как путь к файлу, например:
Каналы гарантируют, что каждый клиент получает сообщения, предназначенные для него. Обрабатывая каналы как пути к файлам, MQTT выполняет все виды полезных функций связи, в том числе фильтрацию сообщений на основе того, где — на каком уровне или в какой ветви — клиенты подписываются на путь к файлу.
Формат сообщений MQTT
Посмотрите на два компонента, из которых состоит каждое сообщение по протоколу MQTT:
Где можно использовать MQTT?
Поскольку приложения IoT ныне внедряются в огромных масштабах, MQTT попал в центр внимания как открытый, простой и масштабируемый способ развёртывания распределённых вычислений и функциональности IoT для более широкой пользовательской базы — как на потребительском, так и на промышленном рынках.
Как указано выше, MQTT — легковесный протокол обмена сообщениями, построенный для ненадёжных сетей и устройств с ограничениями на источник питания и CPU. Однако это не означает, что связь с потенциальной потерей пакетов — его единственное приложение. MQTT предоставляет различные уровни обслуживания для различных типов инфраструктуры IoT, от повторяющейся выборки данных до управления промышленными машинами:
Когда не нужно использовать MQTT?
У разработчиков есть богатый выбор протоколов для проектирования и развёртывания двунаправленных каналов связи IoT, включая MQTT, HTTP, CoAP, WebSockets (если позволяет CPU/батарея) и другие. Является ли MQTT лучшим выбором, зависит от оборудования и задачи приложения.
Разработанный для сред с чрезвычайно низкой пропускной способностью, протокол MQTT может быть довольно негибким в своём стремлении сохранить каждый байт. Например, спецификация определяет всего пять сообщений об ошибке, с помощью которых сервер может отклонить соединение (например, неверное имя пользователя/пароль или неприемлемая версия протокола). Если сервер хочет указать на какую-то иную ошибку, ему не повезло. Хуже того, если ошибка возникает после запуска соединения, нет никакого механизма для сообщения об ошибке вообще. Сервер может только пожать плечами и резко прервать TCP-соединение, оставив клиента без понятия, почему его сбросили (и без какого-либо способа отличить преднамеренное отключение от временной сетевой проблемы). Для людей, привыкших к более гибким и простым в отладке (хотя и менее экономичным по пропускной способности) протоколам pub/sub, такой спартанский подход может показаться немного примитивным.
MQTT часто упоминается вместе с HTTP, поэтому компания Google провела исследование, сравнив их по времени отклика, объёму трафика и другим важным для разработчиков атрибутам. MQTT занял первое место в тестах Google, но только в условиях, когда соединение можно повторно использовать для отправки нескольких полезных нагрузок.
HTTP и MQTT являются хорошим выбором для приложений IoT из-за достаточно малого объёма трафика, низких требований к батарее и памяти.
CoAP — ещё один протокол, который часто сравнивают с MQTT для разработки систем IoT. Они похожи, но есть заметные различия. MQTT — это протокол «многие ко многим», в то время как CoAP — это в основном протокол «один к одному» для связи между сервером и клиентом. В то же время CoAP предоставляет функции метаданных, обнаружения и согласования содержимого, которых нет у MQTT.
В тех случаях, когда клиенты должны только получать данные, Server-Sent Events — тоже подходящий вариант.
Как быстро настроить MQTT
Eclipse Mosquitto — open source брокер MQTT
Eclipse Mosquitto — брокер сообщений с открытым исходным кодом (лицензии EPL/EDL), который реализует протоколы MQTT версий 5.0, 3.1.1 и 3.1. Mosquitto лёгкий и подходит для использования на всех устройствах: от маломощных одноплатных компьютеров до полноценных серверов.
MQTT.js
MQTT.js — это клиентская библиотека для протокола MQTT, написанная на JavaScript для Node.js и браузера. Вот пример отправки сообщения с помощью MQTT.js:
MQTTnet
Установка клиента MQTT:
После настройки параметров клиента MQTT можно установить соединение. В следующем коде показано, как подключиться к серверу:
Приём входящих сообщений:
Для поставщиков корпоративного уровня есть готовые MQTT-серверы для масштабируемого обмена сообщениями между мобильными приложениями, промышленными машинами и широким спектром других вариантов использования IoT. В этом руководстве говорится, как использовать MQTT через брокера корпоративного уровня.
Что насчёт масштабирования?
Когда речь идёт о масштабировании MQTT, следует учесть два соображения: 1) правильный ли это протокол; 2) независимо от выбора протокола, какие инфраструктура и сетевые возможности необходимы для обработки возросшего трафика между устройствами по MQTT.
Lightweight Machine-to-Machine (LWM2M) — ещё один протокол, который можно использовать вместе с MQTT на уровне предприятия. По сравнению с MQTT, он иногда лучше подходит для долговременных систем IoT. MQTT идеально подходит для пробного запуска IoT без особых усилий, в то время как LWM2M предоставляет функции для долгосрочной универсальной инфраструктуры. LWM2M также предоставляет превосходные инструменты управления устройствами, такие как мониторинг подключения, обновление прошивок и удалённые действия на устройствах. Для предприятий с большим количеством неуправляемых устройств, отправляющих большие объёмы данных на центральную платформу, LWM2M является лучшим выбором. Тем не менее, мы говорим о масштабных развёртываниях IoT, поэтому обычно MQTT более чем адекватный вариант. Кроме того, MQTT более распространён и у него более широкая поддержка.
Теперь о возможностях инфраструктуры. Когда речь заходит о загрузке сервера, то редко узким местом является количество одновременных подключений. Большинство хороших серверов/брокеров MQTT поддерживают тысячи одновременных подключений, но какова рабочая нагрузка, необходимая для обработки и ответа на сообщения после того, как сервер MQTT получил фактические данные? Как правило, есть всевозможные потенциальные проблемы, такие как чтение и запись в базу данных и из неё, интеграция с сервером, распределение и управление ресурсами для каждого клиента и т. д. Как только одна машина перестаёт справляться с нагрузкой, нужно добавлять дополнительные серверы, то есть думать о балансировке нагрузки, синхронизации сообщений между клиентами, подключёнными к разным серверам, обобщённом доступе к состоянию клиента независимо от срока соединения или конкретного сервера, к которому подключён клиент — список продолжается и продолжается.
Такие проблемы заслуживают отдельной статьи, и много информации можно найти в разделе Engineering нашего блога. В частности, см. статью о некоторых сложностях обслуживания масштабной инфраструктуры обмена сообщениями в реальном времени.
Какова нынешняя ситуация с MQTT?
В апреле 2019 года OASIS выпустила MQTT v5.0 в качестве официального стандарта. OASIS — это некоммерческий консорциум, состоящий из 600 организаций-членов и 5000 индивидуальных участников.
Версия 5.0 вводит ряд новых функций, которые должны представлять интерес для разработчиков систем реального времени. Эти новые функции обратно совместимы с текущими версиями MQTT. Среди них:
В дополнение к множеству потребительских устройств и сервисов на рынке, MQTT нашёл использование в корпоративной инфраструктуре всех форм и размеров. Это смартфоны и планшеты, системы мониторинга энергии, медицинские устройства, нефтяные вышки и буровые установки, автомобильная и аэрокосмическая промышленность, а также датчики и системы машинного зрения, используемые в погрузочно-разгрузочных работах, строительстве, цепочке поставок, розничной торговле и многое другое.
MQTT и Ably
MQTT — популярный, широко поддерживаемый и относительно зрелый протокол. Он отлично подходит для множества применений в реальном времени, а не только для развёртывания IoT. Тем не менее, поскольку производство и потребление данных в реальном времени продолжают расти экспоненциально, MQTT не всегда будет правильным выбором протокола для удовлетворения ваших потребностей в потоковой передаче. Следите за нашим разделом Realtime Concepts для получения информации о других протоколах и о том, как они подходят вашей ситуации.
Ably предоставляет брокер и адаптер протокола MQTT с трансляцией на собственный протокол Ably в обе стороны, что позволяет интегрироваться с любыми существующими системами и соединениями. Поддерживаются WebSockets, HTTP, SSE, gRPC (в разработке), STOMP, AMQP и другие протоколы для организации распределённой инфраструктуры обмена сообщениями в реальном времени. Есть более 40 клиентских библиотекам SDK и поддержка проприетарных протоколов реального времени.
Что такое MQTT
После того как я стал стал строить умный дом я очень быстро столкнулся с вещью под названием MQTT. Оказывается, некоторые устройства могут «разговаривать с MQTT», а система умного дома может «забирать из MQTT» данные. Происходит «отправка сообщений в топики». Изначально мне было совершенно непонятно что как это все работает и зачем это. Как оказалось, это все не очень сложно.
Я написал этот текст специально для людей кто никогда раньше не сталкивались с MQTT.
История возникновения MQTT
MQTT — это такой специальный протокол по которому умеют общаться программы и устройства. Есть русский язык и люди которые умеют разговаривать на этом языке могут понять друг друга. Точно так же есть «язык» MQTT — программы и устройства которые умеют разговаривать на этом языке могут общаться друг с другом.
Для передачи данных использовалась спутниковые телефоны, которые и сейчас очень дорогие, а 20 лет назад были очень-очень дорогие. Поэтому технология передачи должна была быть как можно более экономной — передавать как можно меньше данных.
Протокол MQTT смог успешно решить эта задачу и стал применяться и в других отраслях. Постепенно компьютеры и микропроцессоры становились все дешевле и это привело к тому что стала появляться куча разных устройств в которые добавили «ума» (для этого придумали красивый термин IoT — Internet of Things — Интернет Вещей). Умный чайник, умный обогреватель — эти устройства могут отправлять данные про себя (какая сейчас температура, сколько устройство работает), а так же удаленно получать команды на управление.
Есть множество устройств разных производителей — как им общаться друг с другом и с серверами умного дома? Можно взять и придумать новый язык (протокол) и многие производители так и делают. Но есть протокол MQTT которые отлично подходит для общения разных устройств и программ. Некоторые производители используют MQTT в своих устройствах. MQTT популярен в мире бесплатных и открытых программ (Open Source).
Программа MQTT Explorer
Если вы работаете с MQTT, то вам нужно обязательно скачать и поставить программу MQTT Explorer.
Программа бесплатная. Программа работает на Windows, на macOS и на Linux.
С помощью этой программы можно подключиться к MQTT серверу и увидеть все то что там происходит.
MQTT брокер
MQTT — это протокол который работает по модели клиент-сервер.
Центральная часть — это MQTT сервер. Обычно сервер MQTT называют MQTT брокер.
Есть очень популярная программа Mosquitto — если запустить эту программу, то у вас появится работающий MQTT сервер.
Далеко не всегда нужно самому запускать MQTT сервер. Многие системы сами поднимают MQTT сервер с которыми работают.
Клиенты
К серверу MQTT подключаются клиенты. Клиенты могут отправлять сообщения и читать сообщения. Некоторые клиенты только отправляют, некоторые только читают, но достаточно часто клиент делает и то и другое: и отправляет сообщения и слушает другие сообщения.
Чтобы клиент мог подключиться к MQTT серверу нужно указать:
Топики и отправка сообщений
Итак, есть MQTT брокер — центр системы. Есть клиенты которые подключаются к этому центру.
Давайте разберем задачу. Есть датчик температуры и есть система умного дома. Как с помощью MQTT датчик может передать температуру в систему умного дома?
Датчик температуры подключается к серверу MQTT. Раз в 5 минут датчик производит замер температуры и отправляет результат замера в сервер MQTT. Например, температура 23.8 °C
Для того чтобы отправить температуру в MQTT датчик должен знать две вещи. Во-первых, саму температуру, она есть — 23.8. А во-вторых датчик должен указать адрес топика в который будет отправлено это значение. Что же такое топик? Чуть-чуть отойдем в сторону. Представим что нужно сохранить число 23.8 на компьютер. Можно сохранить в файл. Для этого нужно знать полный путь к файлу. Например, c:\temperature\sensor.txt — в этом файл мы можем записать число 23.8
Топик очень похож на файл — это расположение какого-то кусочка информации в MQTT сервере. Датчик температуру может отправить сообщение 23.8 в топик temperature/sensor — теперь MQTT сервер знает про это число.
Половину задачи решели — датчик температуру отправил значение температуру в MQTT сервер.
Как же система умного дома узнает о том что датчик прислал новую температуру? При подключении к серверу MQTT система умного дома говорит — я хочу получить все данные которые приходят в топик temperature/sensor MQTT сервер запоминает это желание клиента и как только в топик temperature/sensor приходит какое-то значение сервер пересылает это сообщение всем клиентам кто выразил желание получать сообщение из этого топика (это называется кто «подписался» на эти топики»)
Символ решетка
Клиент при подключении к MQTT серверу может указать список топиков которые он хочет «слушать» (т.е. получать все сообщения которые поступают в эти топики)
При подписке можно указать символ решетка. Например, если клиент говорит что он хочет подписать на temperature/# то этот клиент получит все сообщения которые будут отправлены вот в такие топики:
Так же клиент может подписать на топик # — это ознчает что он будет получать вообще все сообщения которые прилетают в MQTT сервер.
Retain Флаг
MQTT сервер — это всего лишь посредник между разными клиентами. Клиент отправил сообщение в MQTT сервер, сервер переслал это сообщение всем клиентам, которым интересно это сообщение и сервер тут же забыл про это сообщение. Новые клиенты которые подключаются к MQTT серверу уже не получат это сообщение.
Пример. Есть датчик температуры и есть система умного дома. Штатный режим работы. Система умного дома подключилась к MQTT серверу и слушает все сообщения. Датчик температуры подключился к MQTT серверу и каждые 5 минут отправляет данные про температуру. Все работает прекрасно — датчик отправл температуру, MQTT сервер переслал эту температуру в систему умного дома и умный дом отобразил эту температуру в интерфейсе.
Но тут происходит ситуация что нужно перезагрузить систему умного дома. Умный дом перезапустился, и заново подключился к MQTT серверу, но никакой информации о температуре в MQTT сервере нет (те сообщения которые были раньше уже переданы всем клиентам и никуда на MQTT сервере не сохранились). Пока датчик не отправит новое значение система умного дома не получит температуру из MQTT сервера.
Решение такой ситуации — это флаг retain. При отправке сообщения клиент может сказать что это сообщение нужно отправить с флагом retain, т.е. сервер должен сохранить сообщение. В этом случае сервер получит сообщение, переправит его всем клиентам, но не забывает про это сообщение, а оставляет его у себя и будет отправлять это же сообщением всем новым клиентам которые подключились к MQTT серверу.
Last will
Одна из интересных фишек протокола MQTT — это штука под названием Last will — завещание. Еще используют аббревиатуру «LWT» — Last Will and Testament.
Стандартная работа — клиент подключается к MQTT серверу и все время остается подключенным к серверу (сервер «видит» момент подключения и может понять когда клиент отключился).
Задача. Есть клиент — компьютер — он должен быть всегда подключен к MQTT серверу. Если этот компьютер не подключен к MQTT серверу — это авария, что-то случилось либо с этим компьютером, либо с каналом связи. Как об этой аварии могут узнать другие клиенты?
Решение следующее: клиент при подключении говорит серверу: «слушай, когда я отключусь, ты, пожалуйста, вот в этот топик положи вот такое сообщение». Сервер принимает такое «завещание» от клиента и когда этот клиент отключается, MQTT сервер выполняет «последнюю волю» клиента.
Например, клиент может попросить сервер отправить сообщение «offline» в топик «computers/my-desktop/status». И когда этот клиент отвалится MQTT сервер отправит сообщение «offline» в нужный топик. Клиент подключился, сказал MQTT серверу что при отключении нужно отправить в топик значение «offline» и тут же отправляет в этот же топик значение «online». Тогда все другие клиенты которым интересен статус этого клиента могут следить за этим топиком — если там «online» значит с компьютером все нормально, если «offline», то есть проблема.
В последнее время мне пришлось долго и муторно разбираться с протоколом MQTT (Mosquitto) и с тем, как его можно использовать с домашней автоматизацией. Поэтому пришлось разбираться с тем, как оно работает и зачем нужны все эти настройки.
Немного теории
Основные термины и понятия используемые в данном протоколе:
Разберем каждый термин по отдельности
Message
Сообщения (message) содержат в себе информацию, которую один участник сети на базе протокола MQTT хочет передать другим. Взаимодействие между участниками сети осуществляется через Брокера. То есть, если мне, как устройству, нужно передать сообщение о том что я что-то сделал или сообщить о том, как у меня дела, я передаю сообщение брокеру публикуя во всеуслышание что «я что-то сделал» или «как у меня дела».
Publish
Это процесс передачи сообщения брокеру.
То есть простым языком, я подошел к брокеру и сказал «мама я покакал». Брокер гипотетически должен услышать это сообщение и записать его к себе в блокнотик. Почему гипотетически? Потому что есть особенности протокола, которые мы разберем чуть ниже. Пока берем за данность, что я сказал что-то брокеру используя механизм Publish и он это услышал и записал.
Subscribe
Так как всеми сообщениями от всех устройств владеет исключительно брокер, то нам жеж нужно как то получить эти сообщения. Для этого мы подписываемся на рассылку от брокера для получения проходящих через него сообщений. Чтобы читать какие-то конкретные сообщения, нам необходимо определить на какую тему мы хотим получать эти сообщения, и для этого как раз используется механизм Topic
Topic
Это как раз таки Тема, по поводу которой мы хотим получать или как ни странно отправлять сообщения.
То есть формат общения между участниками выглядит примерно так.
Я как участник хочу сказать всем «мама я покакала»
для этого я создаю топик любого содержания, например: мое_тело/задница/
и сообщаю в этот топик сообщение «мама я покакала»
Брокер получит это сообщение, и передаст всем, кто подписался на тему (топик) мое_тело/задница/
То есть это такая вот упрощенная система смс рассылок с определенными темами.
Формат топика может быть разным и абсолютно любым. В принципе мы можем создать любой топик, и в него передавать сообщения любого содержания. Главное чтобы получатель был подписан на этот топик и знал что делать с информацией полученной из сообщений.
Что касается особенностей топиков, то их не так чтобы много.
Во первых они чувствительны к регистру. То есть топик «мое_тело/задница» и топик «Мое_Тело/Задница» это два разных топика.
Во вторых, топики не создаются не сервере администратором. Они создаются публикаторами и подписчиками которые на них подписаны. Брокер только занимается передачей сообщений и служебной информации.
Они позволяют выстраивать иерархию. Ну например:
У нас есть в гостиной и в спальне по два выключателя и один в гараже. Для этого мы формируем на выключателях в топики в виде:
Затем, что есть служебные топики, которые позволяют подписаться на группы топиков или сообщений.
Например если мы хотим читать вообще все сообщения мы подписываемся на топик #
Если мы хотим видеть то, что происходит в доме, то мы подписываемся на топик home/# и будем получать сообщения в топиках:
Но не будем видеть то что происходит в топике:
Если мы хотим видеть то, что происходит в гостиной, мы подписываемся на топик home/livingroom/# и будем получать сообщения только из топиков
В общем я думаю понятно что и как происходит с этими топиками.
Служебные сообщения
В качестве служебных сообщений используются в основном два типа сообщений
Last Will and Testament (LWT) которое сообщает что после этого сообщения считать меня мертвым.
Ну плюс еще используется Keep Alive сообщения, которые сообщают брокеру что «я все еще живой» и стандартно посылаются каждые 60 секунд. Если брокер не получил это сообщение от клиента, то он принудительно пингует его чтобы выяснить живой ли тот, и если выясняется что он неживой, то брокер публикует за клиента LWT сообщение, чтобы все узнали что тот скончался.
Соответственно получение брокером Birth Message от устройства, переводит устройство в понимании брокера в режим ONLINE, а после того как брокер получает от устройства LWT сообщение или когда сам принимает решения что тот скончался проверив устройство на доступность, то переводит статус устройства в режим OFFLINE.
QoS в принципе расшифровывается как Quality Of Service, то есть качество предоставляемой услуги. В разрезе MQTT оно имеет три значения 0,1 и 2
Если по простому, то эти варианты означают по факту определение того, надо ли нам как публикующему свое сообщение устройству, быть уверенным что оно получено.
QoS=0 означает что мы один раз публикуем сообщение «мама я покакала» и нам пофиг услышали нас или нет
QoS=1 означает что мы будем публиковать сообщение «мама я покакала» до посинения, до тех пор пока нам не скажут что нас услышали и можно заткнуться уже.
QoS=2 означает что мы один раз сказали «мама я покакала», получили от мамы подтверждение того что она нас услышала, сообщили маме что мы узнали о том что мама нас улышала, а мама подтвердила, что она поняла что мы узнали о том что она услышала :))))))
Я думаю первая буква М в протоколе, имеет отсылку в адрес Майкрософта, который по стопицот раз переспрашивает «действительно ли вы уверены что хотите закрыть это приложения?» :)))))))
Вот в общем то и все.
Retain
Этот параметр имеет всего два значения вкл и выкл. Означает он очень простой механизм.
Если у нас режим выключен, то когда я сообщаю всему миру «мама я покакала», то его слышат все кто подписан сейчас на топик в который я это сообщил. Но вновь подключившийся подписчик на наш веселый топик «мое_тело/задница» не узнает о том что все уже случилось и так и умрет в неведении наверное.
Если же мы включаем режим Retain, то брокер берет на себя обязательство, после того как мы сообщили миру об акте дефекации, сообщать каждому вновь подписавшемуся на этот топик сей удивительный и жизненно необходимый факт.