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

缘由: 最近在写一个涉及到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
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以使用QNetworkConfigurationManager类来获取连接到系统的网络接口的信息,包括WiFi网络接口的信息。在获取WiFi网络接口的信息之后,可以使用QNetworkInterface类来获取该接口的一些属性,如SSID、MAC地址等。 要获取WiFi信号强度,需要使用操作系统提供的API,例如在Windows上,可以使用WLAN API获取WiFi信号强度。在Qt中,可以使用QProcess类来执行系统命令来获取WiFi信号强度。以下是一个获取WiFi信号强度的示例代码: ```cpp #include <QCoreApplication> #include <QNetworkConfigurationManager> #include <QNetworkInterface> #include <QProcess> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 获取WiFi网络接口 QNetworkConfigurationManager manager; QList<QNetworkConfiguration> configurations = manager.allConfigurations(QNetworkConfiguration::Discovered); QNetworkConfiguration wifiConfig; foreach (QNetworkConfiguration config, configurations) { if (config.bearerType() == QNetworkConfiguration::BearerWLAN) { wifiConfig = config; break; } } // 获取WiFi信号强度 QNetworkInterface wifiInterface(wifiConfig.name()); QProcess process; QString command = QString("iwconfig %1").arg(wifiInterface.name()); process.start(command); process.waitForFinished(); QString output = QString(process.readAllStandardOutput()); int index = output.indexOf("Signal level="); if (index != -1) { QString signalLevel = output.mid(index + 13, 3); qDebug() << "WiFi signal level:" << signalLevel << "dBm"; } else { qDebug() << "Failed to get WiFi signal level"; } return a.exec(); } ``` 上述代码中,首先使用QNetworkConfigurationManager类获取所有已发现的网络接口,并遍历这些接口以查找WiFi网络接口。然后,使用QNetworkInterface类获取该接口的名称并使用QProcess类执行系统命令来获取WiFi信号强度。最后,从命令输出中提取WiFi信号强度,并将其打印出来。请注意,由于命令输出的格式可能会因操作系统而异,因此提取信号强度的代码可能需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值