在Android中有没有一种明确控制WiFi扫描间隔的方法?

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找到整个应用程序。
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
有没有简单的方法可以按一定间隔扫描? 如果这种方法不管用的话,我恐怕也没什么办法。根据我的经验,“硬件相关”的方法可能并不完全符合它们的定义。例如,我曾经创建了一个小应用程序,每隔 X 分钟记录您的位置。所以我调用 requestLocationUpdates 并设置一些 minTime 参数。但是我的手机简单地忽略了 minTime 值,我会尽快得到来自 GPS 的更新,而这不是我想要的。我在这里发了一个问题,并得到了 这个 答案,从中我们可以了解到,在 jelly bean 之前,设备可能会简单地忽略这个值...... 所以现在可能有类似的情况。我建议在最新的 Android 版本上运行此代码。我不太懂 Wifi,但是 1 秒的扫描间隔是不是太频繁了?也许系统不会忽略扫描请求(因此返回 true),但是硬件会? 我们能忽略由其他应用程序启动的扫描吗? 就我所知,在这里也是否定的。在 SCAN_RESULTS_AVAILABLE_ACTION 广播中没有包含任何额外的信息,因此您无法知道哪个应用程序启动了扫描。 最好的解决方案是定义您的要求。您可以使用 ScanResult.timestamp 来确定是否应该使用此结果。例如,如果您想每秒钟获取每个接入点的 RSSI,可以将当前 BSSID 与以前的 BSSID 进行比较。如果在上一秒钟的扫描结果中包含了当前 BSSID,则可以简单地忽略它。然后,您无论获得多少结果都没有关系。 另一个更简单的解决方案是创建一个名为 scanInitiated 的布尔值,并在启动扫描时将其设置为 true。当接收到广播时,仅在 scanInitiatedtrue 时使用数据,然后将其设置为 false。当间隔时间很长时,这并不可靠,但对于长间隔时间来说,它会非常有效。

1
谢谢您的回复,尽管这不是好消息。我就知道这会是这种情况。我已经在Galaxy Nexus和Nexus 7上都尝试了运行jellybean(+)的应用程序,但是都没有成功。问题在于我的模型假定间隔规则,所以我猜我得改变它来处理非同质扫描间隔。 - while
1
奇怪的是,如果设置为500毫秒,它可以在大约1秒的间隔内扫描,因此从硬件上讲,它必须支持。 - while
是的,就像我在第一个解决方案中建议的那样 - 你应该只选择并使用所需的结果,而不是你得到的每个结果。这将帮助你解决两个问题。 - Jong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,