Frameworks Eine Software-Infrastruktur für das Internet der Dinge

Tuukka Ahoniemi * |

Anbieter zum Thema

Um Fallstricke bei der Integration von IoT-Systemen zu vermeiden, müssen diverse Front- und Backend-Techniken angewendet werden. Bereits bei Beginn des Designs ist das gesamte System zu betrachten.

Das Qt-Logo.
Das Qt-Logo.
(Bild: Qt Company)

Die Anwendungen und Neuerungen, die das IoT hervorbringt, sind beeindruckend, und die Technik zur Entwicklung solcher Systeme sowie deren Cloud-Backends sind bereits vorhanden. Aus der Sicht des Embedded-Software-Designs gestaltet sich die Entwicklung solcher Systeme jedoch immer komplexer, und die technischen Anforderungen steigen erheblich. Um Fallstricke bei der Integration zu vermeiden, müssen verschiedene Front- und Backend-Techniken angewendet und bereits bei Beginn des Designs das gesamte System berücksichtigt werden.

Eine völlig neue Welt durch Cloud-Datenanbindung

Wenn Geräte oder Einrichtungen nahtlos zusammenarbeiten, ermöglicht das IoT komplexe Dienste – von denen einige bei der Implementierung noch gar nicht in Betracht gezogen wurden –, indem vergleichsweise preiswerte und energieeffiziente Geräte zum Einsatz kommen. Hinzu kommt, dass sich jederzeit weitere Dienste aufrüsten lassen, ohne dabei die auf dem Gerät laufende Software zu stören. Dies ist insbesondere dann von Vorteil, wenn die verwendeten Technologien dynamische Softwareänderungen erlauben oder flexible externe APIs haben, die Plugin-basierte Designmuster verwenden, um eine einfache Erweiterung von Diensten zu ermöglichen.

Die Qt-Wetterstation – ein Anwendungsbeispiel

Die Qt-Wetterstation ist eine einfache Proof-of-Concept-Implementierung eines IoT-Systems. Sie verfügt über einzelne Wetterstationen, die Embedded-Systeme mit funkbasierten Wettersensoren sind. Diese Stationen sind mit der Qt Cloud verbunden, von wo aus sie überall per Mobilfunk- oder Desktop-Client-Anwendung zugänglich sind.

Architektur eines einfachen Qt-basierten IoT-Systems: die Qt-Wetterstation. Die Code-Wiederverwendung wird maximiert; alle Plattformen nutzen den gleichen Qt GUI Code und die gleichen Qt-Cloud-APIs. Die Client-Anwendungen verwenden den gleichen Code auf allen Plattformen.
Architektur eines einfachen Qt-basierten IoT-Systems: die Qt-Wetterstation. Die Code-Wiederverwendung wird maximiert; alle Plattformen nutzen den gleichen Qt GUI Code und die gleichen Qt-Cloud-APIs. Die Client-Anwendungen verwenden den gleichen Code auf allen Plattformen.
(Bild: Qt Company)

Alle Teile der Qt-Wetterstation – das Embedded-System, Cloud-Backend und die Mobilfunk- bzw. Desktop-Cients – wurden ausschließlich mit Qt implementiert. Die Mobile- und Desktop-Clients teilen sich genau die gleiche Codebasis, und die Wetterstation nutzt das Client-seitige UI, genauso wie die UI für das Embedded-System.

Die Embedded-Wetterstation läuft auf einem Raspberry Pi Developer-Board oder auf dem Boundary Device SABRE LITE (Freescale i.MX 6) und nutzt den „Boot to Qt“ Embedded Linux Software-Stack, der sich bereits in Qt Enterprise Embedded befindet. Mit Qt wird die moderne Touch-Bedienschnittstelle nahtlos mit dem Lower-Level-Gerätetreiber-Code integriert, der mit den Funk-Wettersensoren über einen USB-fähigen Funkempfänger kommuniziert. Das System könnte auch ohne lokale Benutzerschnittstelle betrieben werden (Headless-Betrieb). Mit der Qt Cloud API lädt das Embedded-System die Sensordaten in den Enginio-Datenspeicher.

Die Client-Anwendung ist eine reguläre Qt-Anwendung, die nativ auf allen großen Mobil- und Desktop-Plattformen läuft. Mit der Qt Cloud API werden die Wettersensordaten von der Cloud erfasst und über die Qt Quick UI-Technik visualisiert.

