假设我需要检测仅以1 Hz的频率传输60秒的BLE广告,而且我不知道当天的广告时间。为此,我需要不断扫描。
由于扫描是电池密集型的,因此您应遵守以下准则:
- 找到所需设备后,请立即停止扫描。
- 永远不要在循环上扫描,......
但这不包括我的用例。
最新的BLE芯片(例如CC2560)在扫描时使用大约5 mA,我假设在使用SCAN_MODE_LOW_POWER
时占空比减小。我的问题是,如果我使用该模式,是否可以全天候扫描(并告知用户)?
iOS也是如何为iBeacons做的?
答案 0 :(得分:3)
在Android 5.0上连续扫描BLE广告是否可以接受?
它与哪个Android版本无关。它完全取决于您的实现和用户群。如果您认为在继续扫描设备时不会丢失用户,则可以这样做。
您还可以在Android 5.1的BluetoothLEScanner中提供低功耗,低频扫描等参数,请参阅ScanSettings。
您还可以在Android 5.1,
上使用filters,它不会为所有可用设备执行每段代码(gatt,bluetoothService,框架,您的应用和许多内容),但会让Bluetooth Gatt图层(和蓝牙服务,你的应用程序)知道你正在寻找的设备(你在过滤器中提供)是否在附近。引入此滤波器是为了节省扫描时间内的电池电量。
P.S: - 我提到5.1,因为5.0蓝牙代码很糟糕。
答案 1 :(得分:1)
听起来你不得不不断地听取满足要求。如您所示,这对于功耗原因并不理想。
这是否正常取决于如何使用它。这是针对具有已知用户群的特定应用程序,需要此功能并了解耗电行为吗?如果是这样,那可能就行了。这是一般用户吗?不,这不行。
我的理解是iBeacon每隔x秒发送一次。对于接收器来听一个区域中的所有iBeacons,它只需要监听x秒。在这种设计中,信标和接收器都可以限制它们的功耗。
如果您可以通过同步发送器和接收器的时间进行同步,或者在发送广告时展开广告,则可以解决功耗问题。
答案 2 :(得分:1)
不幸的是,Android仍然为BLE堆栈提供了一步母亲待遇。当BLE设备接近类似于iOS 7+提供的功能时,Android中没有任何东西可以唤醒应用程序。
我们乐观地认为5.0+会有很大的改进,但相反它破坏了一些现有的功能。一些设备如Nexus 4和HTC One在Android L更新后(即使在低延迟模式下每5-10秒发现一次)扫描活动减少,这使得它几乎无法用于我们的用例。
因此,唯一的解决方案是连续扫描BLE设备,这肯定会耗尽电池。 根据您的使用情况,您可以尝试某种机制来停止扫描并仅在需要时启动。 就像我们的应用程序一样,我们使用加速计来检查手机何时运动。如果手机没有移动,我们会停止扫描并在移动手机时再次启动。