MQTT. QoS. Уровни качества обслуживания. Практика



На прошлом уроке мы познакомились с протоколом передачи данных MQTT (Message Queuing Telemetry Transport). Также мы узнали, что у данного протокола существует три уровня качества обслуживания QoS (Quality of Service), с которыми я и предлагаю с помощью практического исследования передачи сообщений познакомиться немного поподробнее.

Также  у нас уже есть брокер MQTT, который мы установили в этом уроке на плату Raspberry PI, которым мы и воспользуемся.

Включим питание платы

 

 

Подключимся к плате по SSH с помощью Putty

 

 

Здесь у нас будет первый клиент MQTT.

В качестве второго клиента мы установим MQTT Explorer. Скачиваем последнюю бета-версию, так как там уже есть возможность в подписках выбирать уровень качества обслуживания в подписках на топики. Вы также при желании можете скачать версию 3.0.5 на той же странице вот по такой ссылке

 

 

Скачиваем, устанавливаем и запускаем MQTT Explorer.

Добавим новое соединение, указав адрес и порт нашего брокера, а также логин и пароль

 

 

Прежде чем соединиться, запустим Wireshark, настроив его на адрес и исключив порт 22, чтобы не ловить пакеты от Putty

 

 

Жмём Connect в MQTT Explorer

 

 

Соединение установлено, начнут сыпаться системные пакеты

 

 

Вот наше соединение в Wireshark

 

 

Дальше идут подписки и публикации.

Попробуем разъединиться с брокером

 

 

Мы видим процесс разъединения

 

 

Кстати, команду разъединения брокер никак не подтверждает, да и нет команды подтверждения на разъединения среди 14 существующих.

Давайте подпишемся на группу топиков, нажав для этого кнопку Advanced

 

 

Удалим для начала подписку на все группы топиков #

 

 

Подпишемся на другую группу топиков, оставив уровень качества обслуживания по умолчанию QoS0

 

 

Выйдем из расширенных настроек соединения

 

 

 

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

 

 

Мы видим подписку на обе группы, также видим уровень качества обслуживания QoS0.

Попробуем опубликовать какое-нибудь сообщение с первого клиента

 

mosquitto_pub -h localhost -u mosquitto -P 123456 -t house/s1 -m 'sss'

 

Сообщение было получено вторым клиентом

 

 

Посмотрим данный процесс в Wirshark.

Вот наш пакет

 

 

 

 

Мы видим, что сообщение пришло с уровнем качества обслуживания 0.

Попробуем отправить то же самое сообщение, но с уровнем 1

 

mosquitto_pub -h localhost -u mosquitto -P 123456 -t house/s1 -m 'sss' -q 1

 

Сообщение данное второй клиент также успешно получил

 

 

Почему же данное сообщение получил клиент? Ведь уровень качества обслуживания в пакете публикации был другой.

Посмотрим пакет в Wireshark

 

 

Дело в том, что всё тут не так просто. Для тех клиентов, которые подписываются на топики с уровнем качества обслуживания ниже, чем в публикации, брокер отправит сообщение с уровнем 0. Также брокер в данном случае не отправляет клиенту-публикатору подтверждение получения сообщения клиентом-подписчиком (клиентами-подписчиками)

 

 

Поэтому давайте теперь попробуем исправить нашу подписку на другой максимальный уровень, например 2. Для этого придётся удалить и заново добавить топик

 

 

Соединим клиент 2 с сервером и отправим с клиента 1 то же самое сообщение (правильнее сказать, мы его опубликуем).

Мы также получим наше сообщение

 

 

А в Wireshark мы уже увидим уровень 1 в сообщении

 

 

Попробуем отправить наше сообщение с уровнем качества обслуживания QoS2

 

mosquitto_pub -h localhost -u mosquitto -P 123456 -t house/s1 -m 'sss' -q 2

 

Клиент 2 получил опубликованное сообщение

 

 

В Wireshark мы также видим сообщение с уровнем 2

 

 

Также мы видим все необходимые пакеты подтверждений между брокером и клиентом-подписчиком

 

 

Давайте теперь попробуем в первом клиенте подписаться на группу топиков

 

mosquitto_sub -v -u mosquitto -P 123456 -h localhost -p 1883 -t house/room1/#

 

А на клиенте 2 попробуем опубликовать что-нибудь в какой-нибудь топик из данной группы

 

 

Сообщение наше получил клиент 1

 

 

Посмотрим отправленный пакет в Wireshark

 

 

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

В составе пакета мы видим уровень качества обслуживания QoS0

 

 

Попробуем отправить с уровнем 1

 

 

Сообщение также клиент 1 получил

 

 

В WireShark мы видим, что сообщение также отправилось дважды

 

 

Причем первый раз отправилось именно с уровнем качества обслуживания QoS1

 

 

А второй раз с уровнем QoS0

 

 

Я думаю, теперь у нас появилось понимание того, как именно работают уровни качества обслуживания. Если клиент-публикатор отправил сообщение в топик с уровнем качества обслуживания, превышающим максимальный уровень в подписке, то повторное сообщение отправляется с уровнем ниже. То же самое будет, если мы попытаемся отправить сообщение с уровнем 2. Давайте проверим

 

 

Клиент 1 также его получил

 

 

И в Wireshark также две отправки

 

 

Первое отправилось с уровнем 2, но не со всем подтверждениями от брокера. Нет подтверждения Publish Complete

 

 

Второе с уровнем 0

 

 

Выйдем из ожидания сообщений на клиенте 1 при помощи комбинации клавиш Ctrl+C и подпишемся заново но с уровнем качества обслуживания QoS2

 

mosquitto_sub -v -u mosquitto -P 123456 -h localhost -p 1883 -t house/room1/# -q2

 

Попробуем заново отправить сообщение в топик с клиента 2 с тем же уровнем

 

 

Клиент 1 сообщение получил

 

 

В WireShark мы видим, что сообщение также отправилось дважды, один раз с уровнем 2, другой раз с уровнем 0, видимо для других подписчиков, которые не просили высокий уровень качества обслуживания.

Хотелось бы увидеть, что клиент 1 получил сообщение именно с уровнем качества обслуживания QoS2.

Давайте подключимся к Raspberry Pi через клиента VNC и установим на неё также WireShark, соглашаясь там со всеми запросами

 

 

Запустим Wireshark

 

 

Только если мы так его запустим, то будем работать не от имени администратора, поэтому запустим WireShark с правами администратора из терминала

 

 

Выбираем вот этот интерфейс

 

 

Никаких фильтров не ставим, так как у нас нет так много локального трафика и с клиента 2 отправим снова наше сообщение с уровнем качества обслуживания QoS2

 

 

Здесь мы видим, что клиент 1 получил только одно сообщение

 

 

И причём именно с уровнем QoS2

 

 

Итак, на данном уроке мы немного разобрались с назначением уровней качества обслуживания QoS при передаче данных по протоколу MQTT. Надеюсь, это нам в будущем поможет при разработке своих проектов, работающих с данным протоколом.

Всем спасибо за внимание!

 

 

Предыдущий урок Передача данных Следующий урок

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

Data Transfer MQTT. QoS. Уровни качества обслуживания. Практика

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

Data Transfer MQTT. QoS. Уровни качества обслуживания. Практика

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*