前言
目前智能手机的使用已经很普遍了,手机定位是手机上的一个核心基础功能。生活中基于定位的应用场景也有很多,比如最常见的打车,司机需要知道你在哪里,同时打车软件也需要基于司机和乘客的位置规划一条路线,让司机更高效、精准的行驶到用户指定地点。这就是典型定位服务应用。当然,除了这种应用,还有很多定位的应用场景,用户位置本身的展示,也是地图产品中不可缺少的。
那么问题就来了
作为
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