Techniken und Tools Modellbasiert entwickeln im Internet of Things
Bedingt durch das Internet der Dinge gibt es viele neue Anforderungen und – vor allem – viele neue Standards und Technologien, die vom Embedded-Entwickler beherrscht werden wollen.
Anbieter zum Thema

In diesem Beitrag wird an einem kompletten, realitätsnahen Beispiel gezeigt, wie die Methodik der modellbasierten Entwicklung dem Architekten und Entwickler hilft, diese Herausforderungen zu bewältigen. Im Beispiel wird ein realer Roboterarm über eine Embedded-IoT-Middleware von einem HTML5-Benutzerinterface gesteuert. Als IoT-Middleware wird MQTT eingesetzt; für die Code-Generierung von Teilen der Oberfläche und der Kommunikation wird das Open-Source Framework Franca verwendet.
Embedded-Entwicklung für das Internet der Dinge
Der Begriff „Internet der Dinge“ (engl. Internet of Things, kurz IoT) beschreibt die Vernetzung von mobilen Geräten, Server-Infrastrukturen und Gegenständen des menschlichen Alltags. Dabei entstehen neue, übergreifende Anwendungen und Systeme, die bisher in dieser Form nicht möglich waren. Da Embedded-Systeme einen wichtigen Teil dieser neuen Anwendungen ausmachen, ist die Welt der Embedded-Entwicklung vom IoT-Trend massiv betroffen.
Dies erschließt neue Einsatzbereiche und Umsatzfelder für die zu entwickelnden Geräte und ist somit zunächst positiv zu sehen. Für die Embedded-Entwickler hält dieser Trend jedoch vielfältige Herausforderungen bereit: Technologien wie webbasierte Oberflächen oder Vernetzung mittels Internettechnologien halten Einzug in das zu beherrschende Technologie-Portfolio. Dazu gehören HTML5, JavaScript oder WebSockets auf der UI-Seite, aber auch Protokoll-Implementierungen und serverseitige Softwarebausteine wie z.B. MQTT.
Bei diesen neuen Herausforderungen der Entwicklung für das Internet der Dinge helfen modellbasierte Methoden: Durch die Erstellung von Modellen wird auf einer abstrakteren Ebene gedacht und entwickelt, als dies bei der reinen Programmierung durch Source-Code möglich wäre. Die zu beherrschenden Technologien werden zwar nach wie vor als Teil der Systeme verwendet, können jedoch von Codegeneratoren umgesetzt werden. Diese Codegeneratoren nehmen die Modelle als Eingabe und produzieren effizienten, schlanken Code zur Anbindung der handgeschriebenen Applikationssoftware an die vorgegebenen Kommunikations-Stacks und Bibliotheks-APIs (kurz für Application Programming Interface).
Der besondere Fokus bei der modellbasierten Entwicklung von IoT-Architekturen sollte auf den Schnittstellen des Systems liegen. Diese stellen die logische Verbindung zwischen den Teilsystemen und Komponenten her. Wenn die Schnittstellen sauber modelliert sind, können die verschiedensten zu integrierenden Teilsysteme (z.B. Libraries, Stacks, Applikationskomponenten) wie Bauklötze zusammengesetzt werden.
In diesem Beitrag wird beschrieben, wie ein solcher modellbasierter Ansatz durch das Open-Source-Projekt Franca unterstützt wird. Dazu wird ein Beispielsystem aufgebaut, das aus einer webbasierten Benutzeroberfläche, einem Roboterarm und einer dazwischenliegenden IoT-Middleware besteht. Die Schnittstellen in diesem System wurden mit Franca [1] modelliert; aus den Schnittstellen wurde Source-Code generiert, der die Teilsysteme des Beispiels elegant verbindet.
Interface Definition Languages (IDLs)
Gerade vor dem Hintergrund der oben beschriebenen Herausforderungen ist es für ein erfolgreiches Projekt wichtig, die Schnittstellen zwischen Komponenten, Subsystemen oder Systemen einer IoT-Landschaft nicht direkt als C-Header-Dateien zu entwerfen und zu repräsentieren, sondern auf einer höheren Abstraktionsebene, die von der Programmiersprache unabhängig ist.
Dies wird durch eine Beschreibungssprache für Schnittstellen oder IDL (kurz für: Interface Definition Language) möglich [2]. Diese reduziert die Syntax auf genau das Vokabular, das für die inhaltliche Definition von Schnittstellen gebraucht wird. Die Abbildung auf eine Programmiersprache geschieht typischerweise durch Codegenerierung.
Alle verfügbaren IDLs erlauben es, Schnittstellen (relativ) unabhängig von der Zielplattform und -sprache formal zu beschreiben. Damit können dieselben Schnittstellen zur Integration über Subsysteme, Programmiersprachen, Controller und Steuergeräte hinweg eingesetzt werden. Schnittstellen werden so ein übergreifendes Werkzeug für Architekten und Entwickler.
Der typische Sprachumfang einer IDL deckt die statischen Anteile von Schnittstellen ab. Zu den statischen Anteilen gehören Datentypen, Attribute und Funktionsaufrufe. Dies ist zur Dokumentation der Schnittstelle und auch zur Codegenerierung ausreichend, da in den typischen Programmiersprachen ebenfalls nur statische Anteile von Schnittstellen beschrieben werden (C-Header oder C++-Klassen enthalten keine Festlegung z.B. von Aufrufreihenfolgen).
Die dynamischen Anteile von Schnittstellen werden heute meist erst in der Implementierung berücksichtigt. Zu den dynamischen Anteilen gehören Aufrufreihenfolgen (also Sequenzen) und die erlaubten Parameterwerte in jedem Schritt. Ebenfalls gehören z.B. nicht-funktionale Eigenschaften wie Timing-Restriktionen zu den dynamischen Anteilen. Gerade für komplexere Systeme ist es sinnvoll, die dynamischen Anteile bereits als Teil der Schnittstellendefinition festzulegen [3]. Dies bringt die Qualität der Software-Entwicklung auf eine neue Ebene. Der Schnittstellen-Designer hat die genaueste Vorstellung davon, wie seine Schnittstelle zu verwenden ist. Über die formale Festlegung der Dynamik kann er dies den nachfolgenden Implementierern übermitteln. Dies steigert die Qualität des resultierenden Softwaresystems.
(ID:44023335)