在 Android 5.0 上连续扫描 BLE 广告是否可以接受?

On Android 5.0 is it acceptable to continuously scan for BLE advertisements?

假设我需要检测仅以 1 Hz 的频率传输 60 秒的 BLE 广告,而且我不知道会在一天中的什么时候。为此,我需要不断扫描。

official docs say

Because scanning is battery-intensive, you should observe the following guidelines:

  • As soon as you find the desired device, stop scanning.
  • Never scan on a loop, ...

但这不包括我的用例。

最新的 BLE 芯片(例如 CC2560)在扫描时使用大约 5 mA,我假设在使用 SCAN_MODE_LOW_POWER 时占空比会降低。我的问题是,如果我使用该模式,是否可以只扫描 24/7(并通知用户)?

还有 iOS 是如何为 iBeacons 做的?

听起来你好像卡住了,必须不断地听才能满足要求。正如您所指出的,出于功耗原因,这并不理想。

这是否可行取决于它的使用方式。这是否适用于具有已知用户群的特定应用程序,这些用户群需要此功能并了解耗电行为?如果是这样,那可能没问题。这个适合普通用户吗?不,这不行。

我的理解是iBeacon每x秒传输一次。接收器要收听一个区域中的所有 iBeacon,只需收听 x 秒。在这个设计中,信标和接收器都可以限制它们的功耗。

如果您可以更改广告的发送方式,则可以解决功耗问题,方法是在发送器和接收器运行时同步,或者在发送广告时分散。

On Android 5.0 is it acceptable to continuously scan for BLE advertisements?

哪个Android版本都没有关系。它完全取决于您的实施和用户群。如果您认为继续扫描设备不会丢失用户,可以这样做。

您还可以在 Android 5.1 的 BluetoothLEScanner 中提供低功耗、低频扫描等参数,请参阅 ScanSettings

您还可以在 Android 5.1, 上使用 filters,它不会为所有可用设备执行每段代码(gatt、bluetoothService、框架、您的应用程序和许多东西),但会让蓝牙 Gatt 层(以及蓝牙服务和您的应用程序)知道您正在寻找的设备(您在过滤器中提供)是否在附近。引入此过滤器是为了在扫描时节省一些电池电量。

P.S:- 我到处都提到 5.1,因为 5.0 蓝牙代码很烂。

遗憾的是Android还对BLE栈提供了step motherly处理。 Android 中没有任何东西可以在 BLE 设备接近时唤醒应用程序,类似于 iOS 7+ 提供的。

我们乐观地认为 5.0+ 会有很大的增强,但相反它破坏了一些现有的功能。 Nexus 4 和 HTC One 等某些设备在 Android L 更新后减少了扫描 activity(即使在低延迟模式下也每 5-10 秒发现一次),这使得它实际上无法用于我们的用例。

因此,唯一的解决办法是不断扫描 BLE 设备,这肯定会耗尽电池电量。 根据您的用例,您可以尝试一些机制来停止扫描并仅在需要时启动。 就像在我们的应用程序中一样,我们使用加速度计来检查 phone 何时在移动。如果 phone 没有移动,我们停止扫描并在 phone 移动时重新开始扫描。