wifinative.java_C#编程使用Managed Wifi API连接无线SSID

2023-10-11 19:40

本文主要是介绍wifinative.java_C#编程使用Managed Wifi API连接无线SSID,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在windows平台下,可以使用native wifi api来控制无线网卡,包括获取无线网卡参数,获取周围无线接入点参数等功能,在windows xp sp2版本的系统上,使用需要下载一个KB918997补丁包才能支持,下载地址如下:http://support.microsoft.com/kb/918997/en-us。而在xp sp3、vista、win7等高版本操作系统中,已经包含了此库,所以可以直接使用。

使用的api最好的文档当然是MSDN,地址如下:http://msdn.microsoft.com/en-us/library/ms706275(v=VS.85).aspx。里面详细介绍所用到的枚举类型、结构体、函数等,并且提供了非常好的实例代码。

如何用C#去操作无线网卡连接无线网络一直是个人学习过程中的一大困惑。好在最近成功解决了这个问题。最近在写一个中国电信ChinaNet无线热点自动连接工具,期间用到了Managed Wifi API,使用起来很是方便。

操作步骤很简单:

关于Managed Wifi API:This project is a .NET class library allowing you to control Wifi (802.11) network adapters installed in your Windows machine programmatically.

The library uses the Native Wifi API, available since Windows Vista and Windows XP SP2 (in a limited fashion, and only after applying a hotfix provided in KB article 918997). Older versions of Windows are not supported.

2.创建C#工程文件,并添加对ManagedWifi.dll的引用。

ManagedWifi-dll.png

3.编写代码,引用“Native Wifi API”。 关键代码如下:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingNativeWifi;namespaceManagedWifiExample

{classMyWifi

{public List ssids = new List();publicMyWifi()

{

ssids.Clear();

}static stringGetStringForSSID(Wlan.Dot11Ssid ssid)

{return Encoding.UTF8.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);

}///

///枚举所有无线设备接收到的SSID///

public voidScanSSID()

{

WlanClient client= newWlanClient();foreach (WlanClient.WlanInterface wlanIface inclient.Interfaces)

{//Lists all networks with WEP security

Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);foreach (Wlan.WlanAvailableNetwork network innetworks)

{

WIFISSID targetSSID= newWIFISSID();

targetSSID.wlanInterface=wlanIface;

targetSSID.wlanSignalQuality= (int)network.wlanSignalQuality;

targetSSID.SSID=GetStringForSSID(network.dot11Ssid);//targetSSID.SSID = Encoding.Default.GetString(network.dot11Ssid.SSID, 0, (int)network.dot11Ssid.SSIDLength);

targetSSID.dot11DefaultAuthAlgorithm =network.dot11DefaultAuthAlgorithm.ToString();

targetSSID.dot11DefaultCipherAlgorithm=network.dot11DefaultCipherAlgorithm.ToString();

ssids.Add(targetSSID);//if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP )//{//Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));//}//Console.WriteLine("Found network with SSID {0}.", GetStringForSSID(network.dot11Ssid));//Console.WriteLine("dot11BssType:{0}.", network.dot11BssType.ToString());//Console.WriteLine("dot11DefaultAuthAlgorithm:{0}.", network.dot11DefaultAuthAlgorithm.ToString());//Console.WriteLine("dot11DefaultCipherAlgorithm:{0}.", network.dot11DefaultCipherAlgorithm.ToString());//Console.WriteLine("dot11Ssid:{0}.", network.dot11Ssid.ToString());//Console.WriteLine("flags:{0}.", network.flags.ToString());//Console.WriteLine("morePhyTypes:{0}.", network.morePhyTypes.ToString());//Console.WriteLine("networkConnectable:{0}.", network.networkConnectable.ToString());//Console.WriteLine("numberOfBssids:{0}.", network.numberOfBssids.ToString());//Console.WriteLine("profileName:{0}.", network.profileName.ToString());//Console.WriteLine("wlanNotConnectableReason:{0}.", network.wlanNotConnectableReason.ToString());//Console.WriteLine("wlanSignalQuality:{0}.", network.wlanSignalQuality.ToString());//Console.WriteLine("-----------------------------------");//Console.WriteLine(network.ToString());

}

}

}//EnumSSID

///

///连接到未加密的SSID///

///

public voidConnectToSSID(WIFISSID ssid)

{//Connects to a known network with WEP security

string profileName = ssid.SSID; //this is also the SSID

string mac = StringToHex(profileName); //

//string key = "";//string profileXml = string.Format("<?xml version=\"1.0\"?>{0}{1}New{0}ESSopennonefalsenetworkKeyfalse{2}0", profileName, mac, key);//string profileXml2 = "<?xml version=\"1.0\"?>Hacker SSID54502D4C494E4B5F506F636B657441505F433844323632TP-LINK_PocketAP_C8D262ESSmanualopennonefalse";//wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml2, true );//wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );

string myProfileXML = string.Format("<?xml version=\"1.0\"?>{0}{1}{0}ESSmanualopennonefalse", profileName, mac);

ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML,true);

ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);//Console.ReadKey();

}///

///字符串转Hex///

///

///

public static string StringToHex(stringstr)

{

StringBuilder sb= newStringBuilder();byte[] byStr = System.Text.Encoding.Default.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)

for (int i = 0; i < byStr.Length; i++)

{

sb.Append(Convert.ToString(byStr[i],16));

}return(sb.ToString().ToUpper());

}

}classWIFISSID

{public string SSID = "NONE";public string dot11DefaultAuthAlgorithm = "";public string dot11DefaultCipherAlgorithm = "";public bool networkConnectable = true;public string wlanNotConnectableReason = "";public int wlanSignalQuality = 0;public WlanClient.WlanInterface wlanInterface = null;

}

}

4.示例程序允许枚举当前网卡接收到的所有无线SSID,并支持接入开放认证(无密码)的无线热点。

ManagedWifi-example.png

5.其它

Wifi XML配置文件请参考微软文档

===============================================

转载后个人遇到的问题:

设置WIFI密码后,不能设置和打开WIFI连接问题解决方案:

需要修改profileXml中的配置信息,要和WIFI设置的一样,不然不能设置和访问WIFI的哦!【个人测试经验】

本人的设置

string profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?>{0}{0}ESSautofalseWPAPSKAESfalsepassPhrasefalse{1}", profileName, key);

==================================================

这篇关于wifinative.java_C#编程使用Managed Wifi API连接无线SSID的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/190378

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具