Geolokační API Googlu slouží k tomu, abychom věděli, kde jsme, i když po ruce nemáme GPS. Pokud jej začnete používat trošku „jinak“, budete znát polohu každého Wi-Fi routeru.
V Computeru 23/10 a posléze na webu Navigovat jste si mohli přečíst článek od Pavla Nygrýna, ve kterém se věnoval technickému pozadí geolokačního API od Googlu. Přesně tento systém na mapách Googlu rozezná vaši přibližnou polohu, pokud jste připojení pomocí Wi-Fi, a stejně tak vám tento systém přidělí přibližnou polohu na chytrém mobilu, který není vybavený GPS přijímačem.
Jak Google zjišťuje polohu
Jak to vlastně celé funguje? Dejme tomu, že před sebou máte notebook, sedíte v kanceláři v centru rušného města a k internetu jste připojení pomocí Wi-Fi routeru. Každý Wi-Fi router má svůj BSSID, což je paralela MAC adresy – je to tedy ve většině případů unikátní identifikátor. Bezdrátová Wi-Fi síť má ale zároveň jednu dobrou vlastnost. Kdokoliv bude v jejím dosahu, může získat její základní identifikační údaje. A k nim vedle jména (SSID) patří i BSSID, síla signálu, nebo třeba informace o způsobu šifrování. Nakonec to nejlepší – v dosahu může být zařízení s GPS přijímačem.
Na tomto principu fungují třeba auta Googlu, která fotí ulice pomocí laserů a fotoaparátů umístěných na nepřehlédnutelném střešním stativu. I tato auta „osahávala“ okolní bezdrátové sítě, zjišťovala unikátní BSSID identifikátor, přidělovala mu svou vlastní známou polohu a… A byla kolem toho zbytečná aféra třeba v Německu. Takto Google získal základní databázi bezdrátových přípojných bodů a jejich polohu. Není to ovšem nic nového, podobným způsobem totiž třeba USA mapuje celá armáda firem s obřími vozovými parky a to už dlouhé roky. O Googlu se v tomto kontextu píše především proto, že je jednoduše obrovský a především proto, že tuto databází dokázal využít v praktickém životě.
Oním praktickým využitím je opět geolokační systém Googlu – tentokrát jeho klientská část. Vraťme se nyní k našemu routeru v kanceláři rušného centra (to je ostatně i případ naší brněnské redakce). Jak třeba takový prohlížeč zjistí, kde se vlastně nacházíme? Je to vcelku jednoduché. Pokud je prohlížeč vybavený podporou pro geolokaci, využije (třeba) systém Googlu, kterému pošle BSSID identifikátory všech Wi-Fi sítí v okolí. Prohlížeč víceméně udělá to samé, co příkaz:
netsh wlan show networks mode=bssid > c:\wifiny_v_okoli.txt
Ten v případě Windows zjistí základní informace o okolních bezdrátových sítích a výstup uloží do textového souboru wifiny_v_okoli.txt, Pokud se do něj podíváte, objevíte tam i řádek s nejdůležitějším údajem – BSSID.
Jak si prohlížeč stáhne vaše souřadnice
Fajn, prohlížeč zná BSSID identifikátory bezdrátových sítí, ještě k nim ale musí připojit souřadnice. Pokud v mapách Googlu klepnete na geolokační tlačítko (najdete ho mezi navigačním křížem a přibližovacím šoupátkem), prohlížeč otevře šifrované SSL spojení se serverem Googlu a na adresu www.google.com/loc/json pošle pomocí HTTP POST příkazu balík dat ve formátu JSON.
Ukázková JSON data by mohla vypadat třeba takto (situace u nás v práci):
{
"version":"1.1.0",
"access_token":"2:TxOUf1FvIIchp7rY:V46pKmYW2fVPkhLb",
"wifi_towers":[
{
"mac_address":"00-1d-0f-e4-4b-12",
"ssid":"nygrynovo",
"signal_strength":-67
},
{
"mac_address":"00-19-cb-58-1f-0f",
"ssid":"Homeless",
"signal_strength":-50
},
{
"mac_address":"00-22-75-34-a9-2f",
"ssid":"kosovo",
"signal_strength":-42
},
{
"mac_address":"e8-39-df-9a-ae-2b",
"ssid":"VOIP",
"signal_strength":-89
},
{
"mac_address":"e8-39-df-9a-ae-2a",
"ssid":"nas net",
"signal_strength":-90
}
]
}
Úplně stejně v případě Googlu funguje i lokalizace pomocí GSM signálu na mobilním telefonu. Zde se ale namísto lokalizovaných Wi-FI AP přípojných bodů používají lokalizované BTS vysílače. Pokud tedy budete používat geolokalizaci třeba na telefonu s Androidem, společně se seznamem Wi-Fi stanic v nejbližším okolí se zašle i seznam vysílačů mobilních operátorů.
Komunikace s Googlem při určování polohy v Mapách Google (HTTP komunikaci snímá doplněk Live Headers)
Servery Googlu všechny tyto informace zpracují, porovnají je se svou databází geograficky zaměřených routerů a BTS stanic, podle síly signálu provedou triangulaci naší nejpravděpodobnější polohy a tu zašlou zpět opět ve formátu JSON. Prohlížeč data zpracuje a na mapu vynese modré kolečko. Víme, kde jsme, a pokud je vše správně zaměřeno, přesnost může být skutečně v řádu jednotek metrů. Bez použití GPS.
„Hackujeme“ Google Geolocation API
Takhle tedy funguje ve zkratce zjištění naší vlastní polohy. Vše je zapouzdřeno do geolokačního systému prohlížeče, ten se nás tedy zároveň zeptá, jestli chceme sdílet naši polohu a provede další bezpečnostní režii. Co když to ale celé obejdeme a sami se budeme chovat jako prohlížeč? Co když budeme s Googlem komunikovat přímo?
Plyne z toho několik zajímavých výhod a hrozeb zároveň. Dejme tomu, že si napíšete (nasimulujete) vlastní HTTP klient, který pomocí POST příkazu pošle JSON data, ve kterých ovšem bude pouze jeden jediný BSSID nějakého Wi-Fi routeru nebo AP. Dokonce nemusíte ani nic šifrovat pomocí SSL, komunikovat totiž můžete i nešifrovaně (vedle https://www.google.com/loc/json totiž můžete použít i http://www.google.com/loc/json).
Namísto informací o všech okolních Wi-Fi sítích pošlu pouze BSSID jedné jediné – ta mě zajímá:
{
"version":"1.1.0",
"wifi_towers":[
{
"mac_address":"BSSID PODLE VAŠEHO GUSTA",
"ssid":"UNKNOWN",
"signal_strength":0
}
]
}
Google v takovém případě nebude provádět žádnou triangulaci a odhad polohy – vrátí vám polohu samotného Wi-Fi routeru. Jinými slovy v rukou právě svíráte docela zajímavý nástroj, který zjistí přibližnou polohu jakéhokoliv zaměřeného bezdrátového routeru/AP na světě. Pokud si zaměříte vlastní domácí router, který pak věnujete babičce, nebo ho prostě prodáte, budete moci v čase sledovat, jak postupně mění svého majitele a polohu. Routery totiž v minulosti nezaměřovala pouze auta Street View, ale samozřejmě i zcela běžní chodci, kteří měli v kapse chytrý telefon se zapnutou Wi-Fi a nejlépe i GPS. Pokud využívali geolokační služby Googlu, docela možná to byli oni, kdo zaměřil právě ten váš router. Ve větším městě s vyšší penetrací podobných chytrých telefonů tedy samozřejmě roste i pravděpodobnost, že přestěhovaný router dříve či později někdo opět zaměří.
Praktický experiment: aplikace VidímRoutery
Abych ale pouze neteoretizoval, připravil jsem jednoduchý experiment. Dělá vše výše zmíněné v jednom jediném kroku. Webová aplikace VidímRoutery nabídne formulář, do kterého můžete zadat libovolnou BSSID/MAC adresu routeru. Po klepnutí na ENTER se program spojí se serverem na už známé adrese google.com/loc/json, pomocí POST příkazu mu předá JSON data s vyplněnou adresou a od Googlu na oplátku obratem dostane přibližnou polohu. Pokud zadáte neexistující BSSID nebo zatím nezaměřenou adresu, Google vás pokaždé přesune do centra Liberce. Jak je to možné? Právě tam je totiž hlášená IP adresa mého serveru, na kterém to celé běží a Google, pokud si nebude vědět rady, použije alespoň zastaralou a velmi nepřesnou geolokaci podle IP adresy.
Ukázková aplikace: stačí zadat libovolný BSSID (MAC adresu) a dozvíte se, jestli o routeru už Google ví
Skript VidímRoutery si můžete vyzkoušet i voláním z vlastní aplikace. Stačí poslat GET dotaz na adresu http://service.tucnacek.cz/vidimroutery/driver.php?bssid=BSSID routeru, a pokud mi server nezahltíte, dostanete jednořádkovou odpověď ve formátu:
OK;12345;50.767019;15.056134
OK je jen potvrzení, že vše proběhlo, tak jak má. Druhá hodnota za středníkem je opět BSSID (pro kontrolu) a pak tu je odhadovaná zeměpisná šířka a v posledním poli zeměpisná délka. Zbytek je už na vás. V každém případě, toto celé je pouhý experiment, a pokud budete chtít strojově zpracovat nějaký větší balík BSSID adres, rozhodně si napište vlastní klient. Ten můj bude příliš pomalý a mně se to nebude líbit.
Mapujeme město
Zjištění přibližné polohy routeru je ovšem pouze první krok. Pak je tu totiž ohromné množství dalších možných využití. Já si pro testovací účely opět napsal jednoduchou aplikaci – tentokrát pro mobilní platformu Android. Mám totiž sice po ruce lokalizátor routerů, chybí mi ale dostatek BSSID adres, na kterých bych to vše pořádně otestoval. Přesně to dělá mobilní program Klobouk Wi-Fi Špion. Při cestě do práce ho spustíte a on bude na pozadí běhu mobilu neustále skenovat okolní sítě a ukládat jejich informace do textové databáze (běžné CSV). Na konci dne ve větším krajském městě bez problému nasbíráte stovky až tisíce bezdrátových sítí a ty pak můžete dávkově opět zpracovat pomocí trošičku zneužitého Google Geolocation API. Aplikace zatím slouží pouze pro testovací účely, později ale bude k dispozici ke stažení pro další případné zájemce.
Klobouk Wi-Fi Špion v akci: během jediné cesty do práce zaznamenal stovky routerů a přípojných bodů
Výsledkem celodenního snažení může být třeba zajímavá mapa s vynesenými polohami stovek a tisíců routerů, na které můžete zkoumat, s jakou přesností je Google lokalizoval. S tím vším totiž souvisí ještě jedna otázka – proč jsem vlastně takto ručně nasbírané stovky BSSID adres nezaměřil přímo pomocí GPS na mobilu? Odpověď je nasnadě: protože Google může být přesnější. Více napoví obrázek dole.
Skenování bezdrátových sítí probíhá zhruba každé 4 sekundy. Pokud během skenu zjistím 3 různě silné bezdrátové sítě, nemohu jim přidělit svoji aktuální GPS polohu, jelikož nejsou na jednom místě. Zároveň nevím, jestli se k nim teprve blížím, nebo se od nich už vzdaluji. Při dalším skenu mohu být nakonec už mimo dosah sítě.
Proč je Google v zaměřování lepší? Tedy on je lepší pouze tam, kde kolem routeru prošlo už mnohem více lidí – tedy přirozeně v centrech měst. Na perifériích naopak spíš najdete nezaměřené přípojné body a také přesnost určení může výrazně kolísat. U zaměřených routerů v centru měst kolem přípojných bodů prošlo stádo majitelů chytrých telefonů a to ze všech různých směrů. Google tedy zná nejpravděpodobnější polohu routeru. Ta nemusí být přesná, čím více lidí ale kolem routeru projde, tím se bude poloha neustále zpřesňovat. Pokud bych routery zaměřoval pomocí vlastní GPS, také bych kolem nich musel projít ze všech různých směrů mnohokrát po sobě a podle síly signálu posléze jakýmkoliv způsobem vypočítat jejich nejpravděpodobnější polohu. Jednoduše si k nim nemohu stoupnout a odečíst souřadnice GPS, protože netuším, kde přesně jsou.
Hotová mapa z dvoudenního mapování (1 146 Wi-Fi sítí). Jezdím tudy skoro každý den se zapnutým GPS, je tedy docela možné, že hromadu z těchto sítí jsem zaměřil já. Sítě ve střední částí mapy ke všemu skoro dokonale kopírují vozovku – ty jsem asi skutečně zaměřil pouze a jedině já a Google nemůže jejich polohu zpřesnit z dalších údajů. Zkušební podobu mapy si můžete vyzkoušet zde, je ale neoptimalizovaná a pomalá, nedoporučuji prohlížet v MSIE. Legendu najdete zde.
Google je specialista na sběr dat – data mining. Stěží byste dnes totiž na internetu našli firmu, která sbírá větší množství nejrůznějších dat. Google zároveň není lakomý a komunitě vše poctivě vrací. Pokud data sbírá, snaží se je i nabízet skrze desítky svých aplikačních rozhraní. Pokud jej ale občas trošičku obelstíte a jeho API použijete možná trošku jinak, než předpokládali jeho inženýři, snad vám to projednou promine. Toto byl jen jeden z mnoha (skutečně mnoha) postupů.