Oreo 上的 altbeacon 库的 BLE 扫描如何工作?
How does BLE scanning work for altbeacon library on Oreo?
之前 Android L Android Altbeacon 库使用后台 运行ning 服务来扫描 BLE 信标。默认扫描时间在前台循环中为 1.1 秒,在后台每 5 分钟为 10 秒。同样对于后台任务,警报管理器用于唤醒应用程序。
我正在研究 Android Oreo 中类似的设置是如何工作的,因为不允许长时间 运行ning 后台服务。我正在经历
http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8
它确实清除了一些东西,但我仍然不完全清楚扫描如何与蓝牙扫描 API 和作业调度程序结合使用。
那么低功耗扫描如何结合基于作业调度程序的周期性调度来监视和范围信标?如果有人能提供一个例子就好了。
说得具体一点-
- 我们什么时候进行被动新信标检测与正常背景扫描?
- 为什么被动扫描只对新检测起作用?为什么我们不能 运行 这个循环?为什么它 运行 仅在作业调度程序扫描之间?
- 假设我设置了 10 秒的扫描周期和 2 分钟的扫描间隔。使用什么技术以什么间隔扫描信标?
- 如果作业调度程序可以安排频率超过 15 分钟的作业,并且它可以 运行 最多 10 分钟的时间,我们可以将扫描间隔设置为 10 分钟,将扫描间隔设置为 5 分钟吗?由于 OS 限制,我们只会损失 5 分钟的扫描时间?另外,我们可以在这 5 分钟内进行被动扫描吗?所以我们没有任何不扫描信标的时间跨度?
了解低功耗扫描如何在低级别工作至关重要:
低功耗扫描依赖于将蓝牙 LE 模式匹配卸载到蓝牙芯片上的硬件过滤器。如果与传入数据包匹配,芯片会通知操作系统,操作系统会向应用程序发送一个意图,唤醒它以处理数据包。
以上内容依赖于由意图传递的过滤扫描的组合(Android 8 中的新 API)。
当计划的扫描作业以 Android 信标库结束时,这种基于意图的交付被设置为由操作系统和蓝牙芯片处理。最终结果是,如果检测到新的信标,广播接收器将很快处理它。这可以在几秒钟内向应用程序发送监控回调,而不是等待 15 分钟等待下一个预定作业。
这一切都是为过滤器与附近已有的蓝牙设备不匹配而设计的。如果一个已经在附近,Intent 将在 100 毫秒左右发送,这是一种非常 CPU 获取持续更新的低效方式,这破坏了整个低功耗点 APIs,并且会导致该应用程序将 运行 持续运行并有资格在 Android 8.
之前终止
使用的过滤器匹配任何信标。这样做是为了节省过滤器,因为它们是有限的硬件资源。出于这个原因,如果已知信标已经存在,则不使用这些扫描 APIs,因为它会立即匹配数据包并破坏该技术的目的。底线:如果扫描作业以可见的信标结束,则低功率扫描未完成。
您不能将计划作业设置为执行超过 15 分钟的频率。这是操作系统限制。扫描周期之间间隔 10 分钟是可行的,但库仅在循环结束时提供扫描结果,因此这可能不是没有帮助。可以修改库以在每个扫描作业中简单地扫描最多 10 分钟,但目前它不会这样做,而且正如你所希望的那样,它会留下 5 分钟未被发现。
如果您真的想在 Android 8+ 上在后台进行持续的 BLE 扫描,OS 允许的方法是使用显示图标的前台服务,以便用户知道是运行。不过,在消费者应用程序中执行此操作时要小心,因为电池消耗非常大,用户可能会在将电池没电归咎于应用程序后卸载该应用程序。但是,对于特殊用例,这可能是可以接受的。
之前 Android L Android Altbeacon 库使用后台 运行ning 服务来扫描 BLE 信标。默认扫描时间在前台循环中为 1.1 秒,在后台每 5 分钟为 10 秒。同样对于后台任务,警报管理器用于唤醒应用程序。
我正在研究 Android Oreo 中类似的设置是如何工作的,因为不允许长时间 运行ning 后台服务。我正在经历 http://www.davidgyoungtech.com/2017/08/07/beacon-detection-with-android-8 它确实清除了一些东西,但我仍然不完全清楚扫描如何与蓝牙扫描 API 和作业调度程序结合使用。
那么低功耗扫描如何结合基于作业调度程序的周期性调度来监视和范围信标?如果有人能提供一个例子就好了。
说得具体一点-
- 我们什么时候进行被动新信标检测与正常背景扫描?
- 为什么被动扫描只对新检测起作用?为什么我们不能 运行 这个循环?为什么它 运行 仅在作业调度程序扫描之间?
- 假设我设置了 10 秒的扫描周期和 2 分钟的扫描间隔。使用什么技术以什么间隔扫描信标?
- 如果作业调度程序可以安排频率超过 15 分钟的作业,并且它可以 运行 最多 10 分钟的时间,我们可以将扫描间隔设置为 10 分钟,将扫描间隔设置为 5 分钟吗?由于 OS 限制,我们只会损失 5 分钟的扫描时间?另外,我们可以在这 5 分钟内进行被动扫描吗?所以我们没有任何不扫描信标的时间跨度?
了解低功耗扫描如何在低级别工作至关重要:
低功耗扫描依赖于将蓝牙 LE 模式匹配卸载到蓝牙芯片上的硬件过滤器。如果与传入数据包匹配,芯片会通知操作系统,操作系统会向应用程序发送一个意图,唤醒它以处理数据包。
以上内容依赖于由意图传递的过滤扫描的组合(Android 8 中的新 API)。
当计划的扫描作业以 Android 信标库结束时,这种基于意图的交付被设置为由操作系统和蓝牙芯片处理。最终结果是,如果检测到新的信标,广播接收器将很快处理它。这可以在几秒钟内向应用程序发送监控回调,而不是等待 15 分钟等待下一个预定作业。
这一切都是为过滤器与附近已有的蓝牙设备不匹配而设计的。如果一个已经在附近,Intent 将在 100 毫秒左右发送,这是一种非常 CPU 获取持续更新的低效方式,这破坏了整个低功耗点 APIs,并且会导致该应用程序将 运行 持续运行并有资格在 Android 8.
之前终止使用的过滤器匹配任何信标。这样做是为了节省过滤器,因为它们是有限的硬件资源。出于这个原因,如果已知信标已经存在,则不使用这些扫描 APIs,因为它会立即匹配数据包并破坏该技术的目的。底线:如果扫描作业以可见的信标结束,则低功率扫描未完成。
您不能将计划作业设置为执行超过 15 分钟的频率。这是操作系统限制。扫描周期之间间隔 10 分钟是可行的,但库仅在循环结束时提供扫描结果,因此这可能不是没有帮助。可以修改库以在每个扫描作业中简单地扫描最多 10 分钟,但目前它不会这样做,而且正如你所希望的那样,它会留下 5 分钟未被发现。
如果您真的想在 Android 8+ 上在后台进行持续的 BLE 扫描,OS 允许的方法是使用显示图标的前台服务,以便用户知道是运行。不过,在消费者应用程序中执行此操作时要小心,因为电池消耗非常大,用户可能会在将电池没电归咎于应用程序后卸载该应用程序。但是,对于特殊用例,这可能是可以接受的。