有没有办法在Android中明确控制WiFi扫描间隔?

whi*_*ile 9 android rssi android-wifi

我目前在WiFi定位上做硕士论文,为了测试我的算法,我需要收集一些数据.

为此,我编写了一个简短而简单的Android程序,它只是为每次扫描找到的所有可用访问点收集RSSI并将它们保存到文件中.我已经设置了一个BroadcastReceiver侦听事件WifiManager.SCAN_RESULTS_AVAILABLE_ACTION,我使用一个Timer名为tim的,用一个WifiManager叫做wifi的扫描来启动扫描,如下所示:

tim.schedule(new TimerTask(){
        @Override
        public void run(){
            wifi.startScan();
        }
}, 0, 1000);
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是,即使我成功启动它们,启动的扫描似乎也不会每秒都发生,并且偶尔会有其他扫描从其他应用程序启动并进行记录.

是否有任何简单的方法可以在设定的时间间隔内扫描而不接收其他应用程序发起的扫描?

整个应用程序可以在https://github.com/while/RSSIMiner上找到,如果它有任何帮助.

Jon*_*ong 4

有什么简单的方法可以按设定的时间间隔进行扫描吗?

如果这效果不好,恐怕不行。根据我的经验,“与硬件相关”的方法可能并不完全按照其定义所述工作。例如,我曾经创建了一个小应用程序,它每 X 分钟记录一次您的位置。所以我requestLocationUpdates用一些minTime参数来调用。但我的手机只是忽略了该minTime值,一旦 GPS 可用,我就会立即收到更新,但这不是我想要的。我在这里发布了一个关于它的问题,并得到了这个答案,从中我们了解到,在果冻豆之前,设备可能会简单地忽略这个值......

所以现在可能是类似的事情。我会尝试在最新的 Android 版本上运行此代码。我对Wifi不太了解,但是1秒对于扫描来说不是太频繁了吗?也许系统不会忽略扫描请求(因此它返回true),但硬件会忽略?

我们可以忽略其他应用程序发起的扫描吗?

据我所知,这里也是负面的。广播中不包含任何额外内容SCAN_RESULTS_AVAILABLE_ACTION,因此您无法知道哪个应用程序启动了扫描。

最好的解决方案是明确您的要求。您可以使用ScanResult.timestamp来确定是否应该使用此结果。例如,如果您尝试每秒获取每个接入点的 RSSI,则可以将当前 BSSID 与之前的 BSSID 进行比较。如果当前BSSID包含在上一秒的扫描结果中,您可以简单地忽略它。然后,获得多少结果并不重要。

另一个更简单的解决方案是创建一个名为的布尔值,并在开始扫描时scanInitiated将其设置为。true接收广播时,仅当 为 时才使用数据scanInitiatedtrue然后将其设置为false。当间隔很短时,这不太可靠,但对于长间隔来说,它会很好用。