iPhone GPS logger

V prejšnjem postu sem se razburjal nad odsotnostjo GPS-ov v fotoaparatih. Pa sem razmišljal naprej: imam telefon, ki je izjemna lokacijska naprava — združuje vsaj 3 lokacijske tehnologije:

  • Triangulacijo z uporabo baznih postaj (natančno na 1-5 km).
  • Zna uporabljat WiFi lokacijo1 (na kakih 50 m natančno).
  • Z obojim lahko pomaga pravemu GPS-u, omrežni A-GPS od mobilnega operaterja pa mu postreže še z almanahi in točno uro. Z vsem tem se GPS dobro ogreje za štart in res hitro najde točno lokacijo.

Kombinacija vseh tehnik pa, poleg hitre določitve lokacije, z omejeno natančnostjo dela celo v zaprtih prostorih. Velika hitrost lociranja in dodatna podatkovna povezava za nalaganje podatkov na strežnik pa za saboj brez problema pustita Garmine in razne namenske loggerje.

Edini problem predstavlja moja želja, da naj taka aplikacija teče v ozadju in me locira periodično na par minut, česar pa Steve Jobs, logično, ne pusti.

Na jailbreakanem telefonu to ne bi smelo biti tak problem. Pa je kar. 🙂 Tule bom podokumentiral korake na poti k uspehu, ki sem jih mukoma prehodil v zadnjem tednu.

Najprej sem našel pripomoček findme. Gre za konzolno aplikacijo, napisano za iPhone OS še pred časom SDK. Uporablja Skyhook API za WiFi geolokacijo in ne dela dobro. Izgleda, da locira samo po IP-ju, in kaže isto točko za celo Ljubljano. To sem seveda ugotovil šele, ko sem napisal bash skripto, ki je klicala curl za posredovanje podatkov na strežnik, in potuhtal kako skonfigurirati LaunchDaemona, ki je skripto periodično poganjal. Dodaten problem: LaunchDaemon opravil ne izvaja med spanjem, si pa zapomni da jih je zgrešil in jih izvede ko se naprava zbudi. Na žalost še vedno precej neuporabno.

Seveda je iPhone SDK postregel s CoreLocation API-jem. Ta omogoča, da dobimo točno lokacijo na osnovi vseh treh tehnologij (Cell ID, WiFi, GPS), se pa pojavijo drugi problemi. Najde se sicer primer kode, prevajanje konzolne aplikacije, ki uporablja nedokumentirane apije za zbujanje telefona, pa je jama brez dna2. Končno aplikacijo z gornjega linka sem našel tudi na Cydii, in se je razsula še preden se je zagnala. Z zgornjo kodo se zato nisem več trudil.

Naslednja postaja: iLocalis. Kar dodelana zadeva, ki omogoča spremljanje lokacije, podobno kot Mobile Me, zraven pa še zaklepanje telefona, snemanje avdia na daljavo, nastavitev preusmeritev, pošiljanje SMS in klicanje, ter brisanje podatkov s telefona — vse na daljavo. Aplikacija dela presenetljivo dobro (trudi se ne izprazniti baterije, dobro lovi exceptione in tudi v logih od telefona lepo izpisuje stanje), in spisal sem že tudi skripto, ki iz strani pobere koordinate in jih zloži v mojo bazo3.

Ampak imel sem pa zelo neprijeten občutek; zadovoljstvo, ki sem ga pridobil z arhivom svojih koordinat, me je minilo, če sem pomislil, kaj vse lahko avtor iLocalisa naredi z mojim telefonom (pobriše ali ukrade popolnoma vse podatke, pošilja SMS-e ali naredi kakšen klic na 090 in se malo pofinancira). Zato sem bil praktično prisiljen njegov server zamenjati s svojim. 🙂

Kako? Aplikacija je zaprta in podpisana, tako da popravljanje binarne datoteke (na windowsih silno uporabna tehnika) odpade.

Problem sem rešil tako, da sem domeno, na katero daemon pošilja podatke, v iPhonovem /etc/hosts preusmeril na svoj IP naslov. Potem sem z vzvratnim inženiringom spisal nekaj svojih PHP skript, ki dovolj dobro imitirajo originalen strežnik, da se aplikacija ne pritoži. Problem pa se je pojavil, ker je edina povezava, ki me je zanimala — to je tista, ki je pošiljala podatke na strežnik — delovala preko HTTPS. Moj samopodpisani certifikat pa je povzročil napako v povezavi in prenos se ni izvršil.

No, izkazalo se je, da je za delovanje dovolj že, če izdelaš svoj CA (Certificate Authority), z njim podpišeš certifikat za strežnik, potem pa certifikat od CA registriraš na telefonu (enostavno ga odpreš iz maila ali s spletne povezave). In zadeva končno deluje. GPS logger, ki ga vsak dan nosim s sabo in mu redno polnim baterije. 🙂

Vas že slišim, kako pravite: “kaj pa boš s tem?” Ne vem še. Kaj pa bo Stephen Wolfram z dvajsetimi leti podatkov iz keyloggerja? Za nekaj bodo že uporabni, če ne za kaj drugega, pa za označevat fotografije glede na uro.

  1. MAC naslovi WiFi dostopnih točk so globalno unikatni in če enkrat prevoziš cel svet in si zapišeš, kje se kakšna dostopna točka nahaja, lahko že s tem, katere MAC-e vidiš, približno veš kje si; firma Skyhook je naredila točno to. []
  2. Dependency hell pri prevajanju toolchaina, različne verzije iPhone OS-a, Applovo podpisovanje, joj, prejoj []
  3. če koga zanima: na strani iLocalis.com moraš sharati svoj zemljevid, ta pa preko AJAX-a vleče podatke iz enega URL-ja v XML formatu. Potrebno je samo narediti cron job ki vsake pol ure poparsa ta XML []