C# 如何在.net中获取可用的wifi AP及其信号强度?
是否有任何方法可以使用.NET访问所有WiFi接入点及其各自的RSSI值?如果我能在不使用非托管代码的情况下完成它,那就太好了,如果它在mono和.NET中都能工作,那就更好了 如果可能的话,我会推荐一个代码示例。 谢谢C# 如何在.net中获取可用的wifi AP及其信号强度?,c#,.net,networking,mono,wifi,C#,.net,Networking,Mono,Wifi,是否有任何方法可以使用.NET访问所有WiFi接入点及其各自的RSSI值?如果我能在不使用非托管代码的情况下完成它,那就太好了,如果它在mono和.NET中都能工作,那就更好了 如果可能的话,我会推荐一个代码示例。 谢谢 以下是我发现的几个类似问题: - - -您可以使用WMI查询来实现它。看看这个。如果您使用的vista wmi不能与所有网络适配器一起使用,vista的另一种选择是使用netsh命令。查看所有Vista和XP SP3系统上的使用本机Wifi API。xpsp2有一个不同的AP
以下是我发现的几个类似问题: - -
-您可以使用WMI查询来实现它。看看这个。如果您使用的vista wmi不能与所有网络适配器一起使用,vista的另一种选择是使用netsh命令。查看所有Vista和XP SP3系统上的使用本机Wifi API。xpsp2有一个不同的API,你可以用它做同样的事情
这是一个包装器项目,在c#at中使用托管代码 它支持Windows Vista和XP SP2(或更高版本) 示例代码:
using NativeWifi;
using System;
using System.Text;
namespace WifiExample
{
class Program
{
/// <summary>
/// Converts a 802.11 SSID to a string.
/// </summary>
static string GetStringForSSID(Wlan.Dot11Ssid ssid)
{
return Encoding.ASCII.GetString( ssid.SSID, 0, (int) ssid.SSIDLength );
}
static void Main( string[] args )
{
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 )
{
if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP )
{
Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
}
}
// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach ( Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles() )
{
string name = profileInfo.profileName; // this is typically the network's SSID
string xml = wlanIface.GetProfileXml( profileInfo.profileName );
}
// Connects to a known network with WEP security
string profileName = "Cheesecake"; // this is also the SSID
string mac = "52544131303235572D454137443638";
string key = "hello";
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>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</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);
wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml, true );
wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );
}
}
}
}
使用NativeWifi;
使用制度;
使用系统文本;
名称空间wifie示例
{
班级计划
{
///
///将802.11 SSID转换为字符串。
///
静态字符串GetStringForSSID(Wlan.Dot11Ssid ssid)
{
返回Encoding.ASCII.GetString(ssid.ssid,0,(int)ssid.SSIDLength);
}
静态void Main(字符串[]参数)
{
WlanClient client=新的WlanClient();
foreach(客户端接口中的WlanClient.WlanInterface-wlanface)
{
//列出具有WEP安全性的所有网络
Wlan.WlanAvailableNetwork[]networks=wlanIface.GetAvailableNetworkList(0);
foreach(Wlan.WLA网络中的可用网络)
{
if(network.dot11defaultciperalgorithm==Wlan.dot11ciperalgorithm.WEP)
{
WriteLine(“找到SSID为{0}的WEP网络”,GetStringForSSID(network.dot11Ssid));
}
}
//检索现有配置文件的XML配置。
//这可以帮助您构建自己的XML配置
//(也就是说,它将为您提供一个可以遵循的示例)。
foreach(wlanIface.GetProfiles()中的Wlan.WlanProfileInfo)
{
string name=profileInfo.profileName;//这通常是网络的SSID
字符串xml=wlanIface.GetProfileXml(profileInfo.profileName);
}
//使用WEP安全性连接到已知网络
string profileName=“Cheesecake”;//这也是SSID
字符串mac=“52544131303235572D4541374443638”;
string key=“你好”;
string profileXml=string.Format(“{0}{1}{0}ESSopenWEPfalsenetworkKeyfalse{2}0”,profileName,mac,key);
SetProfile(Wlan.WlanProfileFlags.AllUser,profileXml,true);
wlanIface.Connect(Wlan.WlanConnectionMode.Profile,Wlan.Dot11BssType.Any,profileName);
}
}
}
}
我找到了另一种方法,尽管它确实需要一些钱
有一个.NET库可供使用,它可以让您获得以太网驱动程序 我正在从C#code运行一个命令
netsh wlan show networks mode=bssid
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.IO;
使用System.Linq;
运用系统反思;
使用系统文本;
使用System.Text.RegularExpressions;
使用System.Threading.Tasks;
名称空间控制台EApp2
{
类访问点
{
公共字符串SSID{get;set;}
公共字符串BSSID{get;set;}
公共字节信号{get;set;}
}
班级计划
{
专用静态异步任务主(字符串[]args)
{
var apList=等待GetSignalOfNetworks();
foreach(apList中的var ap)
{
写线($“{ap.BSSID}-{ap.Signal}-{ap.SSID}”);
}
Console.ReadKey();
}
专用静态异步任务GetSignalOfNetworks()
{
字符串结果=等待ExecuteProcessAsync(@“C:\Windows\System32\netsh.exe”,“wlan显示网络模式=bssid”);
返回Regex.Split(结果@“[^B]SSID\d+”)。跳过(1)。选择many(网络=>GetAccessPointFromNetwork(网络)).ToArray();
}
专用静态访问点[]GetAccessPointFromNetwork(字符串网络)
{
字符串withoutLineBreaks=Regex.Replace(网络,@“[\r\n]+”,“”)。Trim();
字符串ssid=Regex.Replace(withoutLineBreaks,@“^:\s+(\s+).*$”,“$1”).Trim();
返回Regex.Split(withoutLineBreaks,@“\s{4}BSSID\d+”)。跳过(1)。选择(ap=>GetAccessPoint(ssid,ap)).ToArray();
}
私有静态访问点GetAccessPoint(字符串ssid,字符串ap)
{
字符串withoutLineBreaks=Regex.Replace(ap,@“[\r\n]+”,“”)。Trim();
字符串bssid=Regex.Replace(withoutLineBreaks,@“^:\s+([a-f0-9]{2}(:[a-f0-9]{2}){5})。*$”,“$1”).Trim();
byte signal=byte.Parse(Regex.Replace(withoutLineBreaks,@“^.*(signal | Sinal)\s+:\s+(\d+)%.*$”,“$2”).Trim();
返回新访问点
{
SSID=SSID,
BSSID=BSSID,
信号=信号,
};
}
专用静态异步任务ExecuteProcessAsync(字符串cmd,字符串args=null)
{
var进程=新进程()
{
StartInfo=新流程StartInfo
{
FileName=cmd,
参数=args,
重定向标准输入=false,
重定向标准输出=真,
RedirectStandardError=true,
UseShellExecute=false,
Cre
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace ConsoleApp2
{
class AccessPoint
{
public string SSID { get; set; }
public string BSSID { get; set; }
public byte Signal { get; set; }
}
class Program
{
private static async Task Main(string[] args)
{
var apList = await GetSignalOfNetworks();
foreach (var ap in apList)
{
WriteLine($"{ap.BSSID} - {ap.Signal} - {ap.SSID}");
}
Console.ReadKey();
}
private static async Task<AccessPoint[]> GetSignalOfNetworks()
{
string result = await ExecuteProcessAsync(@"C:\Windows\System32\netsh.exe", "wlan show networks mode=bssid");
return Regex.Split(result, @"[^B]SSID \d+").Skip(1).SelectMany(network => GetAccessPointFromNetwork(network)).ToArray();
}
private static AccessPoint[] GetAccessPointFromNetwork(string network)
{
string withoutLineBreaks = Regex.Replace(network, @"[\r\n]+", " ").Trim();
string ssid = Regex.Replace(withoutLineBreaks, @"^:\s+(\S+).*$", "$1").Trim();
return Regex.Split(withoutLineBreaks, @"\s{4}BSSID \d+").Skip(1).Select(ap => GetAccessPoint(ssid, ap)).ToArray();
}
private static AccessPoint GetAccessPoint(string ssid, string ap)
{
string withoutLineBreaks = Regex.Replace(ap, @"[\r\n]+", " ").Trim();
string bssid = Regex.Replace(withoutLineBreaks, @"^:\s+([a-f0-9]{2}(:[a-f0-9]{2}){5}).*$", "$1").Trim();
byte signal = byte.Parse(Regex.Replace(withoutLineBreaks, @"^.*(Signal|Sinal)\s+:\s+(\d+)%.*$", "$2").Trim());
return new AccessPoint
{
SSID = ssid,
BSSID = bssid,
Signal = signal,
};
}
private static async Task<string> ExecuteProcessAsync(string cmd, string args = null)
{
var process = new Process()
{
StartInfo = new ProcessStartInfo
{
FileName = cmd,
Arguments = args,
RedirectStandardInput = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
StandardOutputEncoding = Encoding.UTF8,
}
};
process.Start();
string result = await process.StandardOutput.ReadToEndAsync();
process.WaitForExit();
#if DEBUG
if (result.Trim().Contains("The Wireless AutoConfig Service (wlansvc) is not running."))
{
return await GetFakeData();
}
#endif
return result;
}
private static async Task<string> GetFakeData()
{
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "ConsoleApp2.FakeData.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
using (StreamReader reader = new StreamReader(stream))
{
return await reader.ReadToEndAsync();
}
}
private static void WriteLine(string str)
{
Console.WriteLine(str);
}
}
}