2013-10-09 5 views
4

Windows 7 컴퓨터에서 C++을 사용하여 연결된 wifi 신호의 강도를 얻으려고합니다.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); 
     } 
} 

답변

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's 목록을 포함시킬 수 있다면 좋을 것입니다 ... – Acidic

1

wlanSignalQuality는 RSSI의 보간법입니다. 직접 RSSI를 얻는 방법이 대답 질문에서보세요 : 내가 함께 나를 위해 작동하는 방법을 패치 관리

Get Rssi Value From Windows

+0

감사합니다. 쿠키 - 며칠 전에 살펴 봤습니다. RSSI 값을이 방법으로 얻으려고했으나 dBm으로 변환하는 방법을 모른다. 이 값은 프로그램을 실행할 때마다 완전히 달라졌고 WlanQueryInterface를 호출 할 때마다 값은 32로 증가했습니다. 5627392, 5627424, 5627456 요법 ... – flinthart

+0

@flinthart 범용 변환은 없으며 의존성이없는 단위계입니다 기기에서 전환을 실제로 원하는 경우 – CookieOfFortune