C++ Wifi信号强度

6

我正在尝试在Windows 7机器上使用C ++获取已连接WiFi信号的强度。

我可以使用命令WlanGetAvailableNetworkList获取信号强度值,但返回的值对我们的要求不够细致。基本上,随着您远离WiFi路由器,该值会以20%的增量跳动(99% -> 80% -> 60%等)。

对于我们正在开发的应用程序,我们确实需要更精确的值。我知道这是可能的,因为我在Windows中看到了显示信号强度精确dBm值的应用程序...

如果有人有任何建议,将不胜感激!

dwResult = WlanGetAvailableNetworkList(hClient,&pIfInfo->InterfaceGuid,0,NULL,&pBssList);

if (dwResult != ERROR_SUCCESS) {
    wprintf(L"WlanGetAvailableNetworkList failed with error: %u\n", dwResult);
    dwRetVal = 1;

} else {

    for (j = 0; j < pBssList->dwNumberOfItems; j++) {
        pBssEntry = (WLAN_AVAILABLE_NETWORK *) & pBssList->Network[j];

        if ((pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED ) != 0 ){

            if (pBssEntry->wlanSignalQuality == 0)
                iRSSI = -100;
            else if (pBssEntry->wlanSignalQuality == 100)   
                iRSSI = -50;
            else
                iRSSI = -100 + (pBssEntry->wlanSignalQuality/2);    

            wprintf(L"  Signal Quality[%u]:\t %u (RSSI: %i dBm)\n", j, 
                pBssEntry->wlanSignalQuality, iRSSI);
        }
}
2个回答

5

经过进一步的在线研究,我设法拼凑出了一种适合我的方法。从我所读到的来看——有许多不同的方法可以获得RSSI信号强度值——但是这种方法,虽然可能有点繁琐,但对我们的需求很有效。

我使用命令WlanGetNetworkBssList,然后直接从返回的PWLAN_BSS_ENTRY中获取RSSI值。

我发现每次查询WlanGetNetworkBssList之前调用WlanScan非常重要,否则返回的值不能以任何规律改变。

HANDLE hClient;
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
PWLAN_INTERFACE_INFO pIfConnInfo = NULL;
PWLAN_CONNECTION_ATTRIBUTES pConnectInfo = NULL;

PWLAN_BSS_LIST pBssList=NULL;
PWLAN_BSS_ENTRY  pBssEntry=NULL;
WLAN_OPCODE_VALUE_TYPE opCode = wlan_opcode_value_type_invalid;

DWORD dwResult = 0;
DWORD dwMaxClient = 2;         
DWORD dwCurVersion = 0;
DWORD connectInfoSize = sizeof(WLAN_CONNECTION_ATTRIBUTES);

int i;

// Initialise the Handle
dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
if (dwResult != ERROR_SUCCESS) 
{    
    return 0;
}

// Get the Interface List
dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
if (dwResult != ERROR_SUCCESS) 
{    
    return 0;
}

//Loop through the List to find the connected Interface
PWLAN_INTERFACE_INFO pIfInfo = NULL;
for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) 
{
    pIfInfo = (WLAN_INTERFACE_INFO *) & pIfList->InterfaceInfo[i];    
    if (pIfInfo->isState == wlan_interface_state_connected) 
    {
        pIfConnInfo = pIfInfo;
        break;
    }
}

if ( pIfConnInfo == NULL )
    return 0;

// Query the Interface
dwResult = WlanQueryInterface(hClient,&pIfConnInfo->InterfaceGuid,wlan_intf_opcode_current_connection,NULL,&connectInfoSize,(PVOID *) &pConnectInfo,&opCode);
if (dwResult != ERROR_SUCCESS) 
{    
    return 0;
}

// Scan the connected SSID
dwResult = WlanScan(hClient,&pIfConnInfo->InterfaceGuid,&pConnectInfo->wlanAssociationAttributes.dot11Ssid,NULL,NULL);
if (dwResult != ERROR_SUCCESS) 
{    
    return 0;
}

// Get the BSS Entry
dwResult = WlanGetNetworkBssList(hClient,&pIfConnInfo->InterfaceGuid,&pConnectInfo->wlanAssociationAttributes.dot11Ssid,dot11_BSS_type_infrastructure,TRUE,NULL,&pBssList);

if (dwResult != ERROR_SUCCESS) 
{    
    return 0;
}

// Get the RSSI value
pBssEntry=&pBssList->wlanBssEntries[0];
return pBssEntry->lRssi;

1

wlanSignalQuality是RSSI的插值。查看此答案问题以了解如何直接获取RSSI:

从Windows获取Rssi值


谢谢Cookie - 几天前我确实研究过这个。我尝试通过这种方式获取RSSI值,但我不知道如何将其转换为dBm。每次运行程序和每次调用WlanQueryInterface时,该值都完全不同,并且该值每次增加32。5627392、5627424、5627456等... - flinthart
@flinthart 没有通用的转换,这是一个相对的、无单位的度量标准,如果你真的想进行任何转换,它取决于设备。 - CookieOfFortune

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接