Das Git-Repository unter https://github.com/DennisSchulmeister/dhbwka-wwi-iotws-architektur enthält die vorgeschlagene Referenzarchitektur zur Umsetzung der Projekte. Der Quellcode kann direkt übernommen und für das jeweilige Projekt angepasst und weiterentwickelt werden. Dieser Blogbeitrag soll die Architektur sowie die ersten Schritte zum Kennenlernen der zugrunde liegenden Balena-Cloud vorstellen.

Allgemeine Systemarchitektur

Allgemeine Systemarchitektur

Die allgemeine Systemarchitektur beruht auf einem zentralen MQTT Message Broker, über den die IoT-Devices mit dem Backend und untereinander integriert werden. Dies bietet sich an, da auf diese Weise jede Komponente lediglich die Adresse des MQTT-Brokers kennen muss, um eingebunden zu werden. Untereinander kennen sich die Devices und Komponenten nicht und können auch nicht direkt miteinander kommunizieren. Stattdessen schickt jede Komponente beliebig formatierte Nachrichten (in unserem Fall im JSON-Format, UTF-8 kodiert) an selbst gewählte „Topics“ des Message Brokers und verlässt sich darauf, dass die anderen Komponenten die für sie relevanten Topics überwachen. Auf diese Weise können jederzeit neue Devices und Komponenten hinzugefügt oder alte Komponenten entfernt bzw. ausgetauscht werden, ohne dass die anderen Teile davon betroffen sind.

Deviceseitige Softwarearchitektur

Deviceseitige Softwarearchitektur

Programmiersprache im Beispiel ist Python. Entwicklung, Test und Produktivsetzung sämtlicher Komponenten erfolgen mit Docker – sowohl auf den IoT-Devices als auch im Backend. Auf Seiten der Devices wird dies durch die Balena Cloud im Produktivbetrieb bzw. das Balena CLI während der Entwicklung vollständig automatisiert. Die IoT-Devices umfassen folgende Komponenten:

  • redis: Zentraler Redis-Server
  • sensor: Python-Programm zum Auslesen der Sensordaten und Ablage in Redis
  • startstopbutton: Python-Programm zum Starten und Stoppen der Sensormessungen
    Vorsicht: Dieser belegt den GPIO-Pin 2, der u.a. auch für I²C benutzt wird!
  • mqtthandler: Python-Programm zum Versand der Sensordaten via MQTT
  • grafana: Lokales Grafana-Dashboard zur Überwachung der Devices

Hauptbestandteil ist hier der Redis-Server, der als strukturierter in-memory Key-Value-Store sowohl für die lokale Zwischenspeicherung der Sensordaten als auch die Kommunikation der Teilprogramme untereinander sorgt. Der Server ist so konfiguriert, dass bei einem Stromausfall maximal die Daten der letzten Sekunde verloren gehen können. Die Sensordaten werden dabei via MQTT an das Backend sowie weitere, interessierte Empfänger verschickt. Dabei ist sichergestellt, dass bei einem Teilausfall des Systems keine Sensordaten verloren gehen, sondern der Sendevorgang automatisch nachgeholt wird. Ebenso erlauben die Devices eine einfache Fernsteuerung durch JSON-kodierte Kommandos via MQTT.

Entwicklung der IoT-Devices

Das Balena CLI kann sämtliche Client-Komponenten auf einen lokales Entwicklerboard (hier Rasbperry Pi) ausführen und bei Änderungen am Quellcode automatisch aktualisieren (sog. Livepush). Das erstmalige Starten der Komponenten dauert lange. Dafür werden die betroffenen Komponenten bei jeder Quellcodeänderungen innerhalb weniger Sekunden neugestartet, so dass man fast wie lokal entwickeln kann. Die notwendigen Schritte sind hierfür:

  1. In der Balena Cloud eine neue Anwendung registrieren
  2. Development-Version des Balena OS herunterladen und auf SD-Karte schreiben
  3. Das Entwicklerboard mit dem eben heruntergelandenen Balena OS starten
  4. In der Cloud den „Local Mode“ aktivieren
  5. Auf der Kommandozeile folgende Befehle ausführen:
    • cd device
    • sudo balena scan
    • balena push xxxxxx.local

xxxxxx.local muss hierbei durch den mit sudo balena scan ermittelten Hostnamen ersetzt werden (z.B. 6076a30.local). Alternativ kann auch die IP-Adresse des Boards verwendet werden. Auf der Konsole werden alle Log-Ausgaben der Services und des Devices ausgegeben. Dies kann mit Strg+C beendet werden. Das Device läuft allerdings weiter.

Folgende Befehle können bei der Entwicklung nützlich sein:

  • balena logs xxxxxx.local:
    Wiederaufnahme der Log-Ausgabe in der Konsole
  • balena logs xxxxxx.local --service sensor --service mqtthandler:
    Konsolenausgabe auf einzelne Services einschränken
  • balena ssh xxxxxx.local:
    SSH-Verbindung zum Hostsystem des Devices herstellen
  • balena ssh xxxxxx.local mqtthandler:
    SSH-Verbindung zu einem Containersystem des Devices herstellen

Produktivsetzung der IoT-Devices

Zur Produktivsetzung der Devices muss in der Cloud der „Local Mode” deaktiviert werden (in den Geräteeinstellungen des Entwicklerboards). Anschließend kann das Device wieder über die Balena Cloud verwaltet und konfiguriert werden. Das eigentliche Deployment erfolgt mit folgendem Befehl:

balena push IoT-Projekt

Die Bezeichnung IoT-Projekt muss dabei durch den tatsächlichen Namen der Anwendung innerhalb der Balena Cloud ersetzt werden. Innerhalb der Cloud kann das Verhalten der Devices über verschiedene Umgebungsvariablen beeinflusst werden. Eine Auflistung findet sich in den README-Dateien und den Konfigurationsdateien der einzelnen Komponenten.

Erste Schritte mit Balena und der IoT-Beispielarchitektur

Schreibe einen Kommentar