Buddy-Tracker (Android)

Den Buddy-Tracker gibt es kostenlos bei Google Play™ https://play.google.com/store/apps/details?id=de.leo.android.buddy_tracker

Motivation

Viele Chat-Programme bieten (inzwischen) auch die Möglichkeit seinen aktuellen Standort mit seinen Freunden zu teilen. Wozu also eine weitere App für diese Aufgabe? Ausgangspunkt ist, daß die gesammelten Daten nicht über einen einzigen zentralen Server gehen sollen. Für einen besseren Schutz der Privatspäre sollen die Nutzer eigene Austauschmöglichkeiten für ihre Daten bekommen. Um das Rad nicht neu erfinden zu müssen, kann man auf bestehende Transportmöglichkeiten aufsetzen. Aktuell sind eMail und P2P Filesharing als Transportmöglichkeiten implementiert. Bedeutet natürlich einen etwas höheren Aufwand beim Konfigurieren der Software, aber man hat die Kontrolle wo und wie lange seine Daten gespeichert werden. Und last but not least: Die Aufgabe berührt viele Aspekte der Programmierung von Android-Apps, nicht nur ein einfaches Aufbereiten von Daten aus einer REST-API eines Servers, auf das sich viele Apps reduzieren lassen. Hier spielen Hintergrund-Dienste die ständig laufen müssen, Steuerung der App über globale Intents, Aktivitäts-Erkennung, … mit. Kommunikaton verschiedener asynchroner Prozesse untereinander und das Zähmen der Callback-Hell. (Mit Kotlin ist das deutlich angenehmer geworden) und, und, und … Also ein guter Aufhänger für mich, mich intensiv mit diesem Betriebssystem zu beschäftigen.

Überblick

Zentraler Bestandteil des Buddy-Trackers ist ein GPS-Logger, der automatisch und regelmäßig Positionsdaten sammeln kann (es gibt aber auch eine Option eine einzelne Position manuell aufzeichnen zu lassen). Dabei kann vielfältig konfiguriert werden wann Positionsdaten gesammelt weden sollen und wie lange sie jeweils veröffentlicht bleiben sollen (abhängig allerdings von der verwendeten Übertragungsmethode). Die gesammelten Positionsdaten können dann manuell oder ebenfalls automatisch an eine Liste von Freunden verteilt werden. Dabei kann auch gesteuert werden, wann das geschehen soll.

Mit dem manuellen Aufzeichnen und Teilen von Positionsdaten lassen sich Probleme wie

  • An welchem Ausgang des Bahnhofs wollen wir uns nun genau treffen?
  • An welcher Ecke des Badestrandes wollen wir uns treffen?
  • Ich hab mich im Wald verlaufen, holt mich hier raus!
  • Mein Fahrrad hatte unterwegs einen Platten, holt mich ab!

lösen. Nie wieder Probleme sich zu finden weil die Ortsbeschreibung nicht genau genug war.

Dazu sendet man mit der App manuell jeweils eine Positionsinformation an die gewünschten Empfänger. Dies natürlich nur solange auch eine Mobilfunk-Abdeckung besteht und GPS-Empfang möglich ist. In der Wüste, mitten auf dem Ozean, aber auch innerhalb von Gebäuden funktioniert dieser Ansatz natürlich nicht. Entweder fehlt das Netz um die Daten zu versenden oder der GPS-Empfang ist innerhalb von Gebäuden nicht möglich.

Der Buddy-Tracker kann aber auch automatisch Positionen erfassen und verteilen. Damit wäre die Überwachung einer Fahrzeugflotte oder einfach nur das Teilen des eigenen Aufenthaltsortes mit Freunden zu realisieren. Der Buddy-Tracker sendet seine gesammelten Positionsinformationen in regelmäßigen Intervallen an die definierten Empfänger. Der Sender kontrolliert hier also vollständig, wer die Daten später zu sehen bekommt.

Der Buddy Tracker kann aber auch ohne das Teilen der Positionsdaten mit Freunden als normaler GPS-Logger verwendet werden. Hier ist dann besonders das aktivitätsgesteuerte Aufzeichnen und die Möglichkeit den Buddy-Tracker von anderen Apps aus fernzusteuern zu erwähnen.

