首先,感谢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)。相同的代码在新设备中运行得非常好。
所以我的问题:
我怎么知道,RxAndroidBle2库1.5.0在哪些手机型号或Android版本中的工作方式与在> 6.0 Android版本中的工作方式相同。
为什么扫描始终在所有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);
});
答案 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会阻止成功连接。这种情况也可能显示在其他供应商/设备上。作为开发人员,您对此无能为力。