MQTT einfach erklĂ€rt: Was ist MQTT und warum ist es perfekt fĂŒr IoT?
MQTT ist das Kommunikationsprotokoll fĂŒr IoT-Projekte â egal ob du mit einem ESP32 Sensordaten ĂŒbertrĂ€gst, ein Dashboard mit Node-RED aufbaust oder komplexe Smart-Home-Systeme betreibst.
Doch nicht nur im Hobbybereich spielt MQTT eine Rolle: Auch in Enterprise-Projekten, Industrieanwendungen und skalierbaren Cloud-Systemen ist MQTT lĂ€ngst etabliert. Immer dann, wenn viele GerĂ€te zuverlĂ€ssig und effizient miteinander kommunizieren mĂŒssen, kommt dieses Protokoll ins Spiel.
đ MQTT ist ein leichtgewichtiges Publish/Subscribe-Protokoll zur Ăbertragung von Nachrichten zwischen GerĂ€ten.
https://youtu.be/UScUhc0y6AU
Dieser Beitrag ist der Auftakt zu einer mehrteiligen MQTT-Serie.
Wir starten mit den Grundlagen und bauen direkt ein erstes kleines Testsystem auf. In den folgenden Teilen greifen wir dann Daten aus verschiedenen smarten Systemen ab, ĂŒbertragen diese per MQTT und verarbeiten sie weiter â z. B. in Node-RED oder eigenen Anwendungen.
Was bedeutet MQTT eigentlich?
Bevor wir tiefer einsteigen, stellt sich erstmal eine einfache Frage: đ WofĂŒr steht MQTT eigentlich?
MQTT steht fĂŒr Message Queuing Telemetry Transport.
Klingt im ersten Moment etwas sperrig â lĂ€sst sich aber ziemlich einfach herunterbrechen:
- Message â es werden Nachrichten ĂŒbertragen - Queuing â Nachrichten werden nicht direkt von GerĂ€t zu GerĂ€t gesendet, sondern ĂŒber eine zentrale Stelle gesammelt und verteilt - Telemetry â meist Sensordaten (z. B. Temperatur, Luftfeuchte, Statuswerte) - Transport â die Ăbertragung zwischen GerĂ€ten
Vereinfacht gesagt bedeutet das: MQTT ist ein Protokoll, das speziell dafĂŒr entwickelt wurde, Daten effizient zwischen GerĂ€ten auszutauschen, ohne dass diese direkt miteinander verbunden sein mĂŒssen.
Und genau das macht es so interessant fĂŒr IoT-Projekte.
Ein Mikrocontroller wie ein ESP32 kann seine Daten einfach âin den Raum sendenâ, ohne zu wissen, wer diese spĂ€ter empfĂ€ngt â sei es ein Dashboard, eine Datenbank oder ein anderes GerĂ€t.
Damit das Ganze funktioniert, braucht MQTT im Hintergrund eine zentrale Instanz, die alle Nachrichten entgegennimmt und verteilt.
Genau diese Rolle ĂŒbernimmt der sogenannte Broker.
Und genau diesen setzen wir jetzt gemeinsam auf.
MQTT Broker â Mosquitto mit Docker Compose
Damit wir unser Testsystem sauber und dauerhaft betreiben können, benötigen wir einen sogenannten MQTT-Broker. Dieser ĂŒbernimmt die zentrale Rolle in unserem Setup und verteilt spĂ€ter alle Nachrichten zwischen den GerĂ€ten.
Eine der bekanntesten und leichtgewichtigen Lösungen ist Eclipse Mosquitto.
Eine sehr gute und ausfĂŒhrliche Beschreibung zum offiziellen Docker-Image findest du direkt auf Docker Hub: https://hub.docker.com/_/eclipse-mosquitto
Image herunterladen
ZunÀchst laden wir uns das offizielle Image:
docker pull eclipse-mosquitto Docker Compose Datei erstellen
Jetzt erstellen wir eine eigene Docker-Compose-Datei:
nano mosquitto-docker-compose.yml
FĂŒge folgenden Inhalt ein:
services: mosquitto: image: eclipse-mosquitto container_name: mosquitto restart: unless-stopped ports: - "1883:1883" volumes: - ./mosquitto/config:/mosquitto/config - ./mosquitto/data:/mosquitto/data - ./mosquitto/log:/mosquitto/log mosquitto.conf anlegen
Die Datei mosquitto.conf wird nicht automatisch erstellt und muss daher einmalig von dir angelegt werden.
Zuvor muss jedoch die Verzeichnisstruktur angelegt werden, dafĂŒr gibt es zwei Möglichkeiten:
Variante 1: Der bequeme Weg
Du kannst den Container einmal kurz starten, damit die Verzeichnisstruktur automatisch angelegt wird:
docker compose -f mosquitto-docker-compose.yml up -d
AnschlieĂend stoppst du den Container wieder:
docker compose -f mosquitto-docker-compose.yml down
đ Danach sind die benötigten Ordner vorhanden und du kannst die Konfigurationsdatei hinzufĂŒgen.
Variante 2: Manuell anlegen
Alternativ kannst du die Struktur direkt selbst erstellen:
mkdir mosquitto; cd mosquitto; mkdir config; mkdir data; mkdir log; Berechtigungen auf die Verzeichnisse geben
Damit der Mosquitto Broker Service in die Verzeichnisse schreiben kann, mĂŒssen die berechtigungen angepasst werden.
sudo chown -R 1883:1883 config sudo chown -R 1883:1883 data sudo chown -R 1883:1883 log Konfigurationsdatei erstellen
Im Verzeichnis: ./mosquitto/config legst du nun die Datei mosquitto.conf an:
edit ./mosquitto/config/mosquitto.conf listener 1883 allow_anonymous true persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log
Editor - mosquitto.conf Broker erneut starten
Jetzt kannst du den Container wieder starten:
docker compose -f mosquitto-docker-compose.yml up -d Status prĂŒfen docker compose -f mosquitto-docker-compose.yml ps
MQTT Broker Mosquitto gestartet Logs anzeigen docker compose -f mosquitto-docker-compose.yml logs -f
Ausgabe der Logdatei des Mosquitto Brokers im Docker Container
Zugriff auf den MQTT Broker im Docker Container
Da wir den MQTT-Broker in einem Docker-Container betreiben, mĂŒssen wir fĂŒr einige Befehle direkt innerhalb des Containers arbeiten.
DafĂŒr können wir uns eine interaktive Shell im Container öffnen.
In den Container wechseln
ZunĂ€chst schauen wir uns an, wie unser Container heiĂt:
docker ps --format "{{.Names}}"
Ausgabe der Containernamen in der Konsole mit docker ps
In der Regel haben wir ihn bereits mosquitto genannt.
Nun wechseln wir in den Container:
docker exec -it mosquitto sh
Zugriff auf die Shell in einem Docker Container mit docker exec
Erstes Praxisbeispiel: Temperaturwert senden und empfangen
Nachdem unser MQTT-Broker lÀuft und wir Zugriff auf den Container haben, schauen wir uns jetzt ein erstes praxisnahes Beispiel an.
Ein klassisches Beispiel: Temperaturwerte.
Mosquitto MQTT Broker - Beispiel - Temperatur - Publisher und Subscriber Terminal 1 â Publisher
Der Publisher sendet eine Nachricht an den MQTT-Broker. Dieser verteilt die Nachricht anschlieĂend automatisch an alle Subscriber, die das entsprechende Topic abonniert haben.
mosquitto_pub -h localhost -t sensor/temperature -m "22.5"
Gibt es keinen Subscriber fĂŒr dieses Topic, wird die Nachricht zwar vom Broker entgegengenommen, aber nicht gespeichert und somit verworfen.
Retain-Flag
Mit dem Parameter retain kannst du dieses Verhalten beeinflussen.
Wird dieser auf true gesetzt, speichert der Broker die letzte gesendete Nachricht und liefert sie automatisch an neue Subscriber aus, sobald diese das Topic abonnieren.
mosquitto_pub -h localhost -t sensor/temperature -m "22.5" -r
Beispiel - senden einer MQTT Nachricht mit retain flag
Hinweis: Es wird dabei immer nur die letzte Nachricht gespeichert. Sobald eine neue Nachricht mit gesetztem Retain-Flag gesendet wird, ersetzt diese die vorherige.
Terminal 2 â Subscriber
Der Subscriber lauscht auf ein bestimmtes Topic und empfÀngt automatisch alle Nachrichten, die darauf veröffentlicht werden.
In unserem Beispiel ist das Topic:
sensor/temperature
Der Subscriber wird mit folgendem Befehl gestartet:
mosquitto_sub -h localhost -t sensor/temperature
Sobald nun eine Nachricht auf dieses Topic gesendet wird, erscheint sie direkt im Terminal.
Wichtig zu verstehen: Der Subscriber muss den Publisher nicht kennen. Er âhörtâ einfach auf das Topic und bekommt alle Nachrichten, die dort ankommen.
Topics strukturieren: GerÀte und Sensoren gruppieren
Ein groĂer Vorteil von MQTT ist die Möglichkeit, Topics hierarchisch zu strukturieren. Dazu werden die einzelnen Ebenen mit einem / getrennt.
So lassen sich GerÀte und Sensoren logisch gruppieren, zum Beispiel nach Ort und Funktion:
erdgeschoss/steckdosen erdgeschoss/lampen erdgeschoss/kueche/steckdosen erdgeschoss/kueche/lampen erdgeschoss/kueche/sensoren/temperatur erdgeschoss/kueche/sensoren/luftfeuchtigkeit erdgeschoss/wohnstube/steckdosen erdgeschoss/wohnstube/lampen erdgeschoss/wohnstube/sensoren/temperatur erdgeschoss/wohnstube/sensoren/luftfeuchtigkeit
Wildcards in MQTT: Mehrere Topics gleichzeitig abonnieren
Bisher haben wir einzelne Topics gezielt abonniert, zum Beispiel:
mosquitto_sub -h localhost -t erdgeschoss/kueche/lampen
Doch was passiert, wenn wir nicht nur einen Raum, sondern mehrere gleichzeitig ĂŒberwachen möchten?
đ Genau hier kommen sogenannte Wildcards ins Spiel.
Beispiel: Alle Lampen im Erdgeschoss
Mit folgendem Topic kannst du alle Lampen im Erdgeschoss abonnieren:
mosquitto_sub -h localhost -t erdgeschoss/+/lampen
Damit wĂŒrdest du z. B. folgende Topics empfangen:
- erdgeschoss/kueche/lampen - erdgeschoss/wohnstube/lampen
Beispiel - senden und empfangen von Nachrichten mit Wildcard auf einem Topic Wildcard # â mehrere Ebenen gleichzeitig abonnieren
Neben der + Wildcard gibt es noch eine zweite, sehr mÀchtige Möglichkeit: die # Wildcard
Bedeutung von #
Die Wildcard # steht fĂŒr beliebig viele Ebenen innerhalb eines Topics. Damit kannst du komplette Bereiche auf einmal abonnieren.
Wichtige Regel
Die # Wildcard darf nur am Ende eines Topics stehen.
Beispiel - Wildcard auf einer Ebene zu einem Topic in MQTT
Typischer Effekt bei Retained Messages
Wenn du ein Topic abonnierst und sofort alte Nachrichten angezeigt bekommst, liegt das in der Regel an sogenannten Retained Messages.
alte Nachrichten vom MQTT Broker
Der MQTT-Broker speichert dabei die letzte Nachricht pro Topic, wenn diese mit dem Retain-Flag (-r) gesendet wurde.
Beispiel
Du abonnierst: mosquitto_sub -h localhost -t erdgeschoss/# -v
đ Und erhĂ€ltst direkt mehrere Nachrichten, obwohl aktuell nichts gesendet wurde.
alte Nachrichten vom MQTT Broker welche via Retain Flag gesendet wurden Warum passiert das?
FĂŒr jedes Topic unterhalb von erdgeschoss/... kann eine retained Nachricht gespeichert sein.
Zum Beispiel:
- erdgeschoss/kueche/lampen - erdgeschoss/kueche/sensoren/temperatur - erdgeschoss/wohnstube/lampen
đ FĂŒr jedes dieser Topics wird die letzte gespeicherte Nachricht sofort ausgeliefert.
Retained Nachrichten löschen
Um eine retained Nachricht zu löschen, sendest du einfach eine leere Nachricht auf das gleiche Topic â ebenfalls mit gesetztem Retain-Flag:
mosquitto_pub -h localhost -t erdgeschoss/kueche/lampen -n -r
Alternativ:
mosquitto_pub -h localhost -t erdgeschoss/kueche/lampen -m "" -r
Fazit
Wenn du das Prinzip von Publish und Subscribe einmal verstanden hast und weiĂt, wie Topics aufgebaut sind und mit Wildcards funktionieren, ist der Einstieg in MQTT bereits geschafft.
Viele Dinge wirken am Anfang vielleicht etwas abstrakt â spĂ€testens nach den ersten eigenen Tests wird jedoch schnell klar, wie einfach und flexibel dieses System eigentlich ist.
Gerade die Möglichkeit, Daten unabhĂ€ngig voneinander zu senden und zu empfangen, macht MQTT so leistungsfĂ€hig und perfekt fĂŒr IoT-Projekte.
Ausblick
Im nÀchsten Beitrag gehen wir einen Schritt weiter in die Praxis:
Ich zeige dir anhand eines ESP32, wie du echte Sensordaten erfassen und auf ein MQTT-Topic senden kannst.
Diese Daten werden wir anschlieĂend weiterverarbeiten â zum Beispiel in Node-RED oder anderen Anwendungen.
đ Damit baust du dir Schritt fĂŒr Schritt dein eigenes kleines IoT-System auf.
FAQ â MQTT einfach erklĂ€rt
Was ist MQTT einfach erklÀrt?
MQTT ist ein leichtgewichtiges Kommunikationsprotokoll, mit dem GerÀte Nachrichten untereinander austauschen können.
Dabei senden GerÀte ihre Daten an ein sogenanntes Topic, ohne zu wissen, wer diese empfÀngt. Andere GerÀte können diese Topics abonnieren und die Daten verarbeiten.
Was ist ein MQTT Broker?
Ein MQTT-Broker ist die zentrale Instanz im System.
Er nimmt Nachrichten von Sendern (Publishern) entgegen und verteilt diese an alle EmpfÀnger (Subscriber), die das entsprechende Topic abonniert haben.
Ein hÀufig verwendeter Broker ist Eclipse Mosquitto.
Was ist ein Topic bei MQTT?
Ein Topic ist eine Art âAdresseâ oder âKanalâ, ĂŒber den Nachrichten gesendet werden.
Beispiel: sensor/temperature
GerĂ€te können gezielt auf bestimmte Topics hören und so nur die fĂŒr sie relevanten Daten empfangen.
Was bedeutet Publish und Subscribe? - Publish bedeutet, eine Nachricht an ein Topic zu senden - Subscribe bedeutet, ein Topic zu abonnieren und Nachrichten zu empfangen
Dieses Prinzip nennt man Publish/Subscribe-Modell.
Was ist der Unterschied zwischen MQTT und HTTP?
Der wichtigste Unterschied liegt im Kommunikationsmodell:
- HTTP arbeitet mit Anfrage und Antwort (Request/Response) - MQTT arbeitet mit Publish/Subscribe
MQTT ist dadurch deutlich effizienter und besser fĂŒr IoT-Projekte geeignet, bei denen viele GerĂ€te gleichzeitig Daten austauschen.
Was sind Wildcards in MQTT?
Wildcards ermöglichen es, mehrere Topics gleichzeitig zu abonnieren.
- + steht fĂŒr genau eine Ebene - # steht fĂŒr mehrere Ebenen (nur am Ende erlaubt)
Beispiel: erdgeschoss/+/lampen
Damit können alle Lampen in verschiedenen RÀumen gleichzeitig empfangen werden.
Was ist das Retain-Flag bei MQTT?
Mit dem Retain-Flag kann eine Nachricht beim Broker gespeichert werden.
Neue Subscriber erhalten diese Nachricht sofort, sobald sie das Topic abonnieren.
đ Wichtig: Es wird immer nur die letzte Nachricht gespeichert.
Wann sollte ich MQTT einsetzen?
MQTT eignet sich besonders gut fĂŒr:
- Systeme mit vielen GerĂ€ten - IoT-Projekte mit Mikrocontrollern (z. B. ESP32) - Smart Home Anwendungen - Echtzeit-DatenĂŒbertragung Kann ich mehrere GerĂ€te gleichzeitig verbinden?
Ja, genau das ist einer der gröĂten Vorteile von MQTT. Mehrere Publisher und Subscriber können gleichzeitig ĂŒber einen einzigen Broker kommunizieren.














