【问题标题】:C# Get MAC Address from the Access Point I am connected toC# 从我连接的接入点获取 MAC 地址
【发布时间】:2020-01-16 11:17:49
【问题描述】:

这是我的第一篇文章。

我正在用 C# .NET Framework 4.6.1 编写程序。我需要以某种方式从设备连接的接入点获取 BSSID(MAC 地址),然后将其放入字符串变量中。

我已经在互联网上搜索了几个小时。但是我发现的所有内容都给了我所有接入点的列表。 一些解决方案尝试从 CMD 命令“netsh wlan show interfaces”解析,但似乎无法正常工作。此外,我不喜欢解析方法,它很丑陋,而且对性能一点也不友好。

如果有人对此有解决方案并且可以分享它,那就太好了。

最好的问候 恩里克

从这里的另一个用户那里尝试了下面的代码,但它似乎没有任何回报。返回是空的,例如函数 GetAccessPoint 甚至没有被触发。 (这是我发现的唯一似乎合理的解析解决方案),但正如我所说,我想远离解析。

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();

        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);
    }
}

}

【问题讨论】:

  • BSSID 和 MAC 不一样...
  • 当您尝试解析 cmd 输出时,什么不起作用?
  • 在帖子中添加了信息。 ;)

标签: c# .net networking netsh access-point


【解决方案1】:

经过反复试验,我找到了一个简单的解决方案 =D

class Program
{
    static void Main(string[] args)
    {
        var wlanClient = new WlanClient();
        foreach (WlanClient.WlanInterface wlanInterface in wlanClient.Interfaces)
        {
            var test = wlanInterface.CurrentConnection.wlanAssociationAttributes.Dot11Bssid;
            Console.WriteLine(test);
        }

        Console.ReadKey();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多