Catch me you can!

Koppelt man sein Netbook oder Mobiltelefon mit einer GPS-Maus und fügt ein wenig Software dazu, können Freunde und Familie die eigenen Spritztouren live und kostenlos im Browser verfolgen. Dafür muss man seine Spurdaten weder Webdiensten wie Google Latitude anvertrauen noch einen speziellen Positionssender anschaffen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 17 Min.
Von
  • Markus Schepp
Inhaltsverzeichnis

Es gibt Internet-Nutzer, die viel Energie dafür aufwenden, ihre privaten Daten zu schützen und zu verstecken, die ihre Identität verschleiern, mehrere virtuelle parallel pflegen oder gar separate Rechner für die Verbindung ins Netz unterhalten. Es gibt aber auch das andere Extrem: Leute, die alles twittern, was ihnen durch den Kopf schießt, jedem auf Flickr zeigen, was sie sehen, und im Blog alles verbreiten, was sie (zu wissen) glauben. Aber auch gemäßigt mitteilungsbedürftige Zeitgenossen mögen es interessant finden, per GPS und Mobilgerät mit Datenflatrate die eigene Position auf eine Karte im Web zu projizieren, um Freunde und Web-Bekannte über den eigenen Längen- und Breitengrad sowie die aktuelle Reisegeschwindigkeit auf dem Laufenden zu halten.

Nützliche und originelle Anwendungen für solche Ortungssysteme gibt es viele, ob einen nun die Sorge um den Partner umtreibt, der bei Sauwetter per Motorrad auf dem Heimweg leidet, ob man als Radfahrer, Wanderer oder auch nur Stadtbummler Freunden zeigen will, wo man ist, oder ob man als Geburtstagsparty-Gag zu einer Runde Geocaching mit mobilem Schatz einlädt. Das meiste davon funktioniert zwar auch über kostenlose soziale Netzwerke mit Ortsbezug [1] und Webdienste wie Google Latitude oder Yahoo Fire Eagle. Mit einer Ortungslösung Marke Eigenbau behält man allerdings das gesamte System unter Kontrolle und ist nicht genötigt, seine personenbezogenen Wegdaten einem Internetkonzern oder Webdienstanbieter zu überlassen.

Ziel unseres Projekts myLieu ist, mit wenigen Handgriffen, kostenloser Software und den freien Geodaten von OpenStreetMap [2] einen Positions-Livestream zu realisieren, der den eigenen Standort in der Regel mit weniger als einer Sekunde Verzögerung im Netz anzeigt. Auf heise online haben wir eine Projektseite mit Links zu allen erwähnten Software-Downloads, einer ausführlichen Installationsanleitung und einem Diskussionsforum eingerichtet. Sie erreichen die Projektseite über den Link am Ende dieses Artikels.

Wer die URL eines myLieu-Servers kennt, kann mit jedem beliebigen Browser live verfolgen, wo sich der Träger des betreffenden Client-Geräts gerade herumtreibt.

Für den Nachbau des Systems benötigen Sie einen tragbaren Rechner mit installierter Java-Laufzeitumgebung sowie einem Internetzugang per Mobilfunk und Datenflatrate – zum Einsatz eines Java-Handys statt des Rechners später mehr. Falls Sie extra für den Ortungseinsatz einen UMTS- oder HSDPA-Stick anschaffen und das System nur gelegentlich nutzen wollen, lohnt sich unter Umständen eine günstige Flatrate für einzelne Tage. Die Internetanbindung unterwegs kann natürlich auch ein vorhandenes Mobiltelefon abwickeln, allerdings sollten Sie dieses dann über ein Kabel statt per Bluetooth mit dem Rechner verbinden, um keine unnötige Engstelle in der Datenübertragung zu schaffen. Weiterhin benötigen Sie eine GPS-Maus zur Positionsbestimmung, die es in verschiedenen Ausführungen in der Regel für deutlich unter hundert Euro zu kaufen gibt. Um deren Messergebnisse live ins Internet zu schicken, ist etwas Webspace auf einem Server nötig – sei es gemieteter Platz bei einem Hoster, ein Heimserver oder lediglich ein dauerlaufender PC mit Internetanschluss. In jedem Fall brauchen Sie die Berechtigung, auf dem Server lauffähige Skripte zu installieren, ferner muss dieser PHP ab Version 5.0 unterstützen. Die eingesetzten PHP-Skripte benötigen außerdem das Recht, neue Dateien anzulegen.

