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

Flutter实现多BLE设备连接读写应用的开发步骤咨询

Flutter BLE多设备连接、数据读写完整操作指南

1. 前期依赖准备

  • 优先选用flutter_blue_plus包,这是目前维护活跃度最高的Flutter BLE开发包,已经封装了多设备连接、GATT操作的全量能力,底层直接调用原生系统的BluetoothGatt API,不需要自己实现原生层桥接逻辑
  • 安卓端权限配置:在android/app/src/main/AndroidManifest.xml中添加如下权限:
<!-- Android 12及以上权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<!-- Android 11及以下兼容权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
  • iOS端权限配置:在ios/Runner/Info.plist中添加如下声明:
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限来连接BLE设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>需要蓝牙权限来连接BLE设备</string>
<!-- 后台连接BLE权限,不需要后台运行可以不填 -->
<key>UIBackgroundModes</key>
<array>
  <string>bluetooth-central</string>
</array>

2. 多设备连接核心实现步骤

  • 初始化BLE适配器,检查蓝牙状态
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 校验设备是否支持BLE
if (await FlutterBluePlus.isSupported == false) {
  // 自定义处理设备不支持BLE的逻辑
  return;
}
// 监听蓝牙开关状态
FlutterBluePlus.adapterState.listen((state) {
  if (state == BluetoothAdapterState.on) {
    // 蓝牙已开启,可启动扫描
  } else {
    // 提示用户手动开启蓝牙
  }
});
  • 扫描并过滤目标设备
// 开始扫描,设置超时时间避免一直耗电
FlutterBluePlus.startScan(timeout: const Duration(seconds: 4));
// 存储扫描到的目标设备
List<BluetoothDevice> targetDevices = [];
// 监听扫描结果
FlutterBluePlus.scanResults.listen((results) {
  for (ScanResult r in results) {
    // 按设备名、服务UUID等规则过滤你需要连接的设备,避免重复添加
    if (r.device.name.startsWith("你的设备名前缀") && !targetDevices.contains(r.device)) {
      targetDevices.add(r.device);
    }
  }
});
  • 批量连接多设备,每个设备的连接逻辑独立,不需要等待上一个设备连接完成再发起下一个连接,普通手机同时支持的BLE连接数通常在5~7个,具体和硬件性能有关
// 存储已连接设备,用设备唯一ID作为key
Map<String, BluetoothDevice> connectedDevices = {};
// 存储每个设备的GATT服务列表
Map<String, List<BluetoothService>> deviceServices = {};

// 批量连接逻辑
for (var device in targetDevices) {
  try {
    // 连接设备,autoConnect设为false可提升连接速度
    await device.connect(autoConnect: false);
    // 连接成功后存入缓存
    connectedDevices[device.remoteId.toString()] = device;
    // 发现该设备的所有GATT服务
    var services = await device.discoverServices();
    deviceServices[device.remoteId.toString()] = services;
    // 监听设备断开状态,及时清理缓存
    device.connectionState.listen((state) {
      if (state == BluetoothConnectionState.disconnected) {
        connectedDevices.remove(device.remoteId.toString());
        deviceServices.remove(device.remoteId.toString());
        // 可自定义添加重连逻辑
      }
    });
  } catch (e) {
    // 单个设备连接失败不影响其他设备,可自定义异常提示
    print("设备${device.name}连接失败:$e");
  }
}

3. 多设备数据读写操作

  • 指定设备写数据
Future<void> writeDataToDevice(String deviceId, List<int> data) async {
  // 获取目标设备
  var device = connectedDevices[deviceId];
  if (device == null) return;
  // 替换成你自己的服务UUID、写特征UUID
  var targetService = deviceServices[deviceId]?.firstWhere((s) => s.uuid.toString() == "你的服务UUID");
  var writeChar = targetService?.characteristics.firstWhere((c) => c.uuid.toString() == "你的写特征UUID");
  if (writeChar == null) return;
  // withoutResponse设为false会等待设备响应,适合可靠性要求高的场景
  await writeChar.write(data, withoutResponse: false);
}
  • 监听设备主动上报数据
Future<void> listenDeviceReport(String deviceId) async {
  var device = connectedDevices[deviceId];
  if (device == null) return;
  // 替换成你自己的服务UUID、通知特征UUID
  var targetService = deviceServices[deviceId]?.firstWhere((s) => s.uuid.toString() == "你的服务UUID");
  var notifyChar = targetService?.characteristics.firstWhere((c) => c.uuid.toString() == "你的通知特征UUID");
  if (notifyChar == null) return;
  // 开启特征值通知
  await notifyChar.setNotifyValue(true);
  // 监听设备上报的数据流
  notifyChar.lastValueStream.listen((data) {
    // 自定义处理二进制数据即可
    print("设备$deviceId上报数据:$data");
  });
}

4. 注意事项

  • 多设备连接时不要频繁调用连接/断开接口,容易导致系统BLE适配器缓存错乱,出现GATT 133之类的常见异常
  • 单个设备的读写操作不要并发执行,建议给每个设备的GATT操作加任务队列,按顺序执行,避免调用冲突
  • 页面销毁或者应用退出时,主动断开所有已连接设备,释放系统资源
// 批量断开设备
for (var device in connectedDevices.values) {
  await device.disconnect();
}

内容的提问来源于stack exchange,提问作者Asma Ben Nasr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:27:02