标签:
上一篇简单说了一下如何使用windows native API 扫描站点广播的信号,比较浅显。这一篇简单说一下,如何获取bssid以及wifi定位的原理。
bssid是一个AP信号的唯一标示,一般通过wifi定位,就是检测设备把连接的AP信号的bssid和当前GPS位置上传到服务器,其他设备需要连接目标AP并上传GPS位置信息进行比较,如果一致就认为在范围内,就会允许签到、打卡等操作。这个思路借鉴自这篇博客https://blog.csdn.net/gupar/article/details/50854480,这里说win8.1一下的版本无法获取bssid,待验证。
通过native API获取bssid的方式现在知道两种。一种是通过处于已连接状态的信号,通过接口查询链接属性,属性里可以获取bssid,但仅限于已连接的AP。显然无法获取全部扫描到的AP信号。第二种方式可以获取到所有扫描到的AP信号的bssid,是通过另一个接口,如下
std::wstring bssid;
PWLAN_BSS_LIST ppWlanBssList;
DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,
&pBssEntry->dot11Ssid,
pBssEntry->dot11BssType,
pBssEntry->bSecurityEnabled,
NULL,
&ppWlanBssList);
第三个参数很重要,如果是传入的某个AP的ssid则,只能获取当前AP的bssid,如果传入NULL,则会返回当前网卡扫描到的所有AP的bssid。
发现这个接口也很偶然。开始我一直关注这个接口
dwResult = WlanQueryInterface(hClient,
&pIfInfo->InterfaceGuid,
wlan_intf_opcode_current_connection,
NULL,
&connectInfoSize,
(PVOID *)&pConnectInfo,
&opCode);
但发现他只能返回【current_connection】状态的接口。后来又去MSDN去查有哪些数据结构中包含【bssid】的属性,就发现了WLAN_BSS_LIST。然后继续找,哪些接口会返回这个结构,就找到了【WlanGetNetworkBssList】,然后百度搜了一下就找到上面的链接,顺便用法也有了。后来仔细看了一下官方文档,发现如果第三个参数为NULL,则接口会默认返回所有扫到的bssid。
这里附上源码,因为我的应用中嵌入了CEF,所以json数据结构就使用了cef的实现(所以不太纯,引入cef的依赖,仅供参考吧)。
#include
#include
#include
#include "include/