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
相关产品推荐
相关产品推荐

