如何获取bssid_Windows wlan 获取bssid 以及浅谈wifi定位
标签:
上一篇简单说了一下如何使用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/cef_parser.h" // json func
#include
#pragma comment(lib, "wlanapi.lib")
#pragma comment(lib, "ole32.lib")
int getWlanContent(CefString& strRes)
{
int iState(200);
CefRefPtr pDictRt = CefDictionaryValue::Create();
HANDLE hClient = NULL;
DWORD dwMaxClient = 2; //
DWORD dwCurVersion = 0;
DWORD dwResult = 0;
DWORD dwRetVal = 0;
int iRet = 0;
WCHAR GuidString[39] = { 0 };
unsigned int i, j, k;
/* variables used for WlanEnumInterfaces */
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
PWLAN_INTERFACE_INFO pIfInfo = NULL;
PWLAN_AVAILABLE_NETWORK_LIST pBssList = NULL;
PWLAN_AVAILABLE_NETWORK pBssEntry = NULL;
int iRSSI = 0;
dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
iState = 251;
pDictRt->SetInt("state", iState);
pDictRt->SetDictionary("result", CefDictionaryValue::Create());
CefRefPtr pValue = CefValue::Create();
if (nullptr != pValue)
{
pValue->SetDictionary(pDictRt);
strRes = CefWriteJSON(pValue, JSON_WRITER_DEFAULT);
}
return iState;
// You can use FormatMessage here to find out why the function failed
}
dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
iState = 252;
pDictRt->SetInt("state", iState);
pDictRt->SetDictionary("result", CefDictionaryValue::Create());
CefRefPtr pValue = CefValue::Create();
if (nullptr != pValue)
{
pValue->SetDictionary(pDictRt);
strRes = CefWriteJSON(pValue, JSON_WRITER_DEFAULT);
}
return iState;
// You can use FormatMessage here to find out why the function failed
}
if ((int)pIfList->dwNumberOfItems < 1)
{
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
iState = 256;
pDictRt->SetInt("state", iState);
pDictRt->SetDictionary("result", CefDictionaryValue::Create());
CefRefPtr pValue = CefValue::Create();
if (nullptr != pValue)
{
pValue->SetDictionary(pDictRt);
strRes = CefWriteJSON(pValue, JSON_WRITER_DEFAULT);
}
return iState;
}
CefRefPtr pGuid = CefListValue::Create();
for (i = 0; i < (int)pIfList->dwNumberOfItems; i++)
{
pIfInfo = (WLAN_INTERFACE_INFO *)&pIfList->InterfaceInfo[i];
if (nullptr == pIfInfo)
{
continue;
}
const std::wstring strGuid = L"{9245fe4a-d402-451c-b9ed-9c1a04247482}";
GUID stGuid = { 0 };
//TCHAR sz[MAX_PATH] = { 0 };
LPOLESTR streGuid;
StringFromCLSID(pIfInfo->InterfaceGuid, &streGuid);
std::wstring strTgt = OLE2T(streGuid);
// avaiable wlan
dwResult = WlanGetAvailableNetworkList(hClient,
&pIfInfo->InterfaceGuid,
0,
NULL,
&pBssList);
if (ERROR_SUCCESS != dwResult)
{
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
iState = 253;
continue;
}
CefRefPtr pDictA = CefListValue::Create();
for (auto m = 0; m < pBssList->dwNumberOfItems; m++)
{
CefRefPtr pItem = CefDictionaryValue::Create();
pBssEntry =(WLAN_AVAILABLE_NETWORK *)& pBssList->Network[m];
if (nullptr == pBssEntry)
{
continue;
}
std::wstring ssid;
TCHAR sz[30] = { 0 };
for (auto k = 0;
k < pBssEntry->dot11Ssid.uSSIDLength;
k++) {
swprintf_s(sz, L"%c",
(int)pBssEntry->dot11Ssid.ucSSID[k]);
ssid.append(sz);
}
ULONG lSqn = pBssEntry->wlanSignalQuality;
if (ssid.empty())
{
continue;
}
// bssid
std::wstring bssid;
PWLAN_BSS_LIST ppWlanBssList;
DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,
&pBssEntry->dot11Ssid,
pBssEntry->dot11BssType,
pBssEntry->bSecurityEnabled,
NULL,
&ppWlanBssList);
CefRefPtr pBssidArr = CefListValue::Create();
if (dwResult2 == ERROR_SUCCESS)
{
for (int z = 0; z < ppWlanBssList->dwNumberOfItems; z++)
{
WLAN_BSS_ENTRY bssEntry = ppWlanBssList->wlanBssEntries[z];
TCHAR sz[MAX_PATH] = { 0 };
swprintf_s(sz, L"%02X:%02X:%02X:%02X:%02X:%02X",
bssEntry.dot11Bssid[0],
bssEntry.dot11Bssid[1],
bssEntry.dot11Bssid[2],
bssEntry.dot11Bssid[3],
bssEntry.dot11Bssid[4],
bssEntry.dot11Bssid[5]);
bssid = sz;
CefRefPtr pBidValue = CefValue::Create();
pBidValue->SetString(bssid);
pBssidArr->SetValue(z, pBidValue);
//vecBSSIDs.push_back(bssid);
}
}
if (bssid.empty() || (pBssidArr->GetSize() <1))
{
continue;
}
pItem->SetString("name", ssid);
pItem->SetInt("sglqlt", lSqn);
pItem->SetList("bssid", pBssidArr);
pItem->SetString("netid", strTgt);
pDictA->SetDictionary(m, pItem);
}
pGuid->SetList(i, pDictA);
}
CefRefPtr pValueT = CefValue::Create();
pValueT->SetList(pGuid);
pDictRt->SetInt("state", iState);
pDictRt->SetValue("result", pValueT);
//pDictRt->SetValue("result", pValueT);
CefRefPtr pValueRes = CefValue::Create();
pValueRes->SetDictionary(pDictRt);
strRes = CefWriteJSON(pValueRes, JSON_WRITER_DEFAULT);
return iState;
}
在此简单记录。
标签:
来源: https://blog.csdn.net/moyebaobei1/article/details/82620127
如何获取bssid_Windows wlan 获取bssid 以及浅谈wifi定位相关推荐
- 浅谈Wi-Fi渗透--原理篇
浅谈Wi-Fi渗透–原理篇 在这个手机比人多的移动时代,无线网络Wi-Fi遍布每个角落,殊不知隐藏其中的风云涌动 广义上无线网络应用类型如下,今天的文章就聚焦于 WLAN的一种无线局域网技术--Wi- ...
- 获取文件哈希值_浅谈查找---哈希查找
在上一篇综述中,我给出了排序是为了更快的查找这个观点.也介绍了查找的一些典型应用场景如: 1.判断一个给定值,是否在一个数组 2.mysql 的查询优化 3.再到给定a.b两个文件,各存放50亿个ur ...
- 天线3db波束宽度_浅谈 Wi-Fi 天线(2)
在上一期内容中,我们为大家解读了增益(gain).天线方向图(Antennae Directional Pattern)两个天线技术参数,本期我们来谈谈波束宽度(lobe width). 另一个常见的 ...
- 浅谈室内定位常见的几种运用场景
物联网,被视为继互联网之后的又一次信息技术革命浪潮.当前各种智能化设备集中爆发,在万物互联大趋势推动之下,物联网或将成为下一个万亿元级别的信息产业市场. 室内定位技术的不断成熟,让蓝牙定位.Wi-Fi ...
- 浅谈wifi与zigbee的区别
摘自:[http://blog.chinaunix.net/uid-26851094-id-3369553.html] 侵权删. ZigBee-WiFi二者对比及各优势: 硬件内存需求对比:ZigBe ...
- 浅谈 Wifi WDS的两种模式
转载自品略图书馆 http://www.pinlue.com/article/2018/09/1721/187259292010.html 一.什么是WDS WDS是Wireless Distribu ...
- 必看!清华大学刘洋教授“浅谈研究生学位论文选题”方法,3月7日1小时视频公开课(附视频PPT下载)...
来源:专知 本文约700字,建议阅读5分钟 清华大学计算机系长聘教授刘洋老师在线讲授了关于<浅谈研究生学位论文选题方法>的课程. 标签:论文研究方法 [ 导读 ]在继续抗击疫情之际,3月7 ...
- CSS基础:浅谈position
浅谈position 定位(position)允许您从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置-- MDN 一.文档流 什么是 ...
- 浅谈开发与研发之差异
点击上方蓝色"程序猿Damon",选择"设为星标" 回复"yeah"获取整理的学习资料 今天浅谈一下个人的一些看法以及想法,如有雷同,纯属巧 ...
最新文章
- java 判断object类型_Java学习-方法与多态的学习心得
- 硬核教程:五步掌握用VSCode进行高效Python开发
- DELL备份恢复系统的小工具 Dell DataSafe Local Backup
- 利用OpenCV的imread将RGB图像转化为灰度图像
- EasyUI中进度条的简单使用
- 可视化:在窗口中显示一个球,该球以与水平成45度夹角作直线运动,当遇到边界时,反弹回来,仍与水平成45度角继续运动。
- JZOJ 3947 . 【省常中JSOI模拟】收历史作业
- c++STL容器的stack
- (转)代理模式(Proxy)
- 挖矿赚加密货币?不如出租GPU计算机获取加倍的利润
- 开发函数计算的正确姿势 —— 排查超时问题
- Agenda for Mac(多功能日历管理工具)中文版
- 苹果Mac定制化App开发神器:FileMaker Pro
- pso-svm 算法实现(1):python DEAP
- okhttp post php,Android OkHttp 结合php 多图片上传实例
- 【1】TFTP软件的开发
- Review-常用数学符号的英文及中文叫法
- 基于FPGA的波束形成verilog开发
- 干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)
- round函数几位小数c语言,Excel中利用round函数保留两位小数实例详解