Einsatzmöglichkeiten

Ein paar Ideen wofür man den Buddy-Tracker benutzen kann.

  • Notizbuch für Orte Unabhängig von der kontinuierlichen Aufzeichnung der Positionsdaten kann der Buddy-Tracker auch einzelne Orte speichern. Entweder indem man einen Marker erzeugt, indem man lange auf den entsprechenden Punkt in der Kartenansicht klickt oder aber als Kopie des gerade aktuellen Ortes wenn man die entsprechende Menüoption in der Karten- oder Navigationsansicht benutzt. Zu diesen Orten können dann ggf. Notizen hinterlegt werden. Damit merkt man sich interessante Geschäfte, wo man in einer fremden Stadt sein Auto geparkt hat, …
  • GPS-Logger Der Buddy-Tracker kann Positionsdaten auch nur aufzeichnen und muß sie nicht mit Anderen teilen. Zusammen mit der aktivitätsgesteuerten Aufzeichnung bekommt man so das Bewegungsprofil des Tages ohne in Ruhepausen Speicherplatz oder elektrische Energie zu verschwenden. Manuelles Senden von Positionsdaten Die aktuelle Position oder gespeicherte Ortsdaten können manuell mit Freunden geteilt werden. Je nach gewähltem Übertragungsweg geschieht das in Klartext (der Empfänger muß dann den Buddy-Tracker nicht installiert haben) oder als Datenpaket für den Buddy-Tracker, der die Daten dann beim Empfänger in die Datenbank integriert. Dazu muß der Buddy-Tracker dann natürlich beim Empfänger installiert sein.
  • Teilen der Positionsdaten mit sich selbst Hat man mehrere Geräte und möchte die Positionsdaten die mit dem Smartphone gesammelt wurden auch auf seinem Tablet haben, teilt man die Daten einfach mit sich selber.
  • Teilen der Positionsdaten mit einer Gruppe Der eigentliche Verwendungszweck der App. Das Ganze kann dann jeweils auch noch über externe Apps wie Tasker, Automate oder Llama abhängig von diversen externen Parametern gesteuert werden. So kann die Ortsaufzeichnung zum Beispiel deaktiviert werden, wenn man sich in bestimmten WLANs befindet - man kann damit zum Beispiel die Ortsaufzeichnung zu Hause oder im Büro deaktivieren. Diese Informationen interessieren meist ja eher weniger und außerdem spart es Energie.

Übertragungsarten

Als Übertragungsmethode stehen mehrere Varianten zur Auswahl:

Der Buddy-Tracker kann die Informationen zwischen den Parteien auf mehreren Wegen verteilen. Je nach Einsatzzweck ist die eine oder andere, ggf. auch eine Kombination, sinnvoll. Die Übertragungsarten lassen sich in zwei Klassen einteilen: Manuelles Teilen der Position und automatisches Teilen der Position. Beim manuellen Teilen hat man die Wahl zwischen dem Teilen über externe Apps (wie Chat- oder EMail-Apps) oder dem Buddy-Tracker. Über die externen Apps wird im Moment grundsätzlich eine ausführliche Klartext-Version der Position, der Daten des Buddies oder des Ortes geteilt. Die gewählte App erledigt dann die Zustellung der Information an den Empfänger. Das Teilen dieser langen Klartext-Version über die jeweils aktive SMS-App des Smartphones macht aber eher wenig Sinn - es sei denn man hat zu viel Geld. ;-) Trägt man einen Buddy im Buddy-Tracker ein und gibt dem die Handy-Nummer, dann versendet der Buddy-Tracker eine für SMS Bedingungen gekürzte Fassung der Daten. Teilt man die Daten aber über den Buddy-Tracker, dann werden die möglichen Übertragungsoptionen angeboten, die sich aus den gerade aktivierten Übertragungsmethoden des Buddy-Trackers und den bei den jeweiligen Buddies eingetragenen Kontaktdaten und Aktivierungen der Daten ergeben. Die getätigte Auswahl wird intern gespeichert und beim nächsten Senden als Vorauswahl angeboten. So hat man eine einfache Gruppenbenachrichtigung wobei jeder Buddy mit einer individuellen Kommunkationsmethode angesprochen werden kann.

