路由器默认都会进行SSID广播(除非用户手动配置关闭该功能),在广播帧包含了该路由器的MAC地址。此时需要采集装置进行MAC信息采集和信号强度信息采集,并上传到服务器,经过服务器的计算,保存为“MAC-经纬度”的映射。例如谷歌的街景采集车,曾经因隐私问题在德国被定性为非法。在国内,通过用户智能手机应用的后门功能采集,则是数据公司获取“MAC-经纬度”映射信息的主要途径。一般情况下,用户周边会有多个WIFI信号源,此时手机会默默地解析出所有WIFI的MAC地址,如果某些WIFI的信息在数据库中已经存在,则可以根据信号强度,推导出未知WIFI的经纬度。如果没有已知WIFI,而手机碰巧开着GPS,则也能完成数据采集。用户在不知情的情况下为地图公司搜集了所有的数据, 这样就建立了一个庞大的热点位置数据库,这个数据库是对用户进行定位的关键
原理
- 每一个无线AP都有一个全球唯一的MAC地址,并且一般来说无线AP在一段时间内是不会移动
- 设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址
- 设备将这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备
- 位置服务商会不断更新、补充自己的数据库,以保证数据的准确性,毕竟无线AP不像基站塔那样基本100%不会移动
位置服务数据库的搭建
主动采集
谷歌、Skyhook两家位置服务提供商会主动搜集Wi-Fi等热点的位置信息。Google的街景拍摄车有一个重要的功能就是采集沿途的无线信号,并打上通过GPS定位出的坐标回传至服务器。Skyhook在美国及欧洲一些国家也是直接开着信号采集车采集AP和基站的信号数据
用户提交
Android手机用户在开启”使用无线网络定位”时会提示是否允许使用Google的定位服务,如果允许,用户的位置信息就被谷歌收集到。iPhone则会自动收集Wi-Fi的MAC地址、GPS位置信息、运营商基站编码等,并发送给苹果公司的服务器
如果关闭GPS,而WIFI模块保持开启,手机会读取周边所有WIFI信号的MAC地址和信号强度,并上传至某公司(通常是地图供应商)的服务器,服务器查询并计算后会返回经纬度。WIFI的覆盖范围一般只在50米内,因此定位精度非常接近卫星定位系统
如果WIFI模块也关闭了,就只能通过基站(蜂窝网络)了。此时手机会接收到基站的小区ID,上传至服务器查询,服务器同样返回经纬度。但此时精度较差,误差一般在100以上,仅凭信号强度很难计算出精确位置
定位过程
通过采集和用户设备上传获取WiFi的位置信息
此时无论设备有没有连接WiFi,只要打开了WiFi设置,设备就会自动扫描附近存在的WiFi信号,如果扫描出来那么设备就能知道WiFi的MAC地址
此时如果设备打开了GPS,那么采集方的数据库中就会增加一条数据,该数据是通过GPS得到的设备的坐标,并知道在一定范围内有WiFi的位置,当该WiFi被多次采集后,通过算法算尺来的坐标就更精准
确定设备与WiFi的距离
Wi-Fi信号是电磁波,其信号强度会随着传播距离的增加而衰减
当设备连接上某WiFi时,设备的系统会记录能够捕获的WiFi信号强度(RSSI)。信号会随着距离衰减,通过RSSI=a+b*log(d)的理想化模型便可以计算出设备距离路由器的距离 d。但是理想化模型终究是理想化模型,无线信号因为干扰、反射等原因,计算出的距离其实并不太准确
算法推断出设备的位置
- 三角定位法
三角定位算法就是以WiFi 的坐标为圆心画圆,圆的半径是设备与热点之间的距离,多圆重叠处可能是设备的位置
缺点:定位结果不精准。因为WiFi 的位置和设备距离WiFi 的长度都是推算出的存在误差 - 指纹定位算法
指纹算法是指手机会扫描周围所有的WiFi。这时所有能采集到的MAC地址与之前设备上记录的数据进行比对,匹配之前已采集到的指纹,那么可以认为此时的坐标是指纹指向的坐标
缺点:采集量需要非常大;对服务端性能和数据存储要求高;Wi-Fi不密集的地方,定位结果不理想
防止被定位
最直接的办法是关掉手机系统中的位置服务选项,以避免他人看到你的位置信息
如果要杜绝位置服务商获取数据,用户需要不连接任何Wi-Fi,并且不使用任何相关的位置服务。可以使用某些工具,例如谷歌曾发布过一款选择退出工具,让无线路由器用户有效阻止谷歌搜集他们的数据