【问题标题】:How does BLE scanning work for altbeacon library on Oreo?BLE 扫描如何为 Oreo 上的 altbeacon 库工作?
【发布时间】:2018-04-19 20:11:36
【问题描述】:

在 Android L 之前,Android Altbeacon 库使用后台运行服务来扫描 BLE 信标。默认扫描时间是前台循环 1.1 秒,后台每 5 分钟扫描 10 秒。对于后台任务,警报管理器也用于唤醒应用程序。

鉴于不允许长时间运行的后台服务,我正在研究 Android Oreo 中的类似设置如何工作。我正在经历 http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8 它确实清除了一些东西,但我仍然不完全清楚扫描如何与蓝牙扫描 API 和作业调度程序结合使用。

那么,如何结合使用基于作业调度程序的定期调度来监控和确定信标范围?如果有人能提供一个很好的例子。

更具体一点-

  1. 我们什么时候会进行被动新信标检测而不是正常背景扫描?
  2. 为什么被动扫描仅适用于新检测?为什么我们不能循环运行它?为什么它只在作业调度程序扫描之间运行?
  3. 假设我设置了 10 秒的扫描周期和 2 分钟的扫描间隔。以什么间隔使用什么技术来扫描信标?
  4. 如果作业调度程序可以安排频率超过 15 分钟的作业并且它可以运行最多 10 分钟的时间,我们可以将扫描间隔设置为 10 分钟,将扫描间隔设置为 5 分钟吗?由于操作系统限制,我们只会损失 5 分钟的扫描时间吗?另外,我们可以在这 5 分钟内进行被动扫描吗?所以我们没有不扫描信标的时间跨度?

【问题讨论】:

    标签: android bluetooth-lowenergy altbeacon android-8.0-oreo


    【解决方案1】:

    了解低功耗扫描如何在低级别工作至关重要:

    低功耗扫描依赖于将蓝牙 LE 模式匹配卸载到蓝牙芯片上的硬件过滤器。如果它与传入的数据包匹配,则芯片会通知操作系统,操作系统会向应用程序发送一个意图,唤醒它以处理数据包。

    以上依赖于 Intent 提供的过滤扫描组合(Android 8 中的新 API)。

    当计划的扫描作业以 Android 信标库结束时,这种基于意图的交付设置为由操作系统和蓝牙芯片处理。最终结果是,如果检测到新的信标,广播接收器将很快处理它。这可以在几秒钟内向应用发送监控回调,而不是等待 15 分钟等待下一个计划作业。

    这一切都是为了在过滤器与附近已经存在的蓝牙设备不匹配时工作。如果已经在附近,则 Intent 将在 100 毫秒左右发送,这是一种获取持续更新的 CPU 效率非常低的方式,这违背了低功耗 API 的全部意义,并且会导致应用程序持续运行并符合条件由 Android 8 终止。

    使用的过滤器匹配任何信标。这样做是为了节省过滤器,因为它们是有限的硬件资源。因此,如果已知信标已经存在,则不会使用这些扫描 API,因为它会立即匹配数据包并破坏该技术的目的。底线:如果扫描作业以可见的信标结束,则不会完成低功耗扫描。

    您不能将计划作业的执行频率设置为超过 15 分钟。这是一个操作系统限制。扫描周期之间的 10 分钟将起作用,但库仅在周期结束时提供扫描结果,因此这可能没有帮助。可以将库修改为仅在每个扫描作业上扫描最多 10 分钟,但目前它不这样做,而且你会发现它会留下 5 分钟。

    如果您真的想在 Android 8+ 的后台进行持续的 BLE 扫描,操作系统允许的方法是使用显示图标的前台服务,以便用户知道它正在运行。不过,在消费者应用程序中这样做时要小心,因为电池消耗会非常大,用户可能会在将应用程序归咎于电池没电后将其卸载。但是,对于特殊用例,这可能是可以接受的。

    【讨论】:

    • 总而言之,我们首先开始计划作业扫描。如果在其中检测到信标,我们不会进行低功率扫描。但是,如果在调度作业扫描中未发现信标,我们将启动低功耗扫描以在调度作业扫描的间隔之间运行,希望获得新的信标(如果它变得可见),从而不必等待另一个间隔时间。如果通过任何方式识别出一个信标(计划作业扫描或低功率扫描),我们将不再使用低功率扫描,因为这会立即返回并浪费 CPS 资源。对吗?
    • 还有@davidgyoung altbeacon 库如何检测后台模式?根据github.com/AltBeacon/android-beacon-library/blob/… 中的逻辑,它检查活动活动计数,我认为前台服务为 0?
    • 总结是正确的,是的,计数活动用于确定前景/背景。对于执行持续扫描的前台服务,您可能希望将后台扫描周期设置为恒定,并禁用扫描作业的使用,以便扫描服务持续执行此操作。在此处查看实验性 PR:github.com/AltBeacon/android-beacon-library/pull/663
    • 谢谢。而且,如果我将扫描间隔设置为 5 分钟,那么操作系统不会尊重超过 15 分钟的任何频率。图书馆是否会通过使用 15 分钟的间隔来处理这个问题,否则可能会出现问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    相关资源
    最近更新 更多