Haben Sie keinen Zugriff auf einen Server, können Sie mit myLieu unterwegs zumindest Ihre eigene Position auf dem Bildschirm des Netbooks im Auge behalten. In diesem Fall laufen auf dem mobilen Rechner gleichzeitig die Server-Software und der Java-Client.

Auf Zuschauerseite ist myLieu plattformunabhängig – ein Browser genügt. Damit mehrere Leute gleichzeitig live dranbleiben können, wirft man bildlich gesprochen die Positionsdaten in einen Topf, in den beliebig viele reingucken können. Datenbanken sind hierfür eine bewährte Lösung und kommen auch mit gleichzeitigem Lese- und Schreibzugriff klar, aber ihr Einsatz lohnt sich erst, wenn man bei seinen Touren mit einigen zig Zuschauern rechnet.

Für den Hausgebrauch reicht dagegen als Datentopf eine Textdatei auf dem Webserver, in die nur einer schreibt, während die Zuschauer sie jederzeit zum Lesen öffnen können. Befüllt wird der Topf wie folgt: Meldet die GPS-Maus eine Positions- oder Geschwindigkeitsänderung, schickt der Java-Client auf dem Netbook die Daten übers Netz an den Server. Ein PHP-Skript auf dem Server nimmt die aktuelle Position entgegen und schreibt sie in die Datei geodata.xml, wobei die vorangegangene Position gelöscht wird. Eine parallel gepflegte zweite Datei enthält alle übertragenen Positionen eines gesamten Tages; sie ist am vorangestellten Datum der Form jjjj_mm_tt erkennbar.

Tippt ein Zuschauer die URL eines myLieu-Servers in die Adressleiste seines Browsers, weist die Datei index.html auf dem Server ein Bündel von JavaScript-Programmen an, die Arbeit aufzunehmen. Sie initialisieren zunächst den freien Geodaten-Webdienst OpenStreetMap, auf dessen Kartenmaterial die Position dargestellt wird. Dann lesen unsere Skripte in kurzen Abständen immer wieder die Datei geodata.xml aus, die ausschließlich die zuletzt gemeldete Position enthält – das spart eine zeitraubende Suche nach den frischesten Daten, wie sie bei der fortgeführten Track-Datei anfallen würde. Auf die Karte wird an die gefundene Position eine kleine Grafik als Markierung gesetzt; anschließend zentriert der Server die Darstellung auf diese Position.

Da die Datenmenge, die auf die Reise geht, im Bereich von wenigen Bytes liegt, kann man durchaus die Laufzeiten durchs Netz als bestimmende Größe für die zu erwartende Zeitverzögerung ansetzen. Bei normaler Netzauslastung liegen diese pro Nachricht bei grob geschätzt 100 Millisekunden. Da es sich um eine TCP-Verbindung handelt, laufen zwischen einer Positionsmessung der GPS-Maus und dem Speichern der Daten in der Positionsdatei vier Nachrichten hin und her. Selbst wenn man deren Zeitbedarf großzügig aufrundet, da Client und Skript natürlich auch ein bisschen rechnen müssen, ist eine Verzögerung von unter einer Sekunde realistisch. Auch die Anfrage des Beobachters zu Hause und die Antwort darauf werden ähnlich flott abgewickelt, sodass myLieu in der Praxis gefühlt beinahe in Echtzeit funktioniert.

GPS-Mäuse teilen angeschlossenen Rechnern die geografische Position im kryptisch anmutenden NMEA-Format mit. Erscheinen solche Zeilen in Hyperterminal, funktioniert die angeschlossene GPS-Maus wie gewünscht.

