Eigener Cloud-Server mit MQTT

Der eigene Cloud-Server kann ein 100.000 EUR teurer Server sein oder ein Raspberry Pi 3 – Ja, wir nehmen einfach mal einen günstigen Raspberry Pi 3 für unsere Versuche!

HINWEIS: Alle gezeigten Schritte sind auf anderen Servern (Debian / Ubuntu und andere aus der Familie) GLEICH! Beim Nachbau kann also auch ein anderer Computer verwendet werden!

Raspberry Pi vorbereiten

Für unseren Raspberry Pi nehmen wir das neuste Stretch-Lite Image und spielen es auf eine SD-Karte. Danach stecken wir diese in den Raspberry Pi und starten ihn.
Alle weiteren Schritte erledigen wir über das Terminal direkt am Monitor oder über SSH von einem anderen Rechner aus.

ACHTUNG: Eine Netzwerkverbindung zum Internet und zum Revolution Pi ist natürlich Voraussetzung zum weitermachen!
Vorerst bleiben wir auch in unserem lokalen Netzwerk!!!

Updates installieren

Bevor wir etwas neues installieren, werden wir uns kurz Zeit nehmen um das System auf den neusten Stand zu bringen. Dieser Schritt ist vom Revolution Pi auch schon bekannt.

pi@raspberry:~ $ sudo apt-get update
pi@raspberry:~ $ sudo apt-get dist-upgrade

Über sudo raspi-config sollten wir als erstes das Tastaturlayout und den Zeichensatz auf deutsch (de_DE.UTF-8) einstellen. Außerdem kann dort der SSH-Server aktiviert werden!
WICHTIG: Ändert das Passwort NACH der Konfiguration des Tastaturlayouts und einem Neustart!

2) Einfaches Übertragungsprotokoll

Für die Datenübertragung verwenden wir in der IoT-Welt MQTT (Message Queue Telemetry Transport)

Wikipedia – MQTT

Das Protokoll ist sehr einfach aufgebaut und viele intelligente Sensoren sprechen es schon von Haus aus. Über dieses Protokoll können wir später nicht nur die Daten des Revolution Pi in unsere Cloud schreiben, sondern auch Daten beliebiger anderer Sensoren, SPSen und Programmen.

Wir verwenden die Paho.mqtt Bibliothek von eclipse [link]. Diese gibt es nicht nur für Python sondern auch fast allen anderen gängigen Programmiersprachen.

Fluss der Daten

MQTT Publisher -> MQTT-Broker -> MQTT Subscriber

Zum Beispiel:
RevPi -> Cloud-Server -> Verarbeitungsprogramm

Aufbau des MQTT Datenpakets

Topic: „beschreibung/der/daten“ als String
Payload: Datenbytes als Bytes (z.B. ASCII Zeichen)

MQTT Broker auf Cloud-Server installieren

Als MQTT-Broker verwenden wir mosquitto (Open Source) von eclipse. Dieser Broker befindet sich bereits in den Repositories der gängigen Distributionen und kann einfach installiert werden. Zusätzlich installieren wir auch die Client-Tools für Testzwecke:

pi@raspberrypi:~ $ sudo apt-get install mosquitto mosquitto-clients

Nach der Installation ist der Server sofort gestartet und einsatzbereit!

Mosquitto konfigurieren

Die Standardkonfiguration wurde von mosquitto bereits durch die Installation angelegt. Alle zusätzlichen Einstellungen sollen als eigene Dateien in das /etc/mosquitto/conf.d/ Verzeichnis abgelegt werden. Damit behält man Übersicht.

Damit unser Broker nicht von jedem verwendet werden kann, legen wir nun unsere Benutzer mit jeweiligen Passwörtern an:

# Wird die Datei das erste Mal angelegt, muss "-c" verwendet werden
pi@raspberrypi:~ $ sudo mosquitto_passwd -c /etc/mosquitto/mqttpasswd systemreader
Password:
Reenter password:

# Möchte man weitere Benutzer hinzufügen lässt man das "-c" WEG!
pi@raspberrypi:~ $ sudo mosquitto_passwd /etc/mosquitto/mqttpasswd revpi01
Password:
Reenter password:

Nun haben wir eine Datei /etc/mosquitto/mqttpasswd, in der unsere Benutzer systemreader und revpi01, mit den jeweiligen Passwörtern, enthalten sind.

