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)。相同的代码在新设备中运行得非常好。
所以我的问题:
我怎么知道,在 phone 模型或 Android 版本中,RxAndroidBle2 库 1.5.0 应该以与它相同的方式工作在 >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);
});
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 上。作为开发人员,您对此无能为力。
首先,感谢 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)。相同的代码在新设备中运行得非常好。
所以我的问题:
我怎么知道,在 phone 模型或 Android 版本中,RxAndroidBle2 库 1.5.0 应该以与它相同的方式工作在 >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);
});
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 上。作为开发人员,您对此无能为力。