【发布时间】:2018-06-12 09:23:31
【问题描述】:
首先,感谢 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) 和 Asus Zenfone Go ZB500KL (Android 6.0)。相同的代码在新设备中运行良好。
所以我的问题:
我怎么知道,在哪些手机型号或 Android 版本中,RxAndroidBle2 库 1.5.0 的工作方式应该与它在 >6.0 Android 版本中的工作方式相同。
为什么扫描始终在所有 Android 设备 >5.0 中工作,但不是在所有 Android 设备中连接
提前感谢您的任何回答!
我的代码示例:
扫描----
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);
});
【问题讨论】:
-
真正的问题是什么?你能用
RxBleLog.setLogLevel(RxBleLog.VERBOSE)添加日志吗? -
我已经启用了日志记录,在我从实时设备获取日志后会在此处发布。不过,这需要几天时间,设备就在那里......无论如何,根据手机型号的不同,会有很多不同的行为。
-
另一个问题:你总是在开始连接之前停止扫描吗?
-
这是一个很好的提示。我没有调用scanDisposable.dispose(),只是设置了scanDisposable = null。让我们看看这是否会影响具有旧 Android 版本的设备!
-
在扫描和连接后添加对 dispose() 的调用使其适用于许多手机型号,所以这是一个很好的提示。我想查看 RxAndroidBle API 文档中对此的解释。或许值得一提的是,在某些模型中,即使不调用 dispose() 也可以扫描和连接,但为了覆盖最广泛的设备,应该始终调用 dispose()。然而,有些手机型号总体上无法正常工作。我正在尝试获取有关其中原因的更多信息。
标签: android bluetooth bluetooth-lowenergy interop rxandroidble