代码之家  ›  专栏  ›  技术社区  ›  Guillaume

RxAndroidBle:定期广告扫描

  •  2
  • Guillaume  · 技术社区  · 7 年前

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

    为了节省一些电池,我希望定期扫描(同时遵守Android 7的启动量/时间限制)。我看到了两种不同的实现:

    • 每X秒启动一次扫描,并在Y秒后停止,等待时间为X-Y。

      俣ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–扫描–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–等等
      |--------------|------|--------------|------|---
      |---------X-------->|---------X-------->|---
      |------Y------>俣–俣–俣–俣–俣–俣–俣–俣–俣–俣–俣–俣;‌‌ ‌‌ ‌‌ ‌‌ ‌‌ ‌‌ ‌‌ ‌‌ |---


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

      俣ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–扫描–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–Œ–等等
      |--------------|------|--------------|------|---
      |------X--->|--Y->|------X--->|--Y->|---

    这必须对客户透明,并且必须保留原件 RxAndroidBle 工作,订阅=启动流程,取消订阅=停止流程。

    我想我必须使用 Obersable.interval 但我不知道该怎么办 有任何片段/示例吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Dariusz Seweryn    7 年前

    最初的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次以上的扫描。