Bei myLieu müssen viele Komponenten reibungsfrei zusammenarbeiten. Am besten klappt der Aufbau des Gesamtsystems, wenn Sie schrittweise vorgehen. Koppeln Sie als erstes die GPS-Maus an den Rechner, je nach Modell und Ausstattung stehen dazu eine serielle Schnittstelle, USB oder Bluetooth mit entsprechender Emulation zur Verfügung. Unter Windows kann man eine so installierte Maus mit Anwendungen wie Hyperterminal, Putty oder TeraTerm belauschen. Zum Test der frisch angeschlossenen Maus wählen Sie mit Hyperterminal eine Verbindung zur betreffenden COM-Schnittstelle an und stellen die passende Übertragungsrate ein, beispielsweise 4800, 9600 oder 115 000 Baud; im Zweifelsfall hilft die Dokumentation Ihrer GPS-Maus. Dann sollten im Terminal lesbare – wenn auch nicht auf den ersten Blick verständliche – Daten erscheinen. Denn GPS-Mäuse liefern ihre Position im kryptischen NMEA-Format. Dieser Slang geht auf die National Marine Electronics Association (NMEA) zurück [3]. Ab Einschaltzeitpunkt plappert das GPS-Gerät unablässig in dieser ASCII-Zeilensprache. Als Mindestanforderung muss eine GPS-Maus in der Lage sein, einen Satz mit GPRMC-Daten von sich zu geben (siehe erste Zeile im Screenshot auf c't 11/2009, S. 159. Das Anhängsel RMC steht dabei für recommended minimum sentence.

Ein solcher Satz enthält, durch Kommas getrennt, bereits alle Informationen, die für das hier vorgestellte Ortungssystem notwendig sind. Die Zahl 135913.105 aus dem Beispiel, die dem Schlüsselwort $GPRMC folgt, gibt die aktuelle Uhrzeit an – 13 Stunden, 59 Minuten, 13 Sekunden. Manche GPS-Empfänger wie unser Testgerät geben zudem noch per Dezimalpunkt getrennt Millisekunden aus. Die Angaben erfolgen in UTC, der koordinierten Weltzeit, die der mitteleuropäischen Winterzeit minus einer Stunde entspricht. A zeigt an, dass keine GPS-Empfänger-Warnungen vorliegen (sonst steht hier V). 5222.8226 ist der geografische Breitengrad, in diesem Fall 52 Grad und 22,8226 Minuten auf der Nordhalbkugel (N); entsprechend steht 00948.3876, E für eine östliche Länge von 9 Grad und 48,3876 Minuten. Die folgenden beiden Werte 0.27, 331.00 stehen für die Geschwindigkeit über Grund in Knoten und den Kurs in Winkelgrad. 210409 kodiert das Datum, hier also den 21. April 2009. Nach Platz für weitere Angaben zur magnetischen Deklination und zum Betriebsmodus beendet * den eigentlichen Datensatz, woran sich eine Prüfsumme anschließt. Weitere Zeilen liefern Informationen über die Zahl und Identität der angepeilten Satelliten, die zu erwartende Genauigkeit der Messung und ähnlich spezielle Informationen mehr.

Unser Java-Client holt sich den NMEA-Datenstrom von der COM-Schnittstelle. Wo die Maus zu erreichen ist, übergibt man beim Start des Clients von der Kommandozeile als zusätzlichen Parameter, beispielsweise:

java -jar myLieuPCClient.jar COM4

Den Java-Client startet man über die Windows-Eingabeauf-forderung. Zur Kontrolle schreibt er dort neben den empfangenen NMEA-Daten auch seinen CGI-Aufruf an den Server hinein.

Tröpfeln ihm die Positionsdaten erst einmal ins Haus, hat der eingebaute Parser die Aufgabe, einzelne NMEA-Sätze zu isolieren, fehlerhafte herauszufiltern, mehrere Sätze zu einem vollständigen Informations-Absatz zusammenzustellen, wichtige Daten herauszuziehen und gegebenenfalls umzurechnen, etwa Knoten in Kilometer pro Stunde. Jeder NMEA-Satz beginnt mit $ und endet mit * vor der Prüfsumme. Durch Störung der Übertragung können unzusammenhängende Satzelemente aufeinanderfolgen, etwa wenn ein Zeilenende fehlt. Solche unbrauchbaren Zeilen verraten sich beispielsweise dadurch, dass sie mehrmals $ oder nicht genau so viele Kommas wie im Standard vorgesehen enthalten. Stimmen gefundene und geforderte Kommazahl einer Zeile nicht überein, ignoriert unser Client die gesamte Zeile; die Prüfsumme benutzt er nicht. Der Verlust einer einzelnen Positionsangabe durch Kommunikationsstörungen zwischen GPS-Maus und PC ist in der Praxis verschmerzbar – er liegt weit unter dem Datenausfall, den etwa eine Tunneldurchfahrt verursacht.

Um die Datenmenge gering zu halten, gibt der Client die Daten nur dann weiter, wenn sich die Position um mehr als 0,0005 Dezimalgrad geändert hat (was mit etwa 50 Metern deutlich größer als die typische GPS-Genauigkeit ausfällt) oder die Geschwindigkeit größer null ist.

Seine Erkenntnisse über die Position des Nutzers schickt der Client einerseits an System.out, also an das Terminal, aus dem heraus er gestartet wurde. Dessen Textausgaben geben schon mal einen ersten Eindruck, ob das System bis hierhin funktioniert. Zum anderen versucht er, die Daten an einen Server weiterzuleiten. Dazu dient ein CGI-Aufruf. CGI (Common Gateway Interface) ist ein Standard für den Datenaustausch zwischen Programmen über einen Webserver. Der Standard abstrahiert von konkreten Programmiersprachen, insofern kann man theoretisch mit allem arbeiten, was der gewählte HTTP-Server zur Verfügung stellt, sei es PHP, ASP, Perl oder C. Das Serverprogramm muss lediglich die für CGI geltenden Konventionen einhalten: So darf es keine grafische Oberfläche starten und muss seine Antwort auf der Konsole mit einem HTTP-Header einleiten, der auf den dann folgenden Inhalt hinweist.

Das Ganze funktioniert ähnlich wie der Aufruf eines lokal installierten Programms mit Parametern über die Kommandozeile, nur dass man beispielsweise statt

C:\Programme\>meinProgramm breite=xy laenge=xy geschwindigkeit=xy

eben schreibt:

http://meinServer/meinProgramm?breite=xy&laenge=xy&geschwindigkeit=xy

Unser Client schickt einen ähnlichen CGI-Aufruf an jenen Server, den die Datei myLieu.properties angibt. Diese wird beim ersten Programmstart automatisch im gleichen Verzeichnis angelegt, in dem das Client-JAR liegt; standardmäßig ist darin als Server localhost eingetragen, der relative Pfad zum vorgesehenen PHP-Skript lautet schlicht setUserPosition.php. Diese Voreinstellungen sind für den Funktionstest vorgesehen, bei dem man zunächst den Server auf dem gleichen Rechner laufen lässt wie den Client.

Installieren Sie hierfür das freie Paket WampServer 2. Das Zip-Archiv mit dem PHP-Server-Skript für myLieu von der Projektseite packen Sie einfach ins Verzeichnis wamp\www aus. Anschließend werfen Sie den Server über einen Doppelklick auf wamp\wampmanager.exe oder über das Menü des Wamp-Icons im System-Tray an. Wenn die GPS-Maus Satellitenkontakt hat, der Client arbeitet und Sie http://localhost/index.html in die Adresszeile des Browsers eintippen, sollte dort Ihre aktuelle Position auf OpenStreetMap erscheinen, markiert durch eine Stecknadel. Falls Ihnen unser Icon nicht gefällt, ersetzen Sie einfach die Datei usericon.gif durch ein anderes Bild ähnlicher Größe, etwa ein Mini-Porträtfoto.

Arbeiten Client und Server auf dem gleichen Rechner erfolgreich zusammen, kann man im nächsten Schritt beide Komponenten trennen. Falls Ihr Webspace über eine feste IP-Adresse oder einen Namen erreichbar ist, packen Sie einfach den Inhalt unseres Server-Pakets in ein passendes Verzeichnis und tragen in die Datei myLieu.properties auf dem Netbook als hostname den Internetnamen Ihres Servers (ohne http:// vorne und / am Ende) ein. Liegt das Skript direkt im Wurzelverzeichnis, lassen Sie den Rest unverändert, ansonsten ergänzen Sie vor dem Namen des PHP-Skripts den Pfad. Liegt es beispielsweise im Unterverzeichnis /myLieu, muss die entsprechende Zeile lauten:

url=myLieu/setUserPosition.php

Falls Sie statt eines echten Servers einen durchlaufenden Rechner benutzen wollen, der über einen Router mit dynamischer IP-Adresse mit dem Netz verbunden ist, besorgen Sie sich beispielsweise bei DynDNS.org einen kostenlosen, dauerhaften Host-Namen.

Den CGI-Aufruf nimmt die Basisversion von myLieu stets entgegen, egal von wem er kommt. Wer die Adresse des Servers und den Ort des PHP-Skripts kennt, kann deshalb theoretisch Positionen auch per Hand in den Browser eintippen und letztlich damit Ortsangaben fälschen. Eine sichere Authentifizierung des Aufrufers ist eine denkbare Erweiterung für die nächste Version unseres Mitmachprojekts myLieu; damit wäre dann auch der Zugriff auf die Kartenansicht im Browser per Passwort geschützt.

Wer unterwegs statt eines Netbooks nur ein Handy dabeihaben möchte, kompiliert sich den Java-Code für ein passendes Midlet selbst.

Wer darauf verzichten kann, unterwegs die eigene Position per Browser im Blick zu behalten, kann den Client statt auf einem Netbook auch auf einem Mobiltelefon oder PDA betreiben. Voraussetzung ist, dass das Handy für die Kommunikation mit der GPS-Maus eine serielle oder Bluetooth-Schnittstelle besitzt, Java-Programme ausführt und per EDGE, UMTS oder ähnlichem Weg Daten ins Netz sendet. Diesen Anforderungen genügen auch ältere Modelle. Wer bereits über ein Mobiltelefon mit eingebautem GPS-Empfänger verfügt, muss sogar nur ein einziges Gerät bei sich tragen. Anders als für die Netbook-Variante können wir den Client fürs Java-Handy nicht als fertige, ausführbare Datei für alle denkbaren Kombinationen von Mobiltelefonen und GPS-Mäusen zur Verfügung stellen, sondern nur als Java-Code für ein Midlet, das auf Handys mit CDLC 1.0 und MIDP 1.1 oder neuer läuft. Zum Verpacken als telefon-freundliches JAD-Paket installieren Sie sich Suns Wireless Tookit sowie ein SDK für Java; anschließend tragen Sie im Quellcode die notwendigen Angaben über die verwendete COM-Schnittstelle für den Mausanschluss ein. Auf der Projektseite finden Sie hierfür eine ausführliche Anleitung Schritt für Schritt.

Passt alles, erzeugen Sie im Wireless Toolkit über „Project/Package/Create Package“ eine fertige Anwendung und übertragen sie auf Ihr Handy, wo sie unter dem Namen GPS_Locator zur Verfügung steht. Wem das zu umständlich ist, der kann auch auf das kommerzielle Programm LocViewer von Andreas Kardos zurückgreifen. Dieses Midlet kostet zehn Euro, überträgt die Position an einen beliebig wählbaren Server und lässt sich damit an den Serverteil von myLieu koppeln.

Ausgereizt ist das System in der hier vorgestellten Grundform natürlich längst noch nicht. So sind im Code bereits Funktionen für die Unterstützung mehrerer Nutzer auf demselben Server oder anderer Kartendienste angelegt. Eine Authentifizierung bei der Datenübergabe ist ebenso denkbar wie Erweiterungen um Navigation und Routenplanung, etwa mit Hilfe von OpenRouteService.org, oder gar ein angekoppelter Video-Livestream von einer Helmkamera. Die beschriebene Software steht unter Open-Source-Lizenz und darf daher beliebig weiter entwickelt und angepasst werden. Wer direkt an der Weiterentwicklung dranbleiben will, zieht sich stets die frischesten Code-Versionen aus dem SVN-System auf der Projektseite; über Anregungen, Ideen und Code-Erweiterungen von Ihnen freuen wir uns wie bei allen c't-Mitmachprojekten.

Literatur

[1] Peter König, Orten und orten lassen, Personen und Geräte per GPS, Mobilfunk oder WLAN lokalisieren, c't 2/09, S. 60

[2] Mirko Dölle, Straßenmeister, Straßendaten erfassen und eigene Karten herstellen mit OpenStreetMap, c't 19/08, S. 118

[3] Ausführliche Dokumentation zu NMEA: www.kowoma.de/gps/zusatzerklaerungen/NMEA.htm

www.ctmagazin.de/0911156

Mehr Infos
  1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml"
xmlns:v="urn:schemas-microsoft-com:vml">
4 <head>
5 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
6 <title>.:myLieu:.</title>
7 <script src="prototype.js" type="text/javascript"></script>
8 <script src="main.js" type="text/javascript"></script>
9 <script src="http://www.openlayers.org/api/OpenLayers.js"></script>
10 <script
src="http://www.openstreetmap.org/openlayers/OpenStreetMap.js"></script>
11 <link href="myLieu.css" rel="stylesheet" type="text/css" />
12 <script src="myGeoEngine.js" type="text/javascript"></script>
13 <script src="myLieu.js" type="text/javascript"></script>
14 </head>
15 <body onLoad="onLoad()" onResize="onResize()">";
16 <div id="map"></div>
17 <div id="message">
18 <textarea id="message_text" name="message_text" rows="10" cols="30"
readonly>.:myLieu:.</textarea>
19 </div></body></html>
20

Geodatensysteme wie OpenStreetMap lassen sich über ihr API für eigene Webanwendungen einsetzen, wie hier in der Datei index.html auf der Serverseite unseres Projekts myLieu. Zeile 7 lädt als Hilfsmittel die Bibliothek prototype, die etliche Vereinfachungen im JavaScript-Code erlaubt; Zeile 9 holt das API von OpenStreetMap ins Boot. Zeile 16 und 17 erzeugen DIV-Elemente für die Anzeige, im Klartext die Kartendarstellung und ein eingeblendetes Textfeld.

(pek)