在 Android 5.0 上连续扫描 BLE 广告是否可以接受?
On Android 5.0 is it acceptable to continuously scan for BLE advertisements?
假设我需要检测仅以 1 Hz 的频率传输 60 秒的 BLE 广告,而且我不知道会在一天中的什么时候。为此,我需要不断扫描。
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 移动时重新开始扫描。
假设我需要检测仅以 1 Hz 的频率传输 60 秒的 BLE 广告,而且我不知道会在一天中的什么时候。为此,我需要不断扫描。
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 移动时重新开始扫描。