Für Multi-Screen-Anwendungen wie diese ist es nicht unbedingt ideal, das gleiche UI-Layout für kleine oder große Bildschirme oder Hoch- und Querdarstellungen zu verwenden. Wir haben die Code-Wiederverwendung maximiert, indem genau die gleichen skalierbaren UI-Komponenten zum Einsatz kommen, lediglich die High-Level-Layout-Dateien unterscheiden sich für die verschiedenen Variationen. Damit müssen nur einige wenige separate Codezeilen für andere Layouts geschrieben werden.

Der Entwickler arbeitete mit einem UI-Designer zusammen. Mit der Qt Quick UI-Technologie war ein schnelles UI-Prototyping möglich, um verschiedene UI-Layouts auszuprobieren. Die Prototypen-UIs konnten vor Ort auf einer Desktop-Version von Qt erprobt werden, oder wurden direkt in das Embedded-System oder ein Mobilgerät mit der Qt Creator IDE integriert. Von Qt Creator aus kann man direkt zwischen den Zielplattformen hin und herschalten. Dabei wird automatisch die zugrundeliegende Cross-Kompilierungs-Toolkette geändert und über USB oder IP einem System zugewiesen.

Die Cloud-Server können als permanente, geräteunabhängige Speicher und Archive verwendet werden und Informationen über den Zustand jedes Geräts beinhalten. Im Unterhaltungsumfeld kann ein Anwender etwa auf einem Mobilgerät Musik hören und diese pausieren, um dann zuhause vor dem PC wieder dort fortzufahren, wo pausiert wurde. Durch die Cloud können Systeme Benachrichtigungen an Geräte senden, sowie Sensordaten empfangen, verarbeiten und für Statistikzwecke analysieren.

Da die Datenspeicherung und komplexe Datenanalyse im Cloud-Backend zentralisiert sind, kann die Kapazität der Rechenleistung dynamisch skaliert werden, ohne dabei die einzelnen angeschlossenen Geräte zu beeinträchtigen. Auch der zufällige Verlust der Verbindung zu einem Gerät macht für andere Teile des Systems keinen Unterschied. Die Forderung nach Verfügbarkeit besteht zwar weiter, allerdings nur für das Cloud-Backend. Um die Funktionalität eines einzelnen Geräts ohne Verbindung zum Backend zu gewährleisten sind demnach ein Offline- Speicher und ein logisches Offline-Verhalten erforderlich.

REST Assured: Funktionalität auf höchster Ebene

Obwohl das IoT-Konzept flexible, zukunftssichere, vernetzte Systeme ermöglicht, müssen bestimmte Herausforderungen bei der Entwicklung erfüllt werden. Die Architektur des Internet und World Wide Web ermöglicht es, bestimmte Aspekte des IoT-Designs zu vereinfachen. So bietet REST (Representational State Transfer), eine Architektur auf Basis einfacher HTTP-Protokollbefehle, mehr Flexibilität als herkömmliche Client-Server-Architekturen wie SOAP.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung
Bildergalerie

Eine RESTful-API ermöglicht es Clients und Servern in komplexer Weise zu interagieren, ohne dass der Client Details über mögliche Dienste kennen muss, bevor er mit dem Server verbunden wird. Dies spielt bei der Erweiterung des Systems um beliebige Geräte oder Dienstleistungen eine wichtige Rolle. Ein einfacher URI (Universal Resource Identifier) reicht aus, damit der Client den Server findet. Von hier aus führen der Server und der Client mittels HTTP-Befehlen eine Reihe von Verhandlungen und Datentransferschritten aus, die Informationen über die angebotenen Dienste enthalten, und wie auf sie zugegriffen werden kann.

Obwohl die zentralen REST-Mechanismen in HTTP flexibel sind, arbeiten sie auf unterer Ebene. Ein Entwicklungsumgebung wie Qt kann diese Details auf unterer Ebene durch Komfortklassen abstrahieren und High-Level-objektorientierte Klassen für andere Teile der Anwendung bereitstellen.

