RxAndroidBle2 在扫描和连接 Android phone 模型时的工作方式不同

RxAndroidBle2 working differently in scanning and connecting across Android phone models

首先,感谢 Polidea 为 Android BLE (RxAndroidBle2) 提供的出色的基于 ReactiveX 的库!

当我遇到这个库时,我已经用 RxAndroidBle 完全替换了我在 Android 应用程序中的 BLE 使用,这消除了我在 BLE 和 Java原生BTAPI。我的应用程序旨在连接和引导 BLE 外围设备。下面我从我的 Android Java 代码中复制粘贴了我对 RxAndroidBle 的用法作为示例。

但我不完全理解为什么 RxAndroidBle 可以无缝地与较新的 Android 模型一起工作,而它与较旧的 Android 模型有问题。

问题是有些老phone确实可以扫描找到设备,但是找到合适的设备后就无法连接BT外设了。连接有问题的设备包括 Huawei P8 Lite (Android 6.0) 和 Asus Zenfone Go ZB500KL (Android 6.0)。相同的代码在新设备中运行得非常好。

所以我的问题:

  1. 我怎么知道,在 phone 模型或 Android 版本中,RxAndroidBle2 库 1.5.0 应该以与它相同的方式工作在 >6.0 Android 版本中。

  2. 为什么扫描在所有 Android 设备 >5.0 中始终有效,但在所有 Android 设备 <= 6.0 中无法连接。

提前感谢任何答案!

我的代码示例:

正在扫描----

scanDisposable = rxBleClient.scanBleDevices(
      new ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .build(),
      new ScanFilter.Builder()
            .setServiceUuid(new ParcelUuid(Globals.uuid_my_service))
            .build()
)
      .compose(bindUntilEvent(FragmentEvent.PAUSE))
      .observeOn(AndroidSchedulers.mainThread())
      .take(scanTimeMillis, TimeUnit.MILLISECONDS)
      .doFinally(this::dispose)
      .subscribe(this::addScanResult, this::onScanFailure);

正在连接----

connectionDisposable = bleDevice.establishConnection(false)
      .compose(bindUntilEvent(PAUSE))
      .flatMapSingle(connection ->
            connection.discoverServices()
                  .flatMap(services -> services.getService(Globals.uuid_my_service))
                  .map(service -> service.getCharacteristic(Globals.uuid_program_characteristic))
                  .flatMap(characteristic -> connection
                        .writeCharacteristic(characteristic, programData))
      )
      .doFinally(this::dispose)
      .subscribe(
            characteristic -> {
               Log.i(tag, characteristic.toString());
               bluetoothResponses.msgToUserOnSuccess("\n" + "Success...");
               atomicSuccess.set(true);
            },
            throwable -> {
               bluetoothResponses.onConnectionFailure(throwable);
            });

How do I know, in which phone models or Android versions the RxAndroidBle2 library 1.5.0 should work the same way as it works in >6.0 Android versions.

你不知道 — BLE 实现因供应商、设备、芯片等而异。组合太多,设备特定错误太多。

Why is scanning working always in all Android devices >5.0, but connecting not in all Android devices <= 6.0.

BLE 堆栈的某些实现存在错误。有时它们只是随机失败,但当立即重试时,一切都会开始工作。有时扫描和连接之间的额外时间(~500 毫秒)可以解决问题。

华为 P8 Lite (6.0) 有一个糟糕的 BLE 芯片,不能同时处理扫描和连接。显然有时 the NearbyMessageService from Google Play Services scans continuously in the background 并阻止成功连接。这种情况也可能出现在其他 vendor/devices 上。作为开发人员,您对此无能为力。