На прошлом уроке мы познакомились с протоколом передачи данных 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 (нажмите на картинку)
Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)
Добавить комментарий