Da Qt C++-basiert ist, lässt sich der Embedded-Code auf unterer Ebene, etwa für Hardware-Verbindungen, in die gleiche Software integrieren, ohne dabei Teile des Codes isolieren zu müssen. Mit der Kombination aus REST und Qt-Klassen haben IoT-Einrichtungen die Möglichkeit, nicht nur Daten zu empfangen und sich Befehle zuzusenden, sondern auch mit Servern in der Cloud zu kommunizieren und ihre lokale Hardware-Peripherie zu integrieren.

Die Cloud-Dienste müssen nicht für jede Anwendung von Grund auf neu entwickelt werden. Durch Cloud Services steht Qt-Entwicklern ein Angebot an Cloud-Funktionen auf Basis der RESTful-APIs und eine umfassende Cloud-API für den direkten Einsatz seitens Qt-Kunden zur Verfügung. Zu diesen Diensten zählen der Enginio Data Storage Service, Managed WebSockets für Verbindungen in Echtzeit und Managed Runtimes zur Übergabe von Teilen der Implementierung oder Berechnung – geschrieben mit herkömmlichen serverseitigen Technologien oder direkt über Qt-APIs – auf die skalierbare Serverseite. Vor allem für Systeme, die große Datenmengen sammeln und analysieren, hilft eine skalierbare serverseitige Berechnung dabei, die eingesetzten Embedded-Einrichtungen vernünftig zu betreiben.

Verschiedene Zielplattformen unterstützen

Neben dem zentralen IoT-Software-Stack muss der Entwickler auch langfristigen Support, Wartung, Upgrades und Verbesserungen berücksichtigen. Mit jeder Weiterentwicklung müssen IoT-basierte Systeme imstande sein, neue Hardware zu integrieren, die nahtlos mit den bestehenden Geräten zusammenarbeitet. Entwickler von Embedded-Systemen stehen dann vor dem Problem, dass verschiedene Implementierungsziele erfüllt werden müssen. Erforderlich wird damit eine Entwicklungsumgebung, die eine Software-Implementierung auf verschiedenen Zielanwendungen ermöglicht, die unterschiedliche Funktionen bieten – und das mit einer minimalen Anzahl erforderlicher Änderungen des Quellcodes.

IoT-Systeme erfordern nicht nur die Entwicklung von untereinander vernetzten Embedded-Einrichtungen, sondern auch die Bereitstellung von Client-Anwendungen, um mit diesen Einrichtungen und deren Daten zu interagieren. Heute gibt es zahlreiche Zielplattformen: Web-Dienste über den Browser, jede Art von Android-, iOS- oder Windows-Smartphones oder Tablets und Desktop-PCs. Mit einer übergreifenden Plattformtechnologie wird die Mehrzahl derzeitiger und zukünftiger Plattformen abgedeckt.

Code, der mit dem Qt-Framework geschrieben wurde, läuft auf einer Vielzahl von Betriebssystemen – von Plattformen für Anwendungen auf Echtzeit-Betriebssystemen über Embedded Linux bis hin zu Desktop-PCs und Mobilgeräten. Damit lässt sich eine gemeinsame Betriebslogik für Sensorknoten und Mobilgeräte einsetzen, die grafikintensive Software wie Android verwendet.

Qt bietet einen hohen Grad an Portierbarkeit durch seine Klassen und Tools, genauso wie die UI-(User-Interface-)Ansätze. Mit einer Auswahl an Grafikansätzen können Entwickler die Portierbarkeit maximieren, aber immer noch die Feineinstellung der Anwendung für jedes Zielgerät beibehalten. So können ein Wearable-Funksensor und ein Display einfache Grafik auf Basis statischer Symbole und Zeichen verwenden. Die gleiche Displayfunktion für eine Android-App kann alle Vorteile der Animation und Multi-Touch-Funktion nutzen.

Zu den GUI-Entwicklungsoptionen innerhalb von Qt zählen Qt Quick und Qt Widgets, die vor allem für relativ statische Schnittstellen optimiert sind. Sie eignen sich für Geräte mit beschränkter Verarbeitungsleistung und einfachen, kleineren Displays. Qt Quick bietet die Markup-Sprache QML, die einen deklarativen High-Level-Ansatz für das UI-Design bereitstellt, der von UI-Designern und Entwicklern zusammen verwendet werden kann. Qt Quick unterstützt moderne Rapid-Prototyping-Prozesse zum Erstellen interaktiver touch-basierter Benutzeroberflächen. Zur Integration von HTML5 in die Bedienoberfläche bietet Qt eine Chromium-basierte Engine, genannt Qt WebEngine.

