有人说是用类似的数据库建立的定位机制,可是刚安装的全新无线路由,如果是利用带GPS功能的手机来收集MAC地址和SSID,不可能立刻就被收集进数据库,但是同样能够得到较为精准的定位, 那究竟是怎么只利用Wi-Fi,不利用移动数据(GPRS数据)、GPS来定位的? 原因很简单: Wi-Fi定位并不只是拿设备正在使用的Wi-Fi当定位依据,此时手机(或其他无线设备)会扫描周围所有的Wi-Fi信号,并把它们当作定位依据。 Wi-Fi定位时,不需要手机(或其他无线设备)连接Wi-Fi。因为Wi-Fi定位的依据是Wi-Fi的BSSID和RSSI,这两个定为依据在Wi-Fi未被连接的情况下,也可以被手机等无线设备获取。 以下是详细的Wi-Fi定位原理:
回到正题,在实际的Wi-Fi定位中,你眼前的每一根柱子其实就是一个 Wi-Fi热点(以下简称AP,Access Point),或者说路由器。每个AP都有它自己名字和它所在位置的坐标。但关键问题是,在Wi-Fi定位中,柱子的坐标从哪儿来?我怎么知道我离柱子的距离?就算距离和坐标我都知道,我又怎么能算出我的位置? 这就得说说 Wi-Fi定位的三个步骤: 第一步:数据采集与制备(采集柱子的名字、制备柱子的坐标)。 第二步:确定移动设备与热点的距离(确定与柱子之间的距离) 第三步:通过算法推断出移动设备的位置(通过柱子的坐标与我与柱子的距离,得到我的位置坐标) 一、数据采集与制备: 不管你的手机有没有连接 Wi-Fi,手机都会扫描附近存在的Wi-Fi信号,如果扫描出某个Wi-Fi信号,那么手机系统就可以知道发出WIF信号的AP 的BSSID(MAC 地址) ,也就是这个Wi-Fi在地球上唯一的名字。此刻如果你的手机还用 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 的坐标随着采集次数的增多而不断地迭代,其坐标也会越来越精准。 二、确定移动设备与热点之间的距离: Wi-Fi信号和太阳光一样,都是电磁波。只是 Wi-Fi信号和光有两点较大的不同:一是Wi-Fi信号 的波长比光长许多,二是太阳光的发射源是太阳,Wi-Fi的发射源是 AP(如路由器)。既然Wi-Fi信号也是电磁波,那么Wi-Fi的信号强度必然也会随着传播距离的增加而衰减。 当手机连接上某一 Wi-Fi时,手机的系统会记录手机能够捕获的 Wi-Fi信号强度-RSSI。既然 Wi-Fi信号会随着距离衰减,那么通过RSSI=a+b*log(d)的理想化模型便可以计算出手机距离路由器的长度 d。当理想化模型终究是理想化模型,无线信号因为干扰、反射等等原因,我们计算出的距离其实并不太准确。
三、通过算法推断出移动设备的位置 有了热点的坐标和到热点的距离,就得靠定位算法来帮助我们定位了。 Wi-Fi定位的算法其实有很多,目前主流的有三种算法:
三角定位算法 说白了就是以 AP 的坐标为圆心画圆,圆的半径是我与热点之间的距离,三圆重叠处就有可能是我的位置,其中的推倒证明公式初中就教了,就不在这里细说了。
但是三角定位也有其缺点,就是定位结果不精准。原因很简单,因为 AP 的位置和手机距离 AP 的长度都是推算出的,误差+误差=更大的误差。
指纹定位算法 这算法只能在学校实验室拿小样本来玩儿玩儿,真正做 Wi-Fi定位的 App根本不敢用。因为这一算法的核心思想就是大量的数据存储、大量的query查询。 简单介绍一下指纹算法,回到「数据采集与制备」,当手机获取到 GPS 定位信息的同时,手机会扫描周围所有 AP 的 BSSID。这时所有能采集到的 BSSID 序列就成了指纹存储在数据库中,指向的是收集到该指纹的坐标。当有手机采集的 BSSID 序列能够匹配之前采集到的指纹(BSSID序列),那么就可以认为此时的坐标正是指纹所指向向的坐标。
指纹算法也有致命缺点:一是采集量需要非常大。二是对服务端性能和数据存储要求太高。三是Wi-Fi不密集的地方,定位结果会非常糟糕。
最大似然定位法 目前最靠谱的 Wi-Fi定位算法。说白了就是三角定位法加入了概率论的因素。感兴趣的同学可自己琢磨和研究。 |
|