如何用Flutter Reactive BLE发送UUID至蓝牙设备并存储响应字符串
Flutter Reactive BLE 简化实现与读取问题排查
读取Characteristic失败的常见原因
- 设备未完成连接:读写操作必须在设备处于已连接状态下执行,若未调用
connectToDevice或连接未完成就执行读取,会直接失败。 - UUID格式错误:需将UUID字符串通过
Uuid.parse()转换为Uuid类型,直接传入字符串会导致识别失败。 - 特征权限不足:目标特征需开启读权限,可通过BLE调试工具确认特征属性。
- 设备意外断开:读取时设备已断开连接,需检查设备电量或连接稳定性。
单文件封装BLE逻辑方案
将BLE连接、读取等逻辑封装到单独的BleManager类中,对外暴露极简接口,实现一行代码读取特征值。
封装文件示例(ble_manager.dart)
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; class BleManager { final FlutterReactiveBle _bleInstance = FlutterReactiveBle(); String? _currentConnectedDeviceId; // 内部处理连接逻辑,避免重复连接 Future<void> _ensureConnected(String deviceId) async { if (_currentConnectedDeviceId == deviceId) return; // 监听连接状态,处理连接/断开事件 _bleInstance.connectToDevice(id: deviceId).listen((state) { switch (state.connectionState) { case DeviceConnectionState.connected: _currentConnectedDeviceId = deviceId; break; case DeviceConnectionState.disconnected: _currentConnectedDeviceId = null; break; default: break; } }); // 等待连接建立(可根据设备调整等待时长) await Future.delayed(const Duration(seconds: 2)); } // 对外暴露的读取方法,一行代码调用 Future<List<int>> readBleCharacteristic({ required String deviceId, required String serviceUuid, required String characteristicUuid, }) async { // 确保设备已连接 await _ensureConnected(deviceId); if (_currentConnectedDeviceId != deviceId) { throw Exception("设备连接失败:$deviceId"); } // 解析UUID并构建特征对象 final qualifiedChar = QualifiedCharacteristic( serviceId: Uuid.parse(serviceUuid), characteristicId: Uuid.parse(characteristicUuid), deviceId: deviceId, ); return await _bleInstance.readCharacteristic(qualifiedChar); } // 断开指定设备连接 void disconnect(String deviceId) { if (_currentConnectedDeviceId == deviceId) { _bleInstance.disconnectDevice(id: deviceId); _currentConnectedDeviceId = null; } } }
调用示例
// 初始化BleManager(建议用单例模式,全局复用) final bleManager = BleManager(); // 一行代码读取特征值 try { final response = await bleManager.readBleCharacteristic( deviceId: "你的BLE设备ID", serviceUuid: "0000ffe0-0000-1000-8000-00805f9b34fb", characteristicUuid: "0000ffe1-0000-1000-8000-00805f9b34fb", ); print("读取结果:$response"); } catch (e) { print("读取失败:$e"); }
新手易犯错误提醒
- 跳过连接步骤:必须先完成设备连接才能执行读写,不能直接调用
readCharacteristic。 - UUID未转换:直接传入字符串UUID而非
Uuid.parse()转换后的对象,会导致特征匹配失败。 - 异步逻辑处理不当:需在
async函数中使用await调用异步方法,避免出现未处理的Future。 - 忽略连接状态:连接需要时间,调用连接后立即读写大概率会失败,需等待连接状态变为已连接。
内容的提问来源于stack exchange,提问作者ChaseRatliff
相关产品推荐
相关产品推荐

