1
手機(jī)定位的價值
目前智能手機(jī)的使用已經(jīng)越來越普遍,手機(jī)定位也是手機(jī)上的一個核心基礎(chǔ)功能玫荣。舉一個常見的應(yīng)用如叫車甚淡,司機(jī)需要知道你在哪里,同時打車軟件也需要基于司機(jī)和乘客的位置規(guī)劃一條路線捅厂,讓司機(jī)更高效的行駛到用戶這里贯卦。這就是典型的定位服務(wù)的應(yīng)用。當(dāng)然焙贷,除去這種應(yīng)用撵割,用戶位置本身的展示,也是地圖產(chǎn)品中不可缺少的辙芍。
那么問題就來了啡彬,作為app的用戶,你可能會好奇這個app是如何知道你的位置故硅;而作為app的開發(fā)者庶灿,是如何在程序中得到設(shè)備當(dāng)前的準(zhǔn)確位置的呢?
這個問題說來話長吃衅,我們還是先從定位原理上來解釋吧往踢!
2
可用于無線定位的信號
很顯然,一個功能正常的手機(jī)徘层,總是能夠受到各種無線信號峻呕,這些無線信號的“局部唯一性”利职,是該設(shè)備能定位的關(guān)鍵前提。什么叫局部唯一性瘦癌?我們再把這些具體的信號來展開解釋下你就知道了:
基站信號:
一個手機(jī)能夠接打電話猪贪、收發(fā)短信,說明該手機(jī)能與附近基站發(fā)起交互讯私,收發(fā)信號热押。特別地,對于智能手機(jī)妄帘,還可以通過系統(tǒng)的接口得到基站ID楞黄。正常情況下池凄,每個基站ID是全球唯一的抡驼,這樣如果掃到了某個基站ID,我們又知道該基站的位置肿仑,便能粗略估計設(shè)備的位置致盟。做出這個推測的前提就是一個基站的信號發(fā)射范圍是有限的,正常的手機(jī)尤慰,不可能在相距這個基站很遠(yuǎn)的時候馏锡,還收到這個基站的信號。
在無線通信相關(guān)的教科書里伟端,講到基站定位杯道,總是會談到三角定位,也就是下圖描述的原理责蝠。下圖是很容易理解的党巾,一個手機(jī)能掃描到三個基站的信號,因此其必然在三個基站的共同覆蓋范圍內(nèi)霜医,從而推算的范圍就大大縮小齿拂。但現(xiàn)實是很骨感的,在現(xiàn)在的智能手機(jī)上肴敛,只有極少數(shù)的手機(jī)可以獲取到多個周圍的基站ID署海,而且也無法反算出和這些基站的距離,所以這個算法除非電信運營商自己可以試試医男,對于別人是沒有實戰(zhàn)價值的砸狞。在實戰(zhàn)中,只能是退而求其次镀梭,基于單個基站來定位刀森。
WIFI信號:
現(xiàn)在的智能手機(jī)都支持wifi上網(wǎng)了,而我們連接的每個wifi路由器(包括手機(jī)做移動熱點的那種)丰辣,都有全球唯一的MAC地址撒强。更重要的是禽捆,wifi路由器的部署成本低,因而非常普遍飘哨,在一個樓層里就會有很多個wifi熱點胚想。因而不難想到,一旦我們有了這個全球每個路由器的實際位置芽隆,那么我們就可以基于用戶手機(jī)掃描到的周圍wifi熱點浊服,確定用戶當(dāng)前的位置。
說到這里胚吁,有的朋友會問牙躺,如果一個人帶著手機(jī),開著移動熱點到處行走腕扶,還有那種地鐵孽拷、高鐵、公交車上的移動wifi半抱,豈不是就會引起定位的錯誤脓恕?答對了,確實是這樣窿侈,而且根據(jù)統(tǒng)計炼幔,這種情形還在愈演愈烈。因此史简,如何想辦法來迅速過濾這種移動熱點乃秀,是個值得研究的問題。
GPS信號:
如果手機(jī)在室外或者窗邊圆兵,那么就可以接收到天上的定位衛(wèi)星發(fā)射出來的信號跺讯,基于這種信號,可以推算手機(jī)到每顆衛(wèi)星的距離衙傀、衛(wèi)星位置抬吟,進(jìn)而推算出手機(jī)的位置來。需要注意的是统抬,這個解算是在GPS芯片中完成的火本,在手機(jī)操作系統(tǒng)層面上,可以直接通過API接口得到解算的結(jié)果和誤差半徑聪建。
對于GPS的原因我們不多解釋钙畔,但在調(diào)用時要注意兩點。第一就是GPS的初始定位是很耗時間的金麸,對于老一些的芯片擎析,可能要耗費幾分鐘才能冷啟動定位成功;第二是GPS精度并非是完全可依賴的,在一些地方達(dá)到幾百米都有可能揍魂。
其他:
以上三種是最常用的定位方式桨醋,此外還有藍(lán)牙/IP/地磁場等手段,對于它們的優(yōu)缺點现斋,我們匯總?cè)缦拢?/p>
定位方法
場景
精度
開發(fā)者實現(xiàn)方式
GPS
室外或窗邊喜最,初次定位需要若干秒鎖定等待時間
一般情況下10M內(nèi),高樓邊和高架下面100M內(nèi)
芯片實現(xiàn)庄蹋,系統(tǒng)API提供瞬内,開發(fā)者直接調(diào)用。
基站定位
可以打電話的地方
幾百米
系統(tǒng)API提供基站ID獲取接口限书,開發(fā)者自行維護(hù)基站數(shù)據(jù)庫虫蝶,自行查詢推算位置。
WIFI定位
有WIFI覆蓋的地方
幾米到幾十米均可能倦西,取決于部署密度能真。
系統(tǒng)API提供周圍WIFI的mac地址獲取接口,開發(fā)者自行維護(hù)mac數(shù)據(jù)庫调限,自行查詢推算位置舟陆。
IP定位
所有能上網(wǎng)的手機(jī)
如果連寬帶上網(wǎng)误澳,且寬帶IP穩(wěn)定耻矮,則幾十米到幾百米,否則只能到城市級忆谓,在漫游時IP定位可能會發(fā)生嚴(yán)重的錯誤裆装。
開發(fā)者需要部署一個服務(wù)端,在服務(wù)端得到手機(jī)設(shè)備聯(lián)網(wǎng)的公網(wǎng)ip倡缠,并且自行維護(hù)一個ip數(shù)據(jù)庫哨免,查詢推算位置。
藍(lán)牙定位
有iBeacon部署的區(qū)域
5-10M左右昙沦,取決于部署密度
系統(tǒng)API提供周圍藍(lán)牙信標(biāo)的設(shè)備ID獲取接口琢唾,開發(fā)者自行維護(hù)ibeacon數(shù)據(jù)庫,自行查詢推算位置盾饮。
磁場定位
任意區(qū)域采桃。
室內(nèi)磁場分布多樣的區(qū)域可達(dá)到3M,否則就會變差丘损。
系統(tǒng)API提供磁場強(qiáng)度獲取接口普办,開發(fā)者自行維護(hù)磁場數(shù)據(jù)庫,自行查詢推算位置徘钥。注意磁場強(qiáng)度的絕對定位能力弱衔蹲,須配合WIFI和Ibeacon等絕對定位方式
對于這些定位方法的詳細(xì)原理以及適用范圍,我們會在以后的介紹中呈础,細(xì)致展開舆驶。
3
開發(fā)者如何實現(xiàn)定位能力
了解了這些定位方式的“開發(fā)者實現(xiàn)方式”橱健,開發(fā)者恐怕要渾身冒汗了,千千萬萬的app難道者都如上述說的沙廉,“自行維護(hù)基站畴博、WIFI數(shù)據(jù)庫”嗎?
答案當(dāng)然是否定的蓝仲,在實際的工程實踐中俱病,主流的做法是兩種:
手段之一:調(diào)用系統(tǒng)級定位能力
無論哪個系統(tǒng)(IOS、安卓袱结、WP)都提供了一套系統(tǒng)級定位能力亮隙,這樣的定位能力,對應(yīng)著是一套系統(tǒng)級API垢夹,這個API一般來說溢吻,總是會有如下幾個精度的選項:
高精度:能搜到GPS衛(wèi)星,則使用GPS定位果元,否則促王,則使用WIFI定位,如果WIFI和GPS都無法定位成功而晒,只能根據(jù)基站來給出定位結(jié)果了蝇狼。
平衡功耗:禁用GPS(因為它非常耗電),優(yōu)先使用WIFI倡怎,如果WIFI不可用迅耘,則用基站來進(jìn)行定位。
低功耗(被動定位):根據(jù)不同系統(tǒng)的規(guī)定监署,實現(xiàn)方式也不同颤专,但大體上都是共享其他app的定位結(jié)果,即其他app以高精度钠乏、平衡功耗的方式得到位置栖秕,那么這個位置也一并推送給當(dāng)前使用“低功耗定位”的app,也就是該app不消耗額外的能耗晓避,就完成了定位簇捍。
當(dāng)然,這種系統(tǒng)級定位能力是有著軟肋的够滑,軟肋在于以下兩點
在基站垦写、WIFI定位能力上,系統(tǒng)定位能力取決于系統(tǒng)自己在這方面投入數(shù)據(jù)收集推算的能力彰触,這個是參差不齊的梯投。舉個簡單的例子,百度和高德在中國采集了成百上千個公共場所的室內(nèi)定位信息,使之能達(dá)到米級的室內(nèi)定位分蓖,蘋果做了嗎尔艇?谷歌做了嗎?微軟做了嗎么鹤?他們怎么和國內(nèi)的服務(wù)商拼效果终娃?居然還有人說蘋果定位和谷歌地圖在國內(nèi)定位準(zhǔn),我真是醉了蒸甜。
在中國棠耕,google的服務(wù)不可用,考慮到基站柠新、WIFI定位必須連接服務(wù)端發(fā)請求窍荧,因而Android的系統(tǒng)級定位能力的可用性也會有很大的影響,至少那些“水貨”手機(jī)恨憎,在中國基本就沒法調(diào)用系統(tǒng)定位服務(wù)了蕊退,而行貨手機(jī),相應(yīng)的廠商會改造這個API接口的實現(xiàn)憔恳,使得其重定向為請求國內(nèi)某些定位服務(wù)商瓤荔,從而使得這個接口重新變得可用(對開發(fā)者來說,他并不需要知道這個API是如何實現(xiàn)的)钥组。
但是输硝,我們不得不承認(rèn),在IOS和WP系統(tǒng)上者铜,因為OS沒有開放出讀取基站和WIFI的接口腔丧,因此實際上操作系統(tǒng)的定位能力已經(jīng)形成了壟斷,開發(fā)者也就無法實現(xiàn)自主的定位能力作烟。這也會導(dǎo)致在蘋果和WP手機(jī)上,所有的app在同一時刻的定位誤差砾医,都是一樣的拿撩。
手段之二:調(diào)用第三方定位SDK
對于可以公開讀取基站、WIFI信息的Android手機(jī)系統(tǒng)如蚜,國內(nèi)的百度压恒、高德等地圖廠商自行實現(xiàn)了定位SDK,該定位SDK的作用就是通過系統(tǒng)接口讀取到原始定位信息错邦,然后借助于各家自行部署維護(hù)的數(shù)據(jù)庫探赫,查詢到當(dāng)前掃描到的基站、WIFI的位置撬呢,最終計算出更準(zhǔn)確的定位結(jié)果伦吠,通過SDK的接口,返回給開發(fā)者。這么做的好處毛仪,在于能夠讓app的定位能力脫離對手機(jī)系統(tǒng)的依賴搁嗓。
舉個例子,一個app他如果只是調(diào)用系統(tǒng)定位接口箱靴,那么在行貨手機(jī)腺逛,由于手機(jī)廠商已經(jīng)把定位的網(wǎng)絡(luò)服務(wù)器重定向為國內(nèi)定位服務(wù)商,所以肯定可以定位衡怀,但是在水貨手機(jī)上因為系統(tǒng)底層是直接連google服務(wù)器的棍矛,就會無法定位。但用戶就是上帝抛杨,出現(xiàn)了這個事情在用戶看來茄靠,就是不能接受的,為了保證app在所有手機(jī)上都可以定位蝶桶,開發(fā)者就會不得不使用第三方的獨立定位SDK慨绳。
4
結(jié)束語
在本文中,我們討論了手機(jī)定位的價值真竖、各種定位方式的原理與開發(fā)者實現(xiàn)定位的工程化手段脐雪,希望大家讀完本文后,可以結(jié)合提示恢共,給出下列問題的回答战秋。
在蘋果手機(jī)上,微信的定位準(zhǔn)讨韭、微博的定位不準(zhǔn)V拧(蘋果手機(jī)上的應(yīng)用定位能力是誰提供的?)
我們公司搬家了透硝,我在新的公司定位到了老的地方U痢(先看看你是不是把路由器都帶過來了?)
在最新的Nexus6手機(jī)上濒生,谷歌地圖居然無法定位B癖谩(谷歌地圖為什么會無法定位?)
在家里居然給我定位到幾百米以外了罪治,我都搞不清是xx地圖太爛還是手機(jī)太爛了丽声,不是說好GPS精度5米嗎?(家里的話GPS可以定位成功嗎觉义?)
用陌陌雁社,在三個位置,對同一個好友計算三次距離晒骇,即可用“三角定位”鎖定好友的位置(如果對方在室內(nèi)霉撵,用的是什么定位磺浙?他的定位精確度是多少?你認(rèn)為這個精度可以做三角定位喊巍,還精確到對方的家嗎屠缭?)
在以后的介紹中,我們會進(jìn)一步對各種定位硬件的特點崭参、各種定位方式的實現(xiàn)原理進(jìn)行更細(xì)致的揭秘呵曹,敬請期待。