1 Seminar zum Programmierprojekt Arbeitsbereich Technische Informatik Ausgabe: 30. April 2008 Anleitung B3 Einführung in die Entwicklungsumgebungen Allgemeines In dieser Aufgabe lernen wir die Entwicklungsumgebungen Netbeans und Eclipse, sowie Java Wireless Toolkit (JWT) kennen. Zudem gibt es eine Einführung in die MIDlet/BluetoothProgrammierung. Sie können zwischen Netbeans und Eclipse wählen. Eclipse ist weit verbreitet und besonders an den Universitäten sehr beliebt. Netbeans unterstützt und erleichtert die MIDlet-Programmierung, daher empfehlen wir speziell für dieses Projekt eher Netbeans. NetBeans NetBeans ist eine Entwicklungsumgebung, die komplett in der Programmiersprache Java geschrieben ist. NetBeans wurde für Java entwickelt, es werden aber auch Sprachen wie C, C++, Ruby und Fortran unterstützt. Die Architektur der Software ist vollständig modular aufgebaut und durch so genannte Module bzw. Plugins erweiterbar. Zusätzlich gibt es so genannte Packs, welche die IDE (Integrated Design Environment) um größere Funktionspakete erweitern. Des Weiteren kann NetBeans als Plattform für eigene Anwendungen verwendet werden. Schwerpunkte bei der Entwicklung von NetBeans bildeten Funktionen, dze den Entwickler produktiver machen. [5] Sun Microsystems gründete das NetBeans-OpenSource-Projekt im Juni 2000 und ist dessen Hauptsponsor. NetBeans enthält u.a. einen Editor, Debugger, GUI-Builder, kann für alle Java Editionen und fast allen BetriebssystemPlattformen verwendet werden. [6] Zu Empfehlen ist das Durcharbeiten eines passenden Tutorials (www.netbeans.org > Tutorials > Mobile Applications > Developing Java ME/CDC Applications). Sie können auch nach „MIDlet“ im Netbeans-Tutorial suchen. Folgendes Bild ist dem Link [7] entnommen. Netbeans ist an einem der PCs im Übungsraum C220 installiert. 2 Java Wireless Toolkit (JWT) Bei der Programmierung von Anwendungsprogrammen für mobile Endgeräte eignet sich die Verwendung des Java Wireless Toolkit. 3 Abbildung 1: Hauptmenü des Java Wireless Toolkit Erstellen Sie mit „New Project“ ein neues Projekt, geben Sie dazu den Namen ihres Programs und die MIDlet-Klasse an. Es wird daraufhin ein neues Verzeichnis unter C:\WTK25\apps\ erstellt. Darin finden Sie die Verzeichnisse src\ und bin\, in welchen Sie die Quelldateien ablegen (src\), bzw. die erstellten .jar Files finden (bin\). Starten Sie nun Eclipse und geben Sie als Workspace-Verzeichnis C:\WTK25\apps\ an. Dann können Sie bei der Erstellung eines neuen Projekts den Namen ihres WTK-Projekts angeben und Eclipse übernimmt die dort vorhandene Verzeichnisstruktur. Erstellen Sie im Unterordner src\ ihre Quelldateien und speichern Sie ihre Arbeit. Kompilieren Sie ihr Projekt mittels Build im Wireless Toolkit. Das Java Wireless Toolkit enthält einen Emulator zum Testen Ihrer Programme ohne ein Mobiltelefon. Klicken Sie dazu nach dem Kompilieren auf Run. Es öffnet sich ein neues Fenster mit einem Handy, welches Sie per Maus bedienen können. Abbildung 2: Der Emulator des Java Wireless Toolkit 4 Um Ihr Programm auf das Handy zu laden, gehen Sie auf Project -> Package -> Create Package Sie finden dann im Unterverzeichnis \bin ein .jar File, welches Sie z.B. per Bluetooth auf das Handy laden können. Für eine erste Einführung in die MIDlet-Programmierung sollten Sie sich Kapitel 2 der "Java Wireless Toolkit Dokumentation" ansehen. Gehen Sie dazu auf START -> All Programs -> Sun Java Wireless Toolkit 2.5 Beta -> Documentation. Anhand des dort beschriebenen Beispiels werden wir hier die Grundlagen der MIDlet Programmierung erarbeiten, welche Sie zur Lösung dieser Aufgabe benötigen. Anschließend sollen Sie sich mit der Bluetooth-Funktionalität und den zugehörigen Bibliotheken vertraut machen und diese mittels eines MIDlets auf dem Mobiltelefon realisieren. Ihre Applikation soll in der Lage sein per Bluetooth mit der Host und den BTNodes zu kommunizieren und die dort angebotenen Dienste abzufragen und zu nutzen. MIDlet Programmierung NetBeans nimmt Ihnen einiges an Arbeit ab, was die MIDlet-Programmierung betrifft. Trotzdem ist es wichtig, dass Sie wenigstens ein paar Grundlagen über MIDlets wissen. Anwendungen für das Mobile Information Device Profile (MIDP) heißen MIDlets. Ein oder mehrere MIDlets bilden eine MIDlet-Suite. Eine MIDlet-Suite ist die kleinste installierbare Einheit. Wir gehen hier davon aus, dass Sie das MIDlet "TinyMIDlet" aus der Documentation implementiert und im Emulator getestet haben. Wie Sie im Source-Code von Tiny-MIDlet sehen, erweitert die Klasse TinyMIDlet die Klasse "MIDlet". Jedes entwickelte MIDlet muss die Basisklasse "MIDlet" erweitern. Wird das MIDlet gestartet, so wird die von Ihnen zu implementierende Funktion startApp() aufgerufen. In dieser Funktion legen Sie fest, was angezeigt werden soll, wenn das MIDlet gestartet wird. Der Befehl display.setCurrent(mainForm); bringt dabei die vorher definierte Form "mainForm" zur Anzeige. Der Inahlt dieser Startseite kann alternativ auch bereits im Konstruktor Ihrer Klasse festgelegt werden. Den Befehl zur Anzeige müssen Sie jedoch in der Funktion startApp() absetzen. Der Befehl Command exitCommand = new Command("Exit", Command.EXIT, 0); fügt der Startseite den Befehl "Exit" hinzu. Als Argumente besitzt der Konstruktor Command 1. den Namen des Befehls, 2. den Commando-Typ und 3. die Priorität. Hierbei gilt, je kleiner die Zahl im Feld Priorität, desto höher die Priorität. Des Weiteren, bedeutet eine höhere Priorität (kleinere Zahl), dass dieser Befehl für den Nutzer schneller zugänglich ist, in einem Menü also mit weniger "Klicks" zu erreichen ist. Es empfiehlt sich bei sehr wichtigen oder vorrangigen Befehlen, wie "EXIT" oder "Cancel" eine höhere Priorität zu wählen, um deren Ausführung zu garantieren. Wählt der Benutzer einen Befehl aus, so wird im MIDlet die Funktion public void commandAction(Command c, Displayable s) 5 aufgerufen. Diese Funktion stammt aus dem Interface CommandListener welches von unserer Klasse implementiert wird. Um ein Interface zu implementieren, muss jede im Interface enthaltene Funktion in der implementierenden Klasse definiert werden. Oben genannte Funktion bekommt als Parameter c den abgesetzen "Command" mit dessen Hilfe das Verhalten des MIDlets auf Benutzerinteraktionen gesteuert wird. Der Parameter Displayable s beinhaltet die aktuell angezeigte Seite. Aus ihr lässt sich unter anderem herauslesen, welcher MenüEintrag bei Absetzen des Commands c markiert war. Da das MIDlet das Interface implementiert, muss hier festgelegt werden, wie sich die Applikation bei verschiedenen Benutzerangaben verhalten soll. Einige Funktionen, die Sie im Laufe der nächsten Aufgaben benutzen werden, erfordern, dass sie in einem neuen Thread ausgeführt werden. Es empfielt sich, die Verwendung einer weiteren Klasse die für die Ausführung der Bluetooth-Funktionaltät zuständig ist und problemlos in mehreren Instanzen (Threads) gestartet werden kann. Sehen Sie sich hierzu das Beispiel BluetoothDemo aus dem Wireless Toolkit an. Bluetooth Programmierung Anhand des Beispiels BluetoothDemo werden Sie nun die Grundlagen der BluetoothVerwendung in Java kennenlernen. Im Source-Folder der BluetoothDemo finden Sie fünf Dateien. • DemoMIDlet • GUIImageClient • GUIImageServer • BTImageClient Die Klasse DemoMIDlet ist das MIDlet der Anwendung, GUIImageCient und GUIImageServer sind client- und serverseitig jeweils zur Verarbeitung und Anzeige der in BTImageClient bzw. BTImageServer per Bluetooth empfangen Daten zuständig. BTImageClient wird von GUIImageClient aufgerufen und dient der Suche nach Bluetooth-Geräten in der Umgebung (Inquiry), der Suche nach Bildern, welche ein gefundenes Gerät bereitstellt und den BilderDownload. BTImageServer stellt nicht sichtbar für den Nutzer die Bluetooth-Funktionaltät bereit, antwortet auf Anfragen eines Clients und sendet das ausgewählte Bild per Bluetooth an einen Client. Die Klasse BTImageClient implementiert Runnable und DiscoveryListener. Durch die Implentierung von Runnable wird bei Starten eines Threads die Funktion run() ausgeführt. Durch den DiscoveryListener können Bluetooth-Anfragen wie searchDevices oder searchServices gestartet und die dadurch entstehenden Daten verarbeitet werden. Auf der Seite Java Reference/API finden Sie die API zur Bluetooth-Programmierung in Java. Zur Suche nach Bluetooth-Geräten in der Umgebung wird ein DiscoveryAgent benutzt. Dieser erlaubt das Suchen nach Geräten und nach Services. Zum Suchen nach Geräten wird die Methode startInquiry benutzt. Sie erwartet folgende Argumente: 1. int accessCode bestimmt den Typ der Inquiry. Wir verwenden : DiscoveryAgent.GIAC. 6 2. DiscoveryListener: Listener bestimmt den Listener Thread welcher die gefundenen Geräte empfängt und verarbeitet Das Interface DiscoveryListener bietet eine Möglichkeit, die durch eine Inquiry empfangenen Daten zu verarbeiten. Dazu müssen Sie die Funktion deviceDiscoverd implementieren und die übergebenen Argumente RemoteDevice btDevice und DeviceClass cod (letztere werden Sie nicht zwingend benötigen) in Klassenvariablen speichern und weiterverarbeiten. Eine Einführung in Java2ME und weitere Literatur zum Thema Bluetooth-Programmierung finden Sie in der Anleitung B4. Fragen bzw. Aufgaben: Keine Fragen in Anleitung B3 Anhang Literatur und Quellen [1] http://java.sun.com/products/sjwtoolkit/download-2_5.html [2] http://java.sun.com/javame/reference/apis.jsp [3] http://wireless.klings.org/klings_jabwt_master_thesis.pdf [4] http://www.eclipse.org [5] www.wikipedia.de > netbeans [6] www.netbeans.org [7] http://www.netbeans.org/kb/55/quickstart-mobility.html