C#编@程@使@用@Ma@n@a@g@ed@ W@i@f@i A@PI连@接@无@线@S@S@I@D

2024-06-18 15:38
文章标签 c# .net pi netcore ma ed

本文主要是介绍C#编@程@使@用@Ma@n@a@g@ed@ W@i@f@i A@PI连@接@无@线@S@S@I@D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

操作步骤很简单:

1.下载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的引用。


 

3.编写代码,引用“Native Wifi API”。

关键代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
using System;
using System.Collections.Generic;
using System.Text;
using NativeWifi;
  
  
namespace ManagedWifiExample
{
     class MyWifi
     {
         public List<WIFISSID> ssids = new List<WIFISSID>();
  
         public MyWifi()
         {
             ssids.Clear();
         }
  
  
         static string GetStringForSSID(Wlan.Dot11Ssid ssid)
         {
             return Encoding.UTF8.GetString(ssid.SSID, 0, ( int )ssid.SSIDLength);
         }
  
         /// <summary>
         /// 枚举所有无线设备接收到的SSID
         /// </summary>
         public void ScanSSID()
         {
             WlanClient client = new WlanClient();
             foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
             {
                 // Lists all networks with WEP security
                 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
                 foreach (Wlan.WlanAvailableNetwork network in networks)
                 {
                     WIFISSID targetSSID = new WIFISSID();
  
                     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
  
  
         /// <summary>
         /// 连接到未加密的SSID
         /// </summary>
         /// <param name="ssid"></param>
         public void ConnectToSSID(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\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>New{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", profileName, mac, key);
             //string profileXml2 = "<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>Hacker SSID</name><SSIDConfig><SSID><hex>54502D4C494E4B5F506F636B657441505F433844323632</hex><name>TP-LINK_PocketAP_C8D262</name></SSID>        </SSIDConfig>        <connectionType>ESS</connectionType><connectionMode>manual</connectionMode><MSM> <security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>";
             //wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml2, true );
             //wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );
             string myProfileXML = string .Format( "<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>manual</connectionMode><MSM><security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>" , profileName, mac);
             ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML, true );
             ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
             //Console.ReadKey();
         }
  
         /// <summary>
         /// 字符串转Hex
         /// </summary>
         /// <param name="str"></param>
         /// <returns></returns>
         public static string StringToHex( string str)
         {
             StringBuilder sb = new StringBuilder();
             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());
         }
     }
  
     class WIFISSID
     {
         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,并支持接入开放认证(无密码)的无线热点。


5.其它

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

http://www.microsoft.com/networking/WLAN/profile/v1

这篇关于C#编@程@使@用@Ma@n@a@g@ed@ W@i@f@i A@PI连@接@无@线@S@S@I@D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

C#中Guid类使用小结

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

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字