Протокол MQTT
MQTT (Message Queue Telemetry Transport) - лёгкий сетевой протокол работающий поверх TCP/IP. Используется для обмена сообщения между устройствами по принципу издатель-подписчик (publish–subscribe).

История создания

Первая версия протокола была разработан доктором Энди Станфорд-Кларком (IBM) и Арлен Ниппер (Arcom) в 1999 и опубликована под роялти-фри лицензией. Спецификация MQTT 3.1.1 была стандартизирована консорциумом OASIS в 2014 году.

Возможности

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

  • Прост в использования. Протокол представляет собой программный блок без лишней функциональности, который может быть легко встроен в любую сложную систему;
  • Паттерн проектирования издатель-подписчик удобен для большинства решений с датчиками. Дает возможность устройствам выходить на связь и публиковать сообщения, которые не были бы заранее известны или предопределены;
  • Легок в администрировании;
  • Снижена нагрузку на канал связи. Сообщения, насколько это возможно, несут в себе только полезную нагрузку;
  • Работа в условиях постоянной потери связи или других проблем на линии;
  • Нет ограничений на формат передаваемого контента.

Реализация

Брокер

Mosquitto - платформа, реализующая возможность обмена сообщениями между компонентами системы на базе стандартов протокола MQTT версии 3.1 и 3.1.1
Mosquitto написан на C и распространяется под лицензией BSD.

Устанавливаем и запускаем

$ apt-get install mosquitto
$ mosquitto

Брокеры могут быть сконфигурированы мостом. Например брокер A может перенаправлять сообщения, пришедшие на определенный канал, брокеру B. Таким образом вы можете масштабировать ваше решение.

Соединение мостом

Издатель-подписчик

Paho - реализации протокола обмена сообщений MQTT на популярных языках программирования.

  • C/C++ (Windows/Unix/Mac/embedded systems)
  • Java (J2SE Client/Android Service)
  • JavaScript Client
  • Python Client
  • Go Client
  • C# (.Net/WinRT Client)

Примеры на Python

Устанавливаем библиотеку из репозиториев pip. И запускаем брокер mosquitto на локальном хосте.

$ pip install paho-mqtt

Подписчик (Subscriber)

Этот компонент является подписчиком. Подключается к брокеру по умолчанию на порт 1883 и слушает канал (topic) в ожидании новых сообщений.

from paho.mqtt import client


def on_connect(client, userdata, rc):  
    print("Connected with result code: %s" % rc)
    client.subscribe("mqtt/paho/test")

def on_message(client, userdata, msg):  
    print("%s: %s" % (msg.topic, msg.payload))

def main():  
    subscriber = client.Client()
    subscriber.on_connect = on_connect
    subscriber.on_message = on_message

    subscriber.connect("localhost")
    subscriber.loop_forever()

if __name__ == "__main__":  
    main()

Издатель (Publisher)

Назначение этого компонента публиковать сообщения. Сообщения можно передавать списком.

from paho.mqtt import publish


def main():  
    msgs = [{'topic': "mqtt/paho/test", 'payload': "hello"},
            {'topic': "mqtt/paho/test", 'payload': "world"}]
    publish.multiple(msgs, hostname="localhost")

if __name__ == "__main__":  
    main()

Примеры использования

Наиболее известные примеры использования: