• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++程序中使用Windows系统Native Wifi API的基本教程

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

作者:全速前行 字体:[增加 减小] 来源:互联网 时间:2017-05-28

全速前行 通过本文主要向大家介绍了c++程序设计,c++程序设计语言,c++程序设计 谭浩强,c++程序设计软件,c/c++程序设计教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Windows应用想要实现连接wifi,监听wifi信号,断开连接等功能,用NativeWifi API是个不错的选择。

打开MSDN,搜索NativeWifi Api,找到Native Wifi页。在这里。

信息量很大,如果像我着急实现上述功能,看海量的文档有些来不及。如果直接给我例子,在运行中调试,阅读代码,效率会更高。
但是,我并没有成功。首先,Sample在SDK中,参见这里。我下载几次都失败了,最后放弃这条路。后来同事给了我一份Sample,我不敢确定是否就是这个,但是代码写的也是很晦涩。我的初衷是简单的使用这些API的例子。

看来还是自己动手吧。看相关API,如果不懂,就找有经验人的例子。

几经周折,终于实现我的需求。让我慢慢道来。
1.获得可用AP列表
参见WlanGetAvailableNetworkList的官方文档,下面有例子。

DWORD WINAPI WlanGetAvailableNetworkList( 
 _In_  HANDLE hClientHandle, 
 _In_  const GUID *pInterfaceGuid, 
 _In_  DWORD dwFlags, 
 _Reserved_ PVOID pReserved, 
 _Out_  PWLAN_AVAILABLE_NETWORK_LIST *ppAvailableNetworkList 
); 
</div>

由可用列表便可以找到当前哪个AP正在连接,并显示信号强度。
2.监听当前连接
在获得可用AP列表的基础上,遍历当前AP,看谁正在连接,并取得它的信号。代码片段如下:

