Im vorhergehenden Beitrag “IoT zum Anfassen – IoT Edge Module” wurden die theoretischen Grundlagen von Edge Modulen erläutert. Basierend auf diesem Wissen kann nun mit der Entwicklung eigener Module begonnen werden. Im aktuellen Beitrag wird anhand eines einfachen Beispiels gezeigt, wie mit der Modulentwicklung begonnen werden kann, was die Voraussetzungen für einen leichten Einstieg in die Modulentwicklung sind und was generell bei der Entwicklung beachtet werden sollte.
Rahmenbedingungen für die Entwicklung von Modulen
Grundsätzlich muss eine Applikation als Container gebaut werden, um sie als IoT Edge Modul auf Devices aufzuführen. Dabei kommt jede Containerlösung in Frage, die mit der Open Container Initiative kompatibel ist. Für Produktivszenarien wird allerdings nur die von Microsoft entwickelte moby-engine supported.
Für die Modulentwicklung kann zwischen einer Vielzahl an Sprachen gewählt werden: Neben C, C# und Java kann man auch Node.js und Python verwenden. Die sprachspezifischen Azure IoT Device SDKs unterstützen den Entwickler dabei, alle Möglichkeiten des IoT Edge Frameworks voll auszuschöpfen. Durch das SDK können Module sich auch zum lokalen Edge Hub verbinden. Dieser ermöglicht auf der einen Seite die lokale Kommunikation zwischen verschiedenen Modulen und auf der anderen Seite agiert er als Proxy zum IoT Hub.
Als Betriebssystem für IoT Edge Devices, auf welchen Module ausgeführt werden sollen, werden sowohl Windows als auch Linux grundsätzlich unterstützt. Hierbei sind mehrere Punkte zu beachten: Zum einen werden nicht alle Betriebssysteme gleichermaßen unterstützt, sondern sind in verschiedene Support Level geclustert. Darüber hinaus muss das Container Betriebssystem dem Betriebssystem des Ziel-IoT Edge Devices entsprechen. Wird also ein Modul für ein Edge Device mit einer Linux-Distribution erstellt, kann dieses zwar auf einem Rechner mit Windows entwickelt werden, allerdings nur unter Verwendung von Linux-Containern.
Die unterstützte Device Architektur hängt vom gewählten Betriebssystem ab, wobei grundsätzlich AMD32v7, ARM64 und AMD64 in Frage kommen.
Nicht zuletzt können verschiedene Entwicklungs- und Testumgebungen für die Modulentwicklung zum Einsatz kommen. So existieren sowohl für VS Code als auch für Visual Studio 2017/2019 Extensions, welche sprachspezifische Templates für die Entwicklung und das Deployment von IoT Edge Solutions sowie nützliche Funktionen für das Management von IoT Devices bereitstellen.
Zusammenfassend existieren also eine Vielzahl an Stellschrauben und damit eine große Anzahl an Kombinationsmöglichkeiten der verschiedenen Komponenten. Diese sollten beim initialen Setup für die Modulentwicklung sorgfältig evaluiert werden, um insbesondere Abhängigkeiten zwischen den einzelnen Komponenten wie z.B. zwischen Device Architektur und Betriebssystem, frühzeitig zu erkennen und in die Entscheidungsfindung mit einzubeziehen.
Auf zur Praxis!
Im Folgenden wird gezeigt, wie mit der Entwicklung eines Linux Moduls in C# begonnen werden kann. Dafür wird Visual Studio Code als Entwicklungsumgebung, Docker mit Linux-Containern als Containerlösung sowie Azure Container Registry als Container Registry, in welchem das Module Image gespeichert und verwaltet wird, verwendet.
Um bestmögliche Unterstützung in diesem Szenario zu erhalten, müssen die Visual Studio Code Extensions Azure IoT Tools, Docker und für die Sprachunterstützung C# installiert werden. Darüber hinaus wird das .NET Core 2.1 SDK sowie Docker Community Edition benötigt. Nicht zuletzt wird, um das Modul lokal ausführen, debuggen und testen zu können, das Python-basierte Azure IoT EdgeHub Dev Tool benötigt. Nun stehen lokal alle benötigten Softwarekomponenten bereit und es muss nur noch eine Azure Container Registry angelegt werden.
Damit sind alle Voraussetzungen gegeben und es kann los gehen: in Visual Studio Code kann über View > Command Palette > Azure IoT Edge: New IoT Edge Solution eine neue IoT Edge Solution angelegt werden. Die Ausführung dieses Commands erfordert nachfolgend die Eingabe benötigter Parameter, wie z.B. den Namen der Solution, das gewünschte Module Template (im gegebenen Szenario ‘C# Module’) und die Angaben zur Container Registry. Nach erfolgreicher Ausführung des Commands wird die neue Solution geladen (vgl. Abbildung 1):
In der Solution sind folgende Elemente enthalten:
- Der Ordner .vscode enthält Debug Konfigurationen für Visual Studio Code.
- Der Ordner modules enthält für jedes Modul einen separaten Unterordner, welcher wiederum alle für das jeweilige Modul spezifischen Dateien enthält. Hierzu gehört unter anderem die Datei module.json, welche definiert, wie das Modul gebaut und deployed wird.
- Die Datei .env enthält benötigte Umgebungsvariablen. Im gegebenen Szenario sind das der Nutzername und Passwort für die Azure Container Registry.
- Die Datei deployment.template.json definiert das Deployment Manifest, welches zum einen definiert, welche Module installiert werden und zum anderen wie diese konfiguriert werden sollen.
Der Code des angelegten Moduls befindet sich dann unter modules > <moduleName> > Program.cs (vgl. Abbildung 1: modules > AITSampleModule > Program.cs). Initial implementiert das Modul eine einfache Weiterleitung von empfangenen Nachrichten an den IoT Hub, jedoch kann hier angesetzt werden, um mit Hilfe des Azure IoT Hub SDKs eigene Logik zu implementieren.
Um das Modul letzten Endes zu debuggen, gibt es verschiedene Möglichkeiten für C# Module: Zum einen können Module ohne einen Container debugged werden und zum anderen kann der IoT Edge Simulator verwendet werden, um das Modul in einem Container zu starten und sich mittels Visual Studio Code an den gestarteten Prozess zu hängen. Hier wird der erste Weg skizziert:
Zunächst wird in Visual Studio Code über View > Command Palette > Azure IoT Edge: Start IoT Edge Hub Simulator for Single Module der IoT Edge Simulator gestartet. Danach wird im Terminal in das Modulverzeichnis (modules > <moduleName>) gewechselt und dort dotnet build ausgeführt, um die Applikation zu bauen. Nun kann ein Breakpoint im Modulcode gesetzt werden (z.B. in der Methode PipeMessage(Message message, object userContext)) und die Debugkonfiguration Local Debug (.NET Core) gestartet werden. Wird nun eine Debug-Nachricht mittels dem Befehl
curl --header "Content-Type: application/json" --request POST --data '{"inputName": "input1","data":"hello world"}' http://localhost:53000/api/v1/messages
an das Modul gesendet, so wird der gesetzte Breakpoint erreicht und es kann wie gewohnt durch den Code debugged werden.
Herzlichen Glückwunsch – Sie haben Ihr erstes IoT Edge Modul erstellt und lokal debugged! Freuen Sie sich nun auf weitere spannende Blogbeiträge zum Thema “IoT zum Anfassen”.
Sprechen Sie uns an, wenn auch Sie Hilfe bei der Planung, Einführung oder Umsetzung von IoT und Industrie 4.0 in Ihrem Unternehmen benötigen. Wir führen Sie gerne ans Ziel.
Sie möchten mehr zum Thema IoT erfahren? Besuchen Sie doch unseren kostenlosen Workshop „IoT in a day – Von Null auf Cloud in einem Tag“ oder buchen Sie unseren zweitägigen IoT Proof of Concept-Workshop.