利用WiFi热点来定位

前几天看到一个项目很有意思 whereami "Uses WiFi signals and machine learning to predict where you are"

在没有看这个项目代码之前,我一直很好奇,WiFI signals里面蕴含了什么信息可以用来进行定位呢?至于prediction, 我反而不是特别好奇,无非是一些ML方面的东西。

获取WiFi signals,作者使用的是自己的一个项目 access points. 可以扫描WiFI或许身边的所有的APs, 以及记录这些APs的信号强度。看上去使用起来看简单

from access_points import get_scanner
wifi_scanner = get_scanner()
wifi_scanner.get_access_points()

阅读代码之后可以发现,实现上会区分各种平台包括Linux, Mac, Windows,不同平台有不同的命令来获取APs, 这里仅列举Linux和Mac.

粗看下面,Linux下面使用的命令是"nmcli -t -f ssid,bssid,signal,security device wifi list", 而MacOS X使用的是 "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s". 执行这条命令输出样式是

➜  repo /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
                            SSID BSSID             RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
                     NETGEAR-LEO a0:21:b7:aa:4d:1a -62  11      Y  -- WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)
                         CU_YVVq bc:9c:31:d1:e5:fc -94  10      Y  CN WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
                  Netcore_866E6A 08:10:79:86:6e:6a -91  6,+1    Y  -- WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)
               TP-LINK_418AC8xsj 20:dc:e6:41:8a:c8 -95  6,+1    Y  US WPA(PSK/AES/AES) WPA2(PSK/AES/AES)
                        FAST_201 bc:d1:77:bd:d5:5a -66  6,+1    Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES)
                    TP-LINK_F785 34:96:72:c5:f7:85 -90  1,+1    Y  -- WPA(PSK/AES/AES) WPA2(PSK/AES/AES)
                         CU_9Y9D 9c:7d:a3:6e:51:90 -19  1       Y  CN WPA(PSK/TKIP,AES/TKIP) WPA2(PSK/TKIP,AES/TKIP)

其中RSSI数值可以通过公式2 * (rssi + 100) 转为quality(我不太理解为什么是这么计算,不过看上去RSSI和连接质量呈线性关系)

whereami的工作则是来训练APs和具体location的模型,为了获取训练数据,你需要在一个地点比如厨房或者是卧室带上一阵子,然后标记说这段时间我是在厨房或者是卧室。训练数据最后会转换成为

[ {'ssid-bssid': quality}, {'ssid-bssid': quality }] => kitchen
[ {'ssid-bssid': quality}, {'ssid-bssid': quality }] => bedroom

这样的形式,里面这些字典通过DictVectorizer做成向量形成Feature. 我觉得这个训练效果应该是会非常的好。看这个项目的描述 "Uses WiFi signals and machine learning (sklearn's RandomForest) to predict where you are. Even works for small distances like 2-10 meters." 精度在2-10m左右,所以我猜想这个作者的房子应该是很大地:)