WLAN API for getting signal strenth

后端 未结 2 697
深忆病人
深忆病人 2020-12-09 06:58

I am using WLAN Api i.e WlanGetAvailableNetworkList() for signal strength of wireless lan modem/USB datacard.If somebody have some sample code example or some information pl

相关标签:
2条回答
  • 2020-12-09 07:46

    If you are using Python, there is sample code here.

    If you are using C++, the documentation provides a good example:

    #define UNICODE
    
    #include <windows.h>
    #include <wlanapi.h>
    #include <objbase.h>
    #include <wtypes.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // Need to link with Wlanapi.lib and Ole32.lib
    #pragma comment(lib, "wlanapi.lib")
    #pragma comment(lib, "ole32.lib")
    
    
    int wmain()
    {
    
        // Declare and initialize variables.
    
        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;
    
        dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
        if (dwResult != ERROR_SUCCESS) {
            wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
            return 1;
            // You can use FormatMessage here to find out why the function failed
        }
    
        dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
        if (dwResult != ERROR_SUCCESS) {
            wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
            return 1;
            // You can use FormatMessage here to find out why the function failed
        } else {
            wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems);
            wprintf(L"Current Index: %lu\n", pIfList->dwIndex);
            for (i = 0; i < (int) pIfList->dwNumberOfItems; i++) {
                pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
                wprintf(L"  Interface Index[%u]:\t %lu\n", i, i);
                iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString, 
                    sizeof(GuidString)/sizeof(*GuidString)); 
                // For c rather than C++ source code, the above line needs to be
                // iRet = StringFromGUID2(&pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString, 
                //     sizeof(GuidString)/sizeof(*GuidString)); 
                if (iRet == 0)
                    wprintf(L"StringFromGUID2 failed\n");
                else {
                    wprintf(L"  InterfaceGUID[%d]: %ws\n",i, GuidString);
                }    
                wprintf(L"  Interface Description[%d]: %ws", i, 
                    pIfInfo->strInterfaceDescription);
                wprintf(L"\n");
                wprintf(L"  Interface State[%d]:\t ", i);
                switch (pIfInfo->isState) {
                case wlan_interface_state_not_ready:
                    wprintf(L"Not ready\n");
                    break;
                case wlan_interface_state_connected:
                    wprintf(L"Connected\n");
                    break;
                case wlan_interface_state_ad_hoc_network_formed:
                    wprintf(L"First node in a ad hoc network\n");
                    break;
                case wlan_interface_state_disconnecting:
                    wprintf(L"Disconnecting\n");
                    break;
                case wlan_interface_state_disconnected:
                    wprintf(L"Not connected\n");
                    break;
                case wlan_interface_state_associating:
                    wprintf(L"Attempting to associate with a network\n");
                    break;
                case wlan_interface_state_discovering:
                    wprintf(L"Auto configuration is discovering settings for the network\n");
                    break;
                case wlan_interface_state_authenticating:
                    wprintf(L"In process of authenticating\n");
                    break;
                default:
                    wprintf(L"Unknown state %ld\n", pIfInfo->isState);
                    break;
                }
                wprintf(L"\n");
    
                dwResult = WlanGetAvailableNetworkList(hClient,
                                                 &pIfInfo->InterfaceGuid,
                                                 0, 
                                                 NULL, 
                                                 &pBssList);
    
                if (dwResult != ERROR_SUCCESS) {
                    wprintf(L"WlanGetAvailableNetworkList failed with error: %u\n",
                            dwResult);
                    dwRetVal = 1;
                    // You can use FormatMessage to find out why the function failed
                } else {
                    wprintf(L"WLAN_AVAILABLE_NETWORK_LIST for this interface\n");
    
                    wprintf(L"  Num Entries: %lu\n\n", pBssList->dwNumberOfItems);
    
                    for (j = 0; j < pBssList->dwNumberOfItems; j++) {
                        pBssEntry =
                            (WLAN_AVAILABLE_NETWORK *) & pBssList->Network[j];
    
                        wprintf(L"  Profile Name[%u]:  %ws\n", j, pBssEntry->strProfileName);
    
                        wprintf(L"  SSID[%u]:\t\t ", j);
                        if (pBssEntry->dot11Ssid.uSSIDLength == 0)
                            wprintf(L"\n");
                        else {   
                            for (k = 0; k < pBssEntry->dot11Ssid.uSSIDLength; k++) {
                                wprintf(L"%c", (int) pBssEntry->dot11Ssid.ucSSID[k]);
                            }
                            wprintf(L"\n");
                        }
    
                        wprintf(L"  BSS Network type[%u]:\t ", j);
                        switch (pBssEntry->dot11BssType) {
                        case dot11_BSS_type_infrastructure   :
                            wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);
                            break;
                        case dot11_BSS_type_independent:
                            wprintf(L"Infrastructure (%u)\n", pBssEntry->dot11BssType);
                            break;
                        default:
                            wprintf(L"Other (%lu)\n", pBssEntry->dot11BssType);
                            break;
                        }
    
                        wprintf(L"  Number of BSSIDs[%u]:\t %u\n", j, pBssEntry->uNumberOfBssids);
    
                        wprintf(L"  Connectable[%u]:\t ", j);
                        if (pBssEntry->bNetworkConnectable)
                            wprintf(L"Yes\n");
                        else
                            wprintf(L"No\n");
    
                        wprintf(L"  Signal Quality[%u]:\t %u\n", j, pBssEntry->wlanSignalQuality);
    
                        wprintf(L"  Security Enabled[%u]:\t ", j);
                        if (pBssEntry->bSecurityEnabled)
                            wprintf(L"Yes\n");
                        else
                            wprintf(L"No\n");
    
                        wprintf(L"  Default AuthAlgorithm[%u]: ", j);
                        switch (pBssEntry->dot11DefaultAuthAlgorithm) {
                        case DOT11_AUTH_ALGO_80211_OPEN:
                            wprintf(L"802.11 Open (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_80211_SHARED_KEY:
                            wprintf(L"802.11 Shared (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_WPA:
                            wprintf(L"WPA (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_WPA_PSK:
                            wprintf(L"WPA-PSK (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_WPA_NONE:
                            wprintf(L"WPA-None (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_RSNA:
                            wprintf(L"RSNA (%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        case DOT11_AUTH_ALGO_RSNA_PSK:
                            wprintf(L"RSNA with PSK(%u)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        default:
                            wprintf(L"Other (%lu)\n", pBssEntry->dot11DefaultAuthAlgorithm);
                            break;
                        }
    
                        wprintf(L"  Default CipherAlgorithm[%u]: ", j);
                        switch (pBssEntry->dot11DefaultCipherAlgorithm) {
                        case DOT11_CIPHER_ALGO_NONE:
                            wprintf(L"None (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        case DOT11_CIPHER_ALGO_WEP40:
                            wprintf(L"WEP-40 (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        case DOT11_CIPHER_ALGO_TKIP:
                            wprintf(L"TKIP (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        case DOT11_CIPHER_ALGO_CCMP:
                            wprintf(L"CCMP (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        case DOT11_CIPHER_ALGO_WEP104:
                            wprintf(L"WEP-104 (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        case DOT11_CIPHER_ALGO_WEP:
                            wprintf(L"WEP (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        default:
                            wprintf(L"Other (0x%x)\n", pBssEntry->dot11DefaultCipherAlgorithm);
                            break;
                        }
    
                        wprintf(L"\n");
                    }
                }
            }
    
        }
        if (pBssList != NULL) {
            WlanFreeMemory(pBssList);
            pBssList = NULL;
        }
    
        if (pIfList != NULL) {
            WlanFreeMemory(pIfList);
            pIfList = NULL;
        }
    
        return dwRetVal;
    }
    
    0 讨论(0)
  • 2020-12-09 07:46

    You can use the DeviceIoControl function with OID_802_11_RSSI to query RSSI.

    0 讨论(0)
提交回复
热议问题