使用Native Wifi API查找無線網絡信息

来源:互联网 发布:vs2017 mysql驱动 编辑:程序博客网 时间:2024/06/11 20:38

微軟自XP SP2之後的系統提供了關於Wireless開發的API,

據MSDN描述,此SDK提供兩個主要功能,即:管理无线网络配置和管理无线网络连接。

 

使用這套API也很簡單,主要步驟如下:

  1. 使用WlanOpenHandle、WlanCloseHandle打開或關閉一個客戶端句柄。
  2. 使用WlanEnumInterfaces列舉系統中可用的Wireless設備接口,主要用到的就是它返回的每個無線網卡的GUID這個參數。
  3. 使用WlanGetInterfaceCapability獲取關於無線網卡的性能參數,(注意這個函數在XP SP2下是不被支持的)
  4. 使用WlanQueryInterface獲取關於無線網卡接口的某些參數。
  5. 使用WlanSetInterface設置無線網卡接口某些參數。
  6. 使用WlanScan列舉每個無線網卡接口上找到的可用無線AP。
  7. 使用WlanGetAvailableNetworkList獲取有效的無線網絡信息。
  8. 使用WlanGetProfile、WlanSetProfile、WlanDeleteProfile管理無線網絡配置信息。
  9. 使用WlanConnect、WlanDisconnect連接或斷開某個無線網絡。

在我的這個程式中隻用到WlanOpenHandle、WlanCloseHandle、WlanEnumInterfaces、WlanScan、WlanGetAvailableNetworkList就可以搜索附近的無線網絡信息。

 

首先,要確保Wireless Zero Configuration服務是開啟狀態。

如果它被關閉就使用StartService啟動此服務:

首先先判斷服務是否以經啟動:

啟動服務:

注意:有時候Wireless Zero Configuration服務有可能被Disable掉,這時需要將它設為自動啟動或手動啟動才能調用StartService。

加入以下代碼:

 

獲得一個客戶端句柄:

其中WlanOpenHandle函數參數如下(MSDN):

 

dwClientVersion
值意思

1

當系統版本為Windows XP SP2時。

2

當系統版本為Vista and Windows Server 2008或更高時。

pReserved

這個參數設為NULL.

pdwNegotiatedVersion

此值可以設為NULL。

phClientHandle

一個句柄指針,用來接收獲得的客戶端句柄.

 

列舉系統中的網絡接口:

其中WlanEnumInterfaces函數參數如下(MSDN):

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pReserved

此值設為NULL。

ppInterfaceList

一個WLAN_INTERFACE_INFO_LIST結構指針的地址,你隻需要給它一個空指針就可以,用完後調用WlanFreeMemory釋放它。

 

掃描周圍的無線網絡:

其中WlanScan函數參數如下(MSDN):

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pInterfaceGuid

使用WlanEnumInterfaces函數得到的網絡接口GUID,指針類型。

pDot11Ssid

一個DOT11_SSID結構指針,此函數將搜索此結構指定的網絡,如果設為NULL將會搜索所有網絡。

XP SP2:  必須設為NULL.
pIeData

一个WLAN_RAW_DATA结构指針,客户端配置可能包括提供信息和802.1X认证的要求,可以設為NULL。

XP SP2:  必須設為NULL.
pReserved

必須設為NULL.

 

獲取搜索到的無線網絡列表:

其中WlanGetAvailableNetworkList函數參數如下(MSDN):

hClientHandle

使用WlanOpenHandle函數獲得的客戶端句柄。

pInterfaceGuid

使用WlanEnumInterfaces函數得到的網絡接口GUID,指針類型。

dwFlags
值意思

WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES
0x00000001

包括所有可用的网络列表中特设的网络配置,包括配置文件不可见。

WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_MANUAL_HIDDEN_PROFILES
0x00000002

包括所有可用的网络列表中隐藏的网络配置,包括配置文件不可见。

pReserved

必須設為NULL.

ppAvailableNetworkList

一個WLAN_AVAILABLE_NETWORK_LIST結構指針的地址,用來接收找到的網絡信息列表,你隻需要給它一個空指針就可以,用完後調用WlanFreeMemory釋放它。

 

最後,設用WlanPrintInfo打印搜索到的信息:

 

 

初始化WlanAPI,本例中我是使用LoadLibrary和GetProcAddress調用Wlan API的。所以需要以下步驟: