知乎牛人--移动设备的WiFi定位原理

最近在网上浏览关于WiFi定位的信息,看到知乎上某大神解释的关于目前WiFi定位的原理,下面是回答的原文。


作者:知乎用户
链接:https://www.zhihu.com/question/20355764/answer/26765991
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

很难想象这一问题2年间居然没有一个说对的。最高票答案说得很简单,但缺充满了致命伤。

先简单回答楼主问题:
我今天刚安了一个全新的无线路由,如果是用iPhone类似的具有GPS功能的手机来收集MAC地址和SSID,不可能立刻就收集进数据库,但是我可以同样得到1Km范围的定位原因很简单:

  • Wi-Fi定位并不只是拿设备正在使用的Wi-Fi当定位依据,此时手机(或其他无线设备)会扫描周围所有的Wi-Fi信号,并把它们当作定位依据。
  • Wi-Fi定位时,不需要手机(或其他无线设备)连接Wi-Fi。因为Wi-Fi定位的依据是Wi-Fi的BSSID和RSSI,这两个定为依据在Wi-Fi未被连接的情况下,也可以被手机等无线设备获取。

以下是详细的Wi-Fi定位原理:
WiFi 定位这事儿其实非常好理解。先打个比方,你现在突然出现在一片荒凉的大草原上,不知道自己身处何方,但神奇的是你身边居然立了大于等于3根的柱子,而且每根柱子上都应有该根柱子的精确坐标。你手里居然还有一把测距仪,能够知道你离柱子的准确距离,那么恭喜你,你现在就可以算出(算法后面会介绍)自己所在位置的坐标。

回到正题,在实际的 WiFi 定位中,你眼前的每一根柱子其实就是一个 WIFI热点(以下简称AP,Access Point),或者说路由器。每个AP都有它自己名字和它所在位置的坐标。但关键问题是,在 WIFI 定位中,柱子的坐标从哪儿来?我怎么知道我离柱子的距离?就算距离和坐标我都知道,我又怎么能算出我的位置?这就得说说 Wi-Fi定位的三个步骤:
第一步:数据采集与制备(采集柱子的名字、制备柱子的坐标)。
第二步:确定移动设备与热点的距离(确定与柱子之间的距离)
第三步:通过算法推断出移动设备的位置(通过柱子的坐标与我与柱子的距离,得到我的位置坐标)

一、数据采集与制备:
不管你的手机有没有连接 Wi-Fi,手机都会扫描附近存在的WIFI 信号
,如果扫描出某个WIFI 信号,那么手机系统就可以知道发出WIF信号的AP 的BSSID(MAC 地址) ,也就是这个 WIFI在地球上唯一的名字。此刻如果你的手机还用 GPS 定上了位,那么在采集方的数据库里就会添加一条数据,【BSSID、(X1,Y1)】,其中(X1,Y1)正是GPS 定位得到的坐标。但是(X1,Y1)并不是 AP 的位置,而是手机的位置,因为手机实际离 AP存在一定的距离。为了得到更精确的 AP 位置坐标,此AP 会被大量的手机扫描到,并重复采集。如果此 AP 被采集了 N 次,那么在数据库里,实际的AP信息应该是【BSSID、(X1,Y1),(X2,Y2)...(Xn,Yn)】。
一个 AP可能只被采集一次, 可能被采集上百次。当AP被采集的次数越多,通过算法计算出的 AP 坐标也就越精准。经过算法处理(三角定位算法,后面会介绍),最终该热点的位置数据应该是【BSSID、(X,Y)】。
PS:如果一个AP 能够被不断采集,那么此 AP 的坐标随着采集次数的增多而不断地迭代,其坐标也会越来越精准。

二、确定移动设备与热点之间的距离:
WIFI 信号和太阳光一样,都是电磁波。只是 WIFI 信号和光有两点较大的不同:一是 WIFI 信号 的波长比光长许多,二是太阳光的发射源是太阳,WIFI 的发射源是 AP(如路由器)。既然 WIFI 信号也是电磁波,那么WIFI 的信号强度必然也会随着传播距离的增加而衰减。
当手机连接上某一 WIFI 时,手机的系统会记录手机能够捕获的 WIFI 信号强度-RSSI。既然 WIFI 信号会随着距离衰减,那么通过RSSI=a+b*log(d)的理想化模型便可以计算出手机距离路由器的长度 d。当理想化模型终究是理想化模型,无线信号因为干扰、反射等等原因,我们计算出的距离其实并不太准确。
<img src="https://pic2.zhimg.com/c1442d3b436c4b6e6d7bc7c43a6f40c1_b.jpg" data-rawwidth="824" data-rawheight="745" class="origin_image zh-lightbox-thumb" width="824" data-original="https://pic2.zhimg.com/c1442d3b436c4b6e6d7bc7c43a6f40c1_r.jpg">

三、通过算法推断出移动设备的位置
有了热点的坐标和到热点的距离,就得靠定位算法来帮助我们定位了。
Wi-Fi 定位的算法其实有很多,目前主流的有三种算法:
  • 三角定位算法
  • 指纹定位算法
  • 最大似然估算法
三角定位算法
说白了就是以 AP 的坐标为圆心画圆,圆的半径是我与热点之间的距离,三圆重叠处就有可能是我的位置,其中的推倒证明公式初中就教了,就不在这里细说了。

<img src="https://pic2.zhimg.com/15b4b8fd4af239f04429cbd18136cd49_b.jpg" data-rawwidth="474" data-rawheight="600" class="origin_image zh-lightbox-thumb" width="474" data-original="https://pic2.zhimg.com/15b4b8fd4af239f04429cbd18136cd49_r.jpg">

