基于RxAndroidBle实现写入/通知处理:订阅特征值写入响应
使用RxAndroidBle实现写入特征后订阅通知响应的示例
我来给你补全并解释这个场景的完整实现,这是RxAndroidBle里很常见的「写入-等待通知响应」的用法:
// 假设你已经有了BLE连接的Observable实例 Observable<RxBleConnection> connectionObservable = ...; // 替换成你的BLE连接创建逻辑 // 定义对应的特征UUID UUID WRITE_CHAR_UUID = UUID.fromString("你的写入特征UUID"); UUID TX_CHAR_UUID = UUID.fromString("你的通知特征UUID"); connectionObservable .flatMap( // 第一个函数:为目标特征设置通知,获取通知数据的Observable (RxBleConnection rxBleConnection) -> rxBleConnection.setupNotification(TX_CHAR_UUID), // 第二个双参数函数:结合连接实例和通知流,处理写入+监听响应逻辑 (RxBleConnection rxBleConnection, Observable<byte[]> notificationObservable) -> { // 准备要写入BLE设备的数据 byte[] writeData = "你要发送的指令内容".getBytes(StandardCharsets.UTF_8); // 先执行写入操作,写入完成后自动切换到通知流监听响应 return rxBleConnection.writeCharacteristic(WRITE_CHAR_UUID, writeData) .switchMap(writeResult -> notificationObservable) // 写入成功后订阅通知 .first(); // 如果只需要接收第一个响应,添加此操作符自动结束订阅 } ) .subscribe( responseBytes -> { // 处理收到的设备响应数据 String responseContent = new String(responseBytes, StandardCharsets.UTF_8); Log.d("BLE", "收到设备响应:" + responseContent); }, throwable -> { // 统一处理流中的错误(连接断开、写入失败、通知设置失败等) Log.e("BLE", "操作出错", throwable); } );
关键细节说明:
flatMap双参数重载:这个写法能同时拿到RxBleConnection实例和设置好的通知Observable,避免嵌套过多的流操作,代码结构更清晰。setupNotification:调用该方法会先向BLE设备发送启用通知的指令,成功后返回的Observable会持续发射设备发来的通知数据。writeCharacteristic:执行特征写入操作,返回的Observable会在写入成功时发射写入的字节数组(部分设备会返回写入确认数据)。switchMap:当写入操作完成后,自动切换到通知Observable,这样就能精准监听设备针对本次写入的响应通知。如果只需要获取第一个响应,.first()会在收到数据后自动结束订阅,避免不必要的资源占用。- 生命周期管理:记得在合适的时机(比如Activity的
onDestroy)调用Disposable.dispose()取消订阅,防止内存泄漏。
内容的提问来源于stack exchange,提问作者kosancicivan
相关产品推荐
相关产品推荐

