我需要永久扫描ble
广告,而我没有连接到我的设备以查找它并知道何时连接到它(特定产品)。此扫描在前台服务中实现,以匹配8.0先决条件。
为了保留一些电池,我想定期扫描(同时遵守Android 7的起始量/时间限制)。我看到2个不同的实现:
我想用Rx风格而不是简单的计时器(我不是RX专家)。我不知道哪种解决方案更好/更容易开发。
这必须对客户端透明,并且必须保持原始RxAndroidBle
正常工作,订阅=启动流程并取消订阅=停止流程。
我想我必须使用Obersable.interval
,但我不知道如何管理它
任何代码段/示例?
答案 0 :(得分:3)
最初的Android BLE API具有BluetoothLeScanner
类,允许使用以下四种模式之一开始扫描:
SCAN_MODE_LOW_LATENCY
- 扫描是连续的SCAN_MODE_BALANCED
- 扫描每5秒钟工作2秒SCAN_MODE_LOW_POWER
- 扫描每5秒钟工作0.5秒SCAN_MODE_OPPORTUNISTIC
- 扫描仅在其他应用程序启动时才起作用时间测量由Nordic Semiconductors员工执行,并以comprehensive guide的形式发布给Android BLE开发人员。
RxAndroidBle
库还有一个函数RxBleClient.scanBleDevices(ScanSettings, ScanFilter...)
,它在ScanSettings
对象中接受相同的模式。
如果需要实现不同的扫描参数,可以简单地使用Observable.takeUntil()
和Observable.repeatWhen()
的组合:
Observable<ScanResult> lowLatencyScanObservable = rxBleClient.scanBleDevices(
new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) // make sure that the scanning will be always on by default
.build()
);
Observable<ScanResult> periodicalScan = lowLatencyScanObservable
.takeUntil(Observable.timer(SCAN_TIME, SCAN_TIMEUNIT)) // scan for a specific amount of time and then unsubscribe to the upstream
.repeatWhen(completionObservable -> completionObservable.delay(PAUSE_TIME, PAUSE_TIMEUNIT)); // when the upstream will complete because of `takeUntil()` wait for the pause time and resubscribe to the upstream
人们仍然需要记住API 24+的未记录的“功能”,它可以防止在30秒内启动超过5次扫描。