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 достаточно простой, но при этом функциональный протокол, который удобно применять в устройствах интернета вещей. Он не требует много ресурсов и легко реализуем.

MQTT — интернет вещей по принципу подписки: 4 комментария

  1. Глядя на то, как строятся botnet’ы в сети Internet, возникла идея использовать CHAT протокол, такой как IRC для построения Интернета вещей (IoT), в связи с чем родилась концепция протокола IRC-IoT. В текстовый протокол можно инкапсулировать данные из любого другого протокола. Пока проект находится на стадии формирования, при желании присоединяйтесь.

    Нравится

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

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

Логотип WordPress.com

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

Google+ photo

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

Фотография Twitter

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

Фотография Facebook

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

Connecting to %s