前言
目前智能手机的使用已经很普遍了,手机定位是手机上的一个核心基础功能。生活中基于定位的应用场景也有很多,比如最常见的打车,司机需要知道你在哪里,同时打车软件也需要基于司机和乘客的位置规划一条路线,让司机更高效、精准的行驶到用户指定地点。这就是典型定位服务应用。当然,除了这种应用,还有很多定位的应用场景,用户位置本身的展示,也是地图产品中不可缺少的。
那么问题就来了
- 作为
APP
的用户,你可能会好奇这个APP
是如何知道你的位置,而作为APP
应用开发者,是如何在程序中得到设备当前的准确位置? - 随着混合式
APP
开发覆盖率逐渐上升,在混合式APP
应用中的定位模式与原生APP
有何区别? H5
开发中也会用到一些地图厂商SDK
去获取定位,那H5
中的定位和普通APP
定位又有什么区别,相比之下会不会存在一些偏差呢?
定位其实是一个很复杂的问题,涉及到了很多知识点,但我们想要得出上述问题的答案,就一定要知晓定位的原理,这就是本文将要讨论的核心内容。
不同的定位方式
一个功能正常的客户端设备,是能够收到各种无线信号的,利用这些无线信号的局部唯一性,是定位该设备的关键前提。那么根据这些信号的不同,我们介绍下定位中最常使用的几种信号源。
基站信号定位
我国的基站包括移动、联通和电信等三大运营商基站。
基站定位是通过移动通信(SIM
卡)的基站信号差异,每次刷新基站时都会向就近最优基站鉴权。因此,通过用户出现的基站位置可以确认手机位置范围。另外,处于同一基站范围内但处于范围中的不同扇区,也会被标记。基站定位的准确度取决于定位地点附近所处的基站覆盖密度,如果基站多,定位则准确,如果是山区,基站少,则定位就不那么精确。
通俗来讲,一个手机能够接打电话、收发短信,说明该手机能与附近基站发起交互,收发信号。对于智能手机,我们可以通过本机系统的接口得到基站 ID
。正常情况下,基站 ID
是全球唯一的,这样如果扫到了某个基站 ID
,运营商又知道该基站的位置,便能粗略估算设备的位置。
当然如果手机扫到了多个基站 ID
,比如一个手机扫描到三个基站信号,就确定了三个基站扇区,因此其必然在三个基站扇区的共同覆盖范围内,所以我们手机扫到的基站越多,那我们计算出的位置就会相对更准确些。但是不论是怎样,以这种方式我们计算得出的是一个范围,只是范围大小的差别罢了,很容易理解,这种方式的精度是不高的,通常这个范围在几百米,个别情况(基站少)甚至几公里都是可能的。当然这种方式也不是没有优点,基站定位的优点是对于环境(天气、高楼、位置)要求低,有基站信号的地方就可以定位,反之你要是在沙漠,没有基站,接受不到基站信号,直接就凉了。
Wi-Fi 信号定位
Wi-Fi
是我们日常生活中人人都会使用的东西,通过 Wi-Fi
信号来定位其实和基站定位是类似的,查了下资料,最早开发这个技术的是 Skyhook
公司,所以我们后面会拿它举例子来像大家解释如何通过 Wi-Fi
定位。
连接 Wi-Fi
需要无线路由器,我们可以通过实体线去接入路由器网络,也可以无线接入,而无线接入模式,我们叫它 AP
,现阶段的城市中路由器遍布,也就是说 AP
信号是遍布的。其实能够在任意一个空间都能接收到 AP
信号也是每个城市的愿景。
路由器会持续发射 AP
信号,无论这个信号加不加密、有没有网络,只要路由器通上了电,就会发射,而这些 AP
信号中都包含路由器硬件的唯一标识,即我们常说的 MAC
地址。
信号这个东西,不是说只有我们的客户端(手机)连上路由才是接收到了,即使我们刻意没有连接到路由网络,或者是距离很远无法连接到,但其实还是可以侦听到这些 AP
信号的。
说回定位,我们的设备应用其实只要侦听下附近的 AP
信号(热点或者说 Wi-Fi
网络),再检测下每个信号源的强弱,然后把这些信息发给 Skyhook
服务器,Skyhook
服务器接收到数据之后,根据这些数据查询下每个信号源在数据库中的坐标进行运算,就可以知道客户端的具体位置了,然后把位置返回给客户端机器,也就是我们的设备应用,当然,这个过程中,同样是接收到的 AP 信号源越多,定位就越准确,因为每个信号源都有一个范围,通过范围和范围的交集加上各个信号源强度就可以更精确定位了。
原理就是这么简单,不过这种方式需要 2 个先决条件:
- 客户端可以上网,能够访问
Skyhook
服务器。 Skyhook
数据库中要存储所有AP
信号源对应坐标。
第一个我们好理解,所以我们直接说第二个,Skyhook
这种服务商,如何知道的 AP
地址,或者说他们怎么知道路由器的地址。其实很简单,厂商可以通过雇人等等通过开车瞎转悠的方式采集 AP
信号,再用 GPS
定位的方式采集对应信号源、对应强度的坐标。AP
信号中有路由器硬件唯一的 MAC
标识,采集到定位数据后,把位置信息和 MAC
对应起来存入数据库就可以了,其实和地图厂商要定期采集道路信息一样,这个也需要定期采集。还有一种方式是开放给用户采集,Skyhook
厂商付费买数据,不过还是前者成本更低更靠谱些。
至于 Skyhook
,你可以把它类比国家旗下的地理位置服务商,当然也可以是高德、百度等三方地理位置服务商。
Wi-Fi
定位的精度通常是比较高的,几米到几十米不等,但是还是存在一个问题,一般路由设备是不会经常移动的,但也有移动的路由,比如我开了一个手机热点,不断的走动,不难想到,这种通过移动路由设备 MAC
标识计算出的位置,也是会存在误差的,所以在路由设备移动的过程中,这种方式并不理想。通常比较理想的环境是城市内,移动不频繁的情况。换句话说,想办法去过滤掉这种移动 AP
信号源,也是个值得研究的问题。
这里我们只是简单介绍其原理,细节上其实很复杂,所以无需较真,理解就可以了。除此之外,Wi-Fi
信号其实还有一个用途,那就是做室内定位,这块不在本文讨论范围之内,有兴趣可以查下室内定位技术相关的资料。
GPS 信号定位
说到 GPS
,它的全称叫做全球定位系统(Global Positioning System
),其实严格意义上应该叫 GNSS
(GlobalNavigation Satellite System
),而 GPS
只是 GNSS
的一种。
GPS
是世界上第一个全球卫星导航系统,早在 20 世纪 70 年代,由美国研制,经过差不多 20 年的研发时间,耗资 200 亿美元,最终在 1994 年全面建成。目前,全球一共有四个国家拥有自己的导航系统,除了美国的 GPS
之外,还有欧洲航天局的伽利略卫星定位系统、俄罗斯的格洛纳斯以及我国的北斗卫星导航系统。
卫星导航系统其实一定程度上说明了一个国家的实力,如果没有自己的全球导航系统,就只能使用别人的,那其实对应国家是可以很容易控制并干扰卫星导航系统的,而卫星导航定位系统对标到人体组织,就是眼睛这个器官,可想而知多么重要。
「说段题外话:2000 年北斗发射了第一颗北斗导航卫星,北斗最后一颗全球组网卫星是 2020 年 6 月 30 号发射的,一般人不清楚这其中的重大含义,只知道这天我国又发送了一颗卫星,但是只要对这方面稍微有些认知,就知道这一天的意义是多么重大、是多么的激动人心,因为凭借北斗卫星导航组网,其他国家将不会再有机会、有能力直接切断我国卫星信号,我国也可以不受技术限制的对全球任意一个位置进行精准打击,不过现在是和平年代,主要还是在民用阶段不会再有掣肘。」
由于美国 GPS
定位系统太早了,所以到目前为止它代表 2 个意思,一是特指美国的全球卫星导航定位系统,二是全球导航定位系统的统一简称(原本应该叫 GNSS
),打个比方,我国目前拥有并使用北斗卫星导航系统,但是很多人还会在习惯上称北斗卫星定位这个功能为 GPS
,其实不准确哈。
回到正题,先简单介绍下 GPS
定位原理(只需知道、了解,无需苛责具体实现),GPS
的定位原理并不难,其实就是三角定位法。简单来说,就是通过在不同的位置测量卫星和接收器之间的距离,从而确定接收器的位置。通常来说,一个接收器(客户端,比如手机)需要随时至少能够和 4 颗 GPS
卫星直接联系,才能精确判断自己所处的位置,如果只有 3 颗卫星,那么就无法判断海拔高度,如果只有 2 颗,那就无法计算精确位置。那由于工作原理的限制,全球卫星导航系统的卫星数量也有一个下限,以美国的 GPS
为例,至少要有 24 颗卫星在地球轨道上正常运行,才能保证地球上绝大部分地区能够随时 “看到” 4 颗 GPS
卫星,从而实现精准定位。当然,根据要求、目的的不同,全球卫星导航系统也可能不止 24 颗卫星,比如备用卫星或者其他轨道的卫星等等。
所以,通俗来讲,「在室外无遮挡的条件下」,我们是可以很好的接收到天上定位卫星发射出来的信号的,基于这种信号,可以解算接收器(客户端,比如手机)到每颗卫星的距离、卫星位置,进而解算出接收器的位置来。需要注意的是,这个解算是在 GPS
芯片中完成的,比如在手机操作系统层面上,可以直接通过 API
接口得到解算的结果和误差半径。
目前的 GPS
接收模块(类比手机中的 GPS
信号接收器模块),其实大部分都支持多种卫星接收能力,比如,我们的手机如果支持,可以同时根据GPS
、格洛纳斯、伽利略、北斗四种卫星系统产生的定位解算,比单一卫星系统定位会更精确。
对于 GPS
,要注意两点。
第一是 GPS
的初始定位很耗时间,特别是对于老一代的芯片,可能要耗费几分钟才能冷启动定位成功,现在倒是快了很多。
第二是 GPS
精度并非是完全可依赖的,在某些地方(室内或存在遮挡)误差甚至可以达到几百米甚至上千米,一旦存在物理遮挡,那对 GPS
定位的误差是巨大、致命的。还有一方面是看电离层和接收设备好坏了,不过这个方面产生的误差不会那么致命,因为误差很小。
注意,我上面说的误差,是包含四种情况在内的:
GPS
定位实际误差小,GPS
认为自己误差小。GPS
定位实际误差小,GPS
认为自己误差大。GPS
定位实际误差大,GPS
认为自己误差小。GPS
定位实际误差大,GPS
认为自己误差大。
所以,大家不要单纯的以为解算后数据中的误差半径就可以代表精准度了,因为 GPS
可能也不知道自己算错了,这点很重要!!!
IP 网络定位
IP
定位,其实也可以叫网络定位,网络用语 “顺着网线去找你” 就代表了其定位属性。
先来看一句话:互联网或者说因特网(Internet
)是由各个中心化的自治系统组成的,而这些自治系统又通过互联网交换中心(IXP
)互相连接,以此形成了一个覆盖全球的网络结构。
先说中心化的自治系统(Autonomous System
),我们后面叫它 AS
,自治系统是组成 Internet
的大型网络,连接到 Internet
的每台计算机或设备都连接到一个中心 AS
。而每一个 AS
都会有一个编码,我们称之为 ASN
,知道了 ASN
就等于知道了它所属的 AS,而我们联网后的一个个 IP
就是由不同的 AS
分配的。
而每个 AS
由单个大型组织 ISP
运营。ISP
(Internet Service Provider
)即互联网服务提供商,这些 ISP
运营商是网络最终用户进入 Internet
的入口和桥梁,它包括 Internet
接入服务和 Internet
内容提供服务,我国的 ISP
是要经过国家主管部门批准获得 ISP
许可证才可以运营的企业,能够获得这个资质的企业很少,国内 ISP
运营商分别有移动、联通、电信、广电、铁通等。
每个 ISP
运营的 AS
都管理或者说分配了很多 IP
,这些 IP
逐级分配给到我们每个互联网用户,这时候你可能会想既然 AS
相互独立,我们是怎么访问到国外的信息?
其实每个独立 AS
的信息、资源互通则还需要通过互联网交换中心(Internet Exchange Point
)连接,它是为各个独立 AS
自治系统网络连接所建立的集中交换平台,简称 IX 或 IXP,一般由第三方中立运营。国内第三方中立 IXP
(如CHN-IX
)基本未能成气候,倒是腾讯、阿里、百度等企业通过采用BGP
协议与三大运营商及众多小运营商实现网络互联,建立了事实上的 IXP
。
到此,从底层 IP
到各个 AS
所属的 ISP
,再通过 IXP
将各个 AS
连接,这就是互联网的基础模型。
有两个很普遍的比喻可以对上面内容做一个总结:
- 把
AS
类比成一个城镇的邮局。邮件从一个邮局(AS
)到另一个邮局,直到到达正确的城镇为止,然后该城镇的邮局将在该城镇内传递邮件。每个AS
都控制一组特定的IP
地址,就像每个小镇的邮局负责将邮件传递到该镇内的所有地址一样。 - 把
AS
类比成一个国家的话,那里面所有的IP
就像是内部居民,内部路由表就是内部居民沟通的桥梁。如果居民想要跟其他国家的人聊天,就需要用BGP
协议的IXP
中转进行联系,IXP
相当于国与国之间的桥梁。
终于说回了主题,IP
是怎么定位的?其实很简单,通过 IP
可以定位 ASN
所属 ISP
组织,每个 ISP
组织在分配 IP
到户时,都有记录,到户这个概念大家应该都理解(要联网你得把网线扯到家里),某个 IP
地址分配给了谁,都记录得一清二楚,又由于 ISP
组织基本都是需要国家许可的,所以警察叔叔想找你喝茶,基本逃不掉。当然也不是所有人都有权限去运营商那查看数据的,这个在国内还是比较严格的,所以一般来说别人想顺着网线找你,难度也是很大的。
上面说普通人想要获取 IP
对应其位置信息难度很大,为什么说难度很大而不是没有可能?这就得说到大数据了,大数据时代的今天,各种互联网应用收集到了大量看似无用的信息,但是这些信息之间相互推导,完全是可以推导出某个 IP
的对应地址的。。。也对应了那句话:大数据时代没有隐私。
什么?使用 VPN
可以改变 IP?其实只是加了层保障,还是可以定位到原来的 IP
,有很多种方式都可以使 VPN
代理遮蔽的 IP
无效,比如手机使用的 APP
应用被授权扫描本地网络设备。。这是个什么概念呢?就是假如我允许某 APP
扫描本地网络设备开启了各种权限之后,我又挂了个 VPN
代理。。这个时候由于 APP
已经知道了我 IP
附近的网络、手机设备 MAC
信息、WiFi
、蓝牙等信息,我只是单纯的通过代理改变 IP
将没有任何掩饰作用。。。大数据小广告和各种个性化推送也证实了这些 APP
应用厂商肯定是记录了这些数据。。。
最后,IP
定位的精度相差其实很远,因为用户和服务商们各有手段,只是一般用户手段较低,所以大部分 IP 都可以获得精准定位,少则几十米多则几百米,但也有少部分通过各种手段使得 IP
定位不是那么准确甚至定位不了。
上面我们只是从宏观上介绍了下 IP
定位的方式,细节上比如 IP
网段的指派、解析等等这些和本文讨论内容无关,暂不赘述。
不同定位方式的差异
上文我们简单介绍了四种主流定位方式,其实还有其他方式,比如通过蓝牙定位、通过磁场定位等,都各有利弊,不过多阐述,有兴趣可以自行查阅资料。
简单做个总结:
定位方式 | 使用场景 | 优缺 |
基站定位 | 基站覆盖区域即 | 对环境(天气、高楼、位置)因素要求低,受附近基站影响,精度一般 |
|
| 精度高低取决于路由部署密度,密度高则精度可达到米 |
| 无物理遮蔽的位置 | 精度高,但受到物理遮蔽时精度误差较大,客户端初次启动速度慢 |
| 网络覆盖区域 | 联网且带宽稳定状态下精度几十到几百米,通过技术手段容易产生定位失败 |
开发者实现定位功能的背后
还是以上述 4 种主流的定位方式来说,假如开发者想要去在客户端应用实现定位功能,应该要怎么做?
先说基站定位,由于客户端系统 API
会提供基站 ID
查询接口,所以这种方式下开发者只需要维护一个基站的数据库,使用算法自行去推算位置即可。
再来说 Wi-Fi
定位,通过系统 API
,开发者可以获取到周围路由 AP
信号携带的 MAC
地址,同样的,开发者需要自行去维护 MAC
对应位置的数据库去推算位置。
接着说 GPS
定位,GPS
定位接收卫星数据,此方式由客户端设备的 GPS
芯片实现,系统 API
提供打开并获取定位数据的功能,直接调用即可。
最后说 IP
定位,此种方式下开发者需要部署并维护一个服务端,在服务端得到手机设备联网后的公网 IP
,并且自行维护一个 IP
数据库,才能查询并推算位置。
这里需要注意的是 IOS
系统对隐私极其重视,它不提供读取基站和 Wi-Fi
的接口,所以一般苹果手机上的定位很依赖系统本身,开发者是很难自主实现定位的。
可能大家对这些开发者定位实现方式感到陌生并且不理解,没关系,其实靠个人去实现上述定位功能,除了 GPS
可以直接调用方法,其余的方式都需要维护一个很大的数据库并采集相关数据,这不是个人之力可以达到的。其实在应用开发阶段,大部分开发者主流的做法只有 2 种:
- 调用系统内置定位
API
- 调用第三方
SDK
调用系统内置定位 API
不论是 Android
、IOS
、Windows
或是 MacOS
等系统,内部都提供了一套系统级的定位能力,通常可以直接调用 API 去获取。
有些系统级定位能力可以通过参数控制不同定位精度查询模式,比如:
- 高精度模式,
GPS
定位优先,Wi-Fi
定位其次,两种都不可行则采用基站定位。 - 平衡功耗模式,
GPS
定位禁用,因为费电,优先Wi-Fi
定位,不可用则基站定位。 - 低功耗模式,被动定位,即自身不计算定位,通过周围设备采用高精或平衡功耗模式定位取得坐标位置后,将位置推送给周围使用低功耗定位的设备使用。
当然上面只是大部分,还有些系统底层也有使用其他定位方式,甚至有的系统在定位上不能做出选择,只能靠系统 API
自行处理。
其实,目前的系统定位除了 GPS
是接收卫星信号定位其他的定位模式能力都非常低下,因为设备厂商数据收集的投入参差不齐,所以有些厂商甚至会通过改造将接口 API
重定向到国内某些定位服务商去定位。。。
调用第三方 SDK
终于到了开发者最熟悉的环节,调用第三方 SDK
定位接口。
国内的某德、某度等地图服务商都自行实现了定位 SDK
,为什么我们目前开发都必须要调用三方 SDK
呢?其实是为了 APP
应用的完备性。
在一些好的手机上(以安卓为例),其实系统定位也很给力,毕竟厂商大部分都在底层把定位导向国内的定位服务商了,但是一些比较差的手机上,系统定位假如再没有 GPS
或者是 GPS
连接不到卫星的时候,系统底层会走其他定位模式,而访问的一般是谷歌服务器,至于为什么访问谷歌,毕竟安卓系统和谷歌密不可分。。。那在国内走谷歌服务器,由于国内有墙,自然也就获取不到定位。
一般我们为了应用的完备性、抹平不同设备的底层定位差异,会直接调用三方服务商进行定位,因为这些厂商在基础数据维护上投入非常大,定位更准确。
我们拿某德来举例来说。
它的 Android
定位 SDK
提供的 LBS
(基于位置的服务,Location Based Services
)服务定位接口使用的是混合定位技术,支持开发者自由设置定位模式,同时封装了逆地理信息,以及地理围栏等实用功能,Android
定位 SDK
包含 GPS
和网络定位(Wi-Fi
和基站定位等)能力。SDK
将 GPS
、网络定位能力进行了封装,以三种定位模式对外开放,一般默认选择使用高精度定位模式。
但是但是但是,IOS
系统不一样,我们上面也说过,在苹果的 IOS
系统上,由于 IOS
本身不提供读取基站和 Wi-Fi
的接口,三方服务商也没办法,只能乖乖调用系统定位,这也是为什么国内使用苹果手机的用户,定位都不准,误差都一样的原因。
再来说 PC
,PC
设备底层上由于大多缺少 GPS
芯片,所以 PC
设备上主要依赖的是 IP
定位模式,某些情况下,存在定位失败,失败的话会尝试使用浏览器原生定位接口进行定位(PC
定位一般在浏览器中,浏览器自己也有一套定位接口)。
再来说 H5
定位,其实定位原理都一样,只是 H5
是跑在移动设备的浏览器上,定位过程存在一个中介,一般只要我们打开系统 GPS
,并且所在浏览器已获得定位权限,其实三方 JS
定位 SDK
定位会先尝试调用原生 SDK
接口定位(同安卓 SDK
流程),不行的话就会尝试 IP
定位,最后则也是调用浏览器原生定位接口。
最后
在定位时,如果用户快速移动,其实定位会更加精确,这是因为在导航模式下,一般算法会根据用户的速度和方向来不断纠正产生的误差,这就是为什么开车的时候如果开启导航车子能够准确的定位在道路上的原因。
本文我们讨论了多种定位方式的原理与开发者实现其定位的方式,那么看到这里文章开头的一些问题你可以得出结论了吗?
写这篇文章是因为工作涉及到就参考了些书籍和资料随笔而写,简单阐述,内容不深写的比较快,比较忙所以也没画图,如有错误,欢迎大家指出,感谢!
如果您觉得文章不错,记得点赞,欢迎关注公众号