bool isConnect = false; 
int numberOfItems = pWLAN_AVAILABLE_NETWORK_LIST->dwNumberOfItems; 
  for(int i = 0; i <= numberOfItems; i++) 
  { 
   WLAN_AVAILABLE_NETWORK wlanAN = pWLAN_AVAILABLE_NETWORK_LIST->Network[i]; 
   if(wlanAN.dwFlags & WLAN_AVAILABLE_NETWORK_CONNECTED) 
   { 
    Wprintf(WLAN signal is %s:%d\n", wlanAN.strProfileName, wlanAN.wlanSignalQuality); 
    isConnect = true;     
   } 
  } 
  if(!isConnect){    
 wprintf("Wifi is disconnected!\n");} 
</div>

3.断开连接
如果wifi处于连接状态,将其断开。WlanDisconnect还是容易使用的。原型如下:

DWORD WINAPI WlanDisconnect( 
 _In_  HANDLE hClientHandle, 
 _In_  const GUID *pInterfaceGuid, 
 _Reserved_ PVOID pReserved 
); 
</div>

代码演示在后面。
4.连接一个有profile的AP(已保存过密码)
这是本文的重点。
虽然连接函数WlanConnect原型很简单:

DWORD WINAPI WlanConnect( 
 _In_  HANDLE hClientHandle, 
 _In_  const GUID *pInterfaceGuid, 
 _In_  const PWLAN_CONNECTION_PARAMETERS pConnectionParameters, 
 _Reserved_ PVOID pReserved 
); 

</div> 还好我的需求还是蛮简单的,只要连接已有的profile的AP。那么我的工作就会有针对性的开展。挫折了好多天,每次都连接失败,原因是ERROR_INVALID_PARAMETER。
就在今天,我终于成功了。真是会者不难,难者不会啊。
看看连接参数的结构体:
</div>
typedef struct _WLAN_CONNECTION_PARAMETERS { 
 WLAN_CONNECTION_MODE wlanConnectionMode; 
 LPCWSTR    strProfile; 
 PDOT11_SSID   pDot11Ssid; 
 PDOT11_BSSID_LIST pDesiredBssidList; 
 DOT11_BSS_TYPE  dot11BssType; 
 DWORD    dwFlags; 
} WLAN_CONNECTION_PARAMETERS, *PWLAN_CONNECTION_PARAMETERS; 
</div>

为了实现我的要求,可以这样赋值:
wlanConnectionMode这里设成wlan_connection_mode_profile;
strProfile写上你要连接ap的名称(通常是profile名称);
pDot11Ssid用不上,设置NULL;
pDesiredBssidList同样置成NULL;
dot11BssType我给设成dot11_BSS_type_infrastructure(基础设施?);
dwFlags设置为WLAN_CONNECTION_HIDDEN_NETWORK。
确实是工作了,strProfile如何获取呢?参见监听连接信号中对可用AP列表中第一个profile的获取。
完整代码如下:

// 
#include "stdafx.h" 
#include <windows.h> 
#include <wlanapi.h> 
#include <objbase.h> 
#include <wtypes.h> 
#include <string> 
#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") 
 
using namespace std; 
 
int listenStatus() 
{ 
 HANDLE hClient = NULL; 
 DWORD dwMaxClient = 2;   
 DWORD dwCurVersion = 0; 
 DWORD dwResult = 0; 
 DWORD dwRetVal = 0; 
 int iRet = 0; 
  
 WCHAR GuidString[39] = {0}; 
 //Listen the status of the AP you connected. 
 while(1){ 
  Sleep(5000); 
  PWLAN_INTERFACE_INFO_LIST pIfList = NULL;//I think wlan interface means network card 
  PWLAN_INTERFACE_INFO pIfInfo = NULL; 
 
  DWORD dwFlags = 0;   
  
  dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient); 
  if (dwResult != ERROR_SUCCESS) { 
   wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult); 
   return 1; 
  } 
 
  dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList); 
  if (dwResult != ERROR_SUCCESS) { 
   wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult); 
   return 1; 
  } else { 
 
   wprintf(L"WLAN_INTERFACE_INFO_LIST for this system\n"); 
 
   wprintf(L"Num Entries: %lu\n", pIfList->dwNumberOfItems); 
   wprintf(L"Current Index: %lu\n\n", pIfList->dwIndex); 
   int i; 
   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)); 
 
    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; 
    } 
   } 
  } 
 } 
} 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 
 HANDLE hClient = NULL; 
 DWORD dwMaxClient = 2;   
 DWORD dwCurVersion = 0; 
 DWORD dwResult = 0; 
 DWORD dwRetVal = 0; 
 int iRet = 0;  
 
 /* variables used for WlanEnumInterfaces */ 
 
 PWLAN_INTERFACE_INFO_LIST pIfList = NULL; 
 PWLAN_INTERFACE_INFO pIfInfo = NULL; 
 
 LPCWSTR pProfileName = NULL; 
 LPWSTR pProfileXml = NULL; 
 DWORD dwFlags = 0; 
  
 pProfileName = argv[1]; 
  
 wprintf(L"Information for profile: %ws\n\n", pProfileName); 
  
 dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient); 
 if (dwResult != ERROR_SUCCESS) { 
  wprintf(L"W



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++ 端口扫描程序实现案例
  • C++ 将文件数据一次性加载进内存实例代码
  • C++语言数据结构 串的基本操作实例代码
  • C++中实现把表的数据导出到EXCEL并打印实例代码
  • C++程序设计-五子棋
  • C++语言实现hash表详解及实例代码
  • C++语言 STL容器list总结
  • VC++实现文件与应用程序关联的方法(注册表修改)
  • C/C++程序编译流程详解
  • C++基础学生管理系统

相关文章

  • 2017-05-28VC实现对话框窗口任意分割
  • 2017-05-28C++中CSimpleList的实现与测试实例
  • 2017-05-28c语言打印输出双引号的方法示例
  • 2017-05-28关于C语言指针赋值的问题详解
  • 2017-05-28C++ 中dynamic_cast&lt;&gt;的使用方法小结
  • 2017-05-28C++学习小结之语句
  • 2017-05-28jQuery移动页面开发中主题按钮的设计示例
  • 2017-05-28C++ 学习之旅三 我和超级玛丽有个约会
  • 2017-05-28c++ builder TreeView控件节点遍历代码
  • 2017-05-28C语言实现数据结构和双向链表操作

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 判断指定的进程或程序是否存在方法小结(vc等)
    • C数据结构之单链表详细示例分析
    • C数据结构循环链表实现约瑟夫环
    • C++通过TerminateProess结束进程实例
    • 浅析C语言中的数组及字符数组
    • C++ 关于MFC List Control 控件的总结
    • 引用参数和传值参数的区别深入解析
    • 解析bitmap处理海量数据及其实现方法分析
    • C语言中求余弦值的相关函数总结
    • C++设计模式之观察者模式

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有