如何重置 WLAN 信息的系统缓存

本文关键字:系统 缓存 信息 何重置 WLAN | 更新日期: 2023-09-27 17:55:16

我正在尝试使用C#中的NativeWifi编写WLAN指纹识别程序。为此,我运行一个循环来多次获取 wlan 信息,然后使用 matlab 来平均/分析数据。

问题是,当程序运行时,即使我在房子里走动,我也会得到所有相同的值。从互联网上,我看到有一个缓存可以存储可用网络的数据。我想知道是否有系统调用可以重置此缓存。

我也使用 cmd 调用看到了这一点

Netsh WLAN 显示网络模式=BSSID

这给了我相同的值,直到我在操作系统中打开可用的 WiFi 网络,如果我之后再次运行它,它会给出不同的值。

编辑:这个系统仅供我使用,所以如果有一个已知的库可以为我处理这个问题,我会很乐意在 Linux 平台上重新开始。不过,我什至不知道该用谷歌搜索什么来获取信息。任何与"网络缓存"相关的内容都会让我帮助不相关主题的线程......

我将在下面提供我的代码的相关部分:

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

如何重置 WLAN 信息的系统缓存

在内部,netsh 由此 API 提供支持。这意味着,调用 netsh wlan 显示网络模式=bssid 只会返回上次扫描期间出现的网络的缓存。这就是你发现的。

这意味着为了刷新此缓存,您需要触发扫描。如果您正在使用的 C# 库包含它,则可以通过调用 WlanScan 按需实现此目的。我不确定您使用的是哪个 C# 包装器,但它可能包含此函数。收到扫描完成通知(向源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 上打开可用网络来测试这一点。每次打开后不久,您应该会看到"扫描完成"。如果您愿意,可以使用消息框而不是 Console.WriteLine。

要自行触发扫描:

    wlanIface.Scan();

netsh wlan delete profile name=* i=*

您可能不想在所有接口上执行此操作,并在那里对接口进行硬编码以获得更快的结果