編者按:本文來自微信公眾號「caoz的夢囈」(ID:caozsay),作者 caozsay,36氪經授權發布。原文標題:《從手機定位談談科技》。
有些我以為是常識的東西,後來發現並不是常識。而當我想要分享給大家的時候,經過高手點撥,意外發現居然我自己所了解的也是有偏差的。有鑑於此,寫篇文章。
源起是GPS的工作原理,我一直以為是常識來著。不過今天把這個話題延申一下。
手機定位一般有三個方法。
方法1:基於你當前所接觸的WIFI熱點,如果這個WIFI熱點是公開可查詢的熱點,存在地址信息對應的。那麼你的位置可以鎖定在該位置的一定半徑內。
通過WIFI定位,你的位置只能被確認在一定半徑的範圍內,並不能精確識別你的位置,速度。
方法2:基於移動基站定位,你的手機信號是通過移動基站交互的。移動基站的地理位置是清晰明確的,當你手機可以獲得多個基站的信號,並且不同基站信號存在不同的強弱衰減,那麼可以根據這幾個基站的位置和你信號衰減的情況,大致獲得你的當前位置範圍,以及大致的移動速度,如果你處於具有一定速度的交通工具之內的話。
方法3:最精準的,是通過衛星定位,你看,雖然WIFI,基站,衛星,具體是從近到遠;但定位準確度確實越來越精確。
那麼衛星定位,其實也包括不同的選擇,以前是GPS一統天下,大家一提衛星定位就是GPS,但其實現在有很多家不同的衛星定位系統,GPS依然是全球規模最大的,此外歐洲的伽利略,中國的北鬥系統等等。
實際上很多國產智慧型手機和衛星導航的晶片已經支持北鬥系統,用戶看到的標誌可能還是GPS,但提供定位服務的,實際上可能是來自於不同的系統。
那麼手機會自動根據信號強弱選擇合適的系統進行定位導航,通常情況下,用戶無需自己選擇用哪個衛星系統。所以你就不用問我怎麼切換到北鬥系統啊,手機會在它認為合適的情況下用到的。
這就是我以為是常識,而很多人卻存在誤解的地方。
首先,衛星並不知道你在哪裡,它也不關心。其次,你的手機也不會向衛星傳遞訊號,定位導航衛星不負責跟手機終端交互信息。
從技術上來說,手機給衛星發射信號很難麼,似乎也不難,有衛星通訊電話不是麼,但這面臨兩個問題,第一,所需要的功率會比較大,偶爾通訊也就算了,手機實時定位,如果需要交互信息,電池撐不住的,;第二,衛星也沒有如此強大的應答系統,全球無數手機每秒鐘請求位置,這請求頻次不嚇死人,衛星上放一組伺服器?可能麼?
當然,你說馬斯克不是要搞全球衛星組網麼,丫牛逼,但至少目前技術成本過高,這是不現實的。
那麼還有第三,就是,定位,其實不需要這麼麻煩。
實際上,導航衛星的工作極為簡單,就是廣播,廣播自己的位置,自己的時間。每個所謂GPS晶片(習慣這麼叫,現在很多已經整合了多個衛星系統)就是接受這些信號,然後處理。
怎麼處理呢?你如果知道它信號發出的時間,知道自己接受的時間,乘以傳播速度,也就是光速,就知道自己和衛星的距離了對不對。當你的手機可以獲得多個衛星信號的時候,比如三顆及以上,由於你知道衛星當前的位置數據,就可以通過數學公式,算出自己的所在位置。
但是,且慢,這裡有個嚴峻的問題,因為光速太大,需要極高的時間精確度,衛星上有原子鐘,可以提供極為精確的時間,但你手機上沒有。這時候,就需要把時間也當作變量,所以,需要四顆以上的衛星,才能精準定位你的位置。
感謝科技的力量,現在的衛星定位極為精準,可以精確到米,從而讓駕駛導航成為可能,實際上軍方信號未解密,可以有更好的精確度。
這裡其實還隱藏了一個問題,就是,由於極高的時間精確度,那麼衛星相對於地球是高速運動的,基於相對論,我們知道不同速度下的時間是不同的,在這樣的精確度要求下,這個不一致也會很致命,所以,相對論公式被用於修正這一誤差。
所以真正的原理是這樣的,衛星廣播自己的時間(原子鐘時間,極為精確到小數點後面n多位),當前位置。手機上的定位晶片獲得多個衛星的信息,然後通過相對論公式修正時間誤差,然後基於四顆或更多衛星的信息,測算自己的位置。這就是我說的,如此普及而成本低廉的定位晶片,其實技術含量還是蠻高的。
那麼這裡還有一個冷知識,衛星還負責給你準確的時間,所以你看現在很多智慧型手機沒有調時間的選項,因為完全不需要,只要有衛星信號,時間一定是準確的。再根據你的地理位置判定你所處的時區,給予你當地的時間。
很多產品服務商需要你的位置,比如微信,比如微博,比如大眾點評,當然更不用說地圖導航。確定你的位置提供身邊的服務,或者推薦身邊的聯繫人,都是一種非常標準的網際網路應用。其實在移動網際網路之前,這樣的服務並不是主流,通常只是做到同城推薦。而當時定位主要靠IP位址,這也是以前我經常用到的技術面試題。
實際上 ,手機終端用戶可以選擇是否把自己的定位信息發送給服務商,如果沒有發送自己的地理位置,服務商也會通過你上網的IP來判斷你的大概位置。當然這個就很難精確定位到具體位置了,通常只能定位到城市範圍。
但這裡有一個問題,就是手機終端,並不是必須上報真實的信息給服務商。有大量第三方工具可以偽造你的位置信息,你完全可以告訴服務商你在南極,或者在北歐的某個小島上。
這也就帶來了很多灰色產業的問題。
比如刷單,以前有uber幽靈車,假裝在你附近。
比如約炮騙局,你身邊的美女約你開房,後來延伸到了更多推銷的領域,你身邊的美女開始賣茶,賣酒,炒股,或者拉你上菠菜網站,或者讓你帶她打遊戲等等。
很多不知情的人以為真的是身邊的,其實都是用工具隨意篡改地址,一路掃過來的。
新加坡政府曾經為此非常頭疼,很多新加坡寂寞大叔被國內的騙子們用這招約炮騙錢。現在街上還能看到政府的公益廣告提醒這個騙局。
今天特意街拍了一張這樣的公益廣告,背景是新加坡的組屋住宅區。
你說服務商有沒有辦法確認他的位置的真實性,沒太多辦法,潛在的思路是通過歷史軌跡來判斷,你總不能一個小時前在湖南,一個小時後就出現在了新加坡對吧。當然還有可以用IP位址+地理信息聯合判斷,但IP位址也未必可信,因為可以用代理伺服器上網的麼。
現在還有一種遠程移動上網終端,更厲害了,你的sim 卡和終端放在新加坡,人在大陸,通過網絡可以遠程操縱這個終端上網做任何操作,那就更加完全查不出任何異樣,目前是黑產行業最愛。
我在知識星球分享這個話題的時候,有人提出了這個問題,很多地圖軟體會展示擁堵情況,並給出路程時間測算,這是怎麼實現的呢?
其實不複雜,這是基於用戶不斷地上報數據匯總得到的。
比如這條路段上當前有10個車輛使用了百度地圖,那麼百度地圖就知道這10部車的平均車速,就能知道這個路段目前的擁堵情況大概是怎樣的。
甚至還能分出一些車道情況,比如根據車輛後續上報的行駛軌跡,可以大致區分主路和輔路的車速。(比如輔路可以拐彎,有等紅燈的行為記錄,而主路一路沿主幹道直行)。
如果有充分的歷史數據,還可以做出一些預判,比如現在5點半,你要出發,按照現在路況,可能只需要40分鐘到達目的地,但根據歷史數據可以知道,某些地段馬上要進入晚高峰,所以你實際上可能需要60分鐘才能到達目的地。坦白說,我覺得預判這塊很多地圖廠商應該是沒做到位的。
前幾天有個小新聞證實了這個實現邏輯,有個無聊的人把幾十部安卓手機打開谷歌地圖,放上小推車,然後推著小推車在一條空曠的道路上慢慢行走,然後很快你就看到谷歌地圖顯示這條道路擁堵。
真不想教人學壞,如果國內地圖廠商用這招惡意競爭,噁心對手,我們以後出行就很難有可信的數據了。
地理位置信息成為標配信息後,就產生了基於地理位置的搜索訴求。
比如,離我最近的餐廳有哪些。離我最近的活躍用戶有誰。一些虛擬增強現實的遊戲也會強調這一點。
寫出這樣的代碼或許不難,但高並發情況下呢?
那麼傳統的資料庫索引,就很難滿足這種高並發查詢的訴求。
我特別提醒初入行的程式設計師一句,類似的問題,應該自己經常問自己,怎樣實現可以滿足高並發的查詢請求。想想自己有沒有辦法,然後搜索一下別人怎麼做的。很多程式設計師天天迷茫,不知道怎麼進步,其實很多類似的問題要自己提出來,自己去找答案,不能總是等到去面試了才知道自己不會。當然面試了發現不會,也要花點時間去思考解決掉,不能每次面試都不會。
移動網際網路剛開始興起的時候,這個問題其實還是比較有困擾性的,後來一些資料庫產品提供了地理空間索引,你至少應該知道這樣的方案是什麼,以及如何使用?對自己要求高一些,看看這種產品具體實現的原始碼和底層的邏輯,搜索開銷是怎麼計算的,搜索開銷和數據規模的對應關係是怎樣的,徹底理解通透。
這個問題我就不展開了,技術人員可以作為思考題,多想想。
衛星定位服務目前已經可以做到成本極低,那麼應用場景也就極為廣泛,防盜,追蹤,電子圍欄等等等等。
感謝科技的發展。
幾十年前,航海中的船隻要想知道自己的位置,還是需要憑藉船長的經驗和完整的記錄信息。
十幾年前,我和老婆自駕遊的時候,還要看著紙地圖找路,各種糾結各種開錯路各種停車問人。
今天,我們隨時可以知道自己在哪裡,周圍有什麼,一個人去陌生的國度自由行,只要手機有電有信號,就不用過度擔心迷路,這似乎是理所當然的事情,但真的就是很短的時間,我們才能實現位置認知的自由。