Gui*_*ume 1 android bluetooth-lowenergy android-bluetooth rxandroidble
我需要ble在未连接到我的设备时永久扫描广告以找到它并知道何时连接到它(特定产品)。此扫描在前台服务中实现以匹配 8.0 先决条件。
为了节省一些电池,我想定期扫描(同时尊重 Android 7 的启动量/时间限制)。我看到 2 个不同的实现:
我想用 Rx 风格而不是简单的计时器来做它(我不是 RX 专家)。我不知道哪种解决方案更好/更容易开发。这必须对客户端透明,并且必须保持原始RxAndroidBle工作状态,订阅 = 启动进程,取消订阅 = 停止进程。
我想我必须使用,Obersable.interval但我不知道如何管理这个任何片段/示例?
原始的 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 员工执行,并以面向 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
Run Code Online (Sandbox Code Playgroud)
人们仍然需要记住 API 24+ 的未记录“功能”,它可以防止在 30 秒内启动超过 5 次扫描。
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |