C++程序中使用Windows系统Native Wifi API的基本教程

2020-01-06 14:45:31丽君

 
5.打开网络设置界面
遇到以前没有连接过的AP,需要输入密码,那么,直接打开配置界面让用户自己来搞吧。


ShellExecute( 
 NULL, 
 L"open", 
 L"shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}::{38a98528-6cbf-4ca9-8dc0-b1e1d10f7b1b}", 
 NULL, 
 NULL, 
 SW_SHOWNORMAL); 

6.RSSI
当屏幕上打印出“WlanConnect success!”的时候,别提多高兴了。
就像爱迪生试验灯丝一下,在无数次失败后,终于找到了一种材料可以胜任灯丝的工作。这种喜悦真的令人振奋,往日的阴霾和不爽终于一扫而光。
其实我也尝试过WlanGetProfile和WlanSetProfile,虽然有时结果是能够连上指定AP,但是函数返回结果却总是ERROR_INVALID_PARAMETER。
网上的例子,很多都是抄来抄去的,写的不明不白,虽然有过帮助,但是也有些误导。
今天自己成功的连接到指定AP了(用命令行运行我的例子,输入参数profile name),我一定要把它发表出来,让其他人有个参考。
我认为这是一件诚意的作品,在此也谢谢给过我帮助的朋友。
最后说一下获得的信号。标准信号RSSI是负值,而这里获得的信号都是正值(0~100),在有些需要RSSI的地方,我们需要转换一下:


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); 

     
7.Wifi on与wifi off
下面要说的是在软件层面控制无线网卡的开和关。
问题听起来简单,调查起来复杂,但解决起来却也简单。关键函数便是Native wifi api中的WlanSetInterface。其实这个API功能也是非
常强大的,我只用到其中控制wifi radio state的功能。官网文档在此。
函数原型:


DWORD WINAPI WlanSetInterface( 
 _In_  HANDLE hClientHandle, 
 _In_  const GUID *pInterfaceGuid, 
 _In_  WLAN_INTF_OPCODE OpCode, 
 _In_  DWORD dwDataSize, 
 _In_  const PVOID pData, 
 _Reserved_ PVOID pReserved 
); 

重点说一下三个参数:
(1) OpCode,指定要设置的参数。我们选择wlan_intf_opcode_radio_state
(2) DwDataSize,pData的size。传入时用sizeof得到。
(3) pData,radio state对应的data是WLAN_PHY_RADIO_STATE。
看看这个state结构体:


typedef struct _WLAN_PHY_RADIO_STATE { 
 DWORD    dwPhyIndex; 
 DOT11_RADIO_STATE dot11SoftwareRadioState; 
 DOT11_RADIO_STATE dot11HardwareRadioState; 
} WLAN_PHY_RADIO_STATE, *PWLAN_PHY_RADIO_STATE;