Manuelles Teilen der Position

Beim Teilen über die Buddy-Tracker App gibt es dann die folgenden Optionen:

Text-SMS

(Google erlaubt diese Funktion nicht mehr im Play Store, daher mußte ich sie entfernen)
Hier bekommt der Empfänger eine normale SMS mit einem Link zu einem Kartenprovider (im Moment Google-Maps) in dem die gewünschte Position markiert ist. Abhängig von eingesetzten Gerät kann man sich dann von seinem aktuellen Standort zu dieser Position routen lassen.Ist der Buddy-Tracker installiert, dann erkennt er, den Link zum Kartenprovider und bietet die Option an, die Information auch selber zu bearbeiten. Die Text-SMS ist geeignet für die direkte Kommunikation zwischen wenigen Partnern, da für jede Meldung oder Nachricht je eine SMS an jeden der beteiligten Empfänger gesendet werden muss. Hierzu wäre eine SMS-Flatrate zu empfehlen.

Manuelle eMail

Hier wird der auf dem Gerät bereits benutzte eMail-Client aufgerufen. Dort sind die Empfänger, das Subject und der Meldungstext bereits ausgefüllt, können aber noch nach Belieben editiert werden. Das Versenden der Informationen per eEMail geschieht genau so wie bei Klartext-SMS. Nur sind die übermittelten Informationen etwas ausführlicher, da die Begrenzung auf 160 Zeichen pro SMS weg fällt.

Daten-SMS

(Google erlaubt diese Funktion nicht mehr im Play Store, daher mußte ich sie entfernen)
Dies ist eine spezielle Art von SMS. Sie ist für den normalen Benutzer unsichtbar. Auf dem Empfänger Gerät muß der Buddy-Tracker installiert sein. Dieser horcht auf diese SMS und verarbeitet die übertragenen Daten dann intern gleich weiter. Da bei dieser Übertragungsart keine Menschen involviert sind, ist der Inhalt der SMS definiert und das automatische Verarbeiten einfacher. So können auch redundante Informationen weg gelassen werden und mehr Nutzinformationen in der SMS transportiert werden. Ist beim Empänger kein Buddy-Tracker installiert, verschwindet die Daten-SMS allerdings sang- und klanglos.

Automatisches Teilen der Position

Die ersten zwei Methoden senden die Positionsdaten direkt zu den jeweiligen Empfängern. Es gibt keine zentrale Stelle an der die Positionsdaten zwischengespeichert werden. So haben Unberechtige keinen Zugriff auf die Daten, solange Sender und Empfänger ihre Systeme sauber halten.

Daten-SMS

(Google erlaubt diese Funktion nicht mehr im Play Store, daher mußte ich sie entfernen)
Die Daten-SMS eignet sich auch für das automatische Teilen der Position, sofern man eine SMS-Flat hat. Ansonsten wären die Kosten wohl zu hoch.

Automatische eMail

