Protokolle und Daten

Was ist MQTT? Das MQTT-Protokoll erklärt

MQTT ist ein Publish-Subscribe-Protokoll: Clients senden an Topics eines Brokers, der an die Subscriber weiterleitet. Topics, QoS, Ports, MQTT 5.

MQTT ist ein schlankes Publish-Subscribe-Protokoll für Nachrichten. Geräte und Anwendungen verbinden sich mit einem Server, dem Broker, und senden Nachrichten an benannte Topics wie site/dub01/mdb1/main-incomer. Jeder Client, der dieses Topic abonniert hat, erhält die Nachricht vom Broker. Publisher und Subscriber adressieren einander nie; ein Zähler, ein Dashboard und eine Cloud-Plattform können also Daten teilen, ohne voneinander zu wissen. MQTT läuft über TCP auf Port 1883 oder über TLS auf Port 8883, und sein fester Header ist nur zwei Byte lang. Weil sich jedes Gerät ausgehend mit dem Broker verbindet und beliebig viele Systeme dieselben Daten abonnieren können, ist es zum gängigsten Protokoll geworden, um Sensor- und Zählerdaten über das Internet zu senden.

So funktioniert MQTT

TeilWas es tutBeispiel
BrokerNimmt Verbindungen an, prüft Berechtigungen und leitet jede Nachricht an passende Subscriber weiterEclipse Mosquitto auf einem Server oder ein Cloud-IoT-Dienst
ClientJedes Gerät und jede Anwendung, die sich mit dem Broker verbindet, um zu veröffentlichen, zu abonnieren oder beidesEin Gateway, ein Dashboard, ein Datenbank-Schreiber
TopicEine Textadresse mit Ebenen, getrennt durch /site/dub01/mdb1/main-incomer
NachrichtEin Topic, Nutzdaten bis 256 MB und einige FlagsEin JSON-Objekt mit den Messwerten
AbonnementEin Topic-Filter, optional mit Platzhalternsite/dub01/#
QoSDie Bestätigungsstufe auf jedem Abschnitt0, 1 oder 2
SitzungWas der Broker über die Abonnements und nicht zugestellten Nachrichten eines Clients behältBleibt bei einer Neuverbindung erhalten, wenn der Client es verlangt

Ein Client öffnet eine TCP-Verbindung zum Broker und sendet CONNECT mit seiner Client-ID, Zugangsdaten und einem Keep-Alive-Intervall. Der Broker antwortet mit CONNACK. Ein Publisher sendet dann PUBLISH-Pakete; ein Subscriber sendet SUBSCRIBE mit einem oder mehreren Topic-Filtern, und der Broker schickt ihm ab dann jedes passende PUBLISH. Läuft innerhalb des Keep-Alive-Intervalls kein Paket, sendet der Client PINGREQ, und der Broker schließt eine Verbindung, die anderthalb Intervalle lang still bleibt.

Weil jeder Client eine ausgehende Verbindung zum Broker aufbaut, braucht ein Gateway am Standort keinen offenen eingehenden Port. Das ist der wichtigste praktische Grund, warum MQTT die abgefragten Protokolle für den Datenversand vom Standort abgelöst hat.

Topics und Platzhalter

Topics sind Zeichenketten, bei denen Groß- und Kleinschreibung zählt. Ein Client legt kein Topic an; er veröffentlicht darauf, und der Broker leitet die Nachricht an jedes passende Abonnement weiter. Ein Abonnement kann zwei Platzhalter verwenden:

FilterPasst aufPasst nicht auf
site/dub01/mdb1/+site/dub01/mdb1/main-incomer, site/dub01/mdb1/chiller-2site/dub01/mdb1/chiller-2/alarm
site/dub01/#Jedes Topic unter site/dub01, in beliebiger Tiefesite/cork02/mdb1/main-incomer
site/+/mdb1/main-incomerDiesen Zähler an jedem StandortAndere Zähler

+ steht für genau eine Ebene und # für den ganzen Rest des Baums, deshalb muss es am Ende stehen. Topics, die mit $ beginnen, sind dem Broker vorbehalten, etwa $SYS/ für Broker-Statistiken, und ein Filter, der mit einem Platzhalter beginnt, passt nicht auf sie.

