缘由: 最近在写一个涉及到wifi的工具。之前找到的源码是linux下的,而且充斥着黑科技(底层了,用socket的混淆模式去抓包然后分析,看的头大),想找到一些写好的接口,在收集信息后知道有个能用的,native wifi api(wlanapi)。那就试试看吧
目标 :获取本机可连接的wifi列表,包括ssid,bssid(mac)和延迟情况

官方文档:这里
这里有着一个实例,其实已经解决的很好了,直接复制上去就能用(虽然函数本身实现还是黑箱,不过无所谓了)
官方使用实例

通过WlanOpenHandle获取handle,然后使用WlanEnumInterfances去获取所有网卡信息,再WlanGetAvailableNetworkList使用把对应网卡下读取到的wifi读取出来

    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;//获取handledwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);//获取网卡信息dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);for (i = 0; i < (int)pIfList->dwNumberOfItems; i++) {pIfInfo = (WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];dwResult = WlanGetAvailableNetworkList(hClient,&pIfInfo->InterfaceGuid,0,NULL,&pBssList);//读取wifi}

这里涉及到一个结构体PWLAN_AVAILABLE_NETWORK ,用于存储各个wifi的具体信息,具体定义在wlanapi.h中

typedef struct _WLAN_AVAILABLE_NETWORK {WCHAR strProfileName[WLAN_MAX_NAME_LENGTH];DOT11_SSID dot11Ssid;DOT11_BSS_TYPE dot11BssType;ULONG uNumberOfBssids;BOOL bNetworkConnectable;WLAN_REASON_CODE wlanNotConnectableReason;ULONG uNumberOfPhyTypes;DOT11_PHY_TYPE dot11PhyTypes[WLAN_MAX_PHY_TYPE_NUMBER];// bMorePhyTypes is set to TRUE if the PHY types for the network// exceeds WLAN_MAX_PHY_TYPE_NUMBER.// In this case, uNumerOfPhyTypes is WLAN_MAX_PHY_TYPE_NUMBER and the// first WLAN_MAX_PHY_TYPE_NUMBER PHY types are returned.BOOL bMorePhyTypes;WLAN_SIGNAL_QUALITY wlanSignalQuality;BOOL bSecurityEnabled;DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;DOT11_CIPHER_ALGORITHM dot11DefaultCipherAlgorithm;DWORD dwFlags;DWORD dwReserved;
} WLAN_AVAILABLE_NETWORK, *PWLAN_AVAILABLE_NETWORK;

详细解读可以看文档 → 这里

这里就简单谢谢
strProfileName
包含与网络关联的配置文件名称。如果网络没有配置文件,则该成员将为空。如果有多个配置文件与网络相关联,则可见网络列表中将有多个具有相同SSID的条目。配置文件名称区分大小写。该字符串必须以NULL终止。

简单来叔,若是登录保存过这个wifi(有配置文件),这里就会显示这个wifi的名字。

dot11Ssid
一个DOT11_SSID结构,其中包含可见无线网络的SSID。(也就是wifi的名字)

bNetworkConnectable
指示网络是否可连接。如果设置为TRUE,则网络是可连接的,否则网络将无法连接。

wlanSignalQuality
代表网络信号质量的百分比值。也就是信号强度
该成员的值介于0到100之间。值0表示实际RSSI信号强度为-100 dbm。值100表示实际RSSI信号强度为-50 dbm。

bSecurityEnabled
指示是否在网络上启用了安全性,也就是有没有设密码。值为TRUE表示已启用,否则未启用。

dwFlags
包含网络的各种标志。
WLAN_AVAILABLE_NETWORK_CONNECTED
该网络当前已连接。
WLAN_AVAILABLE_NETWORK_HAS_PROFILE
该网络有一个配置文件。

值得注意的时,这里面并没有具体的bssid(mac)值,在一番搜索后发现一个方案–》源地址
在这里提炼下,

for (j = 0; j < pBssList->dwNumberOfItems; j++)
{pBssEntry = (WLAN_AVAILABLE_NETWORK *)& pBssList->Network[j];PWLAN_BSS_LIST ppWlanBssList;DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,&pBssEntry->dot11Ssid,pBssEntry->dot11BssType,pBssEntry->bSecurityEnabled,NULL,&ppWlanBssList);if (dwResult2 == ERROR_SUCCESS){for (int z = 0; z < ppWlanBssList->dwNumberOfItems; z++){WLAN_BSS_ENTRY bssEntry = ppWlanBssList->wlanBssEntries[z];AString bssid = Printf("%02X:%02X:%02X:%02X:%02X:%02X",bssEntry.dot11Bssid[0],bssEntry.dot11Bssid[1],bssEntry.dot11Bssid[2],bssEntry.dot11Bssid[3],bssEntry.dot11Bssid[4],bssEntry.dot11Bssid[5]);vecBSSIDs.push_back(bssid);}}
}

在这里他在获取了WLAN_AVAILABLE_NETWORK之后,用其调用了WlanGetNetworkBssList函数以获取bssid。
这里是官方文档:这里

最后是实际代码,根据实例稍作修改的一个简单版本

