MQTT

MQTT ist ein Protokoll, mit dem Geräte kleine Nachrichten austauschen, ohne sich gegenseitig zu kennen. Es ist in der Heimautomatisierung, im Internet der Dinge und zunehmend in der Industrie verbreitet und sendet dort Messwerte, Schaltzustände und Befehle.

Entstanden ist es 1999 bei IBM und Arcom, um Messwerte von Ölpipelines über Satellitenverbindungen zu übertragen. Die Anforderungen dieser Umgebung prägen das Protokoll bis heute: wenig Bandbreite, hohe Verzögerung, Verbindungen, die jederzeit abbrechen können. Ein MQTT-Telegramm kommt im einfachsten Fall mit zwei Byte Kopfdaten aus.

Die Buchstaben standen ursprünglich für Message Queuing Telemetry Transport. Seit der Standardisierung durch die OASIS gilt MQTT als Eigenname ohne Auflösung.

Publish und Subscribe

Der Unterschied zu einer gewöhnlichen Verbindung liegt darin, dass Sender und Empfänger nie direkt miteinander sprechen. Dazwischen steht ein Broker, bei dem sich alle Beteiligten anmelden.

Ein Gerät, das Daten hat, veröffentlicht sie zu einem Thema (publish). Ein Gerät, das Daten braucht, abonniert dieses Thema (subscribe). Der Broker nimmt jede Veröffentlichung entgegen und stellt sie allen Abonnenten zu.

Daraus folgt die Eigenschaft, die MQTT ausmacht: Der Sensor weiß nicht, wer seine Werte liest, und der Empfänger weiß nicht, woher sie kommen. Kommt ein weiterer Abonnent hinzu, ändert sich am Sensor nichts. Fällt ein Empfänger aus, sendet der Sensor unverändert weiter.

MQTT · VERÖFFENTLICHEN, VERTEILEN, ABONNIEREN veröffentlichen verteilen abonnieren Temperatursensor Fensterkontakt haus/wohnzimmer/temperatur haus/wohnzimmer/fenster Broker nimmt an, stellt zu Port 1883 · 8883 (TLS) Visualisierung haus/# Heizungssteuerung haus/+/temperatur Datenbank haus/# + steht für genau eine Ebene — haus/+/temperatur erfasst Wohnzimmer und Keller, aber nichts darunter. # steht für alle Ebenen darunter und darf nur am Ende stehen. Sender und Empfänger kennen einander nicht — beide kennen nur den Broker. netzikon.net
MQTT Architektur

Der Preis dafür ist der Broker selbst. Er ist die zentrale Stelle, über die alles läuft — und damit auch die Stelle, deren Ausfall alles lahmlegt.

MQTT Topics

Ein Thema ist eine Zeichenkette, die hierarchisch mit Schrägstrichen gegliedert wird:

haus/wohnzimmer/temperatur
haus/wohnzimmer/fenster
haus/keller/heizung/vorlauf

Themen müssen nicht angelegt werden. Ein Thema existiert, sobald jemand dazu veröffentlicht oder es abonniert — eine Verwaltung oder ein Verzeichnis gibt es nicht.

Beim Abonnieren sind zwei Platzhalter erlaubt:

  • + steht für genau eine Ebene. haus/+/temperatur erfasst die Temperatur aus Wohnzimmer und Keller, nicht aber haus/keller/heizung/vorlauf.
  • # steht für alle darunterliegenden Ebenen und darf nur am Ende stehen. haus/# erfasst alles.

Eine durchdachte Struktur zahlt sich aus, weil sich Abonnements sonst nicht sinnvoll bilden lassen. Als Faustregel steht das Allgemeine vorn und das Besondere hinten, und in den Pfad gehören keine Werte, sondern nur Orte und Bezeichnungen.

Dienstgüte

Für jede Nachricht lässt sich festlegen, wie zuverlässig sie zugestellt wird:

StufeZusageVerhalten
0höchstens einmalSenden und vergessen, keine Bestätigung
1mindestens einmalWiederholung bis zur Bestätigung, Doppelte möglich
2genau einmalZweistufiger Austausch, keine Doppelten

Stufe 0 genügt für Messwerte, die ohnehin laufend neu kommen — ein verlorener Temperaturwert ist belanglos, der nächste folgt in einer Minute. Stufe 1 passt für Schaltbefehle, sofern eine doppelte Ausführung unschädlich ist. Stufe 2 kostet den meisten Aufwand und ist nur dort nötig, wo eine Wiederholung Schaden anrichtet, etwa bei einem Zählerstand, der aufaddiert wird.

