Протоколы «Интернета вещей» - MQTT

Продолжаем исследовать сетевые протоколы.

MQTT (Message Queue Telemetry Transport) – протокол прикладного уровня для организации межмашинной коммуникации (M2M, Machine to Machine), который работает по принципу «издатель-подписчик». Два главных компонента MQTT – клиент и брокер. MQTT-клиенты публикуют сообщения на определённую тему (topic), или подписываются на сообщения и прослушивают их. Тема – это произвольная строка, в которую входят любые символы за исключением специальных символов «/», «+» и «#», суть которых будет раскрыта ниже. MQTT-брокер получает все опубликованные издателями сообщения и перенаправляет релевантные сообщения подписчикам. Подписчики и издатели не должны знать друг о друге, роль играют лишь темы сообщений и сами сообщения. Для организации нормального взаимодействия издатели и подписчики должны использовать общие названия тем и формат сообщений.

MQTT работает поверх ТСР и разработан в расчёте на маломощные встроенные устройства, поэтому вычислительные требования для его реализации минимальны. В дополнение к очень низкой нагрузке на систему, MQTT отличается высокой эффективностью и надёжностью связи даже в сетях с низкой пропускной способностью.

ДЕМО

На картинке светильник (MQTT-клиент), который представляет из себя устройство на микроконтроллере c ОС Contiki на борту. В качестве брокера используется Mosquitto – это популярный и простой в установке и настройке брокер, активно поддерживающийся сообществом. Светильник подписывается на тему proiot3/cmd/leds. Отправлять сообщения брокеру Mosquitto можно из командной строки, например следующая команда включает красный свет:

~$ mosquitto_pub -h localhost -t 'proiot3/cmd/leds' -m 100

Светильник в свою очередь также публикует сообщение, но уже в другой топик proiot3/evt/status если нажата кнопка. В данном топике данные публикуются в JSON формате. Подписаться на топик из командной строки можно так:

~$ mosquitto_sub -h localhost -t 'proiot3/evt/status'

Виртуальному сетевому интерфейсу симулятора нужно назначить дополнительный адрес abcd::1, в противном случае светильник и брокер друг друга не увидят.

mqtt.ipv6 | исходники

screenshot

ТОПИКИ

Топики представляют собой символы с кодировкой UTF8. Длина темы не может превышать 32767 символов. Иерархическая структура топиков имеет формат «дерева», что упрощает их организацию и доступ к данным. Топики состоят из одного или нескольких уровней, которые разделены между собой символом «/».

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

  • Одноуровневый «+». К примеру, нам необходимо получить данные при изменении температуры во всех комнатах – для этого нужно подписаться на топик вида home/+/temperature. В результате получаем данные с топиков home/living-room1/temperature, home/living-room2/temperature и т.д.

  • Многоуровневый «#». К примеру, чтобы получить данные с различных датчиков в доме, подписываемся на топик вида home/#. В результате получаем данные с топиков home/living-room1/temperature, home/living-room2/button и т.п.

screenshot

КАЧЕСТВО ОБСЛУЖИВАНИЯ

MQTT позволяет разработчику гибко контролировать надежность обмена сообщениями, для этого в протоколе предусмотрено три уровня качества обслуживания QoS (Quality of Service):

  • QoS 0. Максимум однократная доставка сообщений. Приёмник сообщения не подтверждает их получение, отправитель, соответственно, передаёт сообщение лишь раз, не предпринимая попыток по их повторной передаче. Это – метод «отправил и забыл»

  • QoS 1. Минимум однократная доставка сообщений. Гарантируется, что приёмник получит сообщение хотя бы один раз. При этом подписчик может получить одно и то же сообщение несколько раз. Отправитель будет предпринимать повторные попытки отправки до тех пор, пока не получит подтверждение в успешной доставке сообщения

  • QoS 2. Однократная доставка сообщений. Гарантируется, что приёмник получит сообщение один и только один раз. Самая медленная процедура доставки сообщений, но при этом и самая надёжная. Для доставки сообщения используется механизм четырехэтапного рукопожатия

Но есть один неочевидный нюанс. Дело в том, что уровень QoS прописан как на стороне издателя так и на стороне подписчика и в результате может не совпадать. В таком случае очевидно происходит понижение «общего» QoS до наименьшего уровня в конкретной паре издатель подписчик. Вот так выглядит MQTT в Wireshark:

screenshot

screenshot

Брокер является наиболее критичным элементом системы «издатель-подписчик», от его надёжности и скорости многое зависит. Брокер отвечает за прием всех сообщений, их фильтрацию, принятие решения о том, кому интересны эти сообщения, и, в конечном итоге, за пересылку сообщений всем клиентам-подписчикам. Среди серверных реализаций брокера помимо уже упомянутого открытого ПО Mosquitto можно выделить IBM WebSphere MQ; легко масштабируемый и высокопроизводительный открытый сервер emqttd на Erlang; брокер HiveMQ и др.

Как уже упоминалось, MQTT работает поверх TCP, где как известно по умолчанию данных ходят без шифрования. Для защиты от бородатых хаккеров и безопасного обмена данными по MQTT протоколу предлагается использовать TLS (Transport Layer Security) вместо TCP. Протокол TLS работает поверх TCP и предназначен для предоставления трёх услуг всем приложениям, работающим над ним – шифрование, аутентификацию и целостность. TLS даёт возможность клиент-серверным приложениям осуществлять связь в сети таким образом, что нельзя производить прослушивание пакетов и осуществить несанкционированный доступ.

links

social