使用Flutter+Android Studio开发BLE可写入但无法读取的问题
问题
使用Flutter + Android Studio,通过flutter_blue_plus库开发BLE蓝牙读写应用时,可正常写入数据,但读取时报错,调换读写顺序问题依旧。
报错信息:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(readCharacteristic, The READ property is not supported by this BLE characteristic, null, null)
相关读写代码:
bleBuilder!.writeData(); bleBuilder!.readData(); void writeData() { String serviceUUID = accDataCharacteristic!.serviceUuid.toString(); String sUUID = accDataCharacteristic!.uuid.toString(); String characterUUID = accDataCharacteristic!.characteristicUuid.toString(); print('writeData serviceUUID '+ serviceUUID + ' sUUID '+ sUUID + ' characterUUID '+ characterUUID); accDataCharacteristic?.write([51, 52, 99, 100]); } void readData(){ String serviceUUID = accDataCharacteristic!.serviceUuid.toString(); String sUUID = accDataCharacteristic!.uuid.toString(); String characterUUID = accDataCharacteristic!.characteristicUuid.toString(); print('readData serviceUUID '+ serviceUUID + ' sUUID '+ sUUID + ' characterUUID '+ characterUUID); }
日志信息:
I/flutter (11323): floatingActionButton onPressed I/flutter (11323): writeData serviceUUID 6e400001-b5a3-f393-e0a9-e50e24dcca9e sUUID 6e400002-b5a3-f393-e0a9-e50e24dcca9e characterUUID 6e400002-b5a3-f393-e0a9-e50e24dcca9e I/flutter (11323): readData serviceUUID 6e400001-b5a3-f393-e0a9-e50e24dcca9e sUUID 6e400002-b5a3-f393-e0a9-e50e24dcca9e characterUUID 6e400002-b5a3-f393-e0a9-e50e24dcca9e I/flutter (11323): readData Instance of 'Future<List<int>>' I/flutter (11323): Instance of 'Future<List<int>>' I/flutter (11323): [FBP] <writeCharacteristic> args: {remote_id: D4:EC:FA:03:64:55, service_uuid: 6e400001-b5a3-f393-e0a9-e50e24dcca9e, secondary_service_uuid: null, characteristic_uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e, write_type: 0, allow_long_write: 0, value: 33346364} D/[FBP-Android](11323): [FBP] onMethodCall: writeCharacteristic D/[FBP-Android](11323): [FBP] onCharacteristicWrite: D/[FBP-Android](11323): [FBP] chr: 6e400002-b5a3-f393-e0a9-e50e24dcca9e D/[FBP-Android](11323): [FBP] status: GATT_SUCCESS (0) I/flutter (11323): [FBP] <writeCharacteristic> result: true I/flutter (11323): [FBP] [[ OnCharacteristicWritten ]] result: {error_string: GATT_SUCCESS, service_uuid: 6e400001-b5a3-f393-e0a9-e50e24dcca9e, success: 1, remote_id: D4:EC:FA:03:64:55, error_code: 0, characteristic_uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e, value: 33346364} I/flutter (11323): [FBP] <readCharacteristic> args: {remote_id: D4:EC:FA:03:64:55, service_uuid: 6e400001-b5a3-f393-e0a9-e50e24dcca9e, secondary_service_uuid: null, characteristic_uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e} D/[FBP-Android](11323): [FBP] onMethodCall: readCharacteristic I/gralloc4(11323): @set_metadata: update dataspace from GM (0x00000000 -> 0x08010000) E/flutter (11323): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(readCharacteristic, The READ property is not supported by this BLE characteristic, null, null) E/flutter (11323): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:648:7) E/flutter (11323): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:334:18) E/flutter (11323): <asynchronous suspension> E/flutter (11323): #2 FlutterBluePlus._invokeMethod (package:flutter_blue_plus/src/flutter_blue_plus.dart:603:13) E/flutter (11323): <asynchronous suspension> E/flutter (11323): #3 BluetoothCharacteristic.read (package:flutter_blue_plus/src/bluetooth_characteristic.dart:130:7) E/flutter (11323): <asynchronous suspension>
报错含义与解决方案
报错含义
该报错明确说明:你当前操作的BLE特征值(Characteristic)不支持READ属性,即这个特征值仅允许写入操作,不允许主动读取。从日志和代码可见,你读写用的是同一个特征值UUID 6e400002-b5a3-f393-e0a9-e50e24dcca9e,而BLE设备的特征值通常分工明确:部分负责写入指令,部分负责返回数据(通过主动读或通知推送)。
解决方案
排查目标服务下的所有特征值属性
先扫描目标服务的全部特征值,检查每个特征值的properties字段,找到支持read或notify属性的特征值:// 遍历服务下的所有特征值 for (var chr in targetService.characteristics) { print("特征值UUID: ${chr.uuid}, 支持属性: ${chr.properties}"); if (chr.properties.read) { print("该特征值支持主动读取"); } if (chr.properties.notify) { print("该特征值支持通知推送"); } }更换到支持读/通知的特征值获取数据
BLE设备返回数据大多用**通知(Notify)**方式,而非主动读取。找到支持notify属性的特征值,订阅通知接收数据:// 筛选支持通知的特征值 var notifyCharacteristic = targetService.characteristics.firstWhere( (chr) => chr.properties.notify, orElse: () => throw Exception("未找到支持通知的特征值") ); // 开启通知订阅 await notifyCharacteristic.setNotifyValue(true); // 监听通知数据 notifyCharacteristic.value.listen((data) { print("收到设备推送数据: $data"); });如果确实需要主动读取,就更换到带有
read属性的特征值执行读取操作。修正异步操作逻辑
BLE读写都是异步操作,需用await确保操作顺序和结果获取:- 调用读写方法时:
await bleBuilder!.writeData(); await bleBuilder!.readData(); - 完善
readData方法的异步处理:Future<void> readData() async { // 打印UUID代码... try { List<int> data = await accDataCharacteristic!.read(); print("读取到数据: $data"); } catch (e) { print("读取失败: $e"); } }
- 调用读写方法时:
内容的提问来源于stack exchange,提问作者t h
相关产品推荐
相关产品推荐