但是三角定位也有其缺点,就是定位结果非常不精准。原因很简单,因为 AP 的位置和手机距离 AP 的长度都是推算出的,误差+误差=更大的误差。

指纹定位算法
这算法只能在学校实验室拿小样本来玩儿玩儿,真正做 Wi-Fi 定位的 App根本不敢用。因为这一算法的核心思想就是大量的数据存储、大量的query查询。
简单介绍一下指纹算法,回到「数据采集与制备」,当手机获取到 GPS 定位信息的同时,手机会扫描周围所有 AP 的 BSSID。这时所有能采集到的 BSSID 序列就成了指纹存储在数据库中,指向的是收集到该指纹的坐标。当有手机采集的 BSSID 序列能够匹配之前采集到的指纹(BSSID序列),那么就可以认为此时的坐标正是指纹所指向向的坐标。
<img src="https://pic4.zhimg.com/383324b97f24f545031df9a315a1f743_b.jpg" data-rawwidth="424" data-rawheight="209" class="origin_image zh-lightbox-thumb" width="424" data-original="https://pic4.zhimg.com/383324b97f24f545031df9a315a1f743_r.jpg">

指纹算法也有致命缺点:一是采集量需要非常大。二是对服务端性能和数据存储要求太高。三是 WIFI 不密集的地方,定位结果会非常糟糕。

最大似然定位法
目前最靠谱的 Wi-Fi 定位算法。说白了就是三角定位法加入了概率论的因素。感兴趣的同学可自己琢磨和研究。


简单说说Wi-Fi 定位的一些有意思的坑:
跨省定位
:万万没想到,万万没想到,Wi-Fi 定位这件事儿在中国居然可以出现跨省定位这样的严重错误。原因就是某家王八蛋路由器生产商根本不遵守一台设备一个 BSSID 的原则。数据库里这条 BSSID 的坐标明明是在大砍省,没想到大吃省居然有一片路由器用了同一个 BSSID,砍省瞬间变吃省。另外,这家王八蛋生产商名叫腾达,堂堂腾达居然连买MAC地址的钱都没有,还是请腾达早日滚蛋破产。
移动 Wi-Fi:你能想到吗,现在公交车上都各种装AP啊,公交车带着 Wi-Fi 满大街跑,你叫我拿你的 Wi-Fi定个毛位啊!我又怎么知道你这是公交车上的 Wi-Fi 啊(其实可以^-^)!!
Wi-Fi 集体搬家:唯一能打倒概率论的敌人。玩了 Wi-Fi 定位后,某天你会发现四川某大学所有的校园 AP(移动)全部出现在了西安某大学里面,数量多达上百个。可怜的西安某大学学生,只能看着地图上的四川地图哭啊!你还敢玩儿概率论??(当然还得玩)
高层建筑内的 WIFI定位:在高层建筑中,手机几乎不可能连上 GPS,也自然无法采集到 AP 的位置。这个坑也有解,考验的是研发同学的实现能力和算法设计能力。

另外,说说为什么 iPhone 可以在无网状态下定位@Ts8zs

当iPhone 获取到WIFI 定位结果后,会在客户端保存一份定位结果,比如「(x1,y1),BSSID1,BSSID2。。。BSSIDn」。即便 iPhone 没有联网,只要扫描到其中一个 BSSID,iOS 即认为此时的位置是(x1,y1)
PS:不连接 WIFI,手机也可以获取 WIFI 的 BSSID 和 RSSI。

最后,说一些对 WIFI定位的常见误区:
一、第三方无法在 iOS 上获取 RSSI,「至于你们第三方的地图应用,自己玩泥巴去吧~」

前半句是对的,后半句大错特错。苹果的wifi定位能力和精度是神一般的存在,完爆谷歌和国内任何一个定位团队。在某些场景下,普通用户甚至无法察觉现在是 WIFI 定位还是 GPS 定位。
另外,真正玩泥巴的是国内的安卓应用,iOS 应用只要调取苹果的网络定位 API 即可获取最高水准的WIFI定位结果。开发者省时省力,用户也能获得最好的体验。
二、「iPhone 在向 Google 提交数据时,总是把所有可能有用的数据同时提交上去,包括 IP、基站编号、Wi-Fi MAC 地址等等,然后 Google 返回尽可能精确的定位信息」
很难相信说出这话的同学@Cat Chen是位 Facebook 的工程师。只要第三方iOS 应用无法获取 WIFI 的 RSSI,就无法进行WIFI 定位(指纹算法也不行,因为 iOS 第三方只能知道当前连接 WIFI 的 BSSID 地址,iOS 7连当前连接的 WIFI BSSID 都无法获取了。)
事实上非越狱状态下,iOS 的第三方应用就是无法获取WIFI 的 RSSI。因此 Google Maps 无法上传关键的定位要素,自然也无法得到自家生产的定位结果。
三、「IP 定位」
难以置信有人会这么说,就算猜答案也应该有点计算机网络的基础常识。如果真用 IP 来定位,定位的精度会比基站定位的精度还低。一般 WIFI 定位的精度在500米以内。
四、想用 WIFI 定位,必须连上 WIFI
手机不用连WIFI,也可以扫描得到附近 WIFI的 BSSID和 RSSI。一般在小区楼底打开地图的前几分钟,都是 WIFI 定位的结果。

展开阅读全文

没有更多推荐了,返回首页