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;