Planen Sie den Topic-Baum, bevor das erste Gerät veröffentlicht, denn jeder Subscriber und jede Zugriffsregel hängt davon ab. Ein guter Baum läuft vom weitesten zum engsten Bereich (Organisation, Standort, Verteilung, Gerät, dann die Art der Nachricht), führt jedes Gerät an genau einer Stelle und enthält keine veränderlichen Werte wie einen Messwert, einen Zeitstempel oder eine Sitzungsnummer. Trennen Sie Telemetrie-, Status- und Befehls-Topics, damit Schreibrechte nur dort vergeben werden, wo sie nötig sind.

QoS, Retain-Nachrichten und Last Will

MQTT kennt drei Zustellstufen. Sie gelten jeweils für einen Abschnitt: vom Publisher zum Broker und vom Broker zu jedem Subscriber.

QoSZustellungPakete auf einem AbschnittTypische Verwendung
0Höchstens einmalPUBLISHHäufige Messwerte, bei denen ein verlorener bald ersetzt wird
1Mindestens einmal, Duplikate möglichPUBLISH, PUBACKZählerwerte und Ereignisse, die ankommen müssen
2Genau einmal auf diesem AbschnittPUBLISH, PUBREC, PUBREL, PUBCOMPSelten; kostet vier Pakete pro Nachricht

Eine Retain-Nachricht behält der Broker als letzten Wert ihres Topics und sendet sie sofort an jeden neuen Subscriber. Das passt zu einem Gerätestatus, kann aber einen veralteten Messwert ausliefern. Ein Last Will ist eine Nachricht, die der Broker für einen Client veröffentlicht, wenn dessen Verbindung ohne sauberes DISCONNECT abreißt; so erfährt ein Subscriber, dass ein Gateway offline ist. Der Leitfaden zu MQTT-QoS und Retain-Nachrichten behandelt beides ausführlich, mit Ablaufzeiten von Nachrichten und dauerhaften Sitzungen.

MQTT-Ports und Sicherheit

PortTransportVerwendung
1883TCPMQTT ohne Verschlüsselung: nur in einem geschlossenen lokalen Netz
8883TLS über TCPMQTTS: die normale Wahl über das Internet oder ein geteiltes Netz
443 (oder ein anderer)WebSocket über TLSBrowser und Netze, die nur HTTPS zulassen

MQTT selbst hat ein Feld für Benutzername und Passwort und sonst nichts. Verschlüsselung, Serveridentität und Client-Zertifikate kommen von TLS, die Zugriffskontrolle von den Regeln des Brokers, welcher Client auf welche Topics veröffentlichen oder sie abonnieren darf. Der MQTTS-Leitfaden erklärt Zertifikate, die Prüfung des Servernamens und wie man eine TLS-Verbindung auf der Kommandozeile testet.

MQTT 3.1.1 und MQTT 5 im Vergleich

MQTT wurde 1999 für die Telemetrie von Pipelines über Satellitenverbindungen entwickelt. OASIS hat MQTT 3.1.1 2014 als Standard veröffentlicht, der 2016 zu ISO/IEC 20922 wurde, und MQTT 5.0 im Jahr 2019. Die meisten Broker unterstützen beide, und viele Geräte sprechen nur 3.1.1.

MQTT 3.1.1MQTT 5.0
BestätigungenErfolg oder einige CONNACK-CodesEin Reason Code auf jeder Bestätigung, auch bei Ablehnung
SitzungClean Session ein oder ausAblaufzeit der Sitzung
Lebensdauer einer NachrichtKeineAblaufzeit der Nachricht
MetadatenKeineUser Properties, Content Type, Payload Format Indicator
LastverteilungAbhängig vom BrokerShared Subscriptions ($share/group/topic)
BandbreiteJedes Mal das volle TopicTopic-Aliase ersetzen ein langes Topic durch eine Zahl
Anfrage und AntwortPer KonventionAntwort-Topic und Korrelationsdaten
FlusssteuerungKeineReceive Maximum und maximale Paketgröße

Für Telemetrie sind die Reason Codes am nützlichsten, weil ein Client sieht, dass der Broker eine Nachricht abgelehnt hat, und die Ablaufzeit von Nachrichten, weil ein durch einen Ausfall verzögerter Befehl verworfen statt verspätet ausgeführt wird.

Payloads: JSON, Sparkplug B und der Datenvertrag

