Handy-Kompass Projektdokumentation von Peter Ammon, Michael Kaiser, Thomas Zsebedits im Fach Navigations- und Ortungssysteme WS05/06 Navigations- und Ortungssysteme Handy-Kompass Inhaltsverzeichnis 1 Einleitung....................................................................................................................... 3 2 Das Sun Java Wireless Toolkit ...................................................................................... 4 2.1 Installation.............................................................................................................. 6 2.2 Installation / Konfiguration von EclipseME.............................................................. 7 3 Klassen aus J2ME ........................................................................................................13 4 Grafische Benutzeroberfläche und Menüführung ..........................................................15 5 Berechnung ..................................................................................................................20 6 5.1 Exkurs Zeit ............................................................................................................20 5.2 Berechnung der Sonnenkoordinaten .....................................................................22 Referenzen ...................................................................................................................26 6.1 Quellen .................................................................................................................26 6.2 Download ..............................................................................................................26 Seite 2 von 26 Navigations- und Ortungssysteme 1 Handy-Kompass Einleitung Wie kann man mit dem Handy navigieren, wenn es nicht mit GPS ausgestattet ist? Dieser Fragestellung hat sich die im Folgenden beschriebene Projektarbeit gewidmet und einen Handykompass entwickelt. Die Entwicklung basiert auf dem System eines Sonnenkompasses, so dass man für die Berechnung nur den Längengrad, an dem man sich gerade befindet, und die Uhrzeit benötigt, die aus dem Handy ausgelesen wird. Die Hauptstädte Europas sind mit ihren Längengraden in einer Auswahlliste hinterlegt; zusätzlich kann ein benutzerdefiniertes Längengrad eingegeben werden. Nach der Einstellung des Längengrades muss das Handy so gedreht werden, dass das auf dem Display angezeigte Sonnensymbol in Richtung der Sonne zeigt. Wenn man das Handy dabei waagrecht hält, ist die Kompassrose richtig ausgerichtet und man kann die vier Haupthimmelsrichtungen ablesen. Für die Entwicklung wurde das Sun Java Wireless Toolkit 2.2 verwendet, das auch unter dem Namen Java 2 Platform, Micro Edition (J2ME) Wireless Toolkit bekannt ist. Die Installation des Toolkits und die zugehörige Konfiguration der Entwicklungsumgebung Eclipse 3.1.1 wird ebenfalls im Folgenden beschrieben. Seite 3 von 26 Navigations- und Ortungssysteme 2 Handy-Kompass Das Sun Java Wireless Toolkit Das Java Wireless Toolkit von Sun ist kostenlos von Suns Website zu beziehen: http://developers.sun.com/techtopics/mobility/downloads/index.html Diese Version der Java-Platform ist eigens für Anwendungen auf mobilen Endgeräten (Handys, Organizer, Smartphones etc.) gedacht und unterstützt den verfügbaren Funktionsumfang. Fertige Java-Programme für solche mobilen Endgeräte werden MIDlets genannt. Zur Implementierung solcher Java-MIDlets reicht prinzipiell das Java Wireless Toolkit, da es sowohl einen Handy-Emulator, als auch ein Projekt-Kompilierungstool beinhaltet. Der Java-Quellcode muss jedoch mit einem beliebigen Editor erstellt werden. Danach erfolgt der Build-Prozess, wobei jeweils eine jad-Datei und eine jar-Datei im Ordner bin des Projektordners erstellt wird. Diese beiden Dateien stellen das Java MIDlet dar, die auch von den Endgeräten ausgeführt werden können. Die jad-Datei beinhaltet Informationen wie die zu startende Klasse, die Größe der jar-Datei, den Namen, die Version uvm. Seite 4 von 26 Navigations- und Ortungssysteme Handy-Kompass Die Software kann über einen Run-Button mit Hilfe des Wireless Toolkit (KToolBar) emuliert werden. Zudem besteht die Option, verschiedene emulierte Endgeräte auszuwählen. Hiermit kann man, direkt ohne reelles Endgerät, die Bedienung mit einer 10er-Tastatur und Displaytasten testen. Leider hat dieses Konzept auch kleinere Schwächen; so unterstützt das emulierte Handy stets die ganze Library von Java Wireless, was bei reellen Endgeräten jedoch oft nicht der Fall ist. Somit ist ein zweiter Test darauf unerlässlich. Zudem ist leider die Entwicklung mehrerer Packages mit vielen Klassen erschwerlich, wenn man keine vollwertige Seite 5 von 26 Navigations- und Ortungssysteme Handy-Kompass Entwicklungsumgebung zur Verfügung hat. Wir entschieden uns daher für die Entwicklung mit EclipseME (siehe Kapitel 2.2). 2.1 Installation Die Installation des Wireless Toolkit verläuft typisch. Der Standard-Installationspfad ist jedoch c:\WTK22 und nicht wie üblich im Programme-Ordner. Alle Einträge für die einzelnen Tools werden im Startmenü erstellt. Empfehlenswert danach ist das Durchführen des Tutorials auf http://developers.sun.com/techtopics/mobility/midp/articles/wtoolkit/, wobei ein typisches „Hello“ Beispiel den kompletten Build- und Run-Prozess durchläuft. Hiermit kann leicht die Funktion des Toolkits kontrolliert werden. Seite 6 von 26 Navigations- und Ortungssysteme 2.2 Handy-Kompass Installation / Konfiguration von EclipseME Da die Entwicklungsumgebung Eclipse sehr verbreitet ist und vor allem im Studiengang Software Engineering häufig Anwendung findet, entschieden auch wir uns bei diesem Projekt dafür. Grundlage für EclipseME (die Mobile Edition von Eclipse) ist eine aktuelle installierte Eclipse-Version (hier: V3.1.1). Der genaue Installationsablauf ist unter http://eclipseme.org/docs/installation.html nachzulesen, so wird an dieser Stelle nur auf Besonderheiten bzw. wichtige Schritte eingegangen. Zuallererst wäre die einfache Installation über das Software-Updatemodul von Eclipse zu nennen. Starten kann man es im Menü über: Help Software Updates Find and Install Search for new features to install Dort trägt man http://www.eclipseme.org/updates/ als eine neue Remote Site ein Seite 7 von 26 Navigations- und Ortungssysteme Handy-Kompass Über einen einfachen Setupprozess verläuft die Installation von EclipseME und ist nach einem Neustart der kompletten Entwicklungsumgebung verfügbar. Danach müssen verschiedene Einstellungen getroffen werden. Ein wichtiger ist die Auswahl des Wireless Toolkits, je nachdem ob verschiedene installiert sind oder ob ein anderer Installationsordner gewählt wurde: Seite 8 von 26 Navigations- und Ortungssysteme Handy-Kompass Daraufhin kann das Projekt erstellt und implementiert werden. Soll es nun über den Emulator ausgeführt werden, so ist es wichtig, in den Project Properties eine geeignete Platform ausgewählt zu haben: Seite 9 von 26 Navigations- und Ortungssysteme Handy-Kompass Des Weiteren muss sich im root-Verzeichnis des Projekts eine konfigurierte jad-Datei befinden. Hierin werden wichtige Einstellungen für das MIDlet getroffen, wie schon in Kapitel 2 beschrieben. Besonders wichtig hierbei ist der Eintrag, über welche Klasse das MIDlet gestartet wird, da sonst das MIDlet weder auf dem Emulator, noch auf dem Endgerät lauffähig ist, was jedoch während der Entwicklung über EclipseME noch nicht auffällt: Seite 10 von 26 Navigations- und Ortungssysteme Handy-Kompass Möchte man während der Entwicklung das MIDlet testen, so muss man es als Emulated J2ME Midlet starten: Seite 11 von 26 Navigations- und Ortungssysteme Handy-Kompass Um das fertige Package (jad- und jar-Datei) zu erstellen, klickt man mit der rechten Maustaste auf das Projekt J2ME Create Package. Im nun folgenden Build-Prozess wird das Package im Ordner deployed abgelegt: Dieses MIDlet kann nun entweder direkt aus dem Explorer ausgeführt werden – somit startet der Emulator – oder per Bluetooth, Infrarot oder Datenkabel auf das Mobile Endgerät kopiert, installiert und ausgeführt werden. Seite 12 von 26 Navigations- und Ortungssysteme 3 Handy-Kompass Klassen aus J2ME Die Klassen in J2ME sind speziell auf die Handyprogrammierung zugeschnitten. Vom Aufbau her unterscheidet sich das gewöhnliche Java SDK und J2ME kaum. Allerdings enthält das J2ME eine viel geringere Anzahl an Klassen. Des Weiteren wird eine Applikation nicht mit “public static void main(String args[ ])“ gestartet, sondern die Starterklasse muss von der MIDlet-Klasse abgeleitet werden. In der abgeleiteten Klasse müssen die Methoden startApp(), pauseApp() und destroyApp(boolean b) implementiert sein. Mit der startApp()Methode wird die Handy-Applikation gestartet und mit destroyApp(boolean b) beendet. public class MobileStart extends MIDlet { Display display; ImageDemo compass; public void startApp() { //startet Applikation display = Display.getDisplay(this); compass = new ImageDemo(this); display.setCurrent(compass); } public void pauseApp () {} public void destroyApp(boolean unconditional) { //beendet Applikation notifyDestroyed(); } } Form Form entspricht einem einzelnen Displayscreen und kann mit einem Panel in Java verglichen werden. Einer Form kann mit append() ein String oder ein Image hinzugefügt werden. Außerdem ist es möglich, dieser Klasse verschiedene GUI-Elemente hinzuzufügen zum Beispiel Radiobuttons, Checkboxen, Textfelder usw. Display Dieser Klasse werden die verschiedenen Form-Objekte hinzugefügt und auf dem Display abgebildet. //Ausgeben einer Form auf dem Display midlet.display.setCurrent(sp.getForm()); Seite 13 von 26 Navigations- und Ortungssysteme Handy-Kompass Command Mit der Command-Klasse werden die verschiedenen Eingabebefehle definiert und dann der gewünschten Form hinzugefügt. //Commands für Softkey-Tasten erstellen //EXIT COMMAND links, Rest wird zu einem Menu zusammengefasst //Command(Name ,Command-Typ, Priorität) cmdExit = new Command("Exit", Command.EXIT, 1); cmdSelect = new Command("Select City", "Select City",Command.SCREEN, 1); cmdInput = new Command("Input Degrees","Input Degrees", Command.SCREEN, 1); cmdNight = new Command("Nightsky", "Nightsky", Command.SCREEN, 1); cmdHelp = new Command("Help", "Help", Command.HELP, 1); addCommand(cmdExit); addCommand(cmdSelect); addCommand(cmdInput); addCommand(cmdNight); addCommand(cmdHelp); CommandListener Der CommandListener ist ein Interface, das sich analog zum ActionListener in Java verhält. Die einzelnen Commands müssen im CommandListener registriert werden. Beim Ausführen eines Commands z.B “Drücken der Taste 5“ wird die commandAction()-Methode aufgerufen und der entsprechende Code ausgeführt. Seite 14 von 26 Navigations- und Ortungssysteme 4 Handy-Kompass Grafische Benutzeroberfläche und Menüführung Standartanzeige Handykompass Breitengrad Aktuelle Stadt Stand der Sonne Längengrad Windrose mit Himmelsrichtungen Uhrzeit in der gerade ausgewählten Stadt Rechter und linker Soft-Button Der oben abgebildet Screenshot ist der Startbildschirm des Handykompasses. Er zeigt standardmäßig den Sonnenstand für die Stadt Heilbronn an. Will man eine andere Stadt auswählen, so kann man dies über den rechten Soft-Button (Menu) tun. Mit dem linken Button (Exit) wird die Applikation beendet. Seite 15 von 26 Navigations- und Ortungssysteme Handy-Kompass Menu Auswahl einer neuen Stadt Eingabe eines Längengrades Navigation bei Nacht Sommer-/Winterzeit einstellen Hilfe bezüglich Applikation Im oben abgebildeten Menu können die Menupunkte entweder mit der Select-Taste oder mit Hilfe der Zifferntasten ausgewählt werden. Dabei entspricht die Zahl vor dem Menupunkt der Taste auf dem Handy. Stadtauswahl (Select City) Auflistung der Städte mit Angabe des Längengrades Mit Hilfe der Select-Taste kann die gewünschte Stadt ausgewählt werden. Abschließend muss man noch mit “Ok“ bestätigen. Seite 16 von 26 Navigations- und Ortungssysteme Handy-Kompass Eingabe eines Längengrades (Input Degrees) In dieser Eingabemaske kann man einen bestimmten Längengrad eingeben, falls man keinen entsprechenden Eintrag in der Städteliste gefunden hat. Die Eingabe muss sich jedoch im Bereich von -180.0 bis 180.0 befinden. Abschließend muss das Ganze noch mit “Ok“ bestätigt werden. Kompass für die Nacht (NightSky) Seite 17 von 26 Navigations- und Ortungssysteme Handy-Kompass Der “NightSky“ soll die Kompass-Navigation bei Nacht ermöglichen. Das Display zeigt einen Teil des Sternenhimmels, den großen Wagen und den kleinen Wagen sowie den Polarstern an. Wenn man nun das Ende des großen Wagens in Richtung des Polarsterns (Teil des kleinen Wagens) verlängert, erhält man die nördliche Himmelsrichtung. Jetzt muss man nur noch das passende Sternenbild dazu finden. Umstellen von Sommer/Winterzeit Im obigen Menu kann man zwischen der Sommer- und Winterzeit wählen. Standardmäßig ist die Winterzeit ausgewählt. Bei Aktivierung der Sommerzeit wird auf die aktuelle Ortszeit eine Stunde aufaddiert. Seite 18 von 26 Navigations- und Ortungssysteme Handy-Kompass Hilfe (Kurzerklärung des Handy-Kompasses) Seite 19 von 26 Navigations- und Ortungssysteme 5 Handy-Kompass Berechnung Die Berechnung, über die die Sonne auf dem Handykompass dargestellt wird, basiert auf der Angabe des Längengrades, auf dem man sich gerade befindet, und der aktuellen Zeit, die aus dem Handy ausgelesen wird. 5.1 Exkurs Zeit Die UTC (Coordinated Universal Time – koordinierte Weltzeit) ist die Referenzzeit, von der die verschiedenen Zeitzonen der Erde abgeleitet werden. Sie ist die eigentliche Nachfolgerin der mittleren General Mean Time (GMT, auch Greenwich Mean Time). Der UTC wird eine allgemeine Zeitzone zugeordnet, ausgehend vom Nullmeridian, der durch Greenwich verläuft. Der Nullmeridian ist ein senkrecht zum Äquator stehender und vom Nord- zum Südpol verlaufender Halbkreis, von dem aus die geografische Lage nach Osten und Westen bestimmt wird. Die Festlegung des Nullmeridians als Basis des internationalen Koordinatensystems erfolgte 1884 in Washington D.C. auf der internationalen Meridian-Konferenz, auf der 25 Nationen vertreten waren. Diese Festlegung ist willkürlich. Prinzipiell könnte der Nullmeridian auch durch jeden anderen Ort der Welt laufen - so verläuft er jedoch durch die Sternwarte in Greenwich. Die mittlere Sonnenzeit am Nullmeridian wurde maßgeblich für die Weltzeit GMT. Da die GMT unterschiedlich gehandhabt wurde und es dadurch immer wieder Verwirrungen gab, wurde sie 1926 von der Universal Time (UT) abgelöst. Von dieser UT gibt es drei Versionen: UT0 – die direkt beobachtete und berechnete mittlere Ortszeit des Nullmeridians UT1 – die Ortszeit mit rechnerisch korrigierten Ungenauigkeiten, die durch die Polschwankungen entstehen UT2 – die UT1 mit weiteren korrigierten Ungenauigkeiten, die durch weitere kleinere Schwankungen der Erdachse entstehen Mit UT wird normalerweise UT1 bezeichnet – der Unterschied zu den anderen Versionen beträgt nur Millisekunden. Heute wird die Definition der Einheit Sekunde nicht mehr durch astronomische Berechnungen gewonnen, sondern von einer Atomuhr abgeleitet. Die aktuelle Weltzeit UTC wird mit Seite 20 von 26 Navigations- und Ortungssysteme Handy-Kompass dieser Atomuhr synchronisiert. Durch zusätzlich eingefügte Sekunden (Schaltsekunden) wird gewährleistet, dass die Differenz zwischen UT1 und UTC nicht mehr als 0,9 Sekunden beträgt, und sie somit in der Nähe der mittleren Sonnenzeit bleibt. Die Central European Time (CET, Mitteleuropäische Zeit) ist die für Mitteleuropa gültige Zeitzone. Sie entspricht der mittleren Sonnenzeit des 15. Längengrades östlich vom Nullmeridian. Ihre Differenz zur UTC beträgt eine Stunde. Die Differenz der Mitteleuropäischen Sommerzeit (MESZ, englisch CEST) zur Weltzeit beträgt zwei Stunden und entspricht somit der mittleren Sonnenzeit des 30. Längengrades. Die CET wird in Europa auch von Ländern genutzt, die rein geografisch nicht in der entsprechenden Zeitzone liegen, wie zum Beispiel Spanien. Karte der Zeitzonen in Europa - http://www.worldtimezone.com/time-europe24.php [2006-01-07] Seite 21 von 26 Navigations- und Ortungssysteme 5.2 Handy-Kompass Berechnung der Sonnenkoordinaten Die Berechnung wird in den Methoden kreisbewegungSonne() und calculateSun() durchgeführt. Die Methode kreisbewegungSonne() erhält als Parameter eine Gradzahl zwischen 0 und 359, die sie in Koordinaten umrechnet, auf denen wiederum die Sonne auf das Display gezeichnet wird. Der Parameter wird von der Methode calculateSun() berechnet. Auf diese wird hier näher eingegangen. Als Parameter erhält calculateSun() das aktuell ausgewählte Place-Objekt, das auch den zugehörigen Längengrad enthält, und ein neues Date-Objekt mit der aktuellen Zeit. Beim Start der Anwendung ist das Place-Objekt null; in diesem Fall wird es mit den Daten von Heilbronn initialisiert. Es wird von der für die CET gültige mittlere Sonnenzeit ausgegangen – dies bedeutet dass die Sonne auf dem 15. Längengrad östlich vom Nullmeridian um 12.00 Uhr mittags genau im Süden steht. Die Methode erhält diese beiden Werte als Referenzen. Die Referenzzeit wird auf 720 gesetzt, da 12.00 Uhr mittags 720 vergangenen Minuten seit Mitternacht entspricht. // Referenzwert 15° östlicher Länge int longitudeRef = 15; // Referenzzeit 12.00 mittags = 720 min long timeRef = 720; // aktuelles Längengrad int longitude = doubleToInt(place.getLongitude()); // aktuelle Tageszeit in Minuten - der erhaltene Wert in Millisekunden // wird in Minuten umgerechnet und modulo 1440 genommen long time = (date.getTime()/(1000*60))%1440; Das aktuelle Längengrad wird aus dem Place-Objekt ausgelesen. Die aktuelle Zeit erhält man aus dem Date-Objekt mit date.getTime() in Millisekunden. Da das Date-Objekt die Millisekunden seit Mitternacht des 1. Januar 1970 (GMT) enthält, erhält man durch die Berechnung von modulo 1440 (Anzahl der Minuten eines Tages) die aktuelle Tageszeit. Bei dem Verrechnen der übergebenen Zeit kann man zum besseren Verständnis annehmen, dass man sich immer auf dem selben (15.) Längengrad befindet. Dies würde bedeuten, dass die Sonne sich um 12.00 Uhr mittags im Süden, um 18.00 Uhr im Westen, um 24.00 Uhr im Norden und um 6.00 Uhr morgens im Osten befindet. Seite 22 von 26 Navigations- und Ortungssysteme Handy-Kompass Da die Sonne sich an einem Tag (1440 min) um 360° bewegt, bedeutet dies, dass sie für 1° vier Minuten (1440 min / 360) benötigt. Um herauszufinden, wo sie sich um die gegebene Uhrzeit befindet, muss man also den Betrag zur Referenzzeit ermitteln. if(time < timeRef) { // Betrag zur Referenzzeit time = timeRef - time; // der Position Minutenzahl/4 dazuaddieren (1° --> 4 min) pos = pos - longToInt(time/4); } else { time = time - timeRef; // der Position Minutenzahl/4 dazuaddieren (1° --> 4 min) pos = pos + longToInt(time/4); } Ist der aktuelle Zeitwert kleiner als der Referenzzeitwert, wird ein Viertel des Betrags (zurückgelegte Gradzahl in der Zeit) von der Referenzposition abgezogen, da der aktuelle Zeitwert vor der Referenzzeit ist. Ist der Zeitwert größer als der Referenzzeitwert, wird ein Viertel des Betrags dazuaddiert. Zum Verständnis der Verrechnung des aktuellen Längengrades, auf dem man sich befindet, kann man annehmen, dass es sich immer um die selbe Zeit handelt – entsprechend der Verrechnung der Zeit. Da die Sonne von Osten nach Westen wandert, kann man hier abschätzen, wie, die Längengrade verrechnet werden müssen. Liegt das aktuelle Längengrad zwischen dem Nullmeridian und dem Referenzgrad (15° östlicher Länge), wird der Betrag der Differenz zwischen aktuellem Längengrad und Referenzlängengrad von der Referenzposition abgezogen. Dies ist der Fall, da das Referenzlängengrad weiter im Osten steht als das aktuelle und die Sonne sich somit erst später über dem aktuellen Längengrad befindet. Sie muss also noch weiter im Osten stehen. Seite 23 von 26 Navigations- und Ortungssysteme Handy-Kompass Nullmeridian und Zeitzonen - http://uhrsucht.de/pics/zeitzone2.gif Das selbe ist der Fall, wenn das aktuelle Längengrad kleiner als 0 ist. Da negative Längengrade vom Nullmeridian aus gesehen im Westen stehen, wird hier ebenfalls der Betrag der Differenz von Referenzlängengrad und aktuellem Längengrad von der Referenzposition abgezogen. // Verrechnen der Längengrade // jeweils die Differenz in Bezug auf die Referenzgrade berechnen if(longitude > 0 && longitude < longitudeRef) { // Betrag zwischen Referenzgrad und Längengrad longitude = longitudeRef - longitude; pos = pos - longitude; } else if (longitude < 0) { // Betrag zwischen Referenzgrad und Längengrad longitude = longitudeRef + (-1)*longitude; pos = pos - longitude; } else { // Betrag zwischen Referenzgrad und Längengrad longitude = longitude - longitudeRef; pos = pos + longitude; } Seite 24 von 26 Navigations- und Ortungssysteme Handy-Kompass Im dritten Fall der Verzweigung, wenn das aktuelle Längengrad größer als das Referenzlängengrad ist, wird der Betrag der Differenz zur Referenzposition dazuaddiert. Hier ist die aktuelle Position weiter im Osten, weshalb hier die Sonne früher steht. // Zwischenschritt notwendig, da 0 bei Koordinatenberechnung im Süden if(pos < 0) { pos = 360 + pos; } Nun ist noch ein Zwischenschritt notwendig. Die Referenzposition wird zu Beginn der Methode calculateSun() mit 0 initialisiert. Die nun errechnete Position kann zwischen -180 und +180 liegen. Da die Methode kreisbewegungSonne(), die die Koordinaten für die Sonne berechnet, davon ausgeht, dass die Position 0 im Süden ist, muss die errechnete Position umgerechnet werden – ist sie kleiner 0, wird 360 dazuaddiert. Seite 25 von 26 Navigations- und Ortungssysteme 6 6.1 Handy-Kompass Referenzen Quellen Sonnenkompass http://software.palmsource.de/product.php?pf=palmos&prod_id=4667 [2006-01-16] http://www.wandernonline.de/html/sonnenkompass.html [2006-01-16] J2ME http://java.sun.com/j2me/index.jsp [2006-01-16] http://java.sun.com/products/sjwtoolkit/ [2006-01-16] http://eclipseme.org/docs/index.html [2006-01-16] Zeit / Koordinaten http://www.welt-zeit-uhr.de/ [2006-01-16] http://www.jgiesen.de/sunearth/ [2006-01-16] http://de.wikipedia.org/wiki/Nullmeridian [2006-01-16] http://de.wikipedia.org/wiki/Weltzeit [2006-01-16] http://de.wikipedia.org/wiki/Greenwich_Mean_Time [2006-01-16] http://de.wikipedia.org/wiki/Koordinierte_Weltzeit [2006-01-16] http://www.worldtimezone.com/time-europe24.php [2006-01-07] http://uhrsucht.de/pics/zeitzone2.gif [2006-01-07] 6.2 Download Der Handykompass wird hier zum Download angeboten: http://www.michaelkaiser.net/kompass/mobileKompass.jad Seite 26 von 26