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)
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.