flutter如何实现蓝牙通信
在Flutter中如何实现蓝牙通信功能?需要支持设备扫描、连接和数据传输。目前使用flutter_blue插件但遇到连接不稳定问题,是否有更稳定的方案或优化建议?跨平台兼容性如何保证?求具体代码示例和最佳实践。
2 回复
在Flutter中实现蓝牙通信主要使用 flutter_blue_plus 库,以下是实现步骤和示例代码:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
flutter_blue_plus: ^1.8.0
2. 配置权限
Android (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
iOS (ios/Runner/Info.plist):
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限进行设备连接</string>
</dict>
3. 核心代码示例
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BluetoothController {
// 扫描设备
void scanDevices() {
FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
FlutterBluePlus.scanResults.listen((results) {
for (ScanResult r in results) {
print('发现设备: ${r.device.name} || RSSI: ${r.rssi}');
}
});
}
// 连接设备
Future<void> connect(BluetoothDevice device) async {
await device.connect();
print('已连接到 ${device.name}');
// 发现服务
List<BluetoothService> services = await device.discoverServices();
for (var service in services) {
for (var characteristic in service.characteristics) {
// 读取特征值
List<int> value = await characteristic.read();
print('特征值: $value');
// 写入数据(示例)
await characteristic.write([0x12, 0x34]);
}
}
}
// 断开连接
void disconnect(BluetoothDevice device) {
device.disconnect();
}
}
4. 权限处理(Android 12+)
需要动态请求定位权限:
// 在 initState 中请求权限
await Permission.locationWhenInUse.request();
关键注意事项:
- 真机测试:蓝牙功能必须在真实设备上测试
- 配对设备:确保目标蓝牙设备处于可发现模式
- 特征权限:读写前检查特征的 properties 属性
- 连接状态监听:通过
device.connectionState.listen()监听连接状态
完整示例可参考 flutter_blue_plus 官方文档。