Die Stufe gilt dabei jeweils für eine Strecke: Was der Sender mit dem Broker vereinbart, muss nicht dem entsprechen, was der Broker mit dem Empfänger vereinbart.

Drei Eigenheiten, die den Unterschied machen

Retained Message. Normalerweise bekommt ein Abonnent nur Nachrichten, die nach seiner Anmeldung eintreffen. Ist eine Nachricht als retained gekennzeichnet, behält der Broker sie als letzten bekannten Wert des Themas und stellt sie jedem neuen Abonnenten sofort zu. Ohne das würde eine frisch gestartete Visualisierung leer bleiben, bis jeder Sensor zufällig das nächste Mal sendet.

Last Will and Testament. Beim Verbindungsaufbau kann ein Gerät eine Nachricht hinterlegen, die der Broker veröffentlicht, wenn die Verbindung unerwartet abreißt. Damit lässt sich ein Ausfall erkennen, ohne dass jemand aktiv nachsehen muss — der übliche Weg, den Zustand eines Geräts als online oder offline zu führen.

Keep Alive. Das Gerät vereinbart ein Zeitintervall und meldet sich innerhalb dessen, auch wenn es nichts zu senden hat. Bleibt die Meldung aus, gilt die Verbindung als tot, und der letzte Wille wird ausgelöst.

Was MQTT nicht regelt

Der Inhalt einer Nachricht ist dem Protokoll gleichgültig. Es überträgt eine Folge von Bytes und kümmert sich nicht darum, ob darin eine Zahl, ein Text oder ein strukturiertes Format steht. In der Praxis hat sich JSON durchgesetzt, verbindlich ist das nicht.

Damit fehlt MQTT dieselbe Eigenschaft wie Modbus: Es beschreibt sich nicht selbst. Wer ein fremdes System anbindet, braucht eine Dokumentation der Themen und Inhalte oder muss den Datenverkehr mitlesen.

Sicherheit

MQTT läuft über TCP, standardmäßig auf Port 1883. Benutzername und Kennwort sind vorgesehen, werden dort aber im Klartext übertragen. Erst der Betrieb über TLS auf Port 8883 sichert sowohl die Zugangsdaten als auch den Inhalt.

Ein Broker sollte zusätzlich regeln, wer welche Themen lesen und beschreiben darf. Ohne solche Regeln kann jeder angemeldete Client alles mitlesen und in jedes Thema schreiben — einschließlich der Themen, über die Schaltbefehle laufen.

Offen im Internet erreichbare Broker ohne Authentisierung sind ein verbreiteter Fund bei Sicherheitsuntersuchungen. Sie geben nicht nur Daten preis, sondern erlauben auch das Schalten von allem, was auf Befehle hört.

Versionen

Verbreitet sind zwei Fassungen. MQTT 3.1.1 ist der langjährige Standard und wird von praktisch jedem Gerät unterstützt. MQTT 5.0 ergänzt vor allem aussagekräftige Fehlercodes statt eines bloßen Verbindungsabbruchs, frei definierbare Zusatzfelder an jeder Nachricht, eine ablaufende Sitzung sowie geteilte Abonnements, bei denen sich mehrere Empfänger die Nachrichten eines Themas aufteilen.

Für einfache Aufbauten genügt 3.1.1; die Erweiterungen von 5.0 zahlen sich vor allem bei vielen Geräten und in der Fehlersuche aus.

Abgrenzung

Gegenüber HTTP liegt der Unterschied in der Richtung: Bei HTTP fragt der Client, wenn er etwas wissen will. Bei MQTT hält das Gerät eine Verbindung offen und bekommt Nachrichten zugestellt, sobald sie entstehen. Für häufige kleine Meldungen ist das sparsamer, weil nicht für jede Abfrage eine Verbindung aufgebaut wird.

Gegenüber Modbus liegt der Unterschied in der Rollenverteilung. Modbus fragt ab, MQTT meldet. Beide Ansätze finden sich heute nebeneinander, oft mit einem Gateway dazwischen, das Modbus-Register ausliest und die Werte als MQTT-Nachrichten weitergibt.

Normen

  • OASIS MQTT Version 3.1.1 – OASIS Standard, 2014
  • OASIS MQTT Version 5.0 – OASIS Standard, 2019
  • ISO/IEC 20922 – Information technology, Message Queuing Telemetry Transport (MQTT) v3.1.1

Weblinks

Erstellt: