MQTT (протокол)

Основная статья - здесь.

MQTT - протокол прикладного уровня, предназначенный для передачи телеметрической информации от датчиков к серверу. Обычно работает поверх стандартного протокола TCP/IP. В отличие от протоколов типа "запрос-ответ" (например, Modbus), протокол MQTT построен на принципе "публикация-подписка".

Разработан в 1999 при участии компаний IBM и Eurotech, стандартизован OASIS в 2014.

## Преимущества

При проектировании в протокол закладывались следующие свойства:

* простота для реализации на платформах с невысокими вычислительными возможностями;
* малый размер пакета для минимизации расходов на трафик;
* асинхронность и управляемый QoS для работы на неустойчивых каналах связи;
* использование каналов связи, инициируемых полевыми устройствами, позволяет избежать необходимости выделения для них "белых" IP-адресов.

## Идентификация передаваемых данных

Имеются два механизма идентификации передаваемых данных:

* топики;
* структурированные данные.

В первом варианте данные идентифицируются путём в адресном пространстве брокера (ключ), значение передаётся в неупакованном виде.
Для реализации второго варианта используется упаковка данных (обычно) в JSON-структуру, внутри которой передаются пары "ключ-значение".

Первый вариант считается более универсальным и более простым для обработки.

Второй вариант применяется в тех случаях, когда необходимо гарантировать совместную передачу нескольких пар "ключ-значение" (принцип транзакции) - например "значение + единица измерения + отметка времени".

## Принципы работы

Сеть передачи данных с протоколом MQTT строится на базе серверов обмена данными (брокеров).

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

Потребитель информации (например, SCADA-система) выполняет однократный запрос брокеру на получение данных определённого топика (процедура подписки). При наличии на сервере данных с флагом retain - потребителю будут немедленно переданы последние полученные сервером данные этого топика.

Сервер обмена (брокер) выполняет следующие функции:

* принимает данные от оконечных узлов;
* при наличии в принятых данных флага retain - выполняет хранение последнего переданного значения данного топика;
* обрабатывает запросы на получение данных от подписчиков, по получению данных от оконечных устройств - осуществляет немедленную их ретрансляцию получателям;
* при необходимости выполняет передачу данных другим брокерам, в т.ч. с изменением топика (функция моста);
* обеспечивает аутентификацию оконечных устройств и получателей данных, защиту каналов передачи.

## Безопасность

В самом протоколе присутствую средства аутентификации пользователей, однако их стойкость невысока [1]. Для повышения устойчивости к прослушиванию и перехвату рекомендуется применять защиту канала при помощи SSL/TLS c применением сертификатов X509 [2].