RxAndroidBle:定期广告扫描

时间:2017-12-13 10:35:59

标签: android bluetooth-lowenergy android-bluetooth rxandroidble

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

为了保留一些电池,我想定期扫描(同时遵守Android 7的起始量/时间限制)。我看到2个不同的实现:

  • 每隔X秒开始扫描,并在Y秒后停止扫描,等待时间为X-Y。

    扫描等待扫描等待
    | -------------- | ------ | -------------- | ------ | ---
    | --------- X --------> | --------- X --------> | ---
    | ------ Y -----&gt; | ----- Y -----&gt; | --- <登记/>


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

    扫描等待扫描等待
    | -------------- | ------ | -------------- | ------ | ---
    | ------ ---- X&GT; |&--Y- GT; | ------ ---- X&GT; |&--Y- GT; | ---

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

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

1 个答案:

答案 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次扫描。