本文来自微信公众号:caoz的梦呓(ID:caozsay),作者: caozsay
有些我以为是常识的东西,后来发现并不是常识。而当我想要分享给大家的时候,经过高手点拨,意外发现居然我自己所了解的也是有偏差的。有鉴于此,写篇文章。
源起是GPS的工作原理,我一直以为是常识来着。不过今天把这个话题延申一下。
一、手机是怎么定位的?
手机定位一般有三个方法。
方法1:基于你当前所接触的Wi-Fi热点,如果这个Wi-Fi热点是公开可查询的热点,存在地址信息对应的。那么你的位置可以锁定在该位置的一定半径内。
通过Wi-Fi定位,你的位置只能被确认在一定半径的范围内,并不能精确识别你的位置,速度。
方法2:基于移动基站定位,你的手机信号是通过移动基站交互的。移动基站的地理位置是清晰明确的,当你手机可以获得多个基站的信号,并且不同基站信号存在不同的强弱衰减,那么可以根据这几个基站的位置和你信号衰减的情况,大致获得你的当前位置范围,以及大致的移动速度,如果你处于具有一定速度的交通工具之内的话。
方法3:最精准的,是通过卫星定位,你看,虽然Wi-Fi,基站,卫星,具体是从近到远;但定位准确度确实越来越精确。
那么卫星定位,其实也包括不同的选择,以前是GPS一统天下,大家一提卫星定位就是GPS,但其实现在有很多家不同的卫星定位系统,GPS依然是全球规模最大的,此外有欧洲的伽利略,中国的北斗系统等等。
实际上很多国产智能手机和卫星导航的芯片已经支持北斗系统,用户看到的标志可能还是GPS,但提供定位服务的,实际上可能是来自于不同的系统。
那么手机会自动根据信号强弱选择合适的系统进行定位导航,通常情况下,用户无需自己选择用哪个卫星系统。所以你就不用问我怎么切换到北斗系统啊,手机会在它认为合适的情况下用到的。
二、卫星定位的原理
这就是我以为是常识,而很多人却存在误解的地方。
首先,卫星并不知道你在哪里,它也不关心。其次,你的手机也不会向卫星传递讯号,定位导航卫星不负责跟手机终端交互信息。
从技术上来说,手机给卫星发射信号很难么,似乎也不难,有卫星通讯电话不是么,但这面临两个问题,第一,所需要的功率会比较大,偶尔通讯也就算了,手机实时定位,如果需要交互信息,电池撑不住的,;第二,卫星也没有如此强大的应答系统,全球无数手机每秒钟请求位置,这请求频次不吓死人,卫星上放一组服务器?可能么?
当然,你说马斯克不是要搞全球卫星组网么,丫牛逼,但至少目前技术成本过高,这是不现实的。
那么还有第三,就是,定位,其实不需要这么麻烦。
实际上,导航卫星的工作极为简单,就是广播,广播自己的位置,自己的时间。每个所谓GPS芯片(习惯这么叫,现在很多已经整合了多个卫星系统)就是接受这些信号,然后处理。
怎么处理呢?你如果知道它信号发出的时间,知道自己接受的时间,乘以传播速度,也就是光速,就知道自己和卫星的距离了对不对。当你的手机可以获得多个卫星信号的时候,比如三颗及以上,由于你知道卫星当前的位置数据,就可以通过数学公式,算出自己的所在位置。
但是,且慢,这里有个严峻的问题,因为光速太大,需要极高的时间精确度,卫星上有原子钟,可以提供极为精确的时间,但你手机上没有。这时候,就需要把时间也当作变量,所以,需要四颗以上的卫星,才能精准定位你的位置。
感谢科技的力量,现在的卫星定位极为精准,可以精确到米,从而让驾驶导航成为可能,实际上军方信号未解密,可以有更好的精确度。
这里其实还隐藏了一个问题,就是,由于极高的时间精确度,那么卫星相对于地球是高速运动的,基于相对论,我们知道不同速度下的时间是不同的,在这样的精确度要求下,这个不一致也会很致命,所以,相对论公式被用于修正这一误差。
所以真正的原理是这样的,卫星广播自己的时间(原子钟时间,极为精确到小数点后面n多位),当前位置。手机上的定位芯片获得多个卫星的信息,然后通过相对论公式修正时间误差,然后基于四颗或更多卫星的信息,测算自己的位置。这就是我说的,如此普及而成本低廉的定位芯片,其实技术含量还是蛮高的。
那么这里还有一个冷知识,卫星还负责给你准确的时间,所以你看现在很多智能手机没有调时间的选项,因为完全不需要,只要有卫星信号,时间一定是准确的。再根据你的地理位置判定你所处的时区,给予你当地的时间。
三、服务商如何确定你的位置
很多产品服务商需要你的位置,比如微信,比如微博,比如大众点评,当然更不用说地图导航。确定你的位置提供身边的服务,或者推荐身边的联系人,都是一种非常标准的互联网应用。其实在移动互联网之前,这样的服务并不是主流,通常只是做到同城推荐。而当时定位主要靠IP地址,这也是以前我经常用到的技术面试题。
实际上 ,手机终端用户可以选择是否把自己的定位信息发送给服务商,如果没有发送自己的地理位置,服务商也会通过你上网的IP来判断你的大概位置。当然这个就很难精确定位到具体位置了,通常只能定位到城市范围。
但这里有一个问题,就是手机终端,并不是必须上报真实的信息给服务商。有大量第三方工具可以伪造你的位置信息,你完全可以告诉服务商你在南极,或者在北欧的某个小岛上。
这也就带来了很多灰色产业的问题。
比如刷单,以前有uber幽灵车,假装在你附近。
比如约炮骗局,你身边的美女约你开房,后来延伸到了更多推销的领域,你身边的美女开始卖茶,卖酒,炒股,或者拉你上菠菜网站,或者让你带她打游戏等等。
很多不知情的人以为真的是身边的,其实都是用工具随意篡改地址,一路扫过来的。
新加坡政府曾经为此非常头疼,很多新加坡寂寞大叔被国内的骗子们用这招约炮骗钱。现在街上还能看到政府的公益广告提醒这个骗局。
今天特意街拍了一张这样的公益广告,背景是新加坡的组屋住宅区。
你说服务商有没有办法确认他的位置的真实性,没太多办法,潜在的思路是通过历史轨迹来判断,你总不能一个小时前在湖南,一个小时后就出现在了新加坡对吧。当然还有可以用IP地址+地理信息联合判断,但IP地址也未必可信,因为可以用代理服务器上网的么。
现在还有一种远程移动上网终端,更厉害了,你的SIM卡和终端放在新加坡,人在大陆,通过网络可以远程操纵这个终端上网做任何操作,那就更加完全查不出任何异样,目前是黑产行业最爱。
四、实时路况是如何实现的
我在知识星球分享这个话题的时候,有人提出了这个问题,很多地图软件会展示拥堵情况,并给出路程时间测算,这是怎么实现的呢?
其实不复杂,这是基于用户不断地上报数据汇总得到的。
比如这条路段上当前有10个车辆使用了百度地图,那么百度地图就知道这10部车的平均车速,就能知道这个路段目前的拥堵情况大概是怎样的。
甚至还能分出一些车道情况,比如根据车辆后续上报的行驶轨迹,可以大致区分主路和辅路的车速。(比如辅路可以拐弯,有等红灯的行为记录,而主路一路沿主干道直行)。
如果有充分的历史数据,还可以做出一些预判,比如现在5点半,你要出发,按照现在路况,可能只需要40分钟到达目的地,但根据历史数据可以知道,某些地段马上要进入晚高峰,所以你实际上可能需要60分钟才能到达目的地。坦白说,我觉得预判这块很多地图厂商应该是没做到位的。
前几天有个小新闻证实了这个实现逻辑,有个无聊的人把几十部安卓手机打开谷歌地图,放上小推车,然后推着小推车在一条空旷的道路上慢慢行走,然后很快你就看到谷歌地图显示这条道路拥堵。
真不想教人学坏,如果国内地图厂商用这招恶意竞争,恶心对手,我们以后出行就很难有可信的数据了。
五、地理索引的话题
地理位置信息成为标配信息后,就产生了基于地理位置的搜索诉求。
比如,离我最近的餐厅有哪些。离我最近的活跃用户有谁。一些虚拟增强现实的游戏也会强调这一点。
写出这样的代码或许不难,但高并发情况下呢?
那么传统的数据库索引,就很难满足这种高并发查询的诉求。
我特别提醒初入行的程序员一句,类似的问题,应该自己经常问自己,怎样实现可以满足高并发的查询请求。想想自己有没有办法,然后搜索一下别人怎么做的。很多程序员天天迷茫,不知道怎么进步,其实很多类似的问题要自己提出来,自己去找答案,不能总是等到去面试了才知道自己不会。当然面试了发现不会,也要花点时间去思考解决掉,不能每次面试都不会。
移动互联网刚开始兴起的时候,这个问题其实还是比较有困扰性的,后来一些数据库产品提供了地理空间索引,你至少应该知道这样的方案是什么,以及如何使用?对自己要求高一些,看看这种产品具体实现的源代码和底层的逻辑,搜索开销是怎么计算的,搜索开销和数据规模的对应关系是怎样的,彻底理解通透。
这个问题我就不展开了,技术人员可以作为思考题,多想想。
六,其他七七八八
卫星定位服务目前已经可以做到成本极低,那么应用场景也就极为广泛,防盗,追踪,电子围栏等等等等。
感谢科技的发展。
几十年前,航海中的船只要想知道自己的位置,还是需要凭借船长的经验和完整的记录信息。
十几年前,我和老婆自驾游的时候,还要看着纸地图找路,各种纠结各种开错路各种停车问人。
今天,我们随时可以知道自己在哪里,周围有什么,一个人去陌生的国度自由行,只要手机有电有信号,就不用过度担心迷路,这似乎是理所当然的事情,但真的就是很短的时间,我们才能实现位置认知的自由。
本文来自微信公众号:caoz的梦呓(ID:caozsay),作者: caozsay