【发布时间】:2017-11-22 05:45:40
【问题描述】:
我正在开发一些与 BLE 相关的应用程序。
疑问很简单,“我们使用android.bluetooth.le.ScanCallback 的onScanResult 方法收到的BLE 扫描结果是否提供了一组缓存的结果?”
如果你没有明白我的意思,请让我通过深入我的实验来解释一下。
我正在使用来自Pinmicro (Card Beacon) 的信标,我们将其配置为以 100 毫秒的间隔进行广播/广告。
我正在使用android.bluetooth.le.ScanSettings.SCAN_MODE_LOW_LATENCY 模式开始扫描,当然我在 Lolipop 以上的 android 版本中运行它(准确地说是 Nexus 5 和 6.0.1)。我周围有大约 100 个信标,但在 logcat 中只记录了一个信标(比如 TARGET 信标)及其 RSSI。
所以,当我开始扫描时,2-3 分钟内一切正常,但更进一步,RSSI 更新有点延迟。请看以下场景:
- 开始扫描
- 将 TARGET 信标放置在 Nexus 5 附近 - 使 RSSI 在 -30 到 -40 之间
- 将 TARGET 信标放置在离 Nexus 5 稍远一点的地方 - 使 RSSI 在 -60 到 -70 左右
- 多次重复步骤 2 和 3,在每个循环之间等待 30 秒
- 经过 15 或 20 个周期后,第 2 步的 RSSI 为 -60 到 -70,第 3 步的 RSSI 为 -30 到 -40。
我的假设是,Android 操作系统正在缓存所有 BLE 广告,并通过 onScanResult 回调发送这些缓存的结果,这会导致在几秒钟后发送旧的缓存广告。我不确定,但会是这样吗?如果是这样,有没有办法从操作系统中清除 BLE 广告缓存?
欢迎任何形式的建议,例如清除缓存的直接方法、变通方法、反射技术等。
提前致谢!
【问题讨论】:
-
您是否找到了操作系统延迟 BLE 扫描回调结果的根本原因?
-
@madking 我在“onScanResult”回调本身内部进行了一些复杂的处理。我在某处读到,最好将该处理代码移动到单独的线程,而不是从同一个线程全部执行,这可能会导致完成回调和返回的延迟。通过一些适当的线程实现,我的代码中不再存在这个问题。但仅在 Android N 及更高版本的新手机中进行了测试。
标签: android bluetooth bluetooth-lowenergy ibeacon beacon