RxAndroidBle读写操作实战:特性读取与数据写入的完整指南

发布时间:2026/5/24 23:35:09

RxAndroidBle读写操作实战:特性读取与数据写入的完整指南 RxAndroidBle读写操作实战特性读取与数据写入的完整指南【免费下载链接】RxAndroidBle项目地址: https://gitcode.com/gh_mirrors/rxa/RxAndroidBleRxAndroidBle是一款基于RxJava的Android蓝牙低功耗BLE开发库它将复杂的BLE操作转化为简洁的响应式数据流帮助开发者轻松实现设备连接、特性读写和数据监听等功能。本文将为你提供一套完整的RxAndroidBle读写操作指南从基础概念到实战技巧让你快速掌握BLE设备通信的核心技能。一、核心概念快速入门在开始编写代码之前我们需要了解几个RxAndroidBle的核心组件RxBleClient作为整个库的入口点负责管理BLE设备和连接RxBleDevice代表一个BLE设备提供连接和操作方法RxBleConnection表示与设备的活跃连接用于执行具体的读写操作CharacteristicBLE设备上的数据端点是我们读写操作的对象这些组件之间的关系可以简单理解为通过RxBleClient发现并获取RxBleDevice连接设备得到RxBleConnection最后通过连接对象操作具体的Characteristic。二、环境准备与依赖配置要在你的Android项目中使用RxAndroidBle首先需要添加依赖。在你的app模块的build.gradle文件中添加以下依赖dependencies { implementation com.polidea.rxandroidble2:rxandroidble:1.11.1 implementation io.reactivex.rxjava2:rxandroid:2.1.1 }同时确保你的AndroidManifest.xml文件中包含必要的权限uses-permission android:nameandroid.permission.BLUETOOTH / uses-permission android:nameandroid.permission.BLUETOOTH_ADMIN / uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION / uses-permission android:nameandroid.permission.BLUETOOTH_CONNECT / uses-permission android:nameandroid.permission.BLUETOOTH_SCAN android:usesPermissionFlagsneverForLocation /三、设备连接与通信准备连接BLE设备是进行读写操作的前提。以下是建立连接的基本步骤初始化RxBleClientRxBleClient rxBleClient RxBleClient.create(context);获取RxBleDevice对象String macAddress 00:11:22:33:44:55; // 设备的MAC地址 RxBleDevice device rxBleClient.getBleDevice(macAddress);建立连接Disposable connectionDisposable device.connect() .subscribe( rxBleConnection - { // 连接成功获取到RxBleConnection对象 handleConnection(rxBleConnection); }, throwable - { // 连接失败处理 Log.e(BLE, 连接失败: throwable.getMessage()); } );⚠️ 注意一定要妥善管理Disposable对象在适当的时候如Activity的onDestroy()调用dispose()方法释放资源避免内存泄漏。四、特性读取操作全解析读取BLE设备的特性值是最常见的操作之一。RxAndroidBle提供了简洁的API来实现这一功能。4.1 基本读取操作UUID characteristicUuid UUID.fromString(0000ffb2-0000-1000-8000-00805f9b34fb); rxBleConnection.readCharacteristic(characteristicUuid) .subscribe( value - { // 读取成功处理数据 String data new String(value); Log.d(BLE, 读取到数据: data); }, throwable - { // 读取失败处理 if (throwable instanceof BleGattException) { int status ((BleGattException) throwable).getStatus(); Log.e(BLE, 读取失败状态码: status); } } );4.2 带超时设置的读取你可以为读取操作设置超时时间避免无限期等待rxBleConnection.readCharacteristic(characteristicUuid) .timeout(30, TimeUnit.SECONDS) .subscribe( value - { /* 处理数据 */ }, throwable - { /* 处理错误包括超时 */ } );4.3 连续读取与数据监听如果需要持续监听特性值的变化可以使用setNotification或setIndication方法rxBleConnection.setupNotification(characteristicUuid) .flatMap(notificationObservable - notificationObservable) .subscribe( value - { // 每次特性值变化时都会收到通知 Log.d(BLE, 特性值变化: Arrays.toString(value)); }, throwable - { /* 处理错误 */ } );五、数据写入操作实战指南向BLE设备写入数据同样简单直观RxAndroidBle提供了多种写入方式以适应不同场景。5.1 基本写入操作UUID characteristicUuid UUID.fromString(0000ffb2-0000-1000-8000-00805f9b34fb); byte[] data Hello BLE.getBytes(); rxBleConnection.writeCharacteristic(characteristicUuid, data) .subscribe( bytes - { // 写入成功 Log.d(BLE, 数据写入成功); }, throwable - { // 写入失败处理 Log.e(BLE, 写入失败: throwable.getMessage()); } );5.2 大数据写入Long Write当需要写入超过MTU大小的数据时可以使用Long Write功能byte[] largeData new byte[512]; // 大于MTU大小的数据 // 填充数据... rxBleConnection.createNewLongWriteBuilder() .setCharacteristicUuid(characteristicUuid) .setBytes(largeData) .setWriteOperationAckStrategy(new ImmediateSerializedBatchAckStrategy()) .build() .subscribe( () - Log.d(BLE, 长数据写入成功), throwable - Log.e(BLE, 长数据写入失败: throwable.getMessage()) );5.3 写入并读取响应在很多情况下我们需要写入命令后立即读取设备的响应byte[] command GET_STATUS.getBytes(); rxBleConnection.writeCharacteristic(characteristicUuid, command) .flatMap(writtenBytes - rxBleConnection.readCharacteristic(characteristicUuid)) .subscribe( response - { // 处理响应数据 Log.d(BLE, 设备响应: new String(response)); }, throwable - { /* 处理错误 */ } );六、错误处理与异常恢复BLE通信过程中可能会遇到各种错误良好的错误处理机制对于提升用户体验至关重要。6.1 常见异常类型RxAndroidBle定义了多种特定的异常类型方便我们进行精准的错误处理BleDisconnectedException连接断开BleCharacteristicNotFoundException特性未找到BleGattExceptionGATT操作失败BleScanException扫描相关错误6.2 错误处理最佳实践rxBleConnection.readCharacteristic(characteristicUuid) .subscribe( value - { /* 处理数据 */ }, throwable - { if (throwable instanceof BleDisconnectedException) { // 连接断开尝试重连 reconnect(); } else if (throwable instanceof BleGattException) { int status ((BleGattException) throwable).getStatus(); // 根据状态码处理特定错误 handleGattError(status); } else { // 其他错误 Log.e(BLE, 读取错误: throwable.getMessage()); } } );七、高级技巧与性能优化7.1 连接共享对于多个特性操作建议共享一个连接以提高效率// 使用share()操作符共享连接 ObservableRxBleConnection connectionObservable device.connect().share(); // 多个操作共享同一个连接 connectionObservable.flatMap(conn - conn.readCharacteristic(characteristic1Uuid)) .subscribe(/* 处理数据 */); connectionObservable.flatMap(conn - conn.writeCharacteristic(characteristic2Uuid, data)) .subscribe(/* 处理结果 */);7.2 操作优先级当有多个操作同时发生时可以设置操作优先级rxBleConnection.readCharacteristic(characteristicUuid) .subscribeOn(rxBleConnection.createNewQueueWithPriority(Priority.HIGH)) .subscribe(/* 处理数据 */);7.3 批处理操作对于多个连续的读写操作可以使用concatMap进行批处理ListUUID characteristicUuids Arrays.asList(uuid1, uuid2, uuid3); Observable.fromIterable(characteristicUuids) .concatMap(uuid - rxBleConnection.readCharacteristic(uuid)) .subscribe( value - Log.d(BLE, 读取到数据: Arrays.toString(value)), throwable - Log.e(BLE, 批处理错误: throwable.getMessage()), () - Log.d(BLE, 所有特性读取完成) );八、完整示例代码以下是一个完整的RxAndroidBle读写操作示例包含了连接管理、数据读写和错误处理public class BleDeviceManager { private RxBleClient rxBleClient; private Disposable connectionDisposable; private RxBleConnection rxBleConnection; public BleDeviceManager(Context context) { rxBleClient RxBleClient.create(context); } public void connectToDevice(String macAddress) { RxBleDevice device rxBleClient.getBleDevice(macAddress); connectionDisposable device.connect() .subscribe( connection - { rxBleConnection connection; Log.d(BLE, 设备连接成功); // 连接成功后可以进行读写操作 readSensorData(); }, throwable - { Log.e(BLE, 连接失败: throwable.getMessage()); } ); } public void readSensorData() { if (rxBleConnection null) { Log.e(BLE, 未建立连接); return; } UUID characteristicUuid UUID.fromString(0000ffb2-0000-1000-8000-00805f9b34fb); rxBleConnection.readCharacteristic(characteristicUuid) .timeout(10, TimeUnit.SECONDS) .subscribe( value - { String sensorData new String(value); Log.d(BLE, 传感器数据: sensorData); // 处理传感器数据 }, throwable - { Log.e(BLE, 读取数据失败: throwable.getMessage()); } ); } public void sendCommand(String command) { if (rxBleConnection null) { Log.e(BLE, 未建立连接); return; } UUID characteristicUuid UUID.fromString(0000ffb3-0000-1000-8000-00805f9b34fb); rxBleConnection.writeCharacteristic(characteristicUuid, command.getBytes()) .subscribe( bytes - Log.d(BLE, 命令发送成功), throwable - Log.e(BLE, 命令发送失败: throwable.getMessage()) ); } public void disconnect() { if (connectionDisposable ! null !connectionDisposable.isDisposed()) { connectionDisposable.dispose(); } } }九、总结与最佳实践RxAndroidBle为Android BLE开发提供了强大而灵活的响应式编程模型通过本文介绍的读写操作技巧你可以轻松实现与BLE设备的高效通信。以下是一些最佳实践总结合理管理连接避免频繁连接和断开尽量共享连接资源妥善处理生命周期在Activity/Fragment的生命周期方法中管理Disposable优化数据处理对于频繁变化的数据考虑使用节流throttle或去抖动debounce操作符完善错误处理针对不同的异常类型提供具体的恢复策略注意权限管理确保在Android 6.0及以上设备上正确请求运行时权限通过掌握这些技能你将能够构建稳定、高效的BLE应用为用户提供出色的蓝牙设备交互体验。想要了解更多RxAndroidBle的高级特性和最佳实践可以参考项目中的示例代码Java示例sample/src/main/java/com/polidea/rxandroidble2/sample/example4_characteristic/CharacteristicOperationExampleActivity.javaKotlin示例sample-kotlin/src/main/kotlin/com/polidea/rxandroidble2/samplekotlin/example4_characteristic/CharacteristicOperationExampleActivity.kt希望本文能帮助你快速掌握RxAndroidBle的读写操作开发出优秀的BLE应用【免费下载链接】RxAndroidBle项目地址: https://gitcode.com/gh_mirrors/rxa/RxAndroidBle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