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

本文标签: 相关信息强度信号密码列表