MQTT überträgt Bytes und sagt nichts über ihre Bedeutung. Die meisten Energieplattformen erwarten JSON, zum Beispiel:

JSON
{"ts":"2026-10-28T09:15:00Z","kW":184.2,"kWh":1532871.4,"V1":231.4,"PF":0.94,"q":"good"}

Das Topic sagt, welcher Zähler es ist; die Nutzdaten tragen die Messzeit, die Werte und ein Qualitätskennzeichen. Die Einheiten und die Bedeutung jedes Schlüssels müssen schriftlich festgehalten und mit jedem Subscriber vereinbart werden: kW oder W, Bezug oder Saldo, die Zeit des Zählers oder die Zeit, zu der das Gateway den Wert empfangen hat. Diese Vereinbarung, nicht die MQTT-Unterstützung, lässt zwei Systeme zusammenarbeiten. Der Leitfaden zur Interoperabilität listet, was ein Datenvertrag festlegen sollte, und der Leitfaden zu Messzeit und Ankunftszeit erklärt, warum die Messzeit in die Nutzdaten gehört.

Sparkplug B, eine in Industriesystemen verbreitete Spezifikation der Eclipse Foundation, legt den Vertrag stattdessen fest. Topics folgen dem Muster spBv1.0/<group>/<message type>/<edge node>/<device>, die Nutzdaten sind binäre Protocol Buffers, und jeder Edge-Knoten veröffentlicht ein Birth Certificate mit seinen Messgrößen und ein Death Certificate (über den Last Will), wenn er die Verbindung verliert. Ein Subscriber kann so Geräte erkennen und Daten ohne eigene Absprache als veraltet markieren, um den Preis eines binären Formats, das einen Sparkplug-fähigen Client zum Lesen braucht.

Rechenbeispiel: Wie viele Daten verbraucht MQTT-Telemetrie?

Fünfzig Zähler veröffentlichen alle 10 Sekunden die obige JSON-Nachricht mit QoS 1. Die Nutzdaten sind 88 Byte lang, das Topic 28 Byte, jedes PUBLISH-Paket also etwa 122 Byte. TLS fügt etwa 22 Byte pro Record hinzu, TCP und IP etwa 52 Byte pro Segment; jede Nachricht belegt auf der Leitung also rund 200 Byte.

Eine Nachricht pro ZählerEine Nachricht pro Standort
Nachrichten pro Tag50 × 8.640 = 432.0008.640
Größe jeder Nachricht auf der Leitungetwa 200 Byteetwa 3.900 Byte (50 Messwerte)
Gesendete Daten pro Tagetwa 86 MBetwa 34 MB
Daten pro Monatetwa 2,6 GBetwa 1 GB

Die Nachricht pro Standort trägt die 50 Messwerte als ein JSON-Array von etwa 3.650 Byte (etwa 73 Byte pro Zähler, mit einem Zeitstempel für die ganze Nachricht) plus Topic und Header, die TCP auf drei Segmente verteilt.

Die zurückkommenden PUBACKs kosten im ersten Fall noch einmal rund 30 MB am Tag. Über einen Festnetzanschluss spielt das keine Rolle; über eine Mobilfunk-SIM entscheidet es über den Datentarif. Die Messwerte eines Standorts in einer Nachricht zu bündeln oder nur Änderungen zu senden senkt den Overhead. Der Intervallleistungsrechner hilft, ein Intervall zu wählen, das die Frage, für die die Daten gedacht sind, noch beantwortet.

MQTT im Vergleich mit anderen Protokollen

MQTTHTTP (REST)Modbus TCPOPC UA
MusterPublish-Subscribe über einen BrokerAnfrage und AntwortAnfrage und Antwort, der Client fragt abClient und Server mit Subscriptions; auch ein Publish-Subscribe-Modus
Wer verbindet sichJeder Client verbindet sich ausgehend mit dem BrokerClient zum ServerClient zu jedem GerätClient zu jedem Server
DatenmodellKeines: Nutzdaten freiKeines: durch die API festgelegtNummerierte RegisterTypisierte Knoten mit Einheiten und Status
Typischer EinsatzVom Standort in die Cloud, vom Gerät zur PlattformGelegentliche Uploads, Web-APIsZähler und Regler vor OrtAnlagensysteme und SCADA

