Java und OSGi in Embedded-Systemen für das Internet der Dinge

Know-how  –  1 Kommentare
Das OSGi-Schichtenmodell (Abb. 1)

Optimierte Java Virtual Machines (JVMs) und moderne, kostengünstige Hardware ermöglichen den Einsatz von Java auch im Embedded-Bereich. OSGi, das dynamische Modulsystem für Java, liefert zusätzlich die noch fehlenden Puzzlestücke, um ein modernes, flexibles, sicheres und (fern-)wartbares System zu entwickeln.

Von den ersten Einsätzen im "Project Green" bis heute hat Java einen langen Weg hinter sich gebracht. Das gilt insbesondere bei eingebetteten Systemen, die in der Vergangenheit oft hardwarebedingt nicht leistungsfähig genug waren, um Java ausführen zu können. Um zu verstehen, warum Java trotzdem eine prominente Rolle im Embedded-Markt spielt und warum es zunehmend relevanter wird, lohnt sich ein tiefergehender Blick.

"Write once, run anywhere" ist der Leitsatz, der viele Vorteile von Java zusammenfasst. Denn im besten Fall schreiben Entwickler ihre Applikation nur ein einziges Mal. Da es für viele verschiedene Plattformen eine JVM gibt, kann man die Applikation überall dort laufen lassen, wo eine solche installiert ist. Das führt automatisch dazu, dass ein Entwickler auf eine Vielzahl von Java-Standardbibliotheken zugreifen kann und nicht jedes Mal das Rad neu erfinden muss. Die Wiederverwendung von Code wird dadurch stark gefördert und Interoperabilität vereinfacht.

Das Java-Universum

Es existiert ein sehr großes Ökosystem, das durch eine große und aktive Community vorangetrieben wird. Sie besteht aus vielen Java-Entwicklern, aber auch aus unterstützenden Unternehmen und Organisationen. Über den sogenannten Java Community Process (JCP) besteht die Möglichkeit, Änderungen und Erweiterungen der Java-Programmiersprache voranzutreiben und so neue standardisierte technische Spezifikationen zu erstellen. Diese werden als Java Specification Requests (JSRs) bezeichnet.

Im Laufe der Zeit hat die Community einen Fundus an Werkzeuge bereitgestellt. Dazu gehören zum Beispiel die mächtigen Entwicklungsumgebungen Eclipse, IntelliJ IDEA oder NetBeans, aber auch kleinere Tools wie JavaDoc, Jedit und JUnit. Letzteres beispielsweise ermöglicht es, schnell und einfach Unit-Tests durchzuführen. JavaDoc kann bei der wichtigen, aber auch unliebsamen Aufgabe des Dokumentierens unterstützen.

Des Weiteren kann man auf Build-Management-Werkzeuge wie Ant oder Maven zurückgreifen, und in Zeiten von Continuous Integration können Werkzeuge wie Hudson und Jenkins von großem Wert sein, da sie die Wartbarkeit des Codes verbessern.

Auch die Sprache selbst ist zu betrachten. Java nutzt beispielsweise Exceptions, um mit Fehlern und außergewöhnlichen Events umzugehen, es ist objektorientiert und robust. Mit dem Garbage Collector lassen sich größere Programmierfehler vermeiden, was zu einer gesteigerten Systemstabilität beiträgt. Man kann eine Softwarekomponente auf dem PC mit den gleichen Werkzeugen entwickeln und testen, egal ob es sich um ein Enterprise-, Desktop-, oder Embedded-System mit Echtzeitanforderungen handelt. Das hilft Unternehmen, ihre Entwickler flexibel einzusetzen. Dazu kommt, dass Java im Vergleich zu vielen anderen Programmiersprachen relativ schnell zu erlernen ist.

Man sieht an dieser Auswahl, warum es Sinn macht, darüber nachzudenken, Java bei eingebetteten Systemen einzusetzen. Es existieren ein gutes Ökosystem, viele Werkzeuge, eine objektorientierte, schnell zu erlernende Sprache, und man ist weitgehend unabhängig von der verwendeten Hardware.

Ein Java für jeden

Wenn die meisten an die Java-Programmiersprache denken, meinen sie Oracles Java Standard Edition. Die Java SE stellt die Kernfunktionen der Programmiersprache bereit. Sie definiert alles, von den Grundtypen und Objekten der Sprache bis hin zu den komplexen Klassen, die für Netzwerk, Sicherheit, Datenbankzugriff, GUI-Entwicklung und XML-Parsing benötigt werden. Zusätzlich zu den Kernklassen besteht die Java-SE-Plattform aus einer virtuellen Maschine, Entwicklungstools, Deployment-Techniken und anderen häufig in Java-Applikationen verwendeten Klassenbibliotheken und Toolkits.

Für den Enterprise-Bereich wurde die Java Enterprise Edition als Erweiterung der Java-SE-Plattform geschaffen. Java EE stellt weitere Klassen zur Verfügung, um groß angelegte, verteilte und skalierbare Systeme zu entwickeln. Im Gegensatz dazu steht die Java Micro Edition. Java ME verfügt über eine API und eine "leichtgewichtige" virtuelle Maschine, um Java auf "limitierten" Geräten wie Mobiltelefonen laufen zu lassen. Sie wurde ursprünglich eingeführt, um den Einschränkungen kleiner Geräte, also Geräten mit begrenzter Leistung, Speicher, Display und Stromverbrauch Rechnung zu tragen.

Java-ME-Konfigurationen sollen eine breite Klasse von unterstützten Geräten abdecken. Die Java Connected Limited Device Configuration (CLDC) wurde für Kleinstgeräte wie Pager definiert und kam auch häufig in Feature Phones zum Einsatz. Das dynamische Laden von Klassen wird hier beispielsweise nicht unterstützt. Auch fehlen essenzielle Klassen, die gerade der Sektor M2M (Machine-to-Machine) benötigt. Das sind beispielsweise die java.io- und java.net-Klassen, die teilweise komplett fehlen oder nur durch Erweiterungen verfügbar sind.

Die Java Connected Device Configuration (CDC) ist im Gegensatz dazu für mittelgroße Embedded-Geräte wie Blu-ray Disc Player, VOIP-Telefone, Fernsehgeräte, Set-Top-Boxen, Drucker oder Residential Gateways gedacht. Profile unter gliedern dann die Konfigurationen weiter. Das Foundation Profile ist ein gutes Beispiel dafür. Es erfüllt unter anderem Anforderungen, die für Geräte gedacht sind, die beispielsweise kein grafisches Interface benötigen.

Mit der zunehmenden Bedeutung von Java im Embedded-Bereich hat Oracle nun das Produktportfolio überarbeitet und macht Java ME und Java SE für den Embedded-Markt fit. Ausgehend von der Java SE ist das neue Java SE Embedded entstanden, das sich auf Systemen mit jeweils mindestens 32 MByte RAM und Flash-Speicher nutzen lässt. Neue, sogenannte "Compact Profiles" erlauben es, Subsets der Standard Edition zu erzeugen.

Für weniger leistungsfähige Systeme ist Java ME Embedded 8 gedacht, das kompatibel zu Java SE ist und sich schon ab 8 MByte RAM nutzen lässt. Es basiert auf Java ME CLDC 8 und dem Java ME Embedded Profile (MEEP) 8