Hier kann nicht der jeweils auf dem Systen verwendete Default-eMail Client verwendet werden. Dieser läßt das automatische Versenden von Mails nicht zu und gewährt auch keinen anderen Apps den Lesezugriff auf Postfächer. (Und das ist auch gut so!) Also muß der Buddy-Tracker einen eigenen eMail-Client mitbringen, der dann vom Anwender jeweils geeignet zu konfigurieren ist. In dieser Betriebsart sendet der Buddy-Tracker eine eMail in einem automatisch zu verarbeitenden Format (JSON, in Zukuft verschlüsselt) an die gewünschten Empfänger. Dies geschieht effizient und unter der Wahrung der Privatsphäre. Die Mail muß nur einmal an den Mailserver gesendet werden. Die Empfänger stehen im BCC, so daß sie gegenseitig nicht sehen wer noch diese Mail bekommen hat. Auf der Empfängerseite lauscht der Buddy-Tracker auf den Posteingang des gewählten Postfaches. Das kann ein extra für den Buddy-Tracker eingerichtetes Postfach sein. Oder aber man benutzt ein vorhandenes Postfach. Die Mails sind im Subjecht durch den Prefix “[#BT#]” gekennzeichnet und werden anhand dieses Prefixes vom Buddy-Tracker erkannt und verarbeitet. Alle anderen Mails im Posteingang läßt der Buddy-Tracker unbeachtet. Bearbeitete Mails können dann auch automatisch im Posteingang gelöscht werden. So bleibt das Postfach auf dem Mailserver sauber. Die folgenden Methoden arbeiten mit einem geteilten Medium, auf das alle Teilnehmer Zugriff haben. Wer Zugriff auf dieses Medium bekommt, hat prizipiell Zugriff auf die Positionsdaten der anderen Teilnehmer. Jeder Sender ist dafür verantwortlich, seine eigenen Positionsdaten zu verwalten - also ggf. veraltete Daten zu löschen. Die anderen Teilnehmer lesen diese Daten nur und schreiben oder löschen dort nichts. Diese Methoden sind geeignet um die Positionsdaten ggf. auch anderen, nicht direkt beteiligten, Parteien zur Verfügung stellen zu können.

Shared Folder

Es gibt die Möglichkeit, einen Ordner auf seinem Gerät ins Internet zu spiegeln und dort den Inhalt mit anderen Leuten zu teilen. Der Buddy-Tracker kann dies nutzen, indem er seine Informationen in diesen Ordner schreibt und die dort eintreffenen Information intern bearbeitet. Jede Positionsmeldung ist eine eigene Datei und jeder Teilnehmer hat hier seinen eigenen Unterordner. So sind die Positionsmeldungen den jeweiligen Sendern zuzuordnen. Getestet wurde das mit Sync (vormals Bittorrent-Sync) und SyncThing Allerdings hat man hier den Nachteil, dass die Information mit etwas Verzögerung verteilt wird da diese Apps nur in gewissen Zeitabständen nach neuen Informationen suchen um Energie zu sparen. Auch kann nur mit Buddies geteilt werden, die gerade auch online sind. Im Minimalfall muß also jeweils immer mindestens ein Mitglied der Gruppe online sein wenn geteilt wird. Dies kann problematisch sein, wenn die Gruppe nur aus mobilen Geräten besteht, die gerne zum Energiesparen auch mal schlafen gehen. Es bietet sich also an ggf. mindestens einen kleinen Server zu integrieren, der diesen Ordner kontinuierlich teilt - ein Raspberry Pi o.Ä. genügt hierfür völlig. Hat man einen Account bei einem Cloud-Provider, dann besteht noch eine weitere Option. Meist unterstützen die Cloud-Anbieter keine automatische Synchronisation eines lokalen Ordners mit einem Ordner in der Cloud nicht. Der Buddy-Tracker benötigt allerdings zum Teilen einen lokalen Ordner. Nur hier bekommt man zuverlässig die Benachrichtigung, wenn sich der Ordnerinhalt geändert hat (= eine neue Nachricht ist eingetroffen). Aber selbst das überprüfen eines bestimmten Ordners beim Cloud-Anbieter ist meist nicht möglich - die entsprechende Schnittstelle wird nicht angeboten. Und wenn - je nach Provider müßte dann eine separate Methode im Buddy-Tracker implementiert und aktuell gehalten werden. Aber es gibt Apps, die genau dies für einen tun. Also warum nicht die nutzen? ;-) Ein vielversprechender Kandidat (ohne Anspruch auf Vollständigkeit) ist zum Beispiel Synchronize Ultimate. Mit dieser App kann man Ordner diverser Cloud-Anbieter mit einem lokalen Ordner synchronisieren. Auf diesen synchronisierten Inhalt greift dann der Buddy-Tracker huckepack zu. Hier hat man auch eine zentrale Stelle, die immer erreichbar ist und umgeht so das Problem der Buddies die gerade nicht erreichbar sind.