MQTT ist meist die Verbindung vom Standort zur Plattform, während Modbus, BACnet und OPC UA die Geräte vor Ort lesen. Der Vergleich OPC UA, Modbus und MQTT stellt sie für Industrieprojekte gegenüber, und Was ist Modbus? erklärt die abgefragte Seite.

MQTT mit EpiSensor

Edge auf dem ZGW-20 Gateway liest Zigbee-, Modbus-, BACnet- und LoRaWAN-Geräte vor Ort, speichert jeden Messwert mit seiner Messzeit und veröffentlicht als MQTT-Client an den Broker einer Plattform, normalerweise über MQTTS auf Port 8883 mit einem Client-Zertifikat. Es veröffentlicht mit QoS 1 und hält fehlgeschlagene Zustellungen in einer lokalen Warteschlange, die es mit den ursprünglichen Zeitstempeln wiedergibt, sobald der Broker wieder erreichbar ist. Topics und Nutzdaten folgen dem Vertrag der Plattform, und Edge mit Ihrer Plattform verbinden zeigt, auf welchen Wegen Edge Daten weitergibt.

Häufige Fragen

Wofür wird MQTT verwendet?

MQTT überträgt kleine, häufige Nachrichten zwischen Geräten und Anwendungen: Sensor- und Zählerwerte, Statusänderungen und Befehle. Es wird in der Gebäude- und Energieüberwachung, für industrielle Telemetrie, Fahrzeugortung und Hausautomation eingesetzt, weil eine Verbindung pro Gerät genügt und der Protokoll-Overhead nur wenige Byte pro Nachricht beträgt.

Was ist ein MQTT-Broker?

Der Broker ist der Server im Zentrum von MQTT. Clients verbinden sich mit ihm, veröffentlichen Nachrichten auf Topics und abonnieren Topics. Der Broker prüft die Berechtigungen jedes Clients, führt Sitzungen und Retain-Nachrichten und leitet jede Nachricht an jeden Client mit passendem Abonnement weiter. Eclipse Mosquitto, EMQX und HiveMQ sind verbreitete Broker, und die großen Cloud-IoT-Dienste enthalten einen.

Welchen Port verwendet MQTT?

TCP-Port 1883 für MQTT ohne Verschlüsselung und TCP-Port 8883 für MQTT über TLS (MQTTS). Beide sind bei der IANA registriert. MQTT über WebSockets hat keinen festen Port; es läuft oft auf 443 hinter einem Webserver, was hilft, wenn eine Firewall nur HTTPS zulässt.

Läuft MQTT über TCP oder UDP?

MQTT läuft über TCP oder über einen anderen Transport, der Bytes verlustfrei und in der richtigen Reihenfolge liefert, etwa TLS oder WebSockets. Ein eigenes Protokoll, MQTT-SN, ist für Sensornetze gedacht und kann über UDP laufen.

Was ist der Unterschied zwischen MQTT und HTTP?

HTTP arbeitet mit Anfrage und Antwort: Ein Client fragt einen Server und wartet auf die Antwort, und für jedes Datum ist eine neue Anfrage nötig. MQTT hält eine Verbindung offen, und der Broker schiebt jede Nachricht beim Eintreffen an die Subscriber. Für häufige kleine Messwerte braucht MQTT weniger Bandbreite und liefert Änderungen schneller; HTTP ist einfacher für gelegentliche Uploads und für Systeme, die nur eine REST-API anbieten.

Was ist der Unterschied zwischen MQTT 3.1.1 und MQTT 5?

MQTT 5 behält dasselbe Modell und ergänzt Reason Codes auf jeder Bestätigung, Ablaufzeiten für Nachrichten und Sitzungen, User Properties, Shared Subscriptions, Topic-Aliase sowie Antwort-Topics für Anfrage und Antwort. Ein Broker mit MQTT 5 nimmt weiterhin Clients mit MQTT 3.1.1 an, deshalb laufen beide oft nebeneinander.

Was ist Sparkplug B?

Sparkplug ist eine Spezifikation der Eclipse Foundation, die MQTT um einen festen Topic-Namensraum, ein binäres Payload-Format sowie Birth- und Death-Nachrichten ergänzt. Ein Subscriber kann so die Messgrößen jedes Edge-Knotens erkennen und weiß, wann dessen Daten veraltet sind. MQTT selbst definiert nichts davon.