标签:

上一篇简单说了一下如何使用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定位相关推荐

  1. 浅谈Wi-Fi渗透--原理篇

    浅谈Wi-Fi渗透–原理篇 在这个手机比人多的移动时代,无线网络Wi-Fi遍布每个角落,殊不知隐藏其中的风云涌动 广义上无线网络应用类型如下,今天的文章就聚焦于 WLAN的一种无线局域网技术--Wi- ...

  2. 获取文件哈希值_浅谈查找---哈希查找

    在上一篇综述中,我给出了排序是为了更快的查找这个观点.也介绍了查找的一些典型应用场景如: 1.判断一个给定值,是否在一个数组 2.mysql 的查询优化 3.再到给定a.b两个文件,各存放50亿个ur ...

  3. 天线3db波束宽度_浅谈 Wi-Fi 天线(2)

    在上一期内容中,我们为大家解读了增益(gain).天线方向图(Antennae Directional Pattern)两个天线技术参数,本期我们来谈谈波束宽度(lobe width). 另一个常见的 ...

  4. 浅谈室内定位常见的几种运用场景

    物联网,被视为继互联网之后的又一次信息技术革命浪潮.当前各种智能化设备集中爆发,在万物互联大趋势推动之下,物联网或将成为下一个万亿元级别的信息产业市场. 室内定位技术的不断成熟,让蓝牙定位.Wi-Fi ...

  5. 浅谈wifi与zigbee的区别

    摘自:[http://blog.chinaunix.net/uid-26851094-id-3369553.html] 侵权删. ZigBee-WiFi二者对比及各优势: 硬件内存需求对比:ZigBe ...

  6. 浅谈 Wifi WDS的两种模式

    转载自品略图书馆 http://www.pinlue.com/article/2018/09/1721/187259292010.html 一.什么是WDS WDS是Wireless Distribu ...

  7. 必看!清华大学刘洋教授“浅谈研究生学位论文选题”方法,3月7日1小时视频公开课(附视频PPT下载)...

    来源:专知 本文约700字,建议阅读5分钟 清华大学计算机系长聘教授刘洋老师在线讲授了关于<浅谈研究生学位论文选题方法>的课程. 标签:论文研究方法 [ 导读 ]在继续抗击疫情之际,3月7 ...

  8. CSS基础:浅谈position

    浅谈position 定位(position)允许您从正常的文档流布局中取出元素,并使它们具有不同的行为,例如放在另一个元素的上面,或者始终保持在浏览器视窗内的同一位置-- MDN 一.文档流 什么是 ...

  9. 浅谈开发与研发之差异

    点击上方蓝色"程序猿Damon",选择"设为星标" 回复"yeah"获取整理的学习资料 今天浅谈一下个人的一些看法以及想法,如有雷同,纯属巧 ...

最新文章

  1. java 判断object类型_Java学习-方法与多态的学习心得
  2. 硬核教程:五步掌握用VSCode进行高效Python开发
  3. DELL备份恢复系统的小工具 Dell DataSafe Local Backup
  4. 利用OpenCV的imread将RGB图像转化为灰度图像
  5. EasyUI中进度条的简单使用
  6. 可视化:在窗口中显示一个球,该球以与水平成45度夹角作直线运动,当遇到边界时,反弹回来,仍与水平成45度角继续运动。
  7. JZOJ 3947 . 【省常中JSOI模拟】收历史作业
  8. c++STL容器的stack
  9. (转)代理模式(Proxy)
  10. 挖矿赚加密货币?不如出租GPU计算机获取加倍的利润
  11. 开发函数计算的正确姿势 —— 排查超时问题
  12. Agenda for Mac(多功能日历管理工具)中文版
  13. 苹果Mac定制化App开发神器:FileMaker Pro
  14. pso-svm 算法实现(1):python DEAP
  15. okhttp post php,Android OkHttp 结合php 多图片上传实例
  16. 【1】TFTP软件的开发
  17. Review-常用数学符号的英文及中文叫法
  18. 基于FPGA的波束形成verilog开发
  19. 干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)
  20. round函数几位小数c语言,Excel中利用round函数保留两位小数实例详解

热门文章

  1. cmd命令行 复制文件夹 删除文件夹(长期更新)
  2. Linux实现上传文件到百度网盘
  3. WEB数据库管理平台kb-dms:数据统计【十二】
  4. 【无标题】诗歌:人生格言
  5. gff格式转gggenes的输入格式
  6. 第一篇:无孝心不成材
  7. strftime()函数的使用方法
  8. 实现zotero使用onedrive同步
  9. git提交全流程 / 提交之后git仓库没显示
  10. Splunk 健康检查之关闭THP