In der Welt des Internet of Things (IoT) gibt es viele Protokolle, die es unseren Geräten ermöglichen, miteinander zu kommunizieren und Informationen zu übertragen. Eines der bekanntesten und zugleich einfachsten Protokolle ist MQTT, das bereits vor über 20 Jahren eingeführt wurde. Viele Smart-Home-Steuerungen unterstützen MQTT von Haus aus oder können durch Drittanbieter-Software damit umgehen.
Egal ob ioBroker, openHAB, HomeAssistant, Node-RED oder andere Dienste – sie alle können mit MQTT arbeiten. Doch was genau ist MQTT, wie funktioniert es, und wie kannst du selbst einen MQTT-Broker einrichten? Diese Fragen werde ich in diesem Beitrag erklären. Im nächsten Teil zeige ich dir dann anhand einfacher Beispiele, wie du MQTT mit verschiedenen MicroControllern nutzen kannst.
- Voraussetzungen für diesen Blog
- Was ist MQTT?
- Wie funktioniert MQTT?
- Daten vom Broker abonnieren
- Der Raspberry Pi wird zum Broker
- MQTT-Broker direkt installieren
- MQTT-Broker mit Docker verwenden
- Daten an den Broker senden und empfangen
- Daten an den Broker senden und empfangen
- Abschließende Worte und Ausblick
Voraussetzungen für diesen Blog
Zur Veranschaulichung nutze ich einen Raspberry Pi 4 mit frisch installiertem Raspberry Pi OS. In Tabelle 1 findest du eine Übersicht der benötigten Hardware. MQTT kann aber auch auf jedem (Linux-basierten) Betriebssystem deiner Wahl einfach eingerichtet werden.
Pos. | Menge | Bauteil |
1 | 1 | Raspberry Pi (Modell egal) |
2 | 1 | Passendes Netzteil für den Raspberry Pi |
3 | 1 | Je nach Raspberry Pi Modell ein LAN-Kabel |
Tatsächlich ist es bei der Nutzung eines Raspberry Pi egal, welches Modell du verwendest, solange du MQTT direkt installierst und nicht z.B. Docker dafür nutzt. MQTT ist ressourcenschonend und benötigt nur minimale Systemressourcen. Wenn du Docker verwenden möchtest, sollte es allerdings mindestens ein Raspberry Pi 3B oder höher sein.
Was ist MQTT?
MQTT steht für Message Queuing Telemetry Transport und ist ein offenes Netzwerkprotokoll für Machine-to-Machine-Kommunikation. Es ermöglicht beispielsweise das Übermitteln von Sensordaten und das Steuern von Aktoren. Auch zur Übermittlung von Statusinformationen von IoT-Geräten wird es verwendet.
Der Hintergrund dieses Protokolls liegt darin, Informationen selbst in instabilen Netzwerken zuverlässig zu übertragen. Ursprünglich aus einer Zeit stammend, in der Netzwerke noch sehr störanfällig waren, bleibt MQTT auch heute relevant.
Standardmäßig lauscht MQTT auf Port 1883 im Netzwerk. Der gesicherte Port 8883 erfordert jedoch die Verschlüsselung via TLS. Wenn du keine TLS-Verschlüsselung einrichten möchtest, kannst du auch einfach einen Benutzernamen und ein Passwort festlegen, um die Anmeldung am MQTT-Broker zu sichern.
Damit du MQTT nutzen kannst, benötigst du einen MQTT-Server, den sogenannten Broker, sowie die Endgeräte, die als Clients fungieren, um Daten zu senden und/oder zu empfangen. Die meisten Broker laufen auf Linux-basierten Systemen, aber es gibt auch Lösungen für Windows. Aufgrund seiner Effizienz wird MQTT häufig in IoT-Projekten eingesetzt.
Wie funktioniert MQTT?
MQTT nutzt eine sogenannte ereignisgesteuerte Publish/Subscribe-Architektur. Einfach erklärt, melden sich alle Sender- und Empfängergeräte – die sogenannten Clients – beim Server (Broker) an. Der Broker fungiert als Informationspuffer, der Daten an die Clients weiterleitet. Damit ein Client Nachrichten vom Broker erhält, muss er sogenannte Topics abonnieren.
In Abbildung 1 siehst du, wie die Architektur von MQTT vereinfacht dargestellt ist. Ein Client, zum Beispiel ein Sensor, kann Daten senden und/oder empfangen. Der Broker nimmt diese Daten auf und verteilt sie an alle Clients, die die entsprechenden Topics abonniert haben.
Ein Topic kannst du dir wie eine Art URL vorstellen, die den gewünschten Inhalt repräsentiert. Zum Beispiel könnte ein Topic für einen Temperatursensor im Wohnzimmer „Daheim/Erdgeschoss/Wohnzimmer/Temperatur“ lauten. Der Broker stellt sicher, dass der Client, der dieses Topic abonniert hat, alle neuen Sensordaten empfängt.
Daten vom Broker abonnieren
Es gibt mehrere Möglichkeiten, wie ein Client Daten von einem Broker abonnieren kann. Eine einfache Variante ist, den Topic vollständig anzugeben, z. B. „Daheim/Erdgeschoss/Wohnzimmer/Temperatur“. Alternativ kannst du mit Platzhaltern arbeiten. Durch die Angabe „Daheim/+/+/Temperatur“ erhältst du die Temperaturdaten aller Zimmer auf jeder Etage. Eine noch umfassendere Option ist die Nutzung des #-Operators, um zum Beispiel „Daheim/Erdgeschoss/#“ für alle Daten des Erdgeschosses abzufragen.
Die flexibelste und datenintensivste Methode ist die Abonnierung des Wurzelverzeichnisses durch „/#“. Dies führt dazu, dass jede Änderung am gesamten MQTT-Netzwerk an den Client übermittelt wird. Diese Variante solltest du jedoch nur nutzen, wenn du wirklich alle Informationen benötigst, da sie viele unnötige Daten übermitteln kann.
Der Raspberry Pi wird zum Broker
Wie bereits erwähnt, erfreut sich MQTT in der IoT-Community großer Beliebtheit. Viele möchten ihre persönlichen Daten oder Steuerungsdaten nicht über öffentliche Dienste im Internet freigeben, daher bietet es sich an, einen eigenen Broker zu betreiben. Ein kleiner Computer wie der Raspberry Pi eignet sich dafür hervorragend.
Im nächsten Abschnitt zeige ich dir, wie du einen MQTT-Broker sowohl direkt als auch über Docker auf deinem Raspberry Pi einrichten kannst.
MQTT-Broker direkt installieren
- Öffne das Terminal deines Raspberry Pi (siehe Abbildung 3).
- Aktualisiere den Pi mit folgendem Befehl:
sudo apt upgrade && sudo apt dist-upgrade
. - Installiere den Mosquitto-Broker mit:
sudo apt install mosquitto
. - Aktiviere den Broker so, dass er nach jedem Neustart automatisch gestartet wird:
sudo systemctl enable mosquitto.service
. - Starte den Broker direkt:
sudo mosquitto -d
.
Ab diesem Punkt hast du einen lokalen, unverschlüsselten MQTT-Broker in deinem Heimnetzwerk eingerichtet. Solange du keine Portweiterleitungen im Router eingerichtet hast, ist der Broker auch nicht über das Internet erreichbar – für private Zwecke ist das meist ausreichend. Damit der Broker nach einem Neustart weiterhin verfügbar ist, solltest du deinem Raspberry Pi eine feste IP-Adresse über den Router zuweisen.
MQTT-Broker mit Docker verwenden
Wenn du Docker nutzt, kannst du den MQTT-Broker ebenfalls unkompliziert installieren. Ich empfehle die Verwendung des Mosquitto-Images von Eclipse. Stelle sicher, dass du zwei Volumes erstellst, um die Daten und Logfiles auch nach einem Neustart des Containers zu behalten.
Gleichzeitig braucht es noch eine Konfigurationsfile, damit später eine einfache Verbindung mit dem MQTT-Broker funktioniert. Von Haus aus liefert das Image keine fertige Konfiguration mit, daher braucht es eine Datei die mosquitto.conf heißen muss. Diese Datei muss lokal auf dem System liegen und den folgenden Inhalt haben, siehe Code 5 und Abbildung 5.
allow_anonymous true
listener 1883
persistence true
persistence_location /mosquitto/data/
Anschließend legst du den Container an: an der Stelle verwende ich keine Compose-File (in Portainer unter Stacks zu finden), sondern die Möglichkeit über Containers -> Add container, siehe Abbildung 6.
Zunächst werden die Basisinformationen, siehe Abbildung 7, eingetragen:
- Name Container: mqtt (in meinem Fall)
- Image: eclipse-mosquitto:latest
- Port mapping:
- 1883 (Host) zu 1883 (Container)
- 9002 (Host) zu 9001 (Container) Hier muss ich bei meinem Host die 9002 statt 9001, da auf diesem Port schon ein anderer Container lauscht.
Anschließend müssen die Volumes und Binds gemappt werden, siehe Abbildung 8. Wichtig dabei, der Ordner /mosquitto/config vom Container muss auf den lokalen Pfad verweisen, wo die mosquitto.conf abgelegt wurde.
Nach kurzer Zeit sollte der Container gestartet sein und bereit für die n meinem Fall liegt die mosquitto.conf im lokalen Verzeichnis /home/piJoern/docker/mqtt/config, daher das Bind mapping auf diesen Pfad. Zuletzt noch die Restart policy auf Always stellen und den Container über den Button Deploy the container starten, siehe Abbildung 9.
Daten an den Broker senden und empfangen
Nun wird es Zeit, die Theorie in die Praxis umzusetzen. Installiere den Mosquitto-Client mit dem Befehl sudo apt install mosquitto-clients
. Nutze anschließend die Terminalbefehle „mosquitto_sub“ zum Empfangen und „mosquitto_pub“ zum Senden von Nachrichten.
Daten an den Broker senden und empfangen
Nun wird es Zeit, die Theorie in die Praxis umzusetzen und Nachrichten an den Broker zu senden und auch Nachrichten vom Broker zu empfangen. Dazu braucht es einen MQTT-Client, der über Code 5 installiert wird.
sudo apt install mosquitto-clients
Code 6: Mosquitto-Client installieren
Anschließend musst du die Terminalbefehle „mosquitto_sub“ für die Funktion subscribe und „mosquitto_pub“ für die Funktion publish von Nachrichten nutzen.
Den Anfang wird der Terminalbefehl „mosquitto_sub“ machen, und die wichtigsten Befehle werden nachfolgend erläutert. Willst du über die hier gezeigten Befehle hinausgehen, empfehle ich an dieser Stelle das intern mitgelieferte Linux-Handbuch, das du im Terminal mit dem Kommando „man mosquitto_sub“, „man mosquitto_pub“ oder „man mosquitto“ aufrufen kannst. Der Linux-Befehl man steht dabei für Manual, auf Deutsch Anleitung oder Handbuch.
Um umfangreich zu sehen, was der mosquitto-Subscriber im Hintergrund abarbeitet, und auch um alle Nachrichten zu empfangen, nutze den Befehl aus Code 6.
mosquitto_sub -h <strong>IP-VOM-BROKER</strong>-d -q 2 -t /#
Code 7: Mosquitto-Subscriber auf Wurzelknoten lauschen lassen
Der hier gezeigte Code 6 nutzt dabei die Optionen aus Tabelle 2 und abonniert alle Topics vom Broker, was bei intensiver MQTT-Nutzung nicht zu empfehlen ist.
Option | Erläuterung |
-h | Gibt den Hostname vom Broker an, mit dem sich verbunden werden soll |
-d | Aktiviert den Debug-Modus und zeigt alle nützlichen Informationen an. |
-q | Spezifiziert welche QoS der Subscriber mit dem Broker kommunizieren soll. In Code 6 wird QoS 2 genutzt. |
-t | Gibt an, welches Topic vom Subscriber abonniert werden soll. In Code 6 abonnieren der Subscriber alle Topics. |
-p | Gibt die Portnummer an, sofern diese von den Standardports abweicht |
Tabelle 2: Optionen des mosquitto-Subscriber
Hast du den Befehl aus Code 6 eingegeben, wird die Ausgabe zunächst die erfolgreiche Verbindung zu dem Broker anzeigen, siehe Abbildung 5 Markierung 1.
icht wundern an der Stelle, da Broker und Client auf dem selben System laufen, wird ohne -h eine Verbindung zum localhost versucht zu öffnen.
In Markierung 1 von Abbildung 5 sieht man, dass eine Verbindung aufgebaut wurde und die Gegenstelle, der Broker, die Verbindung akzeptiert hat. Direkt danach übermittelt der Subscriber, welches Topic abonniert werden soll, hier „/#“, und welcher QoS angefordert wurde, hier „QoS: 2“. Zuletzt wird die Subscribe-Anfrage mittels SUBACK, der Subscription Acknowledged, akzeptiert. Die Verbindung zum Broker ist hergestellt und das gewünschte Topic ist abonniert.
Markierung 2 von Abbildung 5 wird nach einer Zeit bei Ihnen im Terminal erscheinen. Dies ist, wie in „Wie funktioniert MQTT“ beschrieben, die Abfrage, ob der Subscriber noch online ist. Der Broker fragt nach, ob der Client noch online ist, was mit dem sogenannten Ping Request passiert. Im Normalfall sendet der Client die entsprechende Antwort, den sogenannten Ping Response, an den Broker.
Der nächste Schritt, nachdem wir nun einen Subscriber haben, besteht darin, einen Publisher zu nutzen, um Daten an den Broker zu senden. Die erste Nachricht soll natürlich „Hello world“ sein. Diesen kleinen Satz sendet der Publisher an das Topic /test/testpub.
Der Befehl dafür zeigt Code 7.
mosquitto_pub -h <strong>IP-VOM-BROKER</strong> -d -q 2 -t /test/testpub -m “Hello world“
Code 8: mosquitto_pub “Hello world”
Die genutzten Optionen für Code 7 sind in Tabelle 3 aufgelistet.
Option | Erläuterung |
-h | Gibt den Hostname vom Broker an, mit dem sich verbunden werden soll |
-d | Aktiviert den Debug-Modus und zeigt alle nützlichen Informationen an. |
-q | Spezifiziert welche QoS der Publisher mit dem Broker kommunizieren soll. In Code 7 wird QoS 2 genutzt. |
-t | Gibt an, an welches Topic die Daten gesendet werden sollen, hier /test/testpub |
-m | Sende nachfolgende Nachricht, hier „Hello world“ |
Schauen wir uns einmal an, welche Daten bei der Übermittlung, siehe Abbildung 6 Markierung 1, an den Broker gesendet werden. Wie schon zuvor wurde QoS 2 in den Optionen gewählt, weswegen du auch den entsprechenden Kommunikationsverlauf siehst.
Direkt danach schickt der Broker die neue Nachricht an den Subscriber, siehe Abbildung 6 Markierung 2, da dieser alle Topics abonniert hat. An der oberen Umrandung von Markierung 2 von Abbildung 6 sehen wir, dass neue Daten im Topic /test/testpub empfangen wurden. Der QoS 2 – Handshake wird direkt dahinter angezeigt, wobei die Nachricht „Hello world“ empfangen wurde.
Abschließende Worte und Ausblick
In diesem Beitrag habe ich euch gezeigt und erklärt:
- Wie man auf einem Raspberry Pi mit und ohne docker schnell und einfach einen MQTT-Broker erstellen kann
- Was MQTT und das MQTT-Protokoll ist
- Was der Unterschied zu einem MQTT-Broker und MQTT-Client ist
- Wie die Kommunikation zwischen MQTT-Broker und MQTT-Client stattfindet´
Es fehlt an der Stelle einiges im Bezug auf das Thema Sicherheit, da mit der aktuellen Konfiguration jeder sich mit dem MQTT-Broker im Heimnetz verbinden kann. Ratsam ist zumindest die Authentifizierung mittels Username und Passwort. Empfehlen kann ich da die Dokumentation von mosquitto.org, welches viele Einstellungen rund um mosquitto noch einmal erklärt. Gerade bei der Variante mit docker ist darauf zu achten, wie die Struktur mit dem Bind und den Volumes ist, da die Konfiguration sich zu der normalen Installation unterscheidet. Hinsichtlich des nächsten Beitrags zeige ich ein kleines Projekt mit verschiedenen MicroControllern, die mit dem MQTT-Broker kommunizieren und teilweise Daten liefern, aber auch auf abonnierte Nachrichten mit Aktoren reagieren. Dies soll dann noch einmal verdeutlichen, wie MQTT im Wesentlichen funktioniert.