最近助手君在後臺收到不少朋友們的留言,說想通過手機定位自己的親人或朋友,亦或要找回丟失的手機,通過跟大家的交流,發現很多朋友對手機定位的原理知之甚少,有很多誤解,今天助手君就來跟大家科譜一下手機定位的原理知識。大家感興趣的一定要看完哦!相信看完後對手機定位會有更正確的認識,你將了解到定位的精度不僅與手機設備有關,還會受到各種環境的影響,比如室內室外是有區別的。你也將了解到可用於定位的無線信號有哪些。
目前智慧型手機的使用已經越來越普遍,手機定位也是手機上的一個核心基礎功能。作為app的用戶,你可能會好奇這個app是如何知道你的位置;而作為app的開發者,是如何在程序中得到設備當前的準確位置的呢?
這個問題回答起來,太複雜,我們還是先從定位原理上來解釋吧!
開發者如何實現定位能力
了解了這些定位方式的「開發者實現方式」,開發者恐怕要渾身冒汗了,千千萬萬的app難道者都如上述說的,「自行維護基站、WIFI資料庫」嗎?
答案當然是否定的,在實際的工程實踐中,主流的做法是兩種:
可用於定位的無線信號
很顯然,一個功能正常的手機,總是能夠受到各種無線信號,這些無線信號的「局部唯一性」,是該設備能定位的關鍵前提。什麼叫局部唯一性?我們再把這些具體的信號來展開解釋下你就知道了:
手段之一:調用系統級定位能力
無論哪個系統(IOS、安卓、WP)都提供了一套系統級定位能力,這樣的定位能力,對應著是一套系統級API,這個API一般來說,總是會有如下幾個精度的選項:
l 高精度:能搜到GPS衛星,則使用GPS定位,否則,則使用WIFI定位,如果WIFI和GPS都無法定位成功,只能根據基站來給出定位結果了。
l 平衡功耗:禁用GPS(因為它非常耗電),優先使用WIFI,如果WIFI不可用,則用基站來進行定位。
l 低功耗(被動定位):根據不同系統的規定,實現方式也不同,但大體上都是共享其他app的定位結果,即其他app以高精度、平衡功耗的方式得到位置,那麼這個位置也一併推送給當前使用「低功耗定位」的app,也就是該app不消耗額外的能耗,就完成了定位。
當然,這種系統級定位能力是有著軟肋的,軟肋在於以下兩點
l 在基站、WIFI定位能力上,系統定位能力取決於系統自己在這方面投入數據收集推算的能力,這個是參差不齊的。舉個簡單的例子,百度和高德在中國採集了成百上千個公共場所的室內定位信息,使之能達到米級的室內定位,蘋果做了嗎?谷歌做了嗎?微軟做了嗎?他們怎麼和國內的服務商拼效果?居然還有人說蘋果定位和谷歌地圖在國內定位準,我真是醉了。
l 在中國,google的服務不可用,考慮到基站、WIFI定位必須連接服務端發請求,因而Android的系統級定位能力的可用性也會有很大的影響,至少那些「水貨」手機,在中國基本就沒法調用系統定位服務了,而行貨手機,相應的廠商會改造這個API接口的實現,使得其重定向為請求國內某些定位服務商,從而使得這個接口重新變得可用(對開發者來說,他並不需要知道這個API是如何實現的)。
但是,我們不得不承認,在IOS和WP系統上,因為OS沒有開放出讀取基站和WIFI的接口,因此實際上作業系統的定位能力已經形成了壟斷,開發者也就無法實現自主的定位能力。這也會導致在蘋果和WP手機上,所有的app在同一時刻的定位誤差,都是一樣的。
手段之二:調用第三方定位SDK
對於可以公開讀取基站、WIFI信息的Android手機系統,國內的百度、高德等地圖廠商自行實現了定位SDK,該定位SDK的作用就是通過系統接口讀取到原始定位信息,然後藉助於各家自行部署維護的資料庫,查詢到當前掃描到的基站、WIFI的位置,最終計算出更準確的定位結果,通過SDK的接口,返回給開發者。這麼做的好處,在於能夠讓app的定位能力脫離對手機系統的依賴。
舉個例子,一個app他如果只是調用系統定位接口,那麼在行貨手機,由於手機廠商已經把定位的網絡伺服器重定向為國內定位服務商,所以肯定可以定位,但是在水貨手機上因為系統底層是直接連google伺服器的,就會無法定位。但用戶就是上帝,出現了這個事情在用戶看來,就是不能接受的,為了保證app在所有手機上都可以定位,開發者就會不得不使用第三方的獨立定位SDK。
基站信號:
一個手機能夠接打電話、收發簡訊,說明該手機能與附近基站發起交互,收發信號。特別地,對於智慧型手機,還可以通過系統的接口得到基站ID。正常情況下,每個基站ID是全球唯一的,這樣如果掃到了某個基站ID,我們又知道該基站的位置,便能粗略估計設備的位置。
下圖是很容易理解的,一個手機能掃描到三個基站的信號,因此其必然在三個基站的共同覆蓋範圍內。但現實是很骨感的,在現在的智慧型手機上,只有極少數的手機可以獲取到多個周圍的基站ID,而且也無法反算出和這些基站的距離,所以這個算法是沒有實戰價值的。那麼在實戰中的做法是什麼呢?這個我們以後再介紹。
WIFI信號:
現在的智慧型手機都支持wifi上網了,而我們連接的每個wifi路由器(包括手機做移動熱點的那種),都有全球唯一的MAC地址。更重要的是,wifi路由器的部署成本低,因而非常普遍,在一個樓層裡就會有很多個wifi熱點。因而不難想到,一旦我們有了這個全球每個路由器的實際位置,那麼我們就可以確定用戶當前的位置。
說到這裡,有的朋友會問,如果一個人帶著手機,開著移動熱點到處行走,那麼這種移動熱點的mac地址,豈不是就會引起定位的錯誤?答對了,確實是這樣,而且根據統計,這種情形還在愈演愈烈,因此,如何想辦法來迅速過濾這種移動熱點,是個值得研究的問題。
GPS信號:
如果手機在室外或者窗邊,那麼就可以接收到天上的定位衛星發射出來的信號,基於這種信號,可以推算手機到每顆衛星的距離、衛星位置,進而推算出手機的位置來。需要注意的是,這個解算是在GPS晶片中完成的,在手機作業系統層面上,可以直接通過API接口得到解算的結果和誤差半徑。
對於GPS,要注意兩點。第一就是GPS的初始定位是很耗時間的,對於老一些的晶片,可能要耗費幾分鐘才能冷啟動定位成功;第二是GPS精度並非是完全可依賴的,在一些地方達到幾百米甚至上千米都很正常,這個我們也會在後面的介紹中,細緻展開介紹。
以上三種是最常用的定位方式,此外還有藍牙/IP /地磁場等手段,對於他們的優缺點,我們匯總如下:
定位方法
場景
精度
開發者實現方式
GPS
室外或窗邊,初次定位需要若干秒鎖定等待時間
一般情況下10M內,高樓邊和高架下面100M內
晶片實現,系統API提供,開發者直接調用。
基站定位
可以打電話的地方
幾百米
系統API提供基站ID獲取接口,開發者自行維護基站資料庫,自行查詢推算位置。
WIFI定位
有WIFI覆蓋的地方
幾米到幾十米均可能,取決於部署密度。
系統API提供周圍WIFI的mac地址獲取接口,開發者自行維護mac資料庫,自行查詢推算位置。
IP定位
所有能上網的手機
如果連寬帶上網,且寬帶IP穩定,則幾十米到幾百米,否則只能到城市級,在漫遊時IP會發生錯誤。
開發者需要部署一個服務端,在服務端得到手機設備聯網的公網ip,並且自行維護一個ip資料庫,查詢推算位置。
藍牙定位
有iBeacon部署的區域
5-10M左右,取決於部署密度
系統API提供周圍藍牙信標的設備ID獲取接口,開發者自行維護ibeacon資料庫,自行查詢推算位置。
磁場定位
任意區域。
室內磁場分布多樣的區域可達到3M,否則就會變差。
系統API提供磁場強度獲取接口,開發者自行維護磁場資料庫,自行查詢推算位置。注意磁場強度的絕對定位能力弱,須配合WIFI和Ibeacon等絕對定位方式
對於這些定位方法的詳細原理,我們會在以後的介紹中,細緻介紹。
結束語
在本文中,我們討論了手機定位的價值、各種定位方式的原理與開發者實現定位的工程化手段,希望大家讀完本文後,可以結合提示,給出下列問題的回答。
在蘋果手機上,微信的定位準、微博的定位不準!(蘋果手機的定位能力是誰提供的?)
我們公司搬家了,我在新的公司定位到了老的地方!(先看看你是不是把路由器都帶過來了?)
在最新的Nexus6手機上,谷歌地圖居然無法定位!(谷歌地圖為什麼會無法定位?)
在家裡居然給我定位到幾百米以外了,這個手機太爛了,不是說好GPS精度5米嗎?(家裡的話GPS可以定位成功嗎?)
用陌陌,在三個位置,對同一個好友計算三次距離,即可用「三角定位」鎖定好友的位置(如果對方在室內,用的是什麼定位?他的定位精確度是多少?你認為這個精度可以做三角定位,還精確到對方的家嗎?)
在以後的介紹中,我們會進一步對各種定位硬體的特點、各種定位方式的實現原理進行更細緻的揭秘,敬請期待。
一個幫你省錢淘好物,免踩坑,還能獲取實用玩機小技巧的公號