Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.net中获取可用的wifi AP及其信号强度?_C#_.net_Networking_Mono_Wifi - Fatal编程技术网

C# 如何在.net中获取可用的wifi AP及其信号强度?

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

是否有任何方法可以使用.NET访问所有WiFi接入点及其各自的RSSI值?如果我能在不使用非托管代码的情况下完成它,那就太好了,如果它在mono和.NET中都能工作,那就更好了

如果可能的话,我会推荐一个代码示例。 谢谢


以下是我发现的几个类似问题:

-

-


-

您可以使用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);
        }
    }
}