Möglichkeiten und Grenzen von J2ME
Transcription
Möglichkeiten und Grenzen von J2ME
Möglichkeiten und Grenzen von J2ME Studienarbeit im Fach Informatik vorgelegt von Merlin Tonka geb. 01.07.1971 in Mbanga - Kamerun angefertigt am 11.04.2003 Institut für Informatik Lehrstuhl für Informatik 2 Programmiersysteme Friedrich-Alexander-Universität Erlangen–Nürnberg (Prof. Dr. M. Philippsen) Betreuer: Dipl.Inf. Frank Strüber Beginn der Arbeit: 15.01.2003 Abgabe der Arbeit: 14.04.2003 i Ich versichere, dass ich die Arbeit ohne fremde Hilfe und ohne Benutzung anderer als der angegebenen Quellen angefertigt habe und dass die Arbeit in gleicher oder ähnlicher Form noch keiner anderen Prüfungsbehörde vorgelegen hat und von dieser als Teil einer Prüfungsleistung angenommen wurde. Alle Ausführungen, die wörtlich oder sinngemäß übernommen wurden, sind als solche gekennzeichnet. Der Universität Erlangen-Nürnberg, vertreten durch die Informatik 2 (Programmiersysteme), wird für Zwecke der Forschung und Lehre ein einfaches, kostenloses, zeitlich und örtlich unbeschränktes Nutzungsrecht an den Arbeitsergebnissen der Studienarbeit einschließlich etwaiger Schutzrechte und Urheberrechte eingeräumt. Erlangen, den 11.04.2003 Merlin Tonka ii Zusammenfassung Die folgende Ausarbeitung beschäftigt sich mit der Java 2 Microedition (J2ME). Im zweiten Kapitel werden J2ME, die Begriffe Konfiguration und Profil erklärt. Im dritten Kapitel werden die Anforderungen und Möglichkeiten von Mobil Device Information Profil (MIDP) anhand eines konkreten Beispiels besprochen. Im vierten Kapitel werden die anderen J2ME Profile und einige wichtige optionale Profile kurz beschrieben. Dannach werden einige Werkzeuge zur Arbeit mit J2ME vorgestellt. Abschließend wird im fünften Kapitel einen Ausblick über J2ME gegeben. Inhaltsverzeichnis 1 Einleitung 1 2 Java 2 Microedition 2 2.1 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.2 Die Java Plattformen . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3 J2ME Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3.1 Konfigurationen . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.2 Profile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3 Anforderungen und Möglichkeiten von MIDP 10 3.0.3 Grundlagen von MIDP . . . . . . . . . . . . . . . . . . . . 11 3.0.4 Benutzeroberfläche . . . . . . . . . . . . . . . . . . . . . . 16 3.0.5 MIDlet-Beispiel . . . . . . . . . . . . . . . . . . . . . . . . 19 3.0.6 Record Management System (RMS) . . . . . . . . . . . . . 24 3.0.7 Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.0.8 Netzwerktechnologie . . . . . . . . . . . . . . . . . . . . . 28 3.0.9 Over The Air (OTA) . . . . . . . . . . . . . . . . . . . . . 29 3.0.10 Sicherheitsmechanismen . . . . . . . . . . . . . . . . . . . 32 iii INHALTSVERZEICHNIS 4 PDAP, FP und die optionalen Profile iv 34 4.1 Personal Digital Assistent Profil (PDAP) . . . . . . . . . . . . . . 34 4.2 Foundation Profil (FP) . . . . . . . . . . . . . . . . . . . . . . . . 34 4.3 Die wichtigsten optionalen Pakete . . . . . . . . . . . . . . . . . . 35 4.3.1 Bluetooth API . . . . . . . . . . . . . . . . . . . . . . . . 35 4.3.2 Wireless Messaging API(WMA) . . . . . . . . . . . . . . . 36 4.3.3 Mobile Media API(MMAPI) . . . . . . . . . . . . . . . . . 37 4.3.4 Location API . . . . . . . . . . . . . . . . . . . . . . . . . 37 Werkzeuge zur Arbeit mit J2ME . . . . . . . . . . . . . . . . . . 38 4.4.1 J2ME Wireless Toolkit . . . . . . . . . . . . . . . . . . . 40 4.4.2 JBuilder 7 Enterprise with MobileSet 3 . . . . . . . . . . . 40 4.4.3 Sun One Studio 4 Mobile Edition . . . . . . . . . . . . . . 40 4.4.4 Metrowerks CodeWarrior Wireless Studio . . . . . . . . . . 40 4.4.5 Whiteboard SDK . . . . . . . . . . . . . . . . . . . . . . . 40 Eingebette Systeme, die die J2ME verwenden . . . . . . . . . . . 41 4.4 4.5 5 Ausblick 42 5.1 Vergleich von J2ME mit J2SE . . . . . . . . . . . . . . . . . . . . 42 5.2 Probleme und Grenzen vom J2ME . . . . . . . . . . . . . . . . . 42 5.3 Alternativen zur Verwendung von J2ME . . . . . . . . . . . . . . 43 Literatur und Quellen 43 Index 44 Kapitel 1 Einleitung Heutzutage gibt es Mikroprozessoren in fast allen elektronischen Geräten. Die zunehmende Komplexität der Anwendungen eingebetteter Systeme und ihre Netzverbindung bringt neue Probleme mit sich: ✸ zunehmende Funktionalität der Geräte ✸ existierende Software sollte unter zukünftigen Geräten lauffähig bleiben ✸ Netzwerkfähigkeit ✸ Datensicherheit ✸ große Architekturvielfalt Für die Erstellung von Software, die auf vielen verschiedenen Architekturen lauffähig sein soll, gibt es zwei Möglichkeiten: ✸ Es wird eine Plattform spezifiziert, sodass entwickelte Software auf jeder Architektur lauffähig ist, die diese Plattform unterstützt. ✸ Die Software wird manuell auf jede Architektur portiert. In der folgenden Arbeit wird der erste Ansatz anhand von J2ME und einigen Beispielprogrammen, die typische J2ME-Anwendungen verdeutlichen, analysiert. Im Hauptteil der Arbeit werden die Technik und die Möglichkeiten von J2ME beschrieben (Kapitel 2), abschließend werden kurz noch die Grenzen von J2ME betrachtet und es wird ein Ausblick gegeben, wie J2ME in Zukunft eingesetzt werden könnte (Kapitel 3). 1 Kapitel 2 Java 2 Microedition J2SE und J2EE sind Java-Plattformen für Desktop und Server Rechner. J2ME wurde konzipiert, um den Einsatz von Java auf eingebetteten Systemen zu ermöglichen. Die Weiterentwichklung von Java macht die Bibliotheken und APIs1 immer grösser, sodass es besonders wichtig ist für kleine Geräte, die begrenzte Ressourcen haben, eigene APIs zu entwichkeln. 2.1 Übersicht Java ist eine plattformunabhängige Sprache mit dem Leitspruch:“Write once, run anywhere.“(einmal programmieren, überall ausführen). Der Java-Compiler erzeugt nicht Maschinencode, sondern einen Java-Bytecode, der dann von der Laufzeitumgebung (Java Runtime Environment) zur Laufzeit ausgeführt wird. Es gibt Laufzeitumgebungen für verschiedene Betriebssysteme. Die Anwendungen laufen innerhalb der Java Virtual Machine. Um zu verhindern, dass JavaProgramme die Laufzeitumgebung zum Abstürz bringen, ist in Java eine Prüfung des Codes zur Laufzeit eingebaut, die sogenannte Bytecode Verifikation. Diese bringt Performance Einbußen mit sich. Ausserdem ermöglicht Java das dynamische Nachladen von Klassen. 1 Application Program Interfaces sind Bibliotheks-Klassen, die dem Entwickler eine definierte Funktionalität zur Verfügung stellen. 2 KAPITEL 2. JAVA 2 MICROEDITION 2.2 3 Die Java Plattformen Wir werfen einen Blick auf die drei Java Versionen, um zu verstehen, welche Java Plattform für welche Gerate konzipiert ist: Abbildung 2.1: Java 2 Umgebungen und deren Zielmarkt ✸ Die Java 2 Standard Edition (J2SE) Die J2SE ist für Desktop Rechner entwickelt worden. ✸ Die Java 2 Enterprise Edition (J2EE) Die J2EE ist für Server Anwendungen geeignet. ✸ Die Java 2 Microedition (J2ME) Die J2ME ist für kleine Geräte mit begrenztem Speicher (bis 2MB RAM), KAPITEL 2. JAVA 2 MICROEDITION 4 Display und Prozessoren (bis 100MHz) wie Handys, PDAs (Personal Digital Assistent), Smartphone bis hin zu gößeren Geräte wie Set Top Boxen 2 . 2.3 J2ME Architektur Die J2ME-Architektur basiert auf den Konzepten Konfiguration und Profil, die die Java-Plattform auf eine spezielle Klasse von Geräten anpassen. Abbildung 2.2: J2ME Architektur Diese Bild zeigt uns die vier Bausteine der J2ME-Architektur: ✸ die Konfigurationen ✸ die Profile ✸ die virtuelle Maschine (z.B. JVM, KVM) ✸ das Betriebssystem (z.B. PalmOS, PocketPC) Um J2ME zu verstehen müssen wir zuerst die Begriffe Konfiguration und Profile genau verstehen. Wir werden in den folgenden Unterkapiteln die beiden Begriffen kennenlernen. 2 Set-Top Boxen sind Geräte, die in Zusammenhang mit einem Fernseher einen Internetzugang ermöglichen KAPITEL 2. JAVA 2 MICROEDITION 2.3.1 5 Konfigurationen Eine Konfiguration definiert eine Klasse von Geräten. Eine Konfiguration stellt Anforderungen an die virtuelle Maschine, unterstützt Bibliotheken und den abgedeckten Java-Sprachumfang. J2ME hat zwei unterschiedliche Konfigurationen: ✸ Die Connected Device Configuration (CDC) arbeitet mit derselben Java 2 Virtual Maschine wie J2SE ✸ Die Connected Limited Device Configuration (CLDC) arbeitet mit einer “abgespeckten“ virtuellen Maschine (z.B. der “Kilobyte Virtual Machine “) Connected Device Configuration (CDC) Als erste Konfiguration betrachten wir die CDC. Sie kann mit der klassischen virtuellen Java Maschine ausgefürt werden. Diese virtuelle Maschine benötigt für ihre Unterstützung mehrere Megabytes Speicher. Diese Konfiguration ist für Geräte mit permanentem Netzwerkanschluß, einem schnelleren Prozessor (32Bit), mit mindestens 512KB Speicher (ROM/Flash) für die Ausfürung von J2ME- Anwendungen, mit mindestens 256KB Speicher (RAM) und einer schnellen Netzverbindung (z.B. LAN, 56KB Modem bis hin zu DSL) gedacht. So zusagen für kleine Geräte mit einbisschen größerem Speicherplatz und Rechenleistung wie “Screen Phone “ und “Set Top Boxen “. Connected Limited Device Configuration (CLDC) Abschließend lernen wir die CLDC als unsere Ziel-Konfiguration kennen. Das MIDP basiert auf dieser Konfiguration. Die CLDC ist für Geräte mit begrenzten Ressourcen konzipiert. Sie unterstützt Geräte, die hauptsächlich mit Batterie betrieben sind und verwenden die virtuelle Java Maschine, die für diese Gruppe von Geräte entwickelt worden ist. Diese Geräte haben einen 16 Bit oder 32 Bit Prozessor mit 8 bis 32MHz, eine minimale graphische Oberfläche, 160 bis 512KB Speicheranforderungen für das gesamte J2ME (d.h für die virtuelle Maschine und J2ME-Anwendungen), mindestens 128KB nichtflüchtigen Speicher für JVM und CLDC-Bibliotheken, mindestens 32KB für die Laufzeitumgebung und neue erzeugte Objekte und einen Anschluss an einem Netzwerk mit begrenzter Bandbreite (z.B. GSM-Handy mit 9600 Bit/s). Die gesamten J2SE-Bibliotheken sind für kleine Geräte mit begrenzten Ressourcen zu groß. Um diese Bibliotheken an kleine Geräte anzupassen, wurden einige Funktionalitäten reduziert (z.B. KAPITEL 2. JAVA 2 MICROEDITION 6 die java.lang.math wurde deutlich reduziert) oder komplett eliminiert (z.B. das java.awt Paket von J2SE wurde durch javax.microedition.lcdui Paket in J2ME ersetzt. Dieses J2ME-Paket passt sich an die Eigenschaften von J2ME-fähigen Geräte an). CLDC1.1 [5] hat einigen Änderungen an CLDC1.0 gebracht. Folgendes wird jetzt von CLDC1.1 unterstützt: ✸ Gleitkommazahlen mit den Klassen Float und Double. ✸ Neue Klassen: ✸ Die Klasse java.util.Random. Damit hat man einen Zufallsgenerator, der für die Entwicklung von MIDP-Anwendungen wie Spiele sehr wichtig ist. ✸ Die Klasse java.lang.Math, die die Methoden max, abs, ceil, floor, trigonomische Funktionen und die Berechnung der Wurzel zur Verfügung stellt. ✸ eine neue Fehlerklasse, die java.lang.NoClassDefFoundError ✸ zwei Weak Reference Klassen, die java.lang.ref.Reference und java.lang.ref.WeakReference. CLDC unterstützt Multithreading und Garbage Collection wie in J2SE. Im Gegensatz zu J2SE, wo meist ein just-in-time Compiler eingesetzt wird, verwendet die J2ME eine KVM Interpretation. Handys, PDAs3 und Smartphones sind mögliche Zielgeräte der CLDC. Aus Platz- und Performancegründen, sind die herkömmlichen J2SE-APIs stark eingeschränkt. Wir haben jetzt die wichtigste Konfiguration kennengelernt. Jetzt werden wir die virtuelle Machine, die die Eigenschaften der obigen Konfiguration erfüllt, kurz beschreiben. Das Kilobyte Virtual Machine (KVM) Die virtuelle Maschine ist die Maschine hinter jeder Java-Anwendung. Sie ist zuständig für die Sicherheit, die Speicherverwaltung, und die Ausführung von Threads. Das KVM ist die virtuelle Maschine von Sun, die die Anforderungen, der CLDC erfüllt. Deshalb unterstützt die KVM alle CLDC-Bibliotheken. Jedes J2ME-fähige Gerät muß eine CLDC-fähige virtuelle Maschine unterstützen. Wie ist die Sicherheitsprüfung innerhalb der KVM? Die Entwicklung von Anwendungen für KVM erfolgt mit dem normalen “Java 3 Personal Digital Assistent KAPITEL 2. JAVA 2 MICROEDITION 7 Development Kit (JDK) “. Der Boothclasspath teilt dem Java Compiler mit, dass er als Basis API, die CLDC APIs verwendet soll. Die Sicherheitsprüfung innerhalb der virtuellen Maschine (VM) schützt die Laufzeitumgebung gegen gefährlichen Code, der sie zum Abstürz bringen könnte. In der JVM ist der Class-Verifier dafür zuständig, dass der Bytecode keine illegale Anweisung ausführt. Die CLDC fordert, dass diese Klassenverifizierung in zwei Schritten abläuft. Abbildung 2.3: Zwei Phasen Klassenverifizierung in CLDC In J2SE wird eine Bytecode-Verifizierung zur Laufzeit durchgeführt. In CLDC wird hingegen statisch eine Pre-Verifizierung durchgeführt, weil dieser Schritt sehr viele Ressourcen verbraucht und damit auf einem kleinen Gerät mit begrenzten Ressourcen nur schwer durchgeführt werden kann. Der Preverifier 4 fügt in den Bytecode eine Prüfsumme ein, die dann zur Laufzeit geprüft wird. Dieser Mechanismus ist unsicher und kann zum Absturz der Laufzeitumgebung führen, falls 4 Der Peverifier ist ein Hilfsprogramm, der Prüfsummen im Bytecode einfügt KAPITEL 2. JAVA 2 MICROEDITION 8 eine schädliche Anwendung mit gefälschten Prüfsummen eingeschmuggelt wird. Der Bytecode wird nicht mehr zur Laufzeit geprüft, sondern nur die Prüfsumme. So wird in CLDC zuerst eine externe Verifizierung (“preverifier “) außerhalb des Zielsgeräts durchgeführt. Dann wird eine interne Verifizierung (“runtime verifier“) in der virtuellen Maschine des Zielgeräts durchgeführt. Die CLDC benutzt das “Sandbox (Sandkasten)“Model, das genau sagt, dass nur die VM auf die Geräte-Ressourcen zugreifen darf. Die Anwendungen werden in einem reservierten Speicherplatz gespeichert und können nur auf die CLDC, ihre Profile und die zugehörigen optionalen APIs zugreifen. Wir haben die Elemente, die zur CLDC gehören kennengelernt. Als letzter wichtiger Schritt wird der Begriff Profil erklärt und anschließend das MIDP. 2.3.2 Profile Innerhalb einer Konfiguration gibt es viele Typen von Geräten, die unterstützt werden. Diese Geräte können unterschiedliche Fähigkeiten haben, obwohl sie zur gleichen Konfiguration gehören (z.B. Handy und PDA haben unterschiedlichen Bildschirm, aber gehören zur gleichen Konfiguration). Um diese verschiedenen Fähigkeiten zu adressieren, werden Profile für eine spezielle Klasse von Geräten spezifiziert. Ein Profil ist eine Erweiterung der Konfiguration. Es definiert eine Menge von APIs für die Unterstützung einer speziellen Geräteklasse mit bestimmten Fähigkeiten. KAPITEL 2. JAVA 2 MICROEDITION 9 Abbildung 2.4: J2ME grundlegende Aufbau Die J2ME hat drei wichtige Profile und einige optionale Pakete: ✸ CLDC: ✸ Mobile Information Device Profil (MIDP) ✸ Personal Digital Assistent Profil (PDA) ✸ CDC: ✸ Foundation Profil (FP) Wir werden MIDP ausführlich in den nächsten Kapiteln kennenlernen sowie die anderen Profile und einige wichtige optionale Pakete kurz beschreiben. Kapitel 3 Anforderungen und Möglichkeiten von MIDP Wie eine Konfiguration, stellt auch MIDP eigene Anforderungen an Software und Hardware. Wir werden in den folgenden Unterkapiteln, die Anforderungen von MIDP an Software und Hardware betrachten, abschließend die Möglichkeiten von MIDP. Der Hersteller eines J2ME-fähigen Geräts muß einige grundlegende Hardware- und Software-Anforderungen erfüllen. Hardware Anforderungen Das MIDP-Gerät muß: ✸ einen Bildschirm mit mindestens 96*54 Pixels besitzen. ✸ die Interaktion zwischen dem Benutzer und der MIDP-Anwendung (z.B. durch Knöpfe) unterstützen. ✸ mindestens 128KB nichtflüchtigen Speicher (ROM/Flash) für die Ausführung seiner Komponenten haben. ✸ mindestens 8KB nichtflüchtigen Speicher für die dauerhafte Speicherung von Daten wie Eigenschaften einer Anwendung oder Dateien haben. ✸ mindestens 32KB flüchtigen Speicher (RAM) für die Ausführung der MIDPAnwendung haben. ✸ eine drahtlose Netzwerkverbindung ermöglichen. 10 KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 11 Software Anforderungen Eine Software, die MIDP unterstützt muß: ✸ einen Scheduler, eine Ausnahmebehandlung und die Ausführung von Interrupts unterstützen. ✸ in der Lage sein, die Java Virtual Machine (JVM) für CLDC zum Laufen zu bringen. ✸ das Zeichnen von Grafiken auf dem Display unterstützen. ✸ die Eingabe vom Benutzer akzeptieren und die Information an die JVM übergeben. ✸ das Lesen und Schreiben auf dem nichtflüchtigen Speicher unterstützen. Nach den Anforderungen von MIDP werden nun seine Möglichkeiten beschrieben. 3.0.3 Grundlagen von MIDP Das MIDP hat als Ziel eine Architektur und APIs zu entwickeln, um die Entwicklung von Anwendungen für drahtlose Geräte mit beschränkten Ressourcen zu ermöglichen. MIDP basiert auf CLDC. Wir wissen, dass kleine Geräte sehr viele Fähigkeiten haben. Die Java Community Process Expert Group hat eine begrenzte Zahl von APIs spezifiziert, die als absolut wichtig für kleine Geräte sind: ✸ Bereitsstellung und in Rechnung stellen der Applikation ✸ Lebenzyklus einer Anwendung ✸ Ein Modell der Signierung der Anwendung und ein Sicherheitsmodel für priviligierte Bereiche ✸ Aufeinanderfolgende Verhandlungssicherheit ✸ Dauerhafte Speicherung von Daten ✸ Netwerktechnologie ✸ Ton ✸ Schuduler ✸ Benutzeroberfläche KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 12 Die MIDP Architektur Bevor wir MIDP beschreiben, werfen wir einen Blick auf die MIDP-Architektur. Abbildung 3.1: CLDC, MIDP und Bluetooth Architekture Mit dem folgenden Bild können wir genau sehen, dass es zwei Typen von APIs über der CLDC gibt: ✸ MIDP mit ihren optionalen APIs (Bluetooth, Location etc). Um zu gewährleisten, dass sich alle MIDP-Anwendungen auf allen MIDP-fähigen Geräten ausführen lassen, hat das Profil sich nur auf den kleinsten gemeinsamen Nenner seiner Zielgeräte beschränkt. Es gibt im MIDP keine Unterstützung für Dinge wie SMS1 oder Bluetooth, die für den Benutzer wichtig sind. ✸ Die OEM-Spezifische2 APIs. Die proprietären Lösungen werden entwickelt, weil das MIDP nicht alle Funktionalitäten eines Geräts unterstützt. Beim Nokia und Siemens gibt es Bibliotheken, die den Zugriff auf gewisse Funktionen des Geräts (wie die Infrarot-Schnittstelle) ermöglichen. Die MIDPAnwendungen, die mit proprietären Lösungen entwickelt worden sind, können 1 Short Message Service Eine OEM-Spezifische Anwendung beinhaltet Klassen, die nicht Teil von MIDP sind. Diese Anwendungen können nicht zu anderen MIDP-fähigen Geräten portiert werden. 2 KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 13 selbtverständlich nicht zu anderen MIDP-Fähigen Geräte portiert werden. Da die OEM-speczifischen APIs nicht portabel sind und die Verbreitung von MIDP einschränken, wurden in MIDP2.0 optionale APIs definiert, die diese proprietäre Lösungen standardisieren. Bevor die ersten MIDP2.0 Geräte auf dem Markt kommen, müssen wir noch mit diesen proprietären Lösungen leben. Wir werden die wichtigsten optionalen APIs im nächsten Kapitel kurz beschreiben. Die Architektur zeigt auch, dass die CLDC/MIDP-Anwendungen nicht nur auf einem Betriebssystem (wie PalmOs) laufen können, sondern auch neben NativeAnwendungen3 . Bevor wir unsere erste MIDP-Anwendung entwickeln können, müssen wir zuerst verstehen was ein MIDlet4 ist. Abbildung 3.2: MIDP-Architektur und MIDP-Anwendung Dieses Bild zeigt genau, dass jedes MIDlet über dem MIDP-Profil liegt. Mehrere MIDlets werden in ein Paket eingepackt und bilden so eine sogenante MIDlet Suite. Eine MIDlet Suite kann ein oder mehrere MIDlets enthalten. Der Benutzer kann von einem Server immer eine MIDlet Suite herunterladen, und die einzelnen MIDlets ausführen. Das Lebenzyklus eines MIDlets hat 3 Zustände: 3 4 Eine Native-Anwendung ist eine Anwendung, die nicht in Java geschrieben ist. Ein MIDlet ist eine MIDP-Anwendung, die nur die APIs aus MIDP und CLDC verwendet. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 14 Abbildung 3.3: MIDlet Lebenzyklus Auf dem Bild sehen wir folgende Zustände: ✸ Ein Midlet befindet sich im Zustand Paused, wenn es gerade nicht genutzt wird, entweder anfangs oder durch einen entsprechenden Methodenaufruf. ✸ Ein MIDlet befindet sich im Zustand Active, wenn es mit dem Benutzer interagiert. ✸ Der Zustand Destroyed zeigt, dass das MIDlet alle Ressourcen, die es hat, freigegeben hat. Danach kann der Garbage Collector es aufräumen. Nachdem beschrieben wurde, was ein MIDlet ist, werden wir im nächsten Kapitel sehen, wie ein MIDlet erzeugt wird. Wie wird ein MIDlet entwickelt? Die Struktur eines MIDlets ist ähnlich der eines Applets. Es gibt hier keine main-Methode, sondern eine start-Methode. Jedes MIDlet wird immer von der abstrakten Klasse MIDlet abgeleitet. Die Klasse MIDlet hat die folgenden 3 Methoden, die den obigen Zustandsübergängen entsprechen: ✸ abstract void startApp() KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 15 ✸ abstract void pauseApp() ✸ abstract void destroyApp(boolean unconditional) Jede abgeleitete Klasse muß alle abstrakten Methoden der Klasse MIDlet implementieren. Wir werden es an einem konkreten Beispiel in Kapitel 3.0.5 zeigen. Der Java Application Manager (JAM)5 kommuniziert direkt mit dem MIDlet. Der JAM muß folgendes ermöglichen: ✸ den Zugriff von MIDP-Anwendungen auf MIDP- und CLDC-Bibliotheken ✸ den Zugriff von MIDP-Anwendungen auf die JAR-Datei Um alles genau zu verstehen, betrachten wir folgendes Bild; Abbildung 3.4: Kommunikation zwischen JAM und dem MIDlet Das Bild zeigt die 3 wichtigsten Nachrichten, die in beiden Richtungen gesendet werden können. Als Beispiel kann der JAM einen MIDlet unterbrechen (pauseApp), damit der Benutzer einen ankommenden Anruf beantworten kann. Wenn die Verbindung beendet wurde, sendet das MIDlet die Nachricht resumeRequest 6 an JAM. Dann startet JAM das MIDlet wieder. Wir haben die beiden wichtigsten Begriffe von MIDP gelernt, jetzt werden wir die wichtigsten MIDP APIs dargestellt. 5 Der JAM ist eine Anwendung, die im Gerät installiert ist, das MIDP unterstützt. Sie ist für die Installation, die Ausführung und die Deinstallation von MIDlets zuständig. 6 Mit der resumeRequest Methode fordert das MIDlet den JAM auf das MIDlet zu reaktivieren. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 16 3.0.4 Benutzeroberfläche Eine Möglichkeit die MIDP anbietet, ist die Entwicklung von Benutzeroberflächen. Die “Graphic User Interfaces (GUI)“ bei eingebetteten Systeme haben anderen Anforderungen als beim Desktop. Die APIs die hier entwickelt wurden achten auf die Eigenheiten von Handys und Pagers. In allen GUI - Klassen befinden sich spezielle MIDP-KLassen und sie basieren nicht auf “Abstract Window Toolkit (AWT)“ von J2SE. Unter MIDP wird stets nur ein Fenster am Bildschirm angezeigt, da das Display sehr klein ist. MIDP stellt folgende Bibliotheksklassen zur Verfügung. Abbildung 3.5: Aufbau der Klasse Displayable Dieses Bild zeigt uns die wichtigsten APIs, die wir haben, um Benutzeroberflächen zu entwickeln. Ganz oben haben wir die Klasse Display. Jedes MIDlet hat als Instanzvariable ein Display-Objekt. Dieses Objekt zeigt z.B. die Anzahl der Farben, die das Gerät unterstützt, mit der Methode int numColor() an. Die Klasse Displayable ermöglicht das einfügen einer Form, Canvas, Command, Ereignis-Händler in einer Anwendung. Wir werden die verschiedenen Elemente, die wir in diesem Bild haben, kurz beschreiben. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 17 Eigenschaften der Benutzeroberfläche MIDP ist für drahtlose, kleine Geräte entwickelt worden. Die Geräte wie Handy, PDA und Pager haben alle im Vergleich zum Desktop PC kleine Displays, aber nicht alle haben einen Touch-Screen. Unter Berücksichtigung dieser Beschränkungen müssen MIDP-Anwendungen die gleichen Funktionalitäten für alle Geräte haben. So wurde das GUI beim MIDP in zwei Ebenen geteilt: ✸ High-Level API ✸ Low-Level API Die High-Level APIs Diese Schnittstellen ermöglichen die Portierung vom GUI auf verschiedene Geräte. Das Aussehen eines GUI variert von einem Gerät zu anderen. Diese API hat mehr Klassen als die API aus dem Low-Level. Die wichtigsten APIs sind: ✸ Die Klasse Form (d.h. Formular) gibt die Möglichkeit, mehrere Komponenten in einem Fenster zu zeigen. Sie ist ein Container, der mehrere Komponenten beinhaltet. Mit den Methoden append, insert, replace und delete, kann eine Komponente in einer Form angehängt, eingefügt, ersetzt oder gelöscht werden. Wenn eine Komponente in einer Form eingefügt wird, muß der Ereignis-Händler ItemStateListener aufgerufen werden. Ein EreignisHändler überwacht die Ereignisse, die vom MIDlet kommen und reagiert entsprechend. In einem MIDlet gibt es nur die folgenden zwei Typen von Ereignis-Händlern: - Die CommandListener-Schnittstelle definiert eine Methode commandAction(), die aufgerufen wird, wenn ein Knopf gedrückt wird. - Die ItemStateListener wird aufgerufen, wenn eine Komponente des Formular ihren Zustand geändert hat (z.B. Änderung eines Nachrichten-Texts). In einer Form können nur folgende Komponenten aus der Unterklasse Item eingefügt werden. ✸ Die DateField-Komponente aus der Klasse DateField (javax.microedition.lcdui.DateField) ermöglicht eine Manipulierung des Datums. ✸ Mit der Gauge-Komponente aus der Klasse Gauge, kann der DownloadAblauf einer Datei oder der Installierungs-Ablauf einer Software angezeigt werden. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 18 ✸ Das StringItem aus der Klasse StringItem zeigt einen NachrichtenText, den der Benutzer nicht modifiezieren kann. ✸ Das TextField ermöglicht das Schreiben eines Texts wie Name oder E-Mail Adresse. ✸ Das ImageItem aus der Klasse ImageItem kann genutzt werden, um ein Bild an einer bestimmten Position im Formular zu platzieren. z.B. private Form fmMain = new Form (“Mein Studienarbeit“); private DateField dfToday = new DateField (“Today:“,DateField.Date); ... fmMain.append (dfToday); fmMain.setItemStateListener(this); ✸ Wir verlassen jetzt die Unterklasse Form, wo Komponenten angehängt werden können, und betrachten andere Unterklassen von Screen (Siehe Abbildung 2.5). Diese Klassen werden jetzt kurz beschrieben. ✸ Die Choice-Schnittstelle definiert Methoden zur Auswahl zwischen mehrere Möglichkeiten. Es gibt in MIDP zwei Klassen, die die obigen Schnittstellen implementieren: - public class ChoiceGroup extends Item implements Choice {...} Ein ChoiceGroup kann die beiden Ereigniss-Händler benutzen. - public class List extends Screen implements Choice {...} Sie bietet fast die gleiche Möglichkeit wie ChoiceGroup, aber es gibt einige Unterschiede. Eine Liste kann nur den Ereignis-Händler CommandListener benutzen. Eine ChoiceGroup wird auf einem Formular angehängt, wenn mehrere Komponenten ausgewählt werden können. In einem Display ist stets nur eine Möglichkeit ausgewählt. ✸ Mit der TextBox-Komponente aus der Klasse TextBox kann man mehrere Zeilen Nachrichten-Text schreiben (Im Gegenteil zum TextField, das nur eine Zeile Nachrichten-Text erlaubt). ✸ Mit der Alert-Komponente kann eine Warnung angezeigt werden. Diese Warnung kann mit einem Ton oder Bild verbunden sein. ✸ Die Ticker-Komponente zeigt eine Text-Zeile. Die Sätze oder Wörter werden nacheinander mit einer bestimmten Geschwindigkeit gezeigt. ✸ Die letzte Komponente ist die Command-Kommponente (Button in J2SE). Mit Command kann der Benutzer mit dem MIDlet interagieren. Command ist Unterklasse von Displayable. Die Klasse Command KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 19 enhält Informationen über eine Benutzereingabe. Sie hat drei Eigenschaften: den Label, den Typ und die Priorität. Wir werden diese am konkreten Beispiel zeigen. Die Low-Level APIs Diese APIs ermöglichen unmittelbar Änderungen auf dem Display. Sie erlaubt einen direkten Zugriff auf das Display. Hier ist die Portabilität der Anwendung nicht garantiert, deshalb muß der Programmierer selbst dafür sorgen. So spricht man von Low-Level API. Deshalb muß der Entwickler bei der Entwicklung einer Anwendung genau auf das Zielgerät aufpassen. Diese APIs sind sehr geeignet für die Entwicklung von Spielen aller Art. In der Low-Level API haben wir folgende Klassen: die Klassen Canvas und Graphics, die das Zeichnen, beliebiger Grafiken auf dem Display ermöglichen. Wir wissen, dass ein MIDlet nur eine Display-Klasse hat, aber mehrere Displayable-Klassen haben kann (Siehe Abbildung 2.5). Die beiden obigen Klassen gehören zur abstrakten Klasse Displayable. Mit den obigen Klasssen können auch farbige Grafiken gezeichnet werden. Es gibt in diesen APIs die Möglichkeit ganz gezielt auf die Tasten der Standardtastatur eines Geräts zuzugreifen (z.B. keyPressed, keyReleased, keyRepeated etc.). 3.0.5 MIDlet-Beispiel Nachdem wir einige wichtige Dinge über die Möglichkeiten von MIDP gesehen haben, wird am konkreten Beispiel gezeigt, wie man ein komplettes MIDlet anhand obiger Elemente entwickeln kann. Wir werden die Programmstruktur eines MIDlets kennenlernen und folgende Fragen beantworten: 1- Wie wird ein MIDlet erstellt? 2- Was sind JAR- und JAD-Dateien? 3- Wie werden die MIDlets zur Ausführung vorbereitet? Die meisten Entwicklungsumgebungen für MIDP helfen dem Entwickler erheblich, so dass es nicht mehr nötig ist die verschiedenen Schritte der Entwicklung eines MIDlets auf einem Dos- Fenster zu zeigen. Die Entwicklungsumgebungen übernehmen einige Schritte wie die Verifizierung und das Einpacken der MIDlets in JAR-Dateien selbständig. Als Beispiel nehmen wir folgenden Programmcode, der Hello World auf dem Emulator ausgibt: //Verweis auf MIDPspezifischen Klassen KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 20 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; //Ein MIDlet muss immer von der Klasse MIDlet abgleitet werden.Dies ist eine //Grundvoraussetzung zum Erstellen eines MIDlets Programms public class HelloWorld extends MIDlet implements CommandListener { private Form fmMain ; //Ein Bildschirmobjekt deklarieren private Command cmExit; //Ein Command deklarieren public HelloWorld() { fmMain = new Form("Hello World"); // Das Bildschirm bekommt ein Titel cmExit = new Command("Exit", Command.EXIT,0);//Es bekommt ein Exit-Command fmMain.append(new StringItem(null, "Hello World! Wir werden gemeinsam" + "lernen wie MIDP funktioniert und welche Mglichkeiten MIDP" + "bietet")); fmMain.addCommand(cmExit); fmMain.setCommandListener(this); } /*---------------------------------------------------------------------*Die folgenden Funktionen sind die Kernfunktionen die ein MIDlet haben *muss. Der MIDlet Aufbaut ist "ahnlich eines Applets. *----------------------------------------------------------------------*/ //1. wird zu Beginn des Programmes ausgef"uhrt. public void startApp() { Display.getDisplay(this).setCurrent(fmMain); } //2. Hier geht das Programm in den Ruhezustand. //Alle Ressourcen werden vom MIDlet freigegeben public void pauseApp() {} //3. Wird ausgef"uhrt, wenn das MIDlet beendet wird. public void destroyApp(boolean unconditional) {} //Pruefen ob den Benutzer den Command cmExit gedr"uckt hat. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 21 public void commandAction(Command c, Displayable s) { if(c == cmExit) { destroyApp(false);//gibt alle Ressourcen frei notifyDestroyed();// Das MIDlet wird vom JAM gel"oscht } } } So haben wir es geschafft unser erstes MIDP-Programm zu schreiben. Wir müssen jetzt noch klären, wie man es ausführt. Verifikation des Bytecodes (Classfile) Wir müssen zuerst die Dateien unseres Quellcodes von der virtuellen Maschine (d.h. die JVM 1.3 oder 1.4 die auf dem Desktop PC läuft) auf Gültigkeit überprüfen lassen. Dieser Vorgang erfolgt beim Kompilieren automatisch. So wird ein Bytecode aus dem Quellcode erzeugt. Abschließend wird auf dem Desktop eine Pre-Verifizierung durch den Preverifier durchgeführt. Dieses Hilfsprogramm ist im Sun Wireless Toolkit enthalten. Die Ausgabedatei ist größer als die Quelldatei. Dies liegt daran, dass bei der Preverifizierung des Bytecodes eine Prüfsumme angehängt wird. JAR-Datei Eine Anwendung besteht meist aus mehreren Klassen. Es ist sinnvoll alle Klassen, die zu einer Anwendung gehören, in einem Paket zusammenzufassen. Alle Dateien, die zur Ausführung des Programms benötigt werden, werden in eine Datei verpackt. Diese Datei trägt die Endung JAR (Java Archive). Auch andere Quelldateien, wie Bilder oder Icons werden mitverpackt. Der Inhalt einer JARDatei kann auch aus mehreren einzelnen MIDlets bestehen. In diesem Fall spricht man von einer MIDlet Suite. Eine Manifest-Datei7 muß noch der JAR-Datei hinzugefügt werden. Die Manifest-Datei muß folgende Attribute beinhalten: ✸ MIDlet-Name: Name der MIDlet Suite 7 Die Manifest-Datei beschreibt den Inhalt der JAR-Datei und muß unter dem Namen manifest.txt gespeichert werden KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 22 ✸ MIDlet-Version: ✸ MIDlet-Vendor: Name des Entwicklers oder der Firma ✸ MIDlet-<n>: Nummer des MIDlets in der JAR-Datei mit den zwei wichtigten Attributen MIDlet-Name und Klassenname des MIDlets, welche die JAM beim Aufruf des MIDlet startet. ✸ MicroEdition-Configuration: Version der Konfiguration ✸ MicroEdition-Profile: Version des Profils JAD-Datei Nun haben wir beinahe alles durchgeführt, was nötig ist. Nur die JAD-Datei fehlt noch. JAD bedeutet Java Application Description. Diese Datei beinhaltet noch einmal die Beschreibung der MIDlet-Suite, also einige Inhalte, die wir bereits aus der Manifest-Datei kennen. Sie wird von den Emulatoren und einigen Handys benötigt. Ein JAD muß die folgenden Eigenschaften definieren: MIDlet-Name: Name der MIDlet Suite MIDlet-Version: MIDlet-Vendor: Name des Entwicklers oder der Firma MIDlet-<n>: Nummer des MIDlets im Archiv MIDlet-Jar-URL: MIDlet-Jar-Size: Diese Schritte übernimmt das Wireless Toolkit und erleichtert so die Arbeit. Die JAR- und JAD-Dateien für unser HelloWorld-MIDlet wird wie folgt im Toolkit angezeigt: KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 23 Abbildung 3.6: Selbst erstellte JAR- und JAD-Datei beim Toolkit Abschließend können wir unseren Bytecode vom Toolkit ausführen lassen. Als Endergebnis haben wir dieses schöne Bild vom Emulator: KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 24 Abbildung 3.7: Die Anwendung auf den Emulator 3.0.6 Record Management System (RMS) Als nächste Möglichkeit, bietet uns das MIDP einen guten Weg unsere Daten innerhalb einer Datenbank zu verwalten. Weil die Datenspeicherung auf den verschiedenen kleinen Geräten unterschiedlich ist, wurde in MIDP das RMS entwickelt. Viele kleine Geräte kennen keine Datei und ihr Speicher arbeitet ohne Dateisystem wie es auf dem Desktop PC üblich ist. Das RMS bietet eine Alternative zum Dateisystem. Das RMS verwaltet eine kleine Datenbank für die MIDlet Suite. Jedes MIDlet bekommt innerhalb des RMS einen RecordStore8 zugewiesen. In diesem RecordStore kann das MIDlet beliebig viele Records (Einträge) anlegen, solange Speicherplatz vorhanden ist. Es gibt im Gegensatz zu J2SE oder J2EE keine Objektserialisierung. Die Objekte werden nicht direkt im Speicher abgelegt, sondern es ist nur die Speicherung von Byte-Streams möglich. Der Entwickler muß immer in diesem Fall die Datei selbst in einen Byte-Streams umwandeln. 8 Der RecordStore ist eine Kollektion von mehreren Records (Einträgen) KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 25 Record ID 1 2 3 ... Data Array of bytes Array of bytes Array of bytes ... Abbildung 3.8: Inhalt eines RecordStores Kein Eintrag (d.h. Record) in einem RecordStore hat einen Namen, sondern er bekommt eine Record ID9 . Ein Record besteht aus seiner ID und seinen Daten. So besteht der nichtflüchtige Speicher (ROM) aus Sicht der MIDP-Anwendung nur aus einer Menge von RecordStores, die aus eine Menge von Records bestehen. Die MIDlets der selben MIDlet Suite haben direkt Zugang zu ihrem RecordStore (falls dieser existiert). Ein RecordStore hat einen eindeutigen Namen innerhalb eine MIDlet Suite und kann bis zu 32 Unicode-Zeichen lang sein. Verschiedene MIDlet Suites können die gleichen Namen für RecordStores verwenden. Jeder RecordStore hat immer zwei Werte, die beim Durchsuchen der Datenbank sehr wichtig sind. So erhält jeder Record (Eintrag) einen Timestamp10 (d.h. einen Zeitstempel) und eine Versionsnummer. Das folgende Beispiel zeigt wie man RMS auf einem Gerät verwenden kann. import java.io.*; import java.util.*; import javax.microedition.rms.*; public class RecordTest { RecordStore recordStore = null; static final String REC_STORE = "recordStoreName"; ... //Einen Record Store(RS) "offnen public void openRS() { try { recordStore = RecordStore.openRecordStore(REC_STORE, true); } catch(RecordStoreException rse) { 9 10 eindeutige Kennung mit Integer Wert innerhalb der Datenbank Timestamp ist ein Long Integer, das die Zahl von Millisekunden seit 01.01.1970 darstellt KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 26 rse.printStackTrace(); } } ... //Ein neues Record(als Byte-Stream) im recordStore einf"ugen public void addNewRecord(String record) { byte[ ] rec = record.getBytes(); try { recordStore.addRecord(rec, 0, rec.length); } catch(RecordStoreException rse) { System.out.println(rse); } } ... //Ein RS muss nach der "Offnung geschlossen werden. public void close() throws RecordStoreNotOpenException, { RecordStoreException { if (recordStore.getNumRecords() == 0) { String dateiName = recordStore.getName(); recordStore.closeRecordStore(); //aus der Record Store API recordStore.deleteRecordStore(dateiName); } else { recordStore.closeRecordStore(); } } } KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 27 3.0.7 Scheduler Eine andere Möglichkeit, die MIDP uns anbietet, ist die Verwaltung von mehreren Threads11 . Die API gehört zu der java.util. MIDP bietet uns folgende API: ✸ Mit der Klasse Timer kann man festlegen, wann eine Aufgabe erledigt oder beendet wird. ✸ Die Klasse TimerTask arbeitet gemeinsam mit der Klasse Timer. Schauen wir die 6 Methoden dieser API an: ✸ Wir können durch die Methoden void schedule(TimerTask task, long delay) und void schedule(TimerTask task, Date Time) eine Zeitspanne in Millisekunden festlegen nach welcher ein Task einmalig ausgeführt werden soll. ✸ Wenn ein Task periodisch ausgeführt werden soll, sind zwei Fälle zu unterscheiden: ✸ Fixed-Delay: Es kann vorkommen, dass wir für die Ausführung eines Tasks 30 Sekunden fesgelegt haben. Falls der Garbage Collector im gleichen Zeitpunkt seine Arbeit auch erledigt, braucht die TaskAusführung in gesamt mehr als 30 Sekunden bevor der nächsten Task ausgeführt wird. Dies kann zu erheblichen Störungen führen. So gibt es die Methoden - void scheduleAtFixedRate(TimerTask task, long delay, long period) und - void schedule(TimerTask task, long delay), long period), um solch eine Störung durch eine Verzögerung zu vermeiden. ✸ Das Fixed-Rate ermöglicht die Ausführung eines Tasks unter Berücksichtigung des Anfangs des vorigen Tasks und der Verzögerungen zwischen verschiedenen Tasks. Hierfür gibt es die Methoden - void scheduleAtFixedRate(TimerTask task, Date firstTime,long period) und - void schedule(TimerTask task, Date time) Diese Timer-API ist sehr hilfreich bei der Entwicklung von Spielen. 11 Ein Thread ist ein unabhängiger sequentieller Ausführungspfad in einer Ausführungsumgebung. Es können gleichzeitig mehrere Threads in einer Umgebung ablaufen. KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 28 3.0.8 Netzwerktechnologie Bevor ein MIDlet auf einem Gerät laufen kann, müssen wir es zuerst herunterladen. Abbildung 3.9: Der Weg eines MIDlets vom Entwickler bis zum Endbenutzer Der Entwickler muß zuerst das MIDlet in eine MIDlet Suite einpacken, dann auf seinem Server veröffenlichen und von dort können die Endbenutzer sie herunterladen. Wir werden in diesem und den nächsten Kapiteln lernen, wie die Netzwerkverbindung zwischen dem Server und dem mobilen Gerät funktioniert. Mit mehr als hundert Klassen (ungefähr 200 KB), sind die J2SE APIs, die für Netzwerk, Ein-/Ausgabe und die Speicherung von Daten entwickelt wurden, zu groß für CLDC-fähige Geräte. Aufgrund der begrenzten Ressourcen bei kleinen Geräten wurden in CLDC die obigen Klassen durch das sogenannte “Generic Connection Framework (GCF)“ersetzt. Das GCF ist eine Menge von Klassen und Schnittstellen, die für den Zugriff auf gespeicherte Daten und Kommunikationssysteme entwickelt worden ist. Die Konfiguration definiert einen protokollunabhängigen Netzwerkzugang, der vom Profil implementiert werden muß. So werden beim MIDP- und PDAP-Profile spezifische Protokoll spezifiziert. Die Basisklasse heißt Connector, die eineVerbindung mit dem Server herstellt. Mit der Methode open fordert der Client die Übertragung einer bestimmte Datei an ihn. Die generelle Syntax für die Verbindung mit einem Server lautet: Connector.open(“protokol://adresse:parameter “). Hier sind die wichtigsten Protokolle, die von MIDP-Profilen unterstützt werden: ✸ Das HTTP-Protokol wird in MIDP-Profilen unterstützt. So kann man es etwa benutzen um die Homepage der Uni-Erlangen herunterzuladen: Connector.open(“http://www.uni-erlangen.de “); KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 29 ✸ HTTPS-Protokoll. Das Problem, dass das MIDP-1.0 nur das HTTP Protokol unterstützt ist, ist im MIDP -2.0 gelöst. Die wichtigste Komponente der neuen Version ist das Interface HttpsConnection. Das HTTPS-Protokoll garantiert eine sichere Übertragung der Daten. In MIDP-2.0 ist nicht nur die Sicherheit der Daten bei der Übertragung geregelt. Auch die Vergabe von Rechten an MIDlet innerhalb einer Protection Domain wird spezifiziert. So kann man Daten sicher übertragen. Connector.open(“https://www.amazone.de/login“); ✸ Die Verbindung durch Sockets (peer 2 peer Verbindung). Seit MIDP-2.0 ist es auch möglich, sichere Socket-Verbindungen aufzubauen. SocketConnection sc = (SocketConnection) Connector.open(“socket://host.com:79“); SecureConnection sc = (SecureConnection) Connector.open(“ssl://host.com:79“); ✸ Eine Serielle-Verbindung (d.h ein serieller Port, der die serielle Übertragung von Daten als Byte ermöglicht). CommConnection cc = (CommConnection)Connector.open(“comm:com0;baudrate12 =19200“); In MIDP 1.0 dürfen alle MIDlet Suites nur innerhalb eines Sandkastens laufen. Seit MIDP 2.0, gibt es jedoch ein neues Konzept: die sogenannte “Trusted Application“ (d.h. sichere Anwendung), die im Gegensatz zum Sandkasten-Konzept den Zugriff auf Geräte APIs erlaubt. Alle MIDlet Suites aus MIDP 1.0 werden in MIDP 2.0 als unsicher behandelt, weil ihre JAR- und JAD-Dateien keine Sicherheitserlaubnis enthalten. Unter MIDP 2.0-fähigen Geräten, müssen diese im Sandkasten bleiben (d.h. sie können nur auf CLDC- und MIDP- API im KVM zugreifen). Die Public Key Infrastructure (PKI) erlaubt die Signatur von MIDlet Suites (die JAR-Datei wird so signiert und an die JAD-Datei übergeben). 3.0.9 Over The Air (OTA) OTA13 spezifiziert, wie MIDP-Anwendungen in einem drahtlosen Netzwerk übertragen werden können. OTA ist ein Standard Verfahren, das vom MobiltelefonAnbieter und der Netzwerktechnologie unabhängig ist. Es beschränkt sich beim Herunterladen von MIDlets auf nur zwei Dateien: ✸ Java Application Descriptor (JAD). Der JAD teilt dem Handy mit, wo sich die zugehörige JAR-Datei befindet. Die URL unter der die JAR-Datei sich befindet muß angegeben werden, so dass die Installation per OTA möglich 12 13 Baudrate ist die Geschwindigkeit des Ports und ist plattformabhängig. http://java.sun.com/products/midp/OTAProvisioning-1.0.pdf KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 30 ist. Die folgenden Attribute müssen im JAD für OTA angegeben werden: Attribute Midlet-Install-Notify MIDlet-Delete-Notify MIDlet-DeleteConfirm Beschreibung Durch die angebene URL, wird dem Handy der Status der Installation übermittelt (d.h. ob die neue Version der MIDlet Suite schon installiert ist). Durch die angegebene URL, wird dem Handy der Status der Löschung einer MIDlet Suite übermittelt. Nach der Löschung einer MIDlet Suite wird der Benutzer benachrichtigt. Nach der erfolgten, unerfolgten oder unterbrochenen Installation, kann der Client seinen Status an den Server über den Verlauf der Installation senden. Es gibt folgende Status Codes: Status Code 900 901 902 903 904 905 906 907 908 909 910 911 912 Status Nachricht Die Installation ist erfolgreich abgeschlossen Das Gerät hat wenig Speicherplatz Der Benutzer hat die Verbindung abgebrochen Unerwartetes Übertragungsende Die Größe der JAR-Datei ist fehlerhaft Falsche oder fehlende Attribute Ungültige JAD Ungültige JAR-Datei Die Konfiguration oder das Profil ist inkompatibel Ungültige Anmeldung bei der Anwendung Ungenügende Rechte für die Anwendung Die Registrierung ist fehlgeschlagen Die Löschung des MIDlets ist bestätigt ✸ und die JAR-Datei. In MIDP ist es auch möglich, Cookies bei einer Verbindung zwischen Clients und Servern einzusetzen. Die Cookies bieten eine eindeutige Identifizierung vom Client beim Herunterladen einer MIDlet Suite. So kann man zum Beispiel mit MIDP-fähigen Geräten online Bücher bestellen. Beispiel: private void connect() throws IOException { ... KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 31 try { //Verbindung aufbauen http = (HttpConnection) Connector.open("http://www.amazon.de"); /*----------------------------------* Client Anforderungen *-----------------------------------*/ //1. Methode der Anforderungen(hier die GET-Methode) senden http.setRequestMethode(HttpConnection.GET); //2. Header-Informationen als Cookies an Server senden if (cookie != null) http.setRequestProperty("Cookie", cookie); /*------------------------------------* Server Antwort *-------------------------------------*/ //1. Verbindungsstatus holen if (http.getResponseCode() == HttpConnection.HTTP_OK) { //2. Header-Informationen vom Client holen String tmpCookie = http.getHeaderField("Set-Cookie"); // Client-Cookie im rms speichern if(tmpCookie != null) { writeRecord(tmpCookie); // Cookie-Variable aktualisieren cookie = tmpCookie; } } } } Übertragung einer MIDlet Suite durch ein WAP-Gateway MIDP-fähige Geräte können entweder durch Browser (z.B. WML14 oder i-mode) oder durch eine Anwendung neue MIDlet Suites im Server lokalisieren und installieren. Der Server muß HTTP- und HTTPS-Protokolle unterstützen. Die obigen 14 Wireless Markup Language ist eine vereinfachte Version von Hypertext Markup Language (HTML) KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 32 Protokolle benutzen das TCP15 -/ IP16 -Protokoll um mit dem Netz zu kommunizieren. Das WAP17 -Gateway ist beim Client installiert und hat als Aufgabe die Konvertierung der Prokolle in beide Richtungen. Dieses Gateway (WAP-Browser) benutzt das WSP18 um mit dem Client zu kommunizieren. 3.0.10 Sicherheitsmechanismen Wir werden in diesem Kapitel die Neuigkeiten von MIDP2.0 betrachten. Das folgende Bild zeigt, wie MIDlet Suites in MIDP1.0 geschützt sind. Abbildung 3.10: MIDP und CLDC API im Sandkasten In MIDP1.0 dürfen alle MIDlet Suites nur innerhalb eines Sandkastens laufen. Der Sandkasten schützt alle MIDP und CLDC APIs vor ihrer Umgebung (wie Geräte APIs). Das MIDP2.0 hat sich nicht nur über eine sichere Übertragung der MIDlet Suite gekümmert, sondern ermöglicht auch durch das Signieren von MIDlets die Authentizität eines MIDlets zu überprüfen. So wurde ein neues Konzept entwickelt: die Trusted Application (TA). Die MIDP-Anwendungen können im Gegensatz zum Sandkasten-Konzept auf die Geräte-APIs zugreifen, wenn sie als sicher authentifiziert sind. Diese Geräte-APIs bilden die sogenannte Protection Domain. Wenn das MIDlet als sicher erkannt ist, bekommt es die Erlaubnis auf die Protection Domain zuzugreifen. Es gibt auch MIDlet Suites die unsicher sind, diese werden Untrusted MIDlet Suites genannt. Sie sind unsicher, weil die Herkunft und die Integrität der JAR-Datei nicht sicher sind. Eine unsichere MIDlet Suite kann nur im Sandkasten laufen (z.B. alle MIDlet Suites aus MIDP1.0 werden in MIDP2.0 als “untrusted“ bezeichnet, weil ihre JAR- und JAD-Datei keine 15 Transfer Control Protocol Internet Protocol 17 Wireless Application Protocol 18 Wireless Session Protocol 16 KAPITEL 3. ANFORDERUNGEN UND MÖGLICHKEITEN VON MIDP 33 Sicherheitserlaubnis haben.) Jede sichere Umgebung definiert eigene Rechte, die sie einer MIDlet Suite geben kann. Kapitel 4 PDAP, FP und die optionalen Profile Es gibt in J2ME nicht nur das MIDP, sondern auch noch einige Profile und optionale Profile, die wir in diesem Kapitel behandeln werden. 4.1 Personal Digital Assistent Profil (PDAP) Das PDA Profil ist noch im Entwicklungsstadium und ist auf CLDC basiert. Ziel dieser API ist es, PDAs zu unterstützen. Ein Gerät, das dieses Profil unterstützt, muß: ✸ mindestens 512KB Speicher (ROM und RAM) für die JVM und J2ME APIs haben und darf nicht mehr als 16MB haben. ✸ beschränkten Stromverbrauch haben und batteriebetrieben sein. ✸ ein Display mit mindestens 20000 Pixels Auflösung haben. ✸ einen Stift als Eingabegerät haben. 4.2 Foundation Profil (FP) Als letzte J2ME-Profil, stellen wir das FP [7] vor. Dieses Profil gehört zu der CDC-Konfiguration. Ein Gerät (z.B. Set-Top Box), das dieses Profil unterstützen will, muß die JVM und die J2SE APIs vollständig implementieren. Um dieses Profil zu unterstützen, muß ein Gerät folgende Anforderungen erfüllen: 34 KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 35 ✸ mindestens 1024KB ROM. ✸ mindestens 512KB RAM. ✸ eine Netzwerkverbindung. ✸ es wird keine Benutzeroberfläche benötigt; falls eine solche doch gewünscht ist, kann sie von einem optionalen Paket geholt werden. 4.3 Die wichtigsten optionalen Pakete Der Java Community Process (JCP) [2] listet in einer Tabelle alle Spezifikationen und Bibliotheken, die für J2ME bislang existieren oder gerade entstehen auf. Wir betrachten nur einige, die wir als sehr wichtig erachten und beschreiben sie ganz kurz, damit man sehen kann welche Möglichkeiten J2ME noch bietet: ✸ Bluetooth API für J2ME. ✸ Wireless Messaging API. ✸ Mobile Media API. ✸ Location API for J2ME. 4.3.1 Bluetooth API Das Bluetooth API [8], ist eine Menge von APIs, die die kabellose Verbindung von mehreren Geräten auf eine Distanz von bis zu 10m ermöglicht (z.B. kommunizieren Handys, PDA und Laptop miteinander). So wurde diese API entwickelt als Standard für MIDP-fähige Geräte entwickelt und markiert so einen wichtigen Trend auf dem heutigen Markt. Wie wir bereits wissen, schützt jede Standardisierung eines Pakets die Konfiguration und Profile vor proprietären Lösungen und erleichtert die Arbeit des Entwicklers bei der Portierung. Diese APIs unterstützen folgende Bluetooth Protokolle: ✸ RFCOM für die einfache Verbindung zwischen Geräten. ✸ OBEX für die Synchronisation und Datenübertragung. ✸ Service Discovery für die Suche von Geräten innerhalb von 10m und die Ermittlung der Dienste, die sie anbieten. KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 36 Die Geräte, die Bluetooth unterstützen wollen, müssen mindestens 512KB Speicher (ROM/Flash und RAM) haben, Bluetooth Netzverbindung haben und die CLDC und MIDP implementieren. Die Bluetooth Bibliotheken basieren auf das Generic Connection Framework von CLDC. 4.3.2 Wireless Messaging API (WMA) Wir haben gerade gesehen, dass die Bluetooth APIs den Zugriff auf Ressourcen bis eine Distanz von 10m erlauben. Was passiert, wenn die Ressourcen weiter als 10m entfernt sind? Wir müssen in diesem Fall WMA [11] benutzen, um auf die entfernten Ressourcen zuzugreifen. Mit deren Hilfe wird der Zugriff auf Short Message Service (SMS)1 und andere Ressourcen wie Unstructured Supplementary Service (USSD)2 und Cell Broadcast (CBS)3 vereinheitlicht. Diese APIs können in jedem J2ME-Profile genutzt werden. Im Generic Connection Framework (GCF) wird das User Datagramm Protokol (UDP) verwendet und jede Nachricht enthält einen Adressenteil und Nutzinformationsteil. Es wird für jede Nachricht folgendes Paket genutzt: javax.wireless.messaging. Alle Nachrichten müssen die Schnittstelle Message implementieren. Um Nachrichten entfernt zu senden oder zu empfangen, muß das GCF genutzt werden. Die zentrale Klasse für diese APIs ist MessageConnection, die das Senden und Empfangen von Nachrichten sowohl im Client Mode als auch im Server Mode ermöglicht. Das folgende Beispiel zeigt wie die Nachricht an einen entfernten Client gesendet oder empfangen wird. /*------------------------------------------------------------* Client sendet "Hello World" zu einem anderen Client als eine * normale SMS-Nachricht. *------------------------------------------------------------/ try { String adr = "sms://+491797876880"; MessageConnection conn = (MessageConnection) Connector.open(adr); TextMessage msg = (TextMessage) conn.newMessage(MessageConnection.TEXT_MESSAGE); msg.setPaxload("Hello World"); conn.send(msg); 1 Das SMS ist eine Anwendung, die das Senden und Empfangen von Daten über das Netz ermöglicht. 2 Das USSD ist zuständig für den Datenaustausch 3 Das CBS ermöglicht das Funken von Daten KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 37 } catch(Exception); /*--------------------------------------------------------* Im Port 5432 wartet der Server auf Nachrichten und * antwortet entsprechend. *--------------------------------------------------------/ try { String addr = sms://:5432; MessageConnection conn = (MessageConnection) Connector.open(addr); Message msg = null; while (someExitCondition){ //Warte auf ankommende Nachrichten msg = conn.receive(); //Empfang eine Nachricht if (msg instanceof TextMessage) { TextMessage tmsg = (TextMessage)msg; String receivedText = tmsg.getPayloadText(); //Antwortet mit dem gleichen Text tmsg.setPayloadText(Received: + receivedText); conn.send(tmsg); } catch (Exception e) { ... } } 4.3.3 Mobile Media API (MMAPI) Das MMAPI [10] stellt eine Schnittstelle zur Nutzung von Ton- und Multimediafähigkeiten von J2ME-Geräten dar. Diese APIs ermöglichen den Zugriff auf die Funktionen wie das Aufnehmen und Abspielen von Audio- und Video-Daten. Als Voraussetzung für die Benutzung diese APIs, muß das Gerät die CLDC implementieren. Alle Klassen befinden sich im Paket javax.microedition.media.*. 4.3.4 Location API Das Location API [9] ist eine Menge von APIs, die Informationen über den Ort eines Geräts ermöglichen. Diese APIs können nur für MIDP und PDAP angewendet werden und müssen die CLDC implementieren. Um diese APIs zu verwenden, KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 38 muß das Gerät etwas Speicherplatz (max. 20KB ROM und 2KB RAM) für diese APIs zur Verfügung stellen. Im Paket javax.microedition.location.* gibt es viele Klassen, die die Ortung von Geräte ermöglichen. 4.4 Werkzeuge zur Arbeit mit J2ME J2ME bietet Möglichkeiten für die Entwicklung von Anwendungen für kleine Geräte. Es gibt viele kostenlose Entwicklungsumgebungen, die die Entwicklung erleichtern. Viele J2ME-Geräte Hersteller (z.B. Siemens, Nokia, etc.) bieten auch ihre eigenen Entwicklungsumgebungen an. KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE Tool J2ME Wireless Toolkit Hersteller Sun Microsystems PalmOS Emulator Palm, Inc Nokia J2ME Tools Siemens Mobility Toolkit RIM Blackberry JDE Nokia Siemens Motorola iDEN Tools Motorola WHITEboard less Java SDk Zucotto Wireless Wire- Research in Motion MicroEmulator Yospace Motorola Accompli 008 Emulator Forte for Java Bartek Teodorczyk Yospace jBuilder MobileSet Borland xKVM Stefan Haustein und Michael Kroll Sun 39 Anmerkung Es gibt ein Plug-in für das kostenlose Sun Forte for Java Community Edition und Borland jBuilder MobileSet. Es wird mit der PalmOS Version vom MIDP verwendet. Für J2ME-konforme Nokia Endgeräte. Für J2ME-konforme Siemens Endgeräte Für J2ME-konforme RIM Endgeräte. Die Entwicklungsumgebung beinhaltet eine eigene virtuelle Maschine. Für J2ME-konform Motorola Endgeräte Die Entwicklungsumgebung beinhaltet eine eigene virtuelle Maschine. Die Entwicklungsumgebung beinhaltet eine eigene virtuelle Maschine. Sehr geeignet für J2ME- Entwickler. Ist ein Emlator, der auf Applets basiert. Ist ein Online-Emulator. Hierin sind man viele Tools von privaten Anbitern integriert. Es gibt eine spezielle Nokia Edition für J2ME-konforme Nokia Endgeräte. virtuelle Maschine, die 8-Bit Farben für PalmOS implementiert. Abbildung 4.1: J2ME Tools KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 40 Wir werden einige dieser Entwicklungsumgebungen kennenlernen. 4.4.1 J2ME Wireless Toolkit Dieses Toolkit arbeitet mit J2ME/MIDP und hat mehrere Emulatoren. Es gibt Wireless Toolkit für Windows und Unix/Linux Plattformen kostenlos zum Download. Mit KToolBar ist es möglich die Benutzung des Speichers zu beobachten. 4.4.2 JBuilder 7 Enterprise with MobileSet 3 Hier hat man drei Editionen: Personal, Standart (SE) und Enterprise, die plattformunabhängig sind. Dieses MobileSet läuft nur auf Windows Plattformen und ist kostenlos. 4.4.3 Sun One Studio 4 Mobile Edition Es gibt drei Editionen: Community, Mobile, and Enterprise. Community und Mobile sind kostenlose bei Sun zum Download. 4.4.4 Metrowerks CodeWarrior Wireless Studio Es gibt keine kostenlose Evaluierungsversion. Das CodeWarrior Studio 7 ist nur für Windows. 4.4.5 Whiteboard SDK Für die Programmierung von J2ME wurde von der Firma Zucotto4 die Entwicklungsumgebumg Whiteboard entwickelt. Sie ist für die Entwicklung von J2ME Programmen mit CLDC und MIDP gedacht. Es gibt einen Nokia-Handy-Emulator, und es gibt auch ein mitgeliefertes Emulator-Tool, mit dem sich eigene Emulatoren erstellen lassen. Diese Emulatoren sind nicht mit den anderen Entwicklungsumgebungen kompatibel. Whiteboard SDK ist nicht für Palm-Programmierung geeignet und unterstütz nur J2SDK 1.3, nicht 1.4, außerdem gibt es nur eine Windows Version. 4 http://www.zucotto.com KAPITEL 4. PDAP, FP UND DIE OPTIONALEN PROFILE 4.5 41 Eingebette Systeme, die die J2ME verwenden Unter der URL http://wireless.java.sun.com/device, lässt sich nachlesen welche Geräte J2ME unterstützen. An der Menge der Einträge lässt sich die Wichtigkeit und schnelle technologische Entwicklung seit der ersten Spezifikation 1999 erkennen. Kapitel 5 Ausblick In diesem Kapitel wird der Unterschied zwischen J2ME und J2SE in Bezug auf den Speicherplatz vorgestellt. Danach werden die Probleme und Grenzen von J2ME betrachtet. Abschließend wird ein Ausblick für J2ME gegeben. 5.1 Vergleich von J2ME mit J2SE Ich habe den Algorithmus Quicksort genutzt um J2ME mit J2SE zu vergleichen. Der Quellcode befindet sich auf der beigefügten Diskette. Bei dem Test kann man genau beobachten, dass mit MIDP eine Array von mehr als 120 000 Elementen nicht möglich ist. Diese Arrays sind zu groß für kleine Geräte. Eine weiterer, eigentlich offensichtlicher, aber keinesfalls zu vernachlässigender Unterschied zeigt sich selbstverständlich in der Rechengeschwindigkeit: Der J2ME lief auf den jeweiligen Emulatoren langsamer als die normale J2SE auf Desktop PC. Beim MIDP startet die Ausführung der Anwendung nicht in der Methode main, sondern in startApp. 5.2 Probleme und Grenzen vom J2ME Wir haben gelernt, dass MIDP Bytecode noch vor der Ausführung verifiziert wird. Die Verifizierung und der Garbage Collector verlangsamen die Ausführung der Anwendung. J2ME ist eine neue Technologie und existiert seit Juni 1999. Sie ist noch in der Entwicklungsphase. Wie wir gesehen haben, gibt es noch Anforderungen (Java Specification Request), wie z.B. PDA Profil, die noch in der Bearbeitung sind. Obwohl es obige Probleme gibt, hat die J2ME Technologie 42 KAPITEL 5. AUSBLICK 43 Zukunft. Wir müssen noch warten bis viele Geräte auf den Markt sind, die die verschiedenen Profile von J2ME unterstützen, um eine genaue Aussagen treffen zu können. MIDP2.0 hat einige Probleme von MIDP1.0 beseitigt, insbesonders die restrikten Sicherheitsmechanismen von MIDP1.0. Die Veröffenlichung einer neuen Version einer Konfiguration oder eines Profils, wird J2ME weiter verbessern. Was wir beim J2SE erlebt haben, wird sicherlich auch hier passieren. Als Nachteil kann es zu riesigen Bibliotheken kommen, die wie wir es bereits vor dem J2SE kennen, die den Speicherplatzbedarf enorm ansteigen lassen. 5.3 Alternativen zur Verwendung von J2ME MIDP bietet wie in der Arbeit dargestellt eine komfortable Plattform für die Entwicklung von Java-Programmen für Handys über eine Standardisierung. Aber es gibt noch einen zweiten Weg, nämlich eine Anwendung auf jede Architektur zu portieren. Wir werden in diesem Kapitel diesen zweiten Weg vorstellen. Wir wissen aus der Desktop-Welt, dass wenn ein Betriebssystem (z.B. Windows) ein Monopol hat, die Entwickler Anwendungen nur für ein Zielsystem schreiben und sich keine Gedanken über eine Portierung auf andere Betriebssysteme machen (z.B. Das Whiteboard von Zuccoto gibt es nur für Windows). Eine Version genügt, um einen großen Benutzerkreis anzusprechen. Als mögliche Betriebssysteme sehen wir: ✸ Das PalmOS hat ein Standard Development Kit (SDK), das frei verfügbar ist. Es gibt auch den PalmOS Emulator POSE für den Test der Anwendung, der auch frei verfügbar ist. Es wird im Palm meist in C oder C++ programmiert. ✸ Das PocketPC von Microsoft. Es gibt aufgrund der marktbeherrschenden Position von Microsoft nur die PocketPC SDK als Entwicklungsumgebung. Hier ist, wie oben gesagt, eine proprietäre Lösung und nur eine plattformgebundene Programmentwicklung möglich, wie bei jedem Monopolisten. ✸ Embedded Linux. Wenn wir den Markt beobachten, liegen J2ME-fähige Handys im Trend und immer neue Geräte kommen auf den Markt, die J2ME-fähig sind. Heute gibt es MIDP für das PalmOS Betriebssystem und morgen wird nach einem langen Streit auch J2ME für das PocketPC Betriebssystem eingeführt. Was heute auf dem Desktop PC mit J2SE und J2EE passiert, wird sicherlich auch auf dem Markt der kleinen Geräte genauso passieren. Mit immer mehr MIDP-fähigen Geräten auf dem Markt hat J2ME eine breite Zukunft. Literaturverzeichnis [1] John W. Muchow: Core J2ME Technology & MIDP [2] Die gesamte JSR für J2ME: http://www.jcp.org/en/jsr/tech?listByType=Platform [3] J2ME Spezifikationen, Emulatoren, SDK, und Tools zum herunterladen, Source Code vom J2ME Archive: http://www.billday.com/j2me/index.html [4] J2ME Mobile Information Device Profile Spezifikation: http://wwws.sun.com/software/communitysource/midp/download.html http://jcp.org/aboutJava/communityprocess/final/jsr118/index.html [5] J2ME Connected Device Configuration Spezifikation: http://jcp.org/aboutJava/communityprocess/final/jsr036/index.html [6] J2ME Connected, Limited Device http://www.jcp.org/en/jsr/detail?id=139 Configuration Spezifikation: [7] J2ME Foundation Profile für Endgeräte, die mit CDC arbeiten: http://jcp.org/aboutJava/communityprocess/final/jsr046/index.html [8] Bluetooth API: http://www.jcp.org/en/jsr/detail?id=82 [9] Location API: http://www.jcp.org/en/jsr/detail?id=179 [10] Mobile Media API: http://www.jcp.org/en/jsr/detail?id=135 [11] Wireless Messaging API: http://www.jcp.org/en/jsr/detail?id=120 [12] Das PDA Profil: http://www.jcp.org/en/jsr/detail?id=075 [13] Microedition FAQ: http://java.sun.com/j2me/faq.html [14] Die J2ME IDE: http://www.javaworld.com/javaworld/jw-10-2002/jw-1018wireless.html 44 Index Alert, 18 API, 2, 11, 16 AWT, 16 Item, 17 ItemStateListener, 17 J2EE, 2 J2ME, 1–3, 5, 6, 39, 42, 43 J2SE, 2, 6, 7, 16, 42 JAD, 22, 29 JAM, 15 JAR, 21, 29, 32 Java Community Process, 35 Java-Bytecode, 2 Java-Compiler, 2 JBuilder, 39 just-in-time compiler, 6 Bluetooth, 35 Bytecode, 7, 21, 23, 42 Bytecode Verifikation, 2 Bytecode-Verifizierung, 7 Canvas, 19 CBS, 36 CDC, 5 ChoiceGroup, 18 Class-Verifier, 7 CLDC, 5, 6, 11, 34, 37 CodeWarrior, 39 Command, 18 commandAction, 17 CommandListener, 17 Container, 17 Konfiguration, 4, 5 KVM, 6 List, 18 Location, 37 MIDlet, 13–16, 18, 24, 28 MIDlet Suite, 21, 24, 25, 29, 32 MIDP, 5, 11, 12, 16, 17, 19, 24, 27, 30, 42, 43 MMAPI, 37 DateField, 17 Emulator, 23 Fixed-Delay, 27 Fixed-Rate, 27 Form, 17 Foundation Profil, 34 OTA, 29 PalmOS, 40, 43 PDAP, 34, 37 PI, 19 PKI, 29 PocketPC, 43 Preverifier, 21 Profil, 4, 8 Protection Domain, 29, 32 Gauge, 17 GCF, 36 Graphics, 19 HTML, 31 HTTP, 28, 31 HTTPS, 28, 31 ImageItem, 18 45 INDEX Record ID, 25 RecordStore, 24, 25 RMS, 24 Sandkasten, 29, 32 Scheduler, 27 SMS, 12, 36 StringItem, 18 Sun One Studio, 39 TextBox, 18 TextField, 18 Thread, 27 Ticker, 18 Timer, 27 TimerTask, 27 Timestamp, 25 Trusted Application, 29, 32 UDP, 36 Untrusted, 32 USSD, 36 WAP, 32 Whiteboard SDK, 41 Wireless Toolkit, 22, 39, 40 WMA, 36 WML, 31 WSP, 32 46