Für eine Anwendung, die auf mehreren Zielplattformen eingesetzt werden kann – ob nun Embedded, Mobil oder Desktop – kann der Betriebslogik-Code, der Qt nutzt, für alle Anwendungen bis zu 80 Prozent übereinstimmen. Mit den Funktionen von Qt Quick wird die Bedienoberfläche über verschiedene Zielplattformen skalierbar. Sind separate UI-Layouts gewünscht, helfen eine gemeinsame GUI-Ebene oder gemeinsame Komponenten und Designs mit kleinen, separaten Layout-Dateien, die Code-Wiederverwendung zu maximieren. Selbst wenn verschiedene Zielanwendungen vorliegen, ist nur eine kleine Änderung zwischen den GUIs erforderlich – und das alles innerhalb einer einzigen Technologie. Es müssen keine verschiedenen Teams für jede Zielplattform beschäftigt werden.

Fazit: Embedded-Prototyping einfach gemacht

Um Rapid Prototyping auf einem echten Embedded-System vorzunehmen, damit sich Formfaktoren und Systemoptionen ausprobieren lassen, können Entwickler den „Boot to Qt“ Software-Stack nutzen, der in Qt Enterprise Embedded integriert ist. Dabei handelt es sich um einen vorkonfigurierten Software-Stack für eine Embedded-Hardware-Plattform – entweder auf Embedded Android oder Embedded Linux. Mit dem Stack und der vorkonfigurierten Qt Creator IDE (integrierte Entwicklungsumgebung) lässt sich eine Qt-Anwendung sofort in der gewünschten Hardware für das Rapid Prototyping umsetzen. Der in der Regel langwierige Code-Compile-Deploy-Zyklus wird auf wenige Klicks verkürzt.

Für das Rapid Prototyping von Embedded-Systemen benötigen Entwickler ein frühes Feedback von den Endkunden. Dazu dienen Usability-Tests des Projektkunden, um die Entwicklung in die richtige Richtung zu lenken. Dieser Prozess macht auch die Anforderungen für die Hardware ausfindig, damit die letztendliche Hardwareentscheidung nach anfänglichen Durchläufen erfolgen kann und genau den Wünschen entspricht. Der „Boot to Qt“-Software-Stack lässt sich dann für die endgültige Hardware und gewünschten Middleware-Inhalte anpassen. Dies erfolgt über entsprechende Tools oder für Embedded Linux über die proprietären Rezepte für Yocto-Projekt-Tooling. Der übergeordnete, eigentliche Anwendungscode bleibt genau der gleiche.

Durch die vielen Möglichkeiten der Cross-Plattform-Entwicklung, die Qt bietet, lassen sich IoT-Systeme mit Embedded- und Cloud-vernetzten Systemen sowie entfernten Client-Anwendungen umsetzen – ohne dabei für das gesamte Portfolio verschiedene Technologien verwalten zu müssen. Mit einer flexiblen Plugin-basierten Architektur – sowohl für lokale Software als auch das Networking – lassen sich neue Systeme mit beliebigen Diensten hinzufügen, ohne dabei andere Teile des Systems verändern zu müssen.

Qt’s Portierbarkeit und Flexibilität ermöglicht es, vorhandene Software auf aktualisierte Hardware zu migrieren, sobald diese zur Verfügung steht. Damit wird sichergestellt, dass eine IoT-Implementierung wettbewerbsfähig bleibt.

Bei der Arbeit auf einer höheren Abstraktionsebene mit einer erweiterbaren Architektur können sich Unternehmen auf die Bereiche des IoT konzentrieren, mit denen sich eine Differenzierung ergibt, anstatt sich mit Details auf unterer Ebene und dem IoT-Protokoll beschäftigen zu müssen.

Dieser Beitrag ist ursprünglich auf unserem Schwesterportal Elektronikpraxis.de erschienen. Verantwortlicher Redakteur: Franz Graser

* Tuukka Ahoniemi ist Technical Product Marketing Manager bei der Qt Company.

(ID:44416251)