Web Service

(Noch nicht implementiert, aber auf der ToDo-List:)
Aus technischer Sicht ist ein zentraler Web-Service am einfachsten umzusetzen. Ein kleiner Webserver mit MySQL und PHP genügt so daß sich die Buddy-Tracker mit ihm verbinden und ihre Informationen synchronisieren können. Als Hardware genügt ein Raspberry Pi und mit Hilfe eines der dynamischen DNS-Provider kann man diesen Server bei sich zu Hause ins eigene Netz hängen. Zugriff von Dritten sind so nicht möglich (naja, wenn die NSA unbedingt will, dann schafft sie es auch, nicht aber das Script-Kiddie von nebenan …) Diese Option bietet die Möglichkeit, daß auch Geräte, die den Buddy-Tracker nicht installiert haben, an diesem Dienst teilnehmen können, indem sie ihre Positionen über eine (noch zu entwickelnde) Browser-App an dem Webserver veröffentlichen. Die ganzen Automatik-Optionen sind dort aber umständlicher umzusetzen … Auch kann ein weiterer Service geschrieben werden, der die Positionsdaten im Internet für normale Browser zugänglich macht. Zum Beispiel für die Darstellung der Positionen der Teilnehmer eines Marathons oder Radrennens für die Fans. Die Teilnehmer müssen dazu nur ihr Android-Handy mit installiertem Buddy-Tracker mitführen (was für Amateur-Veranstaltungen wohl zumutbar ist).

Datenschutz / Datensparsamkeit

Ein paar Worte welche Informationen anfallen, wo sie gespeichert werden und wer ggf. mitlesen kann. GPS ist ein Rundfunkdienst. Die GPS-Daten werden weltweit ausgestrahlt und die Tatsache ob und wo man die GPS-Daten empfangen hat, kann von außen nicht ermittelt werden. Bei der Nutzung des GPS-Dienstes fallen also keine für Außenstende verwertbare Informationen an. Die Positionsinformationen müssen dann an die Empfänger gesendet werden. Diese müssen die Informationen notgedrungenerweise lesen und verarbeiten können, sonst würde die Übermittlung ja keinen Sinn machen. Je nach gewählter Übertragungsmethode werden, technisch bedingt, mehr oder weniger Daten auch an nicht direkt beteiligte Parteien gesendet. Abschließend bekommt der Provider, der das Kartenmaterial bereit stellt (im Moment Google) noch die Information, das ein gewisses Gerät (das normalerweise einer gewissen Person zugeordnet werden kann) an einem bestimmten Ort interessiert ist (da für diesen Ort ja die mindestens Karte der näheren Umgebung angefordert wird) In der internen Kartendarstellung des Buddy-Trackers geht nicht ganz so viel Information nach außen, da dort nur die Karte des jeweilig benachbarten Gebietes angefordert wird. Die genauen Positionen der interessanten Punkte gehen dabei nicht nach außen. Dies wird in einer der nächsten Versionen entschärt werden: Erst einmal durch weitere Kartenanbieter für den Klartext-Link (bing, OpenStreetmap), so daß jeder die Information auch über mehrere Anbieter streuen kann. Die Einbindung eines alternativen Kartenanbieters in die Buddy-Tracker Anwendung

Lokale Datenbanken auf dem Gerät

Die lokalen Nachrichten und Positionsmeldungen werden im privaten Bereich der App unverschlüsselt gespeichert. Bei normalen ungerooteten Geräten ist das eine hinreichende Sicherheit gegenüber dem Zugriff von anderen Apps. Auf gerooteten Geräten besteht natürlich die Möglichkeit, daß eine entsprechend berechtigte App auch Daten aus den privaten Bereich anderer Apps abgreift. Aber derjenige, der sein Gerät rooted sollte sich darüber im Klaren sein, was er da tut.

SMS, eMail