#include <iostream>
#ifndef UNICODE
#define UNICODE
#endif#include <windows.h>
#include <wlanapi.h>
#include <objbase.h>
#include <wtypes.h>#include <stdio.h>
#include <stdlib.h>// Need to link with Wlanapi.lib and Ole32.lib
#pragma comment(lib, "wlanapi.lib")
#pragma comment(lib, "ole32.lib")
int getwifi() {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);dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);if (dwResult != ERROR_SUCCESS) {wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);return 1;}else {wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems);wprintf(L"Current Index: %lu\n", pIfList->dwIndex);for (i = 0; i < (int)pIfList->dwNumberOfItems; i++) {pIfInfo = (WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];wprintf(L"  Interface Index[%u]:\t %lu\n", i, i);iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR)&GuidString,sizeof(GuidString) / sizeof(*GuidString));if (iRet == 0)wprintf(L"StringFromGUID2 failed\n");else {wprintf(L"  InterfaceGUID[%d]: %ws\n", i, GuidString);//https://baike.baidu.com/item/GUID/3352285?fr=aladdin}wprintf(L"  Interface Description[%d]: %ws", i,pIfInfo->strInterfaceDescription);wprintf(L"\n");wprintf(L"  Interface State[%d]:\t ", i); //链接状态switch (pIfInfo->isState) {case wlan_interface_state_not_ready:wprintf(L"Not ready\n");break;case wlan_interface_state_connected:wprintf(L"Connected\n");break;case wlan_interface_state_ad_hoc_network_formed:wprintf(L"First node in a ad hoc network\n");break;case wlan_interface_state_disconnecting:wprintf(L"Disconnecting\n");break;case wlan_interface_state_disconnected:wprintf(L"Not connected\n");break;case wlan_interface_state_associating:wprintf(L"Attempting to associate with a network\n");break;case wlan_interface_state_discovering:wprintf(L"Auto configuration is discovering settings for the network\n");break;case wlan_interface_state_authenticating:wprintf(L"In process of authenticating\n");break;default:wprintf(L"Unknown state %ld\n", pIfInfo->isState);break;}wprintf(L"\n");dwResult = WlanGetAvailableNetworkList(hClient,&pIfInfo->InterfaceGuid,0,NULL,&pBssList);if (dwResult != ERROR_SUCCESS) {wprintf(L"WlanGetAvailableNetworkList failed with error: %u\n",dwResult);dwRetVal = 1;// You can use FormatMessage to find out why the function failed}else {wprintf(L"WLAN_AVAILABLE_NETWORK_LIST for this interface\n");wprintf(L"  Num Entries: %lu\n\n", pBssList->dwNumberOfItems);for (j = 0; j < pBssList->dwNumberOfItems; j++) {pBssEntry =(WLAN_AVAILABLE_NETWORK*)&pBssList->Network[j];wprintf(L"  Profile Name[%u]:  %ws\n", j, pBssEntry->strProfileName);wprintf(L"  SSID[%u]:\t\t ", j);if (pBssEntry->dot11Ssid.uSSIDLength == 0)wprintf(L"\n");else {for (k = 0; k < pBssEntry->dot11Ssid.uSSIDLength; k++) {wprintf(L"%c", (int)pBssEntry->dot11Ssid.ucSSID[k]);}wprintf(L"\n");}wprintf(L"  BSS Network type[%u]:\t ", j);switch (pBssEntry->dot11BssType) {case dot11_BSS_type_infrastructure:wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);break;case dot11_BSS_type_independent:wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);break;default:wprintf(L"Other (%lu)\n", pBssEntry->dot11BssType);break;}PWLAN_BSS_LIST ppWlanBssList;wprintf(L"  BSSID(mac)[%u]:\t ", j);DWORD dwResult2 = WlanGetNetworkBssList(hClient, &pIfInfo->InterfaceGuid,&pBssEntry->dot11Ssid,pBssEntry->dot11BssType,pBssEntry->bSecurityEnabled,NULL,&ppWlanBssList);if (dwResult2 == ERROR_SUCCESS){WLAN_BSS_ENTRY bssEntry = ppWlanBssList->wlanBssEntries[0];wprintf(L"%02X:%02X:%02X:%02X:%02X:%02X\n",bssEntry.dot11Bssid[0],bssEntry.dot11Bssid[1],bssEntry.dot11Bssid[2],bssEntry.dot11Bssid[3],bssEntry.dot11Bssid[4],bssEntry.dot11Bssid[5]);}wprintf(L"  Connectable[%u]:\t ", j);if (pBssEntry->bNetworkConnectable) //指示网络是否可连接。如果设置为TRUE,则网络是可连接的,否则网络将无法连接。wprintf(L"Yes\n");else {wprintf(L"No\n");wprintf(L"  Not connectable WLAN_REASON_CODE value[%u]:\t %u\n", j,pBssEntry->wlanNotConnectableReason);}wprintf(L"  Signal Quality[%u]:\t %u (RSSI: %i dBm)\n", j,pBssEntry->wlanSignalQuality, iRSSI);wprintf(L"  Security Enabled[%u]:\t ", j);if (pBssEntry->bSecurityEnabled)          //是否启用密码(公共网络或私人?)wprintf(L"Yes\n");elsewprintf(L"No\n");wprintf(L"  Flags[%u]:\t 0x%x", j, pBssEntry->dwFlags);if (pBssEntry->dwFlags) {if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)wprintf(L" - Currently connected");if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_HAS_PROFILE)wprintf(L" - Has profile");}wprintf(L"\n");wprintf(L"\n");}}}}if (pBssList != NULL) {WlanFreeMemory(pBssList);pBssList = NULL;}if (pIfList != NULL) {WlanFreeMemory(pIfList);pIfList = NULL;}return dwRetVal;
}

