MQTT — интернет вещей по принципу подписки

Одним из ключевых аспектов интернета вещей является низкое энергопотребление и ограниченные ресурсы устройств и каналов связи. Достигается это в значительной степени за счёт упрощения. Протоколы “обычного” интернета, такие как HTTP, оказываются слишком сложны и ресурсозатратны. Рассмотрим протокол MQTT работающий по принципу подписок.

MQTT — Message Queue Telemetry Transport (дословно транспорт для очереди сообщений телеметрии) был разработан в IBM в 1999 году https://ru.wikipedia.org/wiki/MQTT и стандартизирован OASIS https://ru.wikipedia.org/wiki/OASIS спустя 15 лет.

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

Реализовано это следующим образом: устройства, которые хотят передать сообщение (называющиеся издатели в терминах MQTT), отправляют его серверу (брокеру), устройства которые хотят получить сообщения (подписчики), также подключаются к брокеру и получают сообщения от него. Всю обработку сообщений берёт на себя MQTT-брокер. Данный подход показал себя очень хорошо и эффективно в таких задачах, как, например, сбор данных, телеметрия и управление простыми устройствами.

MQTT_structure

Рассмотрим принцип работы более подробно.

  • Каждое конечное устройство (издатель или подписчик) инициирует и устанавливает связь с брокером. Это позволяет устранить сразу несколько ограничений в сетях. Например, обойти NAT и отсутствие статических IP-адресов, что является очень распространённым в текущий момент и будет актуально, пока все не перейдут на IPv6.
  • MQTT работает поверх TCP.
  • Для обеспечения безопасности может применяться аутентификация и SSL/TLS.
  • Управления сообщениями осуществляется по принципу раздельной очереди построенной на механизме топиков.
    • У каждого сообщения должен быть адрес называемый топик (пример: /home/kitchen/sensor1/temperature).
    • Издатели могут публиковать сообщения в топик после чего оно попадает в очередь. Подписчики могут подписаться на те или иные топики брокера и получать сообщения из очереди каждого топика. От подписки на топик можно отказаться.
    • Топики организуют дерево на основе адреса с разделением по символу “/”

2017-12-02_19-39-43

Пример

Следующие топики образуют дерево справа:

/home/kitchen/sensor1/temperature
/home/kitchen/sensor1/humidity
/home/kitchen/sensor2/temperature
/home/kitchen/light1/state
/home/kitchen/light2/state

    • Можно подписываться на топики по шаблону на дерево или его части. Например:
      • Одноуровневый шаблон по символу «+»:  /home/kitchen/+/temperature выдаст 2 топика /home/kitchen/sensor1/temperature и /home/kitchen/sensor2/temperature
      • Многоуровневый шаблон по символу «#»: /home/kitchen/# выдаст полную структуру дерева, так как все топики входят в kitchen.
  • В итоге топики представляют собой простой и удобный механизм организации связей разных видов: один ко многим, многие к одному и многие ко многим.
  • Брокеры могут подписываться на топики друг-друга, тем самым получается гибкая и масштабируемая сеть.
  • Существует 3 уровня обработки сообщений. Они определяются параметром QoS (quality of service):
    • QoS 0 At most once: издатель один раз отправляет сообщение брокеру и не ждет подтверждения от него. Сообщение может быть потеряно при сбое в сети. Можно назвать аналогом UDP для простоты понимания.
    • QoS 1 At least once: сообщение точно будет доставлено брокеру, но есть вероятность дублирования сообщений от издателя. Подписчик может получить несколько копий сообщения.
    • QoS 2 Exactly once: На этом уровне гарантируется доставка сообщений подписчику и исключается возможное дублирование отправленных сообщений. Каждое сообщение имеет уникальный идентификатор.

Рассмотрим работу с MQTT на базе Mosquitto — наиболее распространённого брокера. Он есть в репозитариях большинства Linux дистрибьютивов, поэтому установка его не вызывает вопросов. Для Windows и Mac есть официальные версии, там же доступны исходные коды. Также можно получить исходные коды из GitHub. Для работы с брокером проект Mosquitto предоставляет пару консольных утилит издателя и подписчика, называющихся соответственно mosquitto_pub и mosquitto_sub. Они не входят в стандартный пакет Mosquitto в репозитариях и и требуют установки дополнительного пакета mosquitto-clients.

Здесь и далее представлены примеры команд для OpenSUSE Tumbleweed.

Установка пакетов

apt-get install mosquitto mosquitto-clints

Запуск сервиса Mosquito:

systemctl start mosquitto.service

Запустить 2 окна с консолями, из одной подписаться на топик,

mosquitto_sub -t ‘test/topic’ -v

а из другой писать в этот топик.

mosquitto_pub -t ‘test/topic’ -m ‘hello world’

При этом в консоли с подписчиком будет получена запись из топика

hello world

По умолчанию подключение происходит на localhost, при необходимости можно задать адрес через опциональный аргумент “-h” или “—host” и порт через “-p” или “—port”. Из полезных стоит обратить внимание на следующие аргументы:

-q, —qos      Задаёт уровень обслуживания (см. выше), по-умолчанию 0.
-d, —debug     Вывод информации для отладки (всех взаимодействий с брокером и их результата)
-v, —verbose     Вывод расширенного информации для подписчика (топик и сообщение), удобно, если подписываться на группу топиков, чтобы понять откуда пришло сообщение.

В итоге команда на публикацию может выглядеть следующим образом:

mosquitto_pub -h 192.168.1.1 -p 1885 -t test/topic -m «test2»

Ознакомиться с полным перечнем опций утилит издателя и подписчика можно в официальной документации:  mosquitto_pub и mosquitto_sub.

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

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s