You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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设备的特征值通常分工明确:部分负责写入指令,部分负责返回数据(通过主动读或通知推送)。

解决方案

  1. 排查目标服务下的所有特征值属性
    先扫描目标服务的全部特征值,检查每个特征值的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("该特征值支持通知推送");
      }
    }
    
  2. 更换到支持读/通知的特征值获取数据
    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属性的特征值执行读取操作。

  3. 修正异步操作逻辑
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:16:06