如何重置 WLAN 信息的系统缓存?
How do i reset the system cache of WLAN info?
我正在尝试使用 C# 中的 NativeWifi 编写 WLAN 指纹识别程序。为此,我 运行 循环多次获取 wlan 信息,然后使用 matlab 对数据进行平均/分析。
问题是当程序运行 运行ning 时,即使我在房子里四处走动,我也得到了所有相同的值。从互联网上我看到有一个缓存可以存储可用网络的数据。我想知道是否有一个系统调用可以重置这个缓存。
我也看到过使用 cmd 调用
netsh wlan show networks mode=bssid
这给了我相同的值,直到我在 OS 中打开可用的 wifi 网络,如果我再次 运行 它,它会给出不同的值。
编辑:这个系统将仅供我使用,所以如果有一个已知的库可以为我处理这个问题,我会很乐意在 linux 平台上重新开始。不过,我什至不知道如何 google 来获取信息。与 "network cache" 相关的任何内容都需要我帮助不相关主题的线程...
我将在下面提供我的代码的相关部分:
public void get_info_instance(StreamWriter file)
{
try
{
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
Wlan.WlanBssEntry[] wlanBssEntries = wlanIface.GetNetworkBssList();
foreach (Wlan.WlanBssEntry network in wlanBssEntries)
{
int rss = network.rssi;
byte[] macAddr = network.dot11Bssid;
string tMac = "";
for (int i = 0; i < macAddr.Length; i++)
{
tMac += macAddr[i].ToString("x2").PadLeft(2, '0').ToUpper();
}
file.WriteLine("Found network: " + System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).ToString());
file.WriteLine("Signal: " + network.linkQuality + "%");
file.WriteLine("BSS Type: " + network.dot11BssType + ".");
file.WriteLine("RSSID: " + rss.ToString());
file.WriteLine("BSSID: " + tMac);
file.WriteLine(" ");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
全部
netsh wlan delete profile name=* i=*
您可能不想在所有界面上都这样做,并在其中对界面进行硬编码以获得更快的结果
在内部,netsh 由 this API 提供支持。这意味着调用 netsh wlan show networks mode=bssid 只是 returns 上次扫描期间出现的网络缓存。这就是您的发现。
这意味着为了刷新这个缓存,你需要触发一次扫描。如果您正在使用的 C# 库包含它,您可以通过调用 WlanScan. I am not sure which C# wrapper you are using, but it probably includes this function. When you get a scan complete notification(向源 WLAN_NOTIFICATION_SOURCE_ACM 注册并查找 wlan_notification_acm_scan_list_refresh)按需实现,缓存应该是已更新。
如果您让我知道您使用的是哪个 C# 库,也许我可以为您指出相关函数。
您提到打开可用网络会导致缓存刷新。这是因为打开可用网络会触发对 WlanScan 的调用。
配置文件与可用网络列表无关 -- 配置文件是 Wlan 服务用来跟踪您的计算机上配置了哪些网络的内容 -- 删除它们不会使 WlanSvc 再次扫描。删除它们恰好与扫描同时发生可能是巧合,但它比设计用途更多的是副作用。
编辑:要使用您正在使用的托管 Wifi API 订阅通知,此代码段应该有效:
wlanIface.WlanNotification += wlanIface_WlanNotification;
和回调:
static void wlanIface_WlanNotification(Wlan.WlanNotificationData notifyData)
{
if (notifyData.notificationCode == (int)Wlan.WlanNotificationCodeAcm.ScanComplete)
{
Console.WriteLine("Scan Complete!");
}
}
您可以通过 运行 进行测试,然后在 Windows 上打开可用网络。每次打开它后不久,您应该会看到 "Scan Complete"。如果您愿意,可以使用消息框代替 Console.WriteLine。
要自己触发扫描:
wlanIface.Scan();
我正在尝试使用 C# 中的 NativeWifi 编写 WLAN 指纹识别程序。为此,我 运行 循环多次获取 wlan 信息,然后使用 matlab 对数据进行平均/分析。
问题是当程序运行 运行ning 时,即使我在房子里四处走动,我也得到了所有相同的值。从互联网上我看到有一个缓存可以存储可用网络的数据。我想知道是否有一个系统调用可以重置这个缓存。
我也看到过使用 cmd 调用
netsh wlan show networks mode=bssid
这给了我相同的值,直到我在 OS 中打开可用的 wifi 网络,如果我再次 运行 它,它会给出不同的值。
编辑:这个系统将仅供我使用,所以如果有一个已知的库可以为我处理这个问题,我会很乐意在 linux 平台上重新开始。不过,我什至不知道如何 google 来获取信息。与 "network cache" 相关的任何内容都需要我帮助不相关主题的线程...
我将在下面提供我的代码的相关部分:
public void get_info_instance(StreamWriter file)
{
try
{
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
Wlan.WlanBssEntry[] wlanBssEntries = wlanIface.GetNetworkBssList();
foreach (Wlan.WlanBssEntry network in wlanBssEntries)
{
int rss = network.rssi;
byte[] macAddr = network.dot11Bssid;
string tMac = "";
for (int i = 0; i < macAddr.Length; i++)
{
tMac += macAddr[i].ToString("x2").PadLeft(2, '0').ToUpper();
}
file.WriteLine("Found network: " + System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).ToString());
file.WriteLine("Signal: " + network.linkQuality + "%");
file.WriteLine("BSS Type: " + network.dot11BssType + ".");
file.WriteLine("RSSID: " + rss.ToString());
file.WriteLine("BSSID: " + tMac);
file.WriteLine(" ");
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
全部
netsh wlan delete profile name=* i=*
您可能不想在所有界面上都这样做,并在其中对界面进行硬编码以获得更快的结果
在内部,netsh 由 this API 提供支持。这意味着调用 netsh wlan show networks mode=bssid 只是 returns 上次扫描期间出现的网络缓存。这就是您的发现。
这意味着为了刷新这个缓存,你需要触发一次扫描。如果您正在使用的 C# 库包含它,您可以通过调用 WlanScan. I am not sure which C# wrapper you are using, but it probably includes this function. When you get a scan complete notification(向源 WLAN_NOTIFICATION_SOURCE_ACM 注册并查找 wlan_notification_acm_scan_list_refresh)按需实现,缓存应该是已更新。
如果您让我知道您使用的是哪个 C# 库,也许我可以为您指出相关函数。
您提到打开可用网络会导致缓存刷新。这是因为打开可用网络会触发对 WlanScan 的调用。
配置文件与可用网络列表无关 -- 配置文件是 Wlan 服务用来跟踪您的计算机上配置了哪些网络的内容 -- 删除它们不会使 WlanSvc 再次扫描。删除它们恰好与扫描同时发生可能是巧合,但它比设计用途更多的是副作用。
编辑:要使用您正在使用的托管 Wifi API 订阅通知,此代码段应该有效:
wlanIface.WlanNotification += wlanIface_WlanNotification;
和回调:
static void wlanIface_WlanNotification(Wlan.WlanNotificationData notifyData)
{
if (notifyData.notificationCode == (int)Wlan.WlanNotificationCodeAcm.ScanComplete)
{
Console.WriteLine("Scan Complete!");
}
}
您可以通过 运行 进行测试,然后在 Windows 上打开可用网络。每次打开它后不久,您应该会看到 "Scan Complete"。如果您愿意,可以使用消息框代替 Console.WriteLine。
要自己触发扫描:
wlanIface.Scan();