1 Seminar zum Programmierprojekt (TI) Sommersemester 2007 (Lehrstuhl für Technische Informatik) Ausgabe: 15. Mai 2007 Aufgabe B4: Anleitung Einführung in die Entwicklungsumgebung und Abnahmekriterien des Mobiltelefons. Allgemeines In dieser Aufgabe wird mit Kapitel 8 das Schreiben des Pflichtenhefts abgeschlossen. Des Weiteren lernen wir die integrierte Entwicklungsumgebung Eclipse kennen. Eclipse wurde von der Fa. IBM entwickelt und als Open Source zur Verfügung gestellt. Wir beginnen mit der Einführung in die Java Programmierung im Mobiltelefon für mobile Kommunikation mittels Bluetooth. Eclipse Eclipse ist ein Open-Source-Framework zur Entwicklung von Rich-Client-Applikationen (RCP). Die bekannteste Anwendung ist die Nutzung als Entwicklungsumgebung (IDE - Integrated Development Environment) für die Programmiersprache Java. Eclipse ist nicht auf Java festgelegt und wird aufgrund seiner offenen plugin-basierten Struktur mittlerweile für sehr unterschiedliche Entwicklungsaufgaben eingesetzt. Eclipse basiert auf Java-Technologie, seit Version 3.0 konkret auf einem OSGi-Framework (Open Services Gateway Initiative) namens Equinox, das auch Grundlage des IBM Workplace Clients ist, einer Weiterentwicklung von Lotus Notes. Eclipse ist der Nachfolger von IBM "Visual Age" für Java 4.0. Der Quellcode für Eclipse, der einen Wert von angeblich 40 Millionen US-Dollar haben soll, wurde am 7. November 2001 von IBM freigegeben. Etwa die Hälfte der derzeitig am Eclipse-Basisframework arbeitenden Entwickler werden weiterhin von IBM bezahlt. Am 2. Februar 2004 beschloss das von IBM geführte Eclipse-Konsortium die Gründung der rechtlich eigenständigen Eclipse Foundation, die seitdem für die Entwicklung von Eclipse verantwortlich ist. 2 Bis einschließlich zur Version 2.1 war Eclipse als erweiterbare IDE konzipiert. Seit Version 3.0 ist Eclipse selbst nur der Kern, der die einzelnen Plugins lädt, die dann die eigentliche Funktionalität zur Verfügung stellen. Diese Funktionalität nennt sich Rich Client Platform (kurz RCP) und basiert auf dem OSGi-Standard. Sowohl Eclipse als auch die Plugins sind vollständig in Java implementiert. Als GUI-Framework zur Erstellung der grafischen Oberfläche wurde SWT (Standard Widget Toolkit) verwendet. Zur Darstellung der GUIKomponenten basiert SWT ähnlich wie AWT (Abstract Window Toolkit) auf den nativen GUI-Komponenten des jeweiligen Betriebssystems. Eclipse ist daher nicht plattformunabhängig, wird aber für 11 verschiedene Systeme und Architekturen bereitgestellt. Die Plugins lassen sich durch den Download direkt in Eclipse von einem Update-Server oder durch einfaches Entpacken installieren. Für die Eclipse-IDE wurden schon zahlreiche Plugins geschrieben, teils Proprietär, teils frei verwendbar. Primär wird Eclipse als Java-IDE verwendet, es existieren aber etliche Plugins für andere Sprachen oder zur Entwicklung von OSGi-Bundles. Dazu zählt vor allem das CDT-Projekt (Eclipse C/C++ Development Tooling), das C und C++ unterstützt, jedoch nur den GNU-C-Compiler abdeckt. Darüber hinaus gibt es auch Plugins für Perl, PHP, Ruby, Python usw. Diese können auf bequeme Art und Weise über ein Menu in Eclipse eingebunden werden. Java Wireless Toolkit Bei der Programmierung von Anwendungsprogrammen für mobile Endgeräte eignet sich die Verwendung des Java Wireless Toolkit. 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. 3 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 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 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 4 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) 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 abgesetzten "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, welche Sie im Laufe der nächsten Aufgaben benutzen werden, erfordern, dass sie in einem neuen Thread ausgeführt werden. Es empfiehlt 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. 5 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 • GUIImageCient • GUIImageServer • BTImageClient • GUIImageClient 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. 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. Abnahmekriterien des Mobiltelefons Das Kapitel 8 des Pflichtenhefts betrachtet die Kriterien, unter welchen das System nach der Entwicklung getestet und validiert wird. Unter Validierung (Validation) wird die Eignung beziehungsweise der Wert einer Software bezogen auf ihren Einsatzzweck verstanden. Um- 6 gangssprachlich formuliert wird die Frage "Bauen wir das richtige Produkt?" beantwortet. (Lit.: Balzert S. 101) Es wird also die Effektivität der Entwicklung sichergestellt. Im Zusammenhang mit unserem Projekt wird die Validierung der Anforderungsdefinition bzw. dem Abnahmetest zugeordnet. Insofern ist unter der Validierung die Überprüfung der Eignung der Anforderungsdefinition mit den ursprünglichen Zielen des Kunden zu verstehen. Diese Validierung wird dann durch vorgeplante und in Pflichtenheft beschriebene Tests durchgeführt. Tests sind dynamischen Maßnahmen, die eine Ausführung der Software erfordern (Bsp. Überdeckungstest), und können als ein Teil der Quälitätsmaßnahme betrachtet werden. Es gibt verschiedene Definitionen für Test. Nach ANSI/IEEE Std. 610.12-1990 ist Test "the process of operating a system or component under specified conditions, observing or recording the results and making an evaluation of some aspects of the system or component." Die folgende Aspekte sollen beachtet werden: • Tests soll man unter der Annahme planen, dass Fehler gefunden werden können. Deshalb ist ausreichend Zeit dafür einzuplanen. • Jede Anforderung muss getestet werden, ansonsten ist das Testen unvollständig. • Die Anzahl und Komplexität der Testfälle muss ausreichend sein. Die Details dazu werden in der Regel im Softwareentwicklungsprozess festgelegt. Wir schreiben in dieser Aufgabe die Abnahmekriterien bzw. die Tests die durchgeführt werden sollen, um die bis hierher beschriebene Funktionalitäten zu überprüfen. Außerdem, sollen die Tests auch Ausnahmesituationen überdecken. Zum Beispiel, soll ein Test geplant werden, der beschreibt wie das System reagiert, wenn eine unbekannte Antwort auf eine gesendete Anfrage empfangen wird. 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] H. Balzert: Lehrbuch der Software-Technik. Bd.2. Software-Management, SoftwareQualitätssicherung, Unternehmensmodellierung. Spektrum Akademischer Verlag, Heidelberg 1998. [4] http://www.eclipse.org