Die Informationen werden nur direkt zwischen den beiteiligten Parteien ausgetauscht. Mltlesen könnten noch die jeweiligen Provider, die die Nachrichten übermitteln, da die Daten noch nicht verschlüsselt übertragen werden. Im Falle der Klartext-SMS und eMails für Empfänger ohne installierten Buddy-Tracker dürfen die Informationen auch gar nicht verschlüsselt werden, da sonst der Empfänger die Nachricht ja gar nicht lesen könnte. Die Information fällt im Falle der SMS auch nur zum Zeitpunkt der Übertragung an, es sei denn die Telefonprovider speichern den Inhalt der übertragenen SMS noch irgendwo. Im Falle der eMails könnten auch die Internet-Provider, die das jeweilige eMail-Postfach zur Verfügung stellen die Nachrichten nachträglich noch lesen, solange sie noch nicht aus dem Postfach gelöscht wurden.

Shared Folder

Die Sicherheit ist abhänig vom eingesetzten Produkt. Im Falle von Sync bzw. SyncThing ist die Sicherheit so gut, wie die beiteligten Leute ihre Geräte sichern können. Die Übertragung zwischen den Parteien ist verschlüsselt. Die Daten werden nur auf den beteiligten Geräten gespeichert. Es gibt keinen zentralen Server, der die Daten kontinuierlich online hält. Damit müssen die Parteien allerdings auch gleichzeitig online sein, um die Daten auszutauschen (was aber im angestrebten Einsatzfall wohl der Normalzustand sein sollte). Gegebenenfalls kann man natürlich ein weiteres Gerät in die Synchronisations-Gruppe aufnehmen, das immer online ist (ein Raspberry-Pi genügt hierfür vollkommen) und das die Daten für alle Beteiligten ständig verfügbar hält.

Web-Service

Derjenige, der den entsprechenden zentralen Web-Service zur Verfügung stellt hat natürlich Zugriff auf die dort gespeicherten Daten. In einer späteren Ausbaustufe werden die Daten aber auf dem Webserver nur verschüsselt gespeichert und können dann nur noch von den jeweiligen berechtigten Empfängern entschlüsselt werden.

Angedachte Erweiterungen / ToDo-List

Ein paar Ideen, die noch der Umsetzung harren. ;-)

Annährungsalarm

Nähert sich ein einem ein Buddy oder vergrößert sich der Abstand zu ihm zu sehr wird ein Alarm ausgelöst. Definieren von Gebieten in denen grundsätzlich (nicht) getrackt wird Also eine Automatik die den Tracker ein oder ausschaltet sobald man sich in bestimmten Gebieten bewegt.

Fernabfrage der aktuellen Postion (“Ping”)

Geeignet um z.B. den aktuellen Aufenthaltsort seiner Sprößlinge ermitteln zu können. Der Buddy-Tracker sendet nach Eingang eines entsprechenden Kommandos (eines berechtigten Absenders) die aktuelle Position des Gerätes an diesen Absender zurück. Geeignet konfiguriert könnte man es auch als Dienstahlsicherung einsetzen. Definitiv eine kritische Funktion. Es mag sinnvolle Anwendungsbreiche dafür geben - allerdings könnte auch Schindluder damit getrieben werden. Werde ich wenn, dann wohl nur als separat installierbares Zusatzmodul implementieren, das dann aber eine klare optische Rückmeldung gibt, wenn der Dienst aktiv ist.

SOS-Modus

Ausgelöst wird ein Alarm durch Tastenkombinationen auf dem Handy, die man auch blind in der Hosentaschen machen kann. (Hab gehört daß so was geht … klingt interessant) Die App sendet dann eine Alarmnachricht an einen vordefinierten Empfängerkreis und daran anschließend kontinuierlich die aktuelle Position. Dies als stiller Alarm, so daß die Angreifer in der aktuellen Situation nicht aggressiv(er) werden. Zuschaltbar könnte eine Option gemacht werden, bei der die Empfänger der Mail auch Zugriff auf das Mikrophon haben um ggf. beurteilen zu können wie ernst die Lage ist.

Das ist allerdings ziemlich kitzlig mit der Privatsphäre. Wird ggf. dann sogar noch ein weiteres separates Modul werden, so daß die Hauptanwendung mit sparsamen Rechten auskommen kann.