【问题标题】:How do i reset the system cache of WLAN info?如何重置 WLAN 信息的系统缓存?
【发布时间】:2015-06-11 16:27:17
【问题描述】:

我正在尝试在 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);
                } 
        }

【问题讨论】:

  • 你试过netsh wlan delete命令,看看是否刷新?
  • 这是我找到的唯一解决方案,但是执行需要一秒钟或更长时间。该代码必须以大约一个数量级的速度运行才能使用(试图获得数千个网格点。)
  • 对不起,我有点困惑,在这种情况下,“个人资料”的上下文是什么?我不明白我会发送什么参数来删除缓存的信息。该信息是否被视为个人资料?

标签: c# network-programming


【解决方案1】:

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

这意味着为了刷新这个缓存,你需要触发一次扫描。如果您使用的 C# 库包含它,您可以通过调用 WlanScan 按需实现。我不确定您使用的是哪个 C# 包装器,但它可能包含此功能。当您收到scan complete notification(向源 WLAN_NOTIFICATION_SOURCE_ACM 注册并注意 wlan_notification_acm_scan_list_refresh)时,应该更新缓存。

如果您让我知道您使用的是哪个 C# 库,也许我可以为您指出相关函数。

您提到打开可用网络会导致缓存刷新。这是因为打开可用网络会触发对 WlanScan 的调用。

配置文件与可用的网络列表无关——配置文件是 Wlan 服务用来跟踪您的计算机上配置了哪些网络的文件——删除它们不会使 WlanSvc 再次扫描。删除它们恰好与扫描同时发生可能是巧合,但这比设计使用更多的是副作用。

编辑:要使用您正在使用的托管 Wifi API 订阅通知,这个 sn-p 应该可以工作:

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

【讨论】:

  • 这很有帮助,谢谢!!我正在使用使用 NativeWifi 的Managed Wifi API
  • 浏览示例,我找到了 WlanScan。 Wlan.WlanScan(client.clientHandle, info.interfaceGuid, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero));最后 3 个参数是保留/可选的,根据您的需要,它们应该是 0。
  • 就是这样!!谢谢!
  • 这里是 WlanRegisterNotification 调用。 Wlan.WlanRegisterNotification(clientHandle, Wlan.WlanNotificationSource.ACM, false, wlanNotificationCallback, IntPtr.Zero, IntPtr.Zero, out prevSrc));您想在您的程序中注册一次。在回调(wlanNotificationCallback)中,要检查WlanNotificationData的notificationCode。我认为您正在寻找 WlanNotificationCodeAcm.ScanComplete.. 您确实想要 ScanRefresh,但看起来托管 Wifi API 有点过时了。 tbh 你可能很好地启动扫描并等待一秒钟
  • 顺便说一句,如果您曾经在 Windows 10 上工作,Windows 中内置了 this new WiFi API,这将使这一切变得更容易:)
【解决方案2】:

所有人

netsh wlan delete profile name=* i=*

您可能不想在所有接口上都这样做,并在其中对接口进行硬编码以获得更快的结果

【讨论】:

  • 我第一次使用它,它成功了!但是当我再次 netsh wlan 显示网络时,netsh wlan 删除配置文件名称=* i=*,第二次,我收到以下消息:在任何接口上都找不到配置文件 *。直到我重新连接到我的互联网才会出现这种情况。
  • 你想要做的下一个命令可能是执行 netsh cmd to connect ,然后在你的问题中运行上面的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2012-07-22
相关资源
最近更新 更多