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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:15:31