Windows Embedded Compact 7获取WIFI热点

来源:互联网 发布:ubuntu的dash 编辑:程序博客网 时间:2024/05/03 09:22

程序运行的环境为Windows embedded compact 7,VS2008


之前一直想采用WZC一类的函数来获得WINCE 7.0中的WIFI相关信息及热点,但一直都无果,后来在查看MSDN才知道Wlan一类的函数在WINCE7.0上可用来实现这些功能。目前暂时用来获取WIFI的相关信息及热点。

具体操作如下:

          WlanOpenHandle:打开服务的连接;

          WlanEnumInterfaces:枚举当前所有的有效无线网卡;

          WlanGetAvailableNetworkList:获取当前可用的网络接口;

          WlanFreeMemory:释放进行WlanEnumInterface和WlanGetAvailableNetworkList时分配的空间。

具体代码如下:

         

[cpp] view plaincopyprint?
  1. int CwlanwifiDlg::GetWifiAccessPoint()  
  2. {  
  3.     // Declare and initialize variables.  
  4.   
  5. //  HANDLE hClient = NULL;   
  6.     DWORD dwMaxClient = 2;      //      
  7.     DWORD dwCurVersion = 0;  
  8.     DWORD dwResult = 0;  
  9.     DWORD dwRetVal = 0;  
  10.     int iRet = 0;  
  11.   
  12.     WCHAR GuidString[39] = {0};  
  13.   
  14.     unsigned int i, j, k;  
  15.   
  16.     /* variables used for WlanEnumInterfaces  */  
  17.   
  18.     PWLAN_INTERFACE_INFO_LIST pIfList = NULL;  
  19.     PWLAN_INTERFACE_INFO pIfInfo = NULL;  
  20.   
  21.     PWLAN_AVAILABLE_NETWORK_LIST pBssList = NULL;  
  22.     PWLAN_AVAILABLE_NETWORK pBssEntry = NULL;  
  23.   
  24.     int iRSSI = 0;  
  25.   
  26.     dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);  
  27.     if (dwResult != ERROR_SUCCESS) {  
  28.         RETAILMSG(OUTPUT_LOGMSG,(L"WlanOpenHandle failed with error: %u\r\n", dwResult));  
  29.         return 1;  
  30.         // You can use FormatMessage here to find out why the function failed  
  31.     }  
  32.   
  33.     dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);  
  34.     if (dwResult != ERROR_SUCCESS)   
  35.     {  
  36.         RETAILMSG(OUTPUT_LOGMSG,(L"WlanEnumInterfaces failed with error: %u\r\n", dwResult));  
  37.         return 1;  
  38.         // You can use FormatMessage here to find out why the function failed  
  39.     }   
  40.     else   
  41.     {  
  42.         RETAILMSG(OUTPUT_LOGMSG,(L"Num Entries: %d\r\n", pIfList->dwNumberOfItems));  
  43.         RETAILMSG(OUTPUT_LOGMSG,(L"Current Index: %d\r\n", pIfList->dwIndex));  
  44.   
  45.         for (i = 0; i < (int)pIfList->dwNumberOfItems; i++)   
  46.         {  
  47.             pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];  
  48.             RETAILMSG(OUTPUT_LOGMSG,(L"  Interface Index[%u]:\t %lu\r\n", i, i));  
  49.             iRet = StringFromGUID2(pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString,   
  50.                 sizeof(GuidString)/sizeof(*GuidString));   
  51.             // For c rather than C++ source code, the above line needs to be  
  52.             // iRet = StringFromGUID2(&pIfInfo->InterfaceGuid, (LPOLESTR) &GuidString,   
  53.             //     sizeof(GuidString)/sizeof(*GuidString));   
  54.             if (iRet == 0)  
  55.                 RETAILMSG(OUTPUT_LOGMSG,(L"StringFromGUID2 failed\r\n"));  
  56.             else   
  57.                 RETAILMSG(OUTPUT_LOGMSG,(L"  InterfaceGUID[%d]: %ws\r\n",i, GuidString));  
  58.                  
  59.             RETAILMSG(OUTPUT_LOGMSG,(L"  Interface Description[%d]: %s\r\n", i,   
  60.                 &pIfInfo->strInterfaceDescription));  
  61.   
  62.             RETAILMSG(OUTPUT_LOGMSG,(L"  Interface State[%d]:\t ", i));  
  63.             switch (pIfInfo->isState) {  
  64.             case wlan_interface_state_not_ready:  
  65.                 RETAILMSG(OUTPUT_LOGMSG,(L"Not ready\r\n"));  
  66.                 break;  
  67.             case wlan_interface_state_connected:  
  68.                 RETAILMSG(OUTPUT_LOGMSG,(L"Connected\r\n"));  
  69.                 break;  
  70.             case wlan_interface_state_ad_hoc_network_formed:  
  71.                 RETAILMSG(OUTPUT_LOGMSG,(L"First node in a ad hoc network\r\n"));  
  72.                 break;  
  73.             case wlan_interface_state_disconnecting:  
  74.                 RETAILMSG(OUTPUT_LOGMSG,(L"Disconnecting\r\n"));  
  75.                 break;  
  76.             case wlan_interface_state_disconnected:  
  77.                 RETAILMSG(OUTPUT_LOGMSG,(L"Not connected\r\n"));  
  78.                 break;  
  79.             case wlan_interface_state_associating:  
  80.                 RETAILMSG(OUTPUT_LOGMSG,(L"Attempting to associate with a network\r\n"));  
  81.                 break;  
  82.             case wlan_interface_state_discovering:  
  83.                 RETAILMSG(OUTPUT_LOGMSG,(L"Auto configuration is discovering settings for the network\r\n"));  
  84.                 break;  
  85.             case wlan_interface_state_authenticating:  
  86.                 RETAILMSG(OUTPUT_LOGMSG,(L"In process of authenticating\r\n"));  
  87.                 break;  
  88.             default:  
  89.                 RETAILMSG(OUTPUT_LOGMSG,(L"Unknown state %ld\r\n", pIfInfo->isState));  
  90.                 break;  
  91.             }  
  92.             RETAILMSG(OUTPUT_LOGMSG,(L"\r\n"));  
  93.   
  94.             //获得可用的无线网列表   
  95.             dwResult = WlanGetAvailableNetworkList(hClient,  
  96.                 &pIfInfo->InterfaceGuid,  
  97.                 0,   
  98.                 NULL,   
  99.                 &pBssList);  
  100.   
  101.             if (dwResult != ERROR_SUCCESS)   
  102.             {  
  103.                 RETAILMSG(OUTPUT_LOGMSG,(L"WlanGetAvailableNetworkList failed with error: %u\r\n",  
  104.                     dwResult));  
  105.                 dwRetVal = 1;  
  106.                 // You can use FormatMessage to find out why the function failed  
  107.             }   
  108.             else   
  109.             {  
  110.                 RETAILMSG(OUTPUT_LOGMSG, (L"WLAN_AVAILABLE_NETWORK_LIST for this interface\r\n"));  
  111.                 RETAILMSG(OUTPUT_LOGMSG,(L"Num Entries: %d\r\n", pBssList->dwNumberOfItems));  
  112.   
  113.                 for (j = 0; j < pBssList->dwNumberOfItems; j++)   
  114.                 {  
  115.                     pBssEntry = (WLAN_AVAILABLE_NETWORK *)&pBssList->Network[j];  
  116.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Profile Name[%u]:  %s\r\n", j, &pBssEntry->strProfileName));  
  117.                     RETAILMSG(OUTPUT_LOGMSG,(L"  SSID[%u]:\t\t ", j));  
  118.                     if (pBssEntry->dot11Ssid.uSSIDLength == 0)  
  119.                         RETAILMSG(OUTPUT_LOGMSG,(L"\r\n"));  
  120.                     else   
  121.                     {   
  122.                         CString str = _T("");  
  123.                         str = pBssEntry->dot11Ssid.ucSSID;  
  124.                       
  125.   
  126.                     RETAILMSG(OUTPUT_LOGMSG,(L"%s\r\n", str));  
  127.                         RETAILMSG(OUTPUT_LOGMSG,(L"%s\r\n", &pBssEntry->dot11Ssid.ucSSID));  
  128.                     }  
  129.   
  130.                     RETAILMSG(OUTPUT_LOGMSG,(L"BSS Network type[%u]:\t ", j));  
  131.                     switch (pBssEntry->dot11BssType)  
  132.                     {  
  133.                     case dot11_BSS_type_infrastructure   :  
  134.                         RETAILMSG(OUTPUT_LOGMSG,(L"Infrastructure (%u)\r\n", pBssEntry->dot11BssType));  
  135.                         break;  
  136.                     case dot11_BSS_type_independent:  
  137.                         RETAILMSG(OUTPUT_LOGMSG,(L"Infrastructure (%u)\r\n", pBssEntry->dot11BssType));  
  138.                         break;  
  139.                     default:  
  140.                         RETAILMSG(OUTPUT_LOGMSG,(L"Other (%lu)\r\n", pBssEntry->dot11BssType));  
  141.                         break;  
  142.                     }  
  143.   
  144.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Number of BSSIDs[%u]:\t %u\r\n", j, pBssEntry->uNumberOfBssids));  
  145.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Connectable[%u]:\t ", j));  
  146.                     if (pBssEntry->bNetworkConnectable)  
  147.                         RETAILMSG(OUTPUT_LOGMSG,(L"Yes\r\n"));  
  148.                     else   
  149.                     {  
  150.                         RETAILMSG(OUTPUT_LOGMSG,(L"No\r\n"));  
  151.                         RETAILMSG(OUTPUT_LOGMSG,(L" Not connectable WLAN_REASON_CODE value[%u]:\t %u\r\n", j,   
  152.                             pBssEntry->wlanNotConnectableReason));  
  153.                     }          
  154.   
  155.                     RETAILMSG(OUTPUT_LOGMSG,(L"Number of PHY types supported[%u]:\t %u\r\n", j, pBssEntry->uNumberOfPhyTypes));  
  156.   
  157.                     if (pBssEntry->wlanSignalQuality == 0)  
  158.                         iRSSI = -100;  
  159.                     else if (pBssEntry->wlanSignalQuality == 100)     
  160.                         iRSSI = -50;  
  161.                     else  
  162.                         iRSSI = -100 + (pBssEntry->wlanSignalQuality/2);      
  163.   
  164.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Signal Quality[%u]:\t %u (RSSI: %i dBm)\r\n", j,   
  165.                         pBssEntry->wlanSignalQuality, iRSSI));  
  166.   
  167.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Security Enabled[%u]:\t ", j));  
  168.                     if (pBssEntry->bSecurityEnabled)  
  169.                         RETAILMSG(OUTPUT_LOGMSG,(L"Yes\r\n"));  
  170.                     else  
  171.                         RETAILMSG(OUTPUT_LOGMSG,(L"No\r\n"));  
  172.                     //身份验证类型   
  173.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Default AuthAlgorithm[%u]: ", j));  
  174.                     switch (pBssEntry->dot11DefaultAuthAlgorithm)   
  175.                     {  
  176.                     case DOT11_AUTH_ALGO_80211_OPEN:  
  177.                         RETAILMSG(OUTPUT_LOGMSG,(L"802.11 Open (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  178.                         break;  
  179.                     case DOT11_AUTH_ALGO_80211_SHARED_KEY:  
  180.                         RETAILMSG(OUTPUT_LOGMSG,(L"802.11 Shared (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  181.                         break;  
  182.                     case DOT11_AUTH_ALGO_WPA:  
  183.                         RETAILMSG(OUTPUT_LOGMSG,(L"WPA (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  184.                         break;  
  185.                     case DOT11_AUTH_ALGO_WPA_PSK:  
  186.                         RETAILMSG(OUTPUT_LOGMSG,(L"WPA-PSK (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  187.                         break;  
  188.                     case DOT11_AUTH_ALGO_WPA_NONE:  
  189.                         RETAILMSG(OUTPUT_LOGMSG,(L"WPA-None (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  190.                         break;  
  191.                     case DOT11_AUTH_ALGO_RSNA:  
  192.                         RETAILMSG(OUTPUT_LOGMSG,(L"RSNA (%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  193.                         break;  
  194.                     case DOT11_AUTH_ALGO_RSNA_PSK:  
  195.                         RETAILMSG(OUTPUT_LOGMSG,(L"RSNA with PSK(%u)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  196.                         break;  
  197.                     default:  
  198.                         RETAILMSG(OUTPUT_LOGMSG,(L"Other (%lu)\r\n", pBssEntry->dot11DefaultAuthAlgorithm));  
  199.                         break;  
  200.                     }  
  201.   
  202.                     //加密类型   
  203.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Default CipherAlgorithm[%u]: ", j));  
  204.                     switch (pBssEntry->dot11DefaultCipherAlgorithm)   
  205.                     {  
  206.                     case DOT11_CIPHER_ALGO_NONE:  
  207.                         RETAILMSG(OUTPUT_LOGMSG,(L"None (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  208.                         break;  
  209.                     case DOT11_CIPHER_ALGO_WEP40:  
  210.                         RETAILMSG(OUTPUT_LOGMSG,(L"WEP-40 (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  211.                         break;  
  212.                     case DOT11_CIPHER_ALGO_TKIP:  
  213.                         RETAILMSG(OUTPUT_LOGMSG,(L"TKIP (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  214.                         break;  
  215.                     case DOT11_CIPHER_ALGO_CCMP:  
  216.                         RETAILMSG(OUTPUT_LOGMSG,(L"CCMP (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  217.                         break;  
  218.                     case DOT11_CIPHER_ALGO_WEP104:  
  219.                         RETAILMSG(OUTPUT_LOGMSG,(L"WEP-104 (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  220.                         break;  
  221.                     case DOT11_CIPHER_ALGO_WEP:  
  222.                         RETAILMSG(OUTPUT_LOGMSG,(L"WEP (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  223.                         break;  
  224.                     default:  
  225.                         RETAILMSG(OUTPUT_LOGMSG,(L"Other (0x%x)\r\n", pBssEntry->dot11DefaultCipherAlgorithm));  
  226.                         break;  
  227.                     }  
  228.   
  229.                     RETAILMSG(OUTPUT_LOGMSG,(L"  Flags[%u]:\t 0x%x", j, pBssEntry->dwFlags));  
  230.                     if (pBssEntry->dwFlags)   
  231.                     {  
  232.                         if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)  
  233.                             RETAILMSG(OUTPUT_LOGMSG,(L" - Currently connected"));  
  234.                         if (pBssEntry->dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED)  
  235.                             RETAILMSG(OUTPUT_LOGMSG,(L" - Has profile"));  
  236.                     }     
  237.                     RETAILMSG(OUTPUT_LOGMSG,(L"\r\n"));  
  238.   
  239.                     RETAILMSG(OUTPUT_LOGMSG,(L"\r\n"));  
  240.                 }//for (j = 0; j < pBssList->dwNumberOfItems; j++)  
  241.             }//else 无线网个数   
  242.         }//for (i = 0; i < (int)pIfList->dwNumberOfItems; i++)  
  243.     }//else 无线适配器   
  244.   
  245. //  释放空间   
  246.     if (pBssList != NULL)   
  247.     {  
  248.         WlanFreeMemory(pBssList);  
  249.         pBssList = NULL;  
  250.     }  
  251.   
  252.     if (pIfList != NULL)   
  253.     {  
  254.         WlanFreeMemory(pIfList);  
  255.         pIfList = NULL;  
  256.     }  
  257.   
  258.     return dwRetVal;  
  259. }  

需要附加头文件:

#include <wlanapi.h>
#pragma comment(lib, "wlanapi.lib")

定义的宏

//定义输入LOG信息宏
#define OUTPUT_LOGMSG 1

编译时可能会出错,但我把其中出错的地方注释掉,就可以编译了,而且能够得到相应的结果。

修改文件 ntddndis.h 修改如下:

                   #define NDIS_IF_MAX_STRING_SIZE IF_MAX_STRING_SIZE
line 3958  //typedef IF_COUNTED_STRING NDIS_IF_COUNTED_STRING, *PNDIS_IF_COUNTED_STRING;

                  #define NDIS_MAX_PHYS_ADDRESS_LENGTH IF_MAX_PHYS_ADDRESS_LENGTH
line 3960 //typedef IF_PHYSICAL_ADDRESS NDIS_IF_PHYSICAL_ADDRESS, *PNDIS_IF_PHYSICAL_ADDRESS;