9

我目前正在做关于 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);

我现在遇到的问题是,即使我成功启动它们,启动的扫描似乎也不会每秒钟发生一次,并且时不时地还会有其他一些从其他应用程序启动的扫描也被记录下来。

是否有任何简单的方法可以按设定的时间间隔进行扫描并且不接收由其他应用程序启动的扫描?

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

4

1 回答 1

4

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

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

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

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

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

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

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

于 2012-12-14T21:27:12.833 回答