MQTT auf dem Raspberry Pi - Mosquitto Part I
Den eigenen MQTT Broker betreiben und alles zuhause miteinander vernetzen? Easy!
Bearbeitungszeit: <20 Minuten (kurze Variante) - 1,5 Stunden (mit User Accounts)
Ziel
MQTT als Nachrichtenprotokoll ist super geeignet um z.B. im Heimnetzwerk verschiedene Geräte miteinander sprechen zu lassen. Das kann ein Handy sein, das der LED-Lichterkette sagt, welche Farbe sie haben soll, oder ein Temperatursensor, der die Temperatur alle 15 Minuten loggt, oder vielleicht ein CO2-Sensor, der dir eine Nachricht aufs Handy schickt, dass du lüften solltest.
Damit all das funktioniert, braucht MQTT einen Server oder Broker (darum geht es hier) und einen oder mehrere Clients, die entweder auf Nachrichten reagieren (subscribe) oder sie absenden (publish) können. Jede Nachricht besteht dabei aus einem Topic (Thema auf das Clients lauschen können) und einer Payload (z.B. 'Temperatur 17.35' oder 'LED #FF0000')
In diesem Blogpost zeige ich dir, wie du auf einem Rasberry Pi deinen eigenen MQTT Broker betreiben kannst.
Hardware-Voraussetzungen
- 1x Raspberry Pi 3B+/4/400 (Am besten ein Starterkit, da ist alles bei)
Als Amazon-Partner verdiene ich an qualifizierten Verkäufen, wenn du die Links verwendest. Das hilft mir mehr Zeit für coole Tutorials aufzubringen. Wenn du das nicht möchtest sind daneben jeweils die Links ohne Partnerprogramm gelistet.
Software-Installation
Wenn du ein Raspberry Pi Starter Kit geholt hast, ist in der Regel Raspbian (Ein Debian für den Pi) vorinstalliert. Falls nicht, findest du hier bei heise-Tipps+Tricks eine deutschsprachige Anleitung.
Der MQTT Broker Mosquitto ist in den Debian-Paketquellen verfügbar und sehr komfortabel zu installieren. Du musst lediglich den folgenden Befehl im Terminal eingeben.
sudo apt install mosquitto
Um direkt auf dem Pi testen zu können, kannst du noch die Befehle mosquitto_sub und mosquitto_pub bekommen, indem du folgendes installierst.
sudo apt install mosquitto-clients
Das war es schon 😀 Ab jetzt kannst du dich mit dem Broker/Server verbinden und Nachrichten publishen oder darauf subscriben.
Terminal 1 subscriben:
mosquitto_sub -h localhost -t /test/topic
# Hier kommt die Nachricht an, sobald im zweiten Terminal publish aufgerufen wird.
Terminal 2 publishen:
mosquitto_pub -h localhost -t /test/topic -m "Hallo von Terminal 2!"
Die Basisinstallation ist damit nach ca. 10 - 20 Minuten beendet. Der Rest des Blogposts beschäftigt sich mit der Konfiguration von User-Login.
Systemd-Service
Der Mosquitto-Server wird automatisch mit der Installation gestartet und als Systemd-Service registriert, so dass er beim Reboot automatisch wieder mit startet. Mit den folgenden Kommandos kannst du ihn starten, stoppen, neustarten und den Autostart deaktivieren bzw. aktivieren.
sudo systemctl start mosquitto # Starten
sudo systemctl stop mosquitto # Stoppen
sudo systemctl restart mosquitto # Neustarten
sudo systemctl disable mosquitto # Autostart deaktivieren
sudo systemctl enable mosquitto # Autostart aktivieren
Konfiguration User-Accounts
Die Mosquitto Konfiguration ist grundsätzlich in der Datei /etc/mosquitto/mosquitto.conf zu finden. Zusätzlich werden alle Dateien, die auf .conf enden aus dem Verzeichnis /etc/mosquitto/conf.d/ eingebunden.
Im ersten Konfigurationsschritt kannst du die Anmeldung am MQTT-Server auf User-Accounts mit Passwort beschränken. Lege hierzu eine neue Datei /etc/mosquitto/conf.d/010-listener-with-users.conf an
listener 1883
password_file /etc/mosquitto/conf.d/010-access-list
allow_anonymous false
In der Konfiguration wird zuerst als listener der Port angegeben auf dem MQTT laufen soll, 1883 ist der Standard. password_file gibt eine Datei an in der Benutzer:Passwort Kombinationen gespeichert sind. allow_anonymous ist optional, besagt aber, dass ein Benutzeraccount zum Senden und Empfangen von MQTT-Nachrichten benutzt werden muss, wenn es auf false gesetzt ist.
Um die Passwortdatei anzulegen gibt es zwei Wege. Entweder fügst du die Benutzer einzeln hinzu mit den folgenden Befehlen:
sudo touch /etc/mosquitto/conf.d/010-access-list
sudo mosquitto_passwd /etc/mosquitto/conf.d/010-access-list heizung
# Password: 12345
# ...
sudo mosquitto_passwd /etc/mosquitto/conf.d/010-access-list user2
# Password: ...
# ...
Oder du bereitest die Datei mit einer Benutzername:Passwort-Kombination pro Zeile vor, z.B.
heizung:12345
plant:programmer
wc_leds:11235813
und rufst dann sudo mosquitto_passwd -U /etc/mosquitto/conf.d/010-access-list
auf. Dieses Kommando konvertiert die menschenlesbaren Passwörter.
In beiden Fällen beinhaltet die Datei am Ende Benutzername:Passworthash-Kombinationen, die von Mosquitto zur Authentifizierung verwendet werden.
Wenn du probierst, mit dem gleichen mosquitto_pub Kommando von oben eine Nachricht zu senden, bekommst du jetzt eine Fehlermeldung Connection Refused: not authorised. Error: The connection was refused.
Der Aufruf muss also in Zukunft Nutzer und Passwort enthalten. Die beiden Möglichkeiten dafür sehen so aus
mosquitto_pub -h localhost -t /test/topic -m "Hallo von Terminal 2!" -u heizung -P 12345
# Oder in URL Form
mosquitto_pub -L mqtt://heizung:12345@localhost/test/topic -m "Hallo von Terminal 2 mit Anmeldung!"
Jetzt haben wir einen MQTT-Broker laufen, der Subscriptions aufnimmt und Nachrichten unterverteilt. Da es sich noch um eine unverschlüsselte Verbindung handelt, werden Passwort und Nutzername lesbar durch das Netz geschickt. Im Moment wird zwar ein Login erfordert, aber alle Nutzer dürfen dasselbe.
Deshalb geht es im nächsten Blogpost darum, wie du SSL-Zertifikate für die Kommunikation zwischen Client und Broker einrichten kannst und was es für Möglichkeiten gibt, Berechtigungen für Benutzer zu setzen.
Falls du bis dahin Fragen oder Vorschläge für weitere Themen hast, schreib mir gerne öffentlich oder als DM auf Twitter @Plantprogrammer oder per E-Mail.
Den nächsten Post gibt es hier.