Продолжаем исследовать сетевые протоколы.
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
, в противном случае светильник и брокер друг друга не увидят.
ТОПИКИ
Топики представляют собой символы с кодировкой UTF8. Длина темы не может превышать 32767 символов. Иерархическая структура топиков имеет формат «дерева», что упрощает их организацию и доступ к данным. Топики состоят из одного или нескольких уровней, которые разделены между собой символом «/».
Подписчик может также получать данные сразу с нескольких топиков, для этого существуют специальные символы. Они бывают двух типов: одноуровневые и многоуровневые. Для более простого понимания рассмотрим в примерах каждый из них:
-
Одноуровневый «+». К примеру, нам необходимо получить данные при изменении температуры во всех комнатах – для этого нужно подписаться на топик вида
home/+/temperature
. В результате получаем данные с топиковhome/living-room1/temperature
,home/living-room2/temperature
и т.д. -
Многоуровневый «#». К примеру, чтобы получить данные с различных датчиков в доме, подписываемся на топик вида
home/#
. В результате получаем данные с топиковhome/living-room1/temperature
,home/living-room2/button
и т.п.
КАЧЕСТВО ОБСЛУЖИВАНИЯ
MQTT позволяет разработчику гибко контролировать надежность обмена сообщениями, для этого в протоколе предусмотрено три уровня качества обслуживания QoS (Quality of Service):
-
QoS 0. Максимум однократная доставка сообщений. Приёмник сообщения не подтверждает их получение, отправитель, соответственно, передаёт сообщение лишь раз, не предпринимая попыток по их повторной передаче. Это – метод «отправил и забыл»
-
QoS 1. Минимум однократная доставка сообщений. Гарантируется, что приёмник получит сообщение хотя бы один раз. При этом подписчик может получить одно и то же сообщение несколько раз. Отправитель будет предпринимать повторные попытки отправки до тех пор, пока не получит подтверждение в успешной доставке сообщения
-
QoS 2. Однократная доставка сообщений. Гарантируется, что приёмник получит сообщение один и только один раз. Самая медленная процедура доставки сообщений, но при этом и самая надёжная. Для доставки сообщения используется механизм четырехэтапного рукопожатия
Но есть один неочевидный нюанс. Дело в том, что уровень QoS прописан как на стороне издателя так и на стороне подписчика и в результате может не совпадать. В таком случае очевидно происходит понижение «общего» QoS до наименьшего уровня в конкретной паре издатель подписчик. Вот так выглядит MQTT в Wireshark:
Брокер является наиболее критичным элементом системы «издатель-подписчик», от его надёжности и скорости многое зависит. Брокер отвечает за прием всех сообщений, их фильтрацию, принятие решения о том, кому интересны эти сообщения, и, в конечном итоге, за пересылку сообщений всем клиентам-подписчикам. Среди серверных реализаций брокера помимо уже упомянутого открытого ПО Mosquitto можно выделить IBM WebSphere MQ; легко масштабируемый и высокопроизводительный открытый сервер emqttd на Erlang; брокер HiveMQ и др.
Как уже упоминалось, MQTT работает поверх TCP, где как известно по умолчанию данных ходят без шифрования. Для защиты от бородатых хаккеров и безопасного обмена данными по MQTT протоколу предлагается использовать TLS (Transport Layer Security) вместо TCP. Протокол TLS работает поверх TCP и предназначен для предоставления трёх услуг всем приложениям, работающим над ним – шифрование, аутентификацию и целостность. TLS даёт возможность клиент-серверным приложениям осуществлять связь в сети таким образом, что нельзя производить прослушивание пакетов и осуществить несанкционированный доступ.