RxAndroidBle:定期广告扫描

Gui*_*ume 1 android bluetooth-lowenergy android-bluetooth rxandroidble

我需要ble在未连接到我的设备时永久扫描广告以找到它并知道何时连接到它(特定产品)。此扫描在前台服务中实现以匹配 8.0 先决条件。

为了节省一些电池,我想定期扫描(同时尊重 Android 7 的启动量/时间限制)。我看到 2 个不同的实现:

  • 每 X 秒开始扫描,Y 秒后可以停止,等待时间为 XY。

    ?? ?? ?? ?? ?? 扫描???? ?? ?? ?? ?? 等待???? ?? ?? ?? ??扫描???? ?? ?? ?? ?? 等待
    |--------------|------|--------------|------|---
    | ---------X-------->|---------X-------->|---
    |------你----->?? ?? ?? ?? ?? ?? ?? ?? |-----Y----->?? ?? ?? ?? ?? ?? ?? ?? |---


  • 开始扫描 X 秒,等待 Y 秒,开始扫描 X 秒等等。

    ?? ?? ?? ?? ?? 扫描???? ?? ?? ?? ?? 等待???? ?? ?? ?? ??扫描???? ?? ?? ?? ?? 等待
    |--------------|------|--------------|------|---
    | ------X---->|--Y->|------X---->|--Y->|---

我想用 Rx 风格而不是简单的计时器来做它(我不是 RX 专家)。我不知道哪种解决方案更好/更容易开发。这必须对客户端透明,并且必须保持原始RxAndroidBle工作状态,订阅 = 启动进程,取消订阅 = 停止进程。

我想我必须使用,Obersable.interval但我不知道如何管理这个任何片段/示例?

Dar*_*ryn 5

原始的 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 次扫描。