2013-10-09 182 views
4

我试图让Windows 7的机器上使用C++所连接的WiFi信号的强度。C++ WiFi信号强度

我可以得到一个值使用命令WlanGetAvailableNetworkList的信号强度,但返回的值是粒度不够我们的需要。基本上,当你离开Wifi路由器时,数值以20%的增量跳跃(99% - > 80% - > 60%等)。

对于我们正在开发我们的应用程序确实需要一个更精确的值。我知道这是可能因为我在对显示信号强度的精确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); 
     } 
} 

回答

3

好的网上不断的研究后,我好不容易才拼凑,对我工作的方式。从我读过的 - 有很多不同的方式获取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; 
+0

如果你可以包含'include'的列表...... – Acidic

1

wlanSignalQuality是RSSI的插值。看看如何获​​得直接的RSSI这样的回答的问题:

Get Rssi Value From Windows

+0

谢谢Cookie - 我前几天看过这个。我尝试以这种方式获取RSSI值 - 但我不知道如何将其转换为dBm。每次运行该程序时,该值都完全不同,每次我调用WlanQueryInterface时,值都会增加32. 5627392,5627424,5627456等... – flinthart

+0

@ flinthart没有通用转换,它是一种相对无单位的度量,取决于设备,如果你真的想做任何转换。 – CookieOfFortune