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

C# 如何重置WLAN信息的系统缓存?,c#,network-programming,C#,Network Programming,我正在尝试用C#中的NativeWifi编写WLAN指纹识别程序。为此,我多次运行循环以获取wlan信息,然后使用matlab对数据进行平均/分析 问题是,当程序运行时,即使我在房子里走动,我也会得到所有相同的值。从互联网上我看到,有一个缓存存储可用网络的数据。我想知道是否存在重置此缓存的系统调用 我还使用cmd调用看到了这一点 netsh wlan显示网络模式=bssid 这会给我相同的值,直到我在操作系统中打开可用的wifi网络,如果我再次运行它,它会给不同的值 编辑:这个系统只供我使用,所

我正在尝试用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);
                } 
        }
public void get\u info\u实例(StreamWriter文件)
{
尝试
{
foreach(客户端接口中的WlanClient.WlanInterface-wlanface)
{
Wlan.WlanBssEntry[]wlanBssEntries=wlanIface.GetNetworkBssList();
foreach(Wlan.WlanBssEntry中的Wlan.WlanBssEntry网络)
{
int rss=network.rssi;
字节[]macAddr=network.dot11Bssid;
字符串tMac=“”;
for(int i=0;i
适用于所有

netsh wlan delete profile name=* i=*

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

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

这意味着要刷新此缓存,需要触发扫描。如果您正在使用的C#库中包含它,您可以通过调用来按需实现这一点。我不确定您使用的是哪个C#包装器,但它可能包含此函数。当您收到(向源WLAN\U通知\U源ACM注册并查看WLAN\U通知\U ACM\U扫描\U列表\U刷新)时,应更新缓存

如果您让我知道您使用的是哪个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上打开可用网络来测试这一点。每次打开后不久,您都会看到“扫描完成”。如果愿意,可以使用messagebox代替Console.WriteLine

要自己触发扫描,请执行以下操作:

    wlanIface.Scan();

您是否尝试了netsh wlan delete命令并查看它是否刷新?这是我找到的唯一解决方案,但执行该命令需要一秒钟或更长时间。这个代码必须运行大约一个数量级更快才能使用(试图获得数千个网格点。)不能走得更快,然后C++对不起我有点困惑,什么是“概况”的情况下,在这种情况下?我不明白要删除缓存的信息,我会发送哪些参数。这些信息被认为是个人资料吗?我第一次使用它时,它起了作用!但当我再次显示netsh wlan网络,然后netsh wlan删除配置文件名=*i=*,第二次,我得到以下消息:在任何接口上都找不到配置文件*。直到我重新连接到internet时才会发生这种情况。您要执行的下一个命令可能是执行netsh cmd进行连接,然后运行上面问题中的代码。这非常有帮助,谢谢!!我使用的是使用NativeWifi的。翻阅示例,我发现了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是否正确。我想你是我