我正在编写一个小型网络管理工具。为了了解各种WiFi网络的详细信息,我正在调用wlanapi.dll, WlanGetProfile(...)
API方法来获取每个可用WiFi网络的配置文件信息。
假设两个本地WiFi网络具有类似的SSID,我如何查询这两个网络上的信息,并在向用户提供信息时区分这两个网络?
我正在使用C#编写我的应用程序,但是,如果他们能够提供我需要的答案,则可以提供非特定于代码的通用详细信息。但是,我将其标记为C#/ .Net,因为如果有办法使用本机.Net库获取此信息,我会感谢C#代码示例。
答案 0 :(得分:5)
正如其他人所说,2个Wi-Fi网络可以具有相同的ESSID(SSID)但不具有相同的BSSID(Mac地址)。所以你可以通过MAC地址来区分这两者。
要获取MAC地址以便向用户显示信息,有两种方法。
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);
}
}
通过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连接的情况下的输出:
捕获输出时,您可以向用户显示所需的信息。
答案 1 :(得分:4)
没有检测到具有相同SSID的少数网络的原因,因为它们具有不同的MAC。
然而,它看起来没有办法连接到选定的一个,因为无法在连接时指定MAC。
答案 2 :(得分:1)
此代码项目示例如此相同的链接:A-Vista-Wireless-Network-Scanner
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地址供您检查。