如果存在两个具有类似SSID的WiFi网络,您如何区分代码中的两个?

时间:2018-04-04 17:30:06

标签: c# .net network-programming ssid wlanapi

我正在编写一个小型网络管理工具。为了了解各种WiFi网络的详细信息,我正在调用wlanapi.dll, WlanGetProfile(...) API方法来获取每个可用WiFi网络的配置文件信息。

假设两个本地WiFi网络具有类似的SSID,我如何查询这两个网络上的信息,并在向用户提供信息时区分这两个网络?

我正在使用C#编写我的应用程序,但是,如果他们能够提供我需要的答案,则可以提供非特定于代码的通用详细信息。但是,我将其标记为C#/ .Net,因为如果有办法使用本机.Net库获取此信息,我会感谢C#代码示例。

4 个答案:

答案 0 :(得分:5)

正如其他人所说,2个Wi-Fi网络可以具有相同的ESSID(SSID)但不具有相同的BSSID(Mac地址)。所以你可以通过MAC地址来区分这两者。

要获取MAC地址以便向用户显示信息,有两种方法。

1。 Managed Wifi API

var wlanClient = new WlanClient();
foreach (WlanClient.WlanInterface wlanInterface in wlanClient.Interfaces)
{
    Wlan.WlanBssEntry[] wlanBssEntries = wlanInterface.GetNetworkBssList();
    foreach (Wlan.WlanBssEntry wlanBssEntry in wlanBssEntries)
    {
        byte[] macAddr = wlanBssEntry.dot11Bssid;
        var macAddrLen = (uint) macAddr.Length;
        var str = new string[(int) macAddrLen];
        for (int i = 0; i < macAddrLen; i++)
        {
            str[i] = macAddr[i].ToString("x2");
        }
        string mac = string.Join("", str);
        Console.WriteLine(mac);
    }
}
  1. 的Process.Start / Cmd的
  2. 通过Process.Start / Cmd执行一些命令:

    using System;
    using System.Diagnostics;
    
    class Program
    {
        static void Main(string[] args)
        {       
            Process proc = new Process();
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.FileName = "cmd";
    
            proc.StartInfo.Arguments = @"/C ""netsh wlan show networks mode=bssid | findstr BSSID """;
    
            proc.StartInfo.RedirectStandardOutput = true;       
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            string output = proc.StandardOutput.ReadToEnd();
            proc.WaitForExit(); 
    
            Console.WriteLine(output); 
        }   
    }
    

    还可以使用第2点的代码执行第三个命令,这个命令非常详细。您将不得不操纵字符串以从中提取信息。

    netsh wlan show all 
    

    它非常实用且详细,这就是您所描述的具有相同SSID的多个Wi-Fi连接的情况下的输出:

    wifi

    捕获输出时,您可以向用户显示所需的信息。

答案 1 :(得分:4)

没有检测到具有相同SSID的少数网络的原因,因为它们具有不同的MAC。

然而,它看起来没有办法连接到选定的一个,因为无法在连接时指定MAC。

答案 2 :(得分:1)

此代码项目示例如此相同的链接:A-Vista-Wireless-Network-Scanner

enter image description here

Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.FileName = "netsh";
proc.StartInfo.Arguments = "wlan show networks mode=bssid";
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();

使用mac连接:

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

答案 3 :(得分:0)

具有相同SSID的不同网络仍将具有不同的MAC地址。

这也适用于同一网络的不同接入点。

不幸的是我不知道如何查询MAC地址供您检查。