admin管理员组文章数量:1574959
缘由: 最近在写一个涉及到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;
//获取handle
dwResult = 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
版权声明:本文标题:C++ wlanapi获取wifi列表与相关信息(ssid,密码开启,信号强度,bssid&mac等) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727779668a1129186.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论