Diesen Benutzern geben wir nun Berechtigungen auf bestimmte Topics. Das schränkt z.B. die Möglichkeit ein, dass mehrere RevPis auf das selbe Topic schreiben – wir wollen die Daten ja hinterher auch auseinander halten können!
Für die Berechtigungen legen wir die Datei /etc/mosquitto/user.acl an:

pi@raspberrypi:~ $ sudo nano /etc/mosquitto/user.acl

# Systemreader muss alles lesen können um es zu verarbeiten
user systemreader
topic read #

# Erster RevPi darf nur hier lesen und schreiben
user revpi01
topic readwrite datensammlung/revpi01/#

# This affects all clients.
pattern write $SYS/broker/connection/%c/state

Mit diesen beiden Dateien können wir nun unseren mosquitto absichern. Dazu legen wir die Datei /etc/mosquitto/conf.d/secure.conf an und fügen die Konfiguration ein:

pi@raspberrypi:~ $ sudo nano /etc/mosquitto/conf.d/secure.conf

# Secure our mosquitto broker
allow_anonymous false
password_file /etc/mosquitto/mqttpasswd
acl_file /etc/mosquitto/user.acl

Danach starten wir unseren mosquitto neu:
pi@raspberrypi:~ $ sudo systemctl restart mosquitto

Bitte prüft, ob der Broker wirklich läuft, da sonst Fehler in der Konfiguration gemacht wurde:
pi@raspberrypi:~ $ sudo systemctl status mosquitto

Mosquitto testen

Auf unserem Cloud-Server testen wir nun unser MQTT-System. Dafür müssen wir sowohl die Daten „Subscriben“ (Empfangen) als auch Daten publishen (senden). Mit diesen paar Zeilen in der Nash, können wir testen:

# Subscriber starten und alle Topics (-t "#") subscriben und in den Hintergrund packen
pi@raspberrypi:~ $ mosquitto_sub -v -u systemreader -P test -t "#" &
[1] 5515

# ProzessID vom Subscriber merken
pi@raspberrypi:~ $ subpid=$!

# Daten publishen in den Topic "datensammlung/revpi01/sensorwert"
# Achtung: datensammlung/revpi01/ muss als erstes stehen, da der User
# revpi01 nur dort hin schreiben darf!!!
pi@raspberrypi:~ $ mosquitto_pub -u revpi01 -P test -t "datensammlung/revpi01/sensorwert" -m 100

# Nach Drücken der Eingabetaste erhalten wir aus dem Hintergrund von
# mosquitto_sub sofort den Wert, den wir übertragen haben
100
pi@raspberrypi:~ $ mosquitto_pub -u revpi01 -P test -t "datensammlung/revpi01/sensorwert" -m 200
200

# mosquitto_sub im Hintergrund beenden
pi@raspberrypi:~ $ kill $subpid
Mosquitto über das Netzwerk testen

Auf unserem Cloud-Server starten wir den Subscriber und lauschen auf alle Topics:
mosquitto_sub -v -u systemreader -P test -t '#'

Das Programm blockiert nun und wartet auf Nachrichten.

Von einem Netzwerkrechner senden wir nun eine Nachricht an unseren Cloud-Server. Dabei wird über den Parameter -h die IP von unserem Cloud-Server angegeben:
mosquitto_pub -h 192.168.50.156 -u revpi01 -P test -t "datensammlung/revpi01/sensorwert" -m 150

Auf der Konsole von unserem Cloud-Server wird sofort nach Absenden Topic und Wert ausgegeben:
datensammlung/revpi01/sensorwert 150

Sollte man einen Windowsrechner verwenden, gibt es das übersichtliche MQTT.fx – http://mqttfx.jensd.de/

Dort richtet man sich eine Verbindung zu unserem Cloud-Server ein

und senden eine Nachricht per publish

Unser Cloud-Server gibt auch hier Topic und Wert sofort aus:
datensammlung/revpi01/sensorwert 250

HINWEIS: Sollte etwas nicht funktionieren, liegt es evtl. an einem falschen Topic! Der Benutzer revpi01 darf erst ab datensamlung/revpi01/xxx schreiben. Sollte man sich vertippen wird KEINE FEHLERMELDUNG ausgegeben! Es passiert dann einfach nur nichts!

So geht es weiter

Im nächsten Blogeintrag werden wir RevPiPyLoad installieren und konfigurieren um Sensorwerte per MQTT an unseren Cloud-Server zu übertragen.

Weiter >>