RxAndroidBle2在扫描和连接Android手机型号时的工作方式不同

时间:2018-06-12 09:23:31

标签: android bluetooth bluetooth-lowenergy interop rxandroidble

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

当我遇到图书馆时,我已经完全用RxAndroidBle替换了我的Android应用程序中的BLE用法,这消除了我在BLE和Java原生BT API上遇到的很多问题。我的应用程序旨在连接和操纵BLE外围设备。下面我从我的Android Java代码中复制粘贴了我对RxAndroidBle的使用。

然而,我并不完全理解为什么RxAndroidBle能够与较新的Android模型无缝兼容地工作,而旧版Android模型则存在问题。

问题是某些旧手机确实可以扫描并找到该设备,但在找到合适的设备后无法连接到BT外围设备。连接有问题的设备例如是华为P8 Lite(Android 6.0)和华硕Zenfone Go ZB500KL(Android 6.0)。相同的代码在新设备中运行得非常好。

所以我的问题:

  1. 我怎么知道,RxAndroidBle2库1.5.0在哪些手机型号或Android版本中的工作方式与在> 6.0 Android版本中的工作方式相同。

  2. 为什么扫描始终在所有Android设备> 5.0中运行,但不能连接所有Android设备< = 6.0。

  3. 提前感谢任何答案!

    我的代码中的示例:

    扫描----

    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);
                });
    

1 个答案:

答案 0 :(得分:1)

  

我怎么知道,在哪种手机型号或Android版本中,RxAndroidBle2库1.5.0的工作方式应与在> 6.0 Android版本中的工作方式相同。

您不需要-BLE的实现因供应商,供应商,设备,芯片等的不同而有很大差异。组合太多,而且特定于设备的错误也很多。

  

为什么扫描总是在所有> 5.0的Android设备上都能正常工作,但不能在所有<= 6.0的Android设备上连接。

BLE堆栈的某些实现存在错误。有时它们只是随机失败,但是当立即重试时,一切开始起作用。有时,扫描和连接之间需要额外的时间(约500毫秒)才能达到目的。

华为P8 Lite(6.0)带有一块笨拙的BLE芯片,无法同时处理扫描和连接。显然有时the NearbyMessageService from Google Play Services scans continuously in the background会阻止成功连接。这种情况也可能显示在其他供应商/设备上。作为开发人员,您对此无能为力。