Одним из ключевых аспектов интернета вещей является низкое энергопотребление и ограниченные ресурсы устройств и каналов связи. Достигается это в значительной степени за счёт упрощения. Протоколы “обычного” интернета, такие как 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-брокер. Данный подход показал себя очень хорошо и эффективно в таких задачах, как, например, сбор данных, телеметрия и управление простыми устройствами.
Рассмотрим принцип работы более подробно.
- Каждое конечное устройство (издатель или подписчик) инициирует и устанавливает связь с брокером. Это позволяет устранить сразу несколько ограничений в сетях. Например, обойти NAT и отсутствие статических IP-адресов, что является очень распространённым в текущий момент и будет актуально, пока все не перейдут на IPv6.
- MQTT работает поверх TCP.
- Для обеспечения безопасности может применяться аутентификация и SSL/TLS.
- Управления сообщениями осуществляется по принципу раздельной очереди построенной на механизме топиков.
- У каждого сообщения должен быть адрес называемый топик (пример: /home/kitchen/sensor1/temperature).
- Издатели могут публиковать сообщения в топик после чего оно попадает в очередь. Подписчики могут подписаться на те или иные топики брокера и получать сообщения из очереди каждого топика. От подписки на топик можно отказаться.
- Топики организуют дерево на основе адреса с разделением по символу “/”
Пример
Следующие топики образуют дерево справа:
/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 достаточно простой, но при этом функциональный протокол, который удобно применять в устройствах интернета вещей. Он не требует много ресурсов и легко реализуем.
Глядя на то, как строятся botnet’ы в сети Internet, возникла идея использовать CHAT протокол, такой как IRC для построения Интернета вещей (IoT), в связи с чем родилась концепция протокола IRC-IoT. В текстовый протокол можно инкапсулировать данные из любого другого протокола. Пока проект находится на стадии формирования, при желании присоединяйтесь.
НравитсяНравится