Message Queue Telemetry Transport

von Steve Liedtke

MQTT ist ein offenes Nachrichtenprotokoll im Bereich Internet of Things (IoT)

MQTT - Geschichte

  • 1999 von Andy Stanford-Clark (IBM) und Arlen Nipper (Cirrus Link Solutions) entwickelt
  • 2013 von IBM als Open-Source herausgegeben
  • 2014 über OASIS standardisiert

Eigenschaften von MQTT

  • Leichtgewichtig
  • Batterieschonend
  • Bandbreitenschonend
  • Gleichzeitige Nachrichtenübermittlung an viele Geräte
  • Kleine Client-Bibliotheken
  • Minimaler Protokolloverhead
  • Daten-agnostisch (keine Präferenz zu bestimmten Datenformaten)

Publish / Subscribe

  • Sender sind Publisher, Empfänger sind Subscriber
  • Sender und Empfänger kennen sich nicht
  • Zum Senden und Empfangen von Nachrichten wird ein Vermittler benötigt

Broker

  • Als Vermittler (Broker) wird ein zentraler Server/Rechner benötigt
  • Broker weiß an welchen Subscriber eine Nachricht gesendet werden muss
  • Es können über MQTT Bridges auch mehrere Broker eingesetzt werden
  • Beliebter MQTT Broker: Mosquitto

Reservierte Ports (IANA)

  • 1883
  • 8883

MQTT im Detail

Technisch

  • Baut auf dem TCP/IP Stack auf
  • Jeder Client ist mit dem Broker verbunden

Topics

  • Ein Topic stellt dar an welche Empfänger eine Nachricht geschickt wird
  • Empfänger teilen dem Broker mit, dass sie Nachrichten zu einem Topic erhalten wollen
  • Ein Sender sendet eine Nachricht unter einem Topic an den Broker
  • Broker leitet die Nachricht an die entsprechenden Empfänger weiter

Topic-Level

  • Ein Topic besteht aus 1 oder mehreren Topic-Leveln
  • Jedes Level ist durch ein Slash (/) separiert
  • Beispiel: HackerspaceBremen/Hauptraum/Temperatur

Topic-Eigenschaften

  • Besteht aus einer UTF-8 Zeichenkette
  • Mindestens 1 Zeichen
  • Leerzeichen sind erlaubt
  • Topic-Name ist Case-Sensitive
  • Einzelner / ist erlaubt

Topic-Wildcards

  • Empfänger kann mehrere Topics auf einmal abonnieren
  • Sender kann Wildcards nicht nutzen
  • +
    • Wildcard für ein Level
  • #
    • Wildcard für mehrere Level

Homie

  • Nicht Teil von MQTT
  • git.io/homieiot
  • Versuch Topic-Namen für Gerätschaften zu standardisieren

Quality of Service (QoS)

  • Regelt Garantie der Zustellung
  • Erleichtert Kommunikation in unzuverlässigen Netzwerken
  • QoS-0: Bestenfalls einmal
  • QoS-1: Mindestens einmal
  • QoS-2: Genau einmal

QoS-0

  • Zustellung nicht garantiert
  • Broker bestätigt nicht den Empfang einer Nachricht gegenüber Sender

QoS-1

  • Zustellung wird garantiert
  • Broker bestätigt Empfang einer Nachricht gegenüber Sender
  • Empfänger bestätigt nicht den Erhalt der Nachricht
  • Duplikate sind möglich

QoS-2

  • Zustellung wird garantiert
  • Broker bestätigt Empfang einer Nachricht gegenüber Sender
  • Empfänger bestätigt nicht den Erhalt der Nachricht
  • Duplikate sind möglich

Retained Message

  • Normale Nachricht mit retained Flag
  • Broker speichert letzte Retained Message und QoS Level für Topic
  • Jeder Empfänger erhält die Nachricht direkt nachdem ein Topic abonniert wurde

Last Will and Testament

  • Benachrichtigung anderer Clients bei Verbingsabbruch
  • LWT wird an ein Topic gesendet
  • LWT wird bei Verbindung mit Broker gesetzt
  • Broker sendet LWT an Empfänger wenn Client-Verbindung unterbrochen wird

Weiteres

  • Keep alive
  • Persistente Sitzungen
  • Verschlüsselung über TLS
  • Authentifizierung

Codebeispiele

Client-Bibliotheken

  • Es gibt für nahezug jede Programmiersprache Client-Bibliotheken, u.a.

Java

Verbindung zum Broker

MqttClient mqttClient = 
            new MqttClient("tcp://iot.eclipse.org","generated_clientId");

mqttClient.connect();

Java

Nachricht senden

mqttClient.publish("HackerspaceBremen/Hauptraum/Temperatur", 
            new MqttMessage("36.2".getBytes()));

Java

Nachricht empfangen

mqttClient.subscribe("HackerspaceBremen/Hauptraum/Temperatur", 
            new IMqttMessageListener() {
			
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // message arrived
    }
});

Arduino

siehe Beispiel auf Github

ESP8266

siehe Beispiel auf Github

MQTT-SN

MQTT for Sensor Networks

  • Einbindung von Geräten ohne TCP/IP
  • Diese können über verschiedene Protokolle (z.B. Zigbee, Bluetooth Low Energy) angebunden werden
  • Gateway bindet Geräte in MQTT-Netzwerk ein
  • MQTT-SN ermöglicht kleineren Footprint (z.B. Topic-Id statt Name)

Vielen Dank für eure Aufmerksamkeit!

Quellen

Weitere Informationen