C++ wlanapi获取wifi列表与相关信息(ssid,密码开启,信号强度,bssidmac等)相关推荐

  1. iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架

    iOS 9 发布之后,苹果推出了 NetworkExtension,利用这个框架可以实现很多和网络相关的操作.本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取 ...

  2. java 获取wifi_获取wifi列表并连接wifi

    一.获取wifi列表 获取wifi列表需要用wifiManager.startScan();进行扫描,扫描结果的列表使用List 保存 扫描步骤: wifiManager.startScan(); / ...

  3. Android7.0+ 获取WiFi列表以及连接WiFi

    获取WiFi列表并连接 这段时间项目中涉及到需要获取WiFi列表以及连接,在这里记录下 其中就有一个坑,在Android7.0以上还需要打开定位(也就是手机中"位置信息") Wif ...

  4. Android7.0华为Mate9开发获取WiFi列表失败

    关键代码 WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Contex ...

  5. android wifi动画显示,Android获取WiFi列表的正确用法

    最近有个需求,需要做一个获取WiFi列表的功能,也在网上找了一些资料,但有些资料是有问题的,然后经过自己的摸索,总结如下: 本地环境: Android Studio版本:3.0.1:DEMO APK ...

  6. android 获取wifi的加密类型,Android WIFI开发:获取wifi列表,连接指定wifi,获取wifi加密方式,监听wifi网络变化等...

    下面是 Android 开发中 WiFi 的常用配置,如:获取当前 WiFi ,扫描 WiFi 获取列表,连接指定 WiFi ,监听网络变化等等. 下面是效果图: GitHub 下载地址:https: ...

  7. 获取access中表的相关信息

    就用到两条.net自带的获取数据库信息的语句 OleDbConnection con = new OleDbConnection(connection); // OleDB数据库连接实例 // 获取数 ...

  8. Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小

    Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小 1 动态获取手机屏幕的 屏幕密度与对应像素比例 例如在 320 * 480 尺寸为 3.2 英寸的手机 ,对应的像素密度 ...

  9. H5获取wifi列表及当前wifi

    H5获取wifi列表及当前wifi <script type="text/javascript" src="./js/jquery.js">< ...

最新文章

  1. PLSQL Developer中几个功能
  2. ViewState提交后丢失,竟然是OnInit搞的鬼
  3. 【高速接口-RapidIO】Xilinx SRIO IP 核详解
  4. javascript --- [FormData的使用] 表单元素转换成表单 对象二进制文件上传
  5. 次短路 Yen氏算法 凸包
  6. Abbreviated biography of Jon Claerbout
  7. 开源风云 20 年!
  8. 为GitHub项目加入Travis-CI的自动集成
  9. 机器学习与数据挖掘_Regularization
  10. python入门教程陈孟林_如何入门Python?
  11. jt808终端鉴权_JT808-1: JT808协议、GB808协议、道路运输车辆卫星定位系统-北斗兼容车载终端通讯协议...
  12. python overflowerror_Python中的OverflowError:(34,'结果太大')
  13. 低分怎么上计算机专科学校,低分“首选”这四个专业,不仅给全家能争光,专科也能进国企...
  14. android 模拟器 驱动,【新手指导】模拟器报错列表及解决办法!
  15. 计算机显卡怎样安装方法,独立显卡安装简易教程
  16. ORA-00604: error occurred at recursive SQL level 1 ...——oracle服务空间不足
  17. ssm毕设项目基于框架的众筹管理系统f5244(java+VUE+Mybatis+Maven+Mysql+sprnig)
  18. XML 文件结构与语法
  19. HBuilder常用快捷键总结
  20. Linux 系统调用号

热门文章

  1. 虚拟演播室建设--这篇文章或许能用上
  2. 走穿java23种设计模式--18中介者模式详解
  3. 【零信任落地案例】山石网科南京市中医院云数据中心〃零 信任”建设项目成功案例
  4. 中国人民大学退出国际大学排名?校方:从未参加过!
  5. 中石油称澳洲资产缩水近900亿无中生有
  6. echarts通用环形图
  7. GPU上的相似度检测(PNSR 和 SSIM)
  8. 华为OD机试题 - 射击比赛(JavaScript)| 代码+思路+重要知识点
  9. 蓝桥算法训练 未名湖边的烦恼 JAVA
  10. docker尚硅谷脑图分享(Docker.mmap)