如何通过经典蓝牙从ESP32向Flutter App读取数据?
Flutter 蓝牙串口对接ESP32入门指导
一、选对依赖,避开过时坑
- 别用停更的
flutter_blue,直接上flutter_blue_plus——它是前者的维护分支,适配最新Flutter版本,安装命令:flutter pub add flutter_blue_plus - ESP32的蓝牙串口用SPP协议,对应固定UUID:服务UUID
0000ffe0-0000-1000-8000-00805f9b34fb,特征值UUID0000ffe1-0000-1000-8000-00805f9b34fb,不用额外装串口库,用flutter_blue_plus直接读写即可。
二、一步步实现通信
1. 配置权限(必做)
- 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" /> <!-- Android 12及以上需要以下权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> - iOS:在
ios/Runner/Info.plist中添加蓝牙权限描述:<key>NSBluetoothAlwaysUsageDescription</key> <string>需要蓝牙连接ESP32获取数据</string> <key>NSBluetoothPeripheralUsageDescription</key> <string>需要蓝牙连接ESP32获取数据</string>
2. 扫描并连接ESP32
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; // 检查蓝牙可用性并开启 if (!await FlutterBluePlus.isAvailable) { // 提示用户设备不支持蓝牙 return; } await FlutterBluePlus.turnOn(); // 扫描设备,匹配ESP32的蓝牙名称 FlutterBluePlus.scanResults.listen((results) { for (var result in results) { if (result.device.name == "ESP32_BT") { // 需与ESP32代码中的蓝牙名称一致 result.device.connect(); break; } } }); // 扫描4秒后停止 await FlutterBluePlus.startScan(timeout: const Duration(seconds: 4));
3. 接收ESP32的数据
连接成功后,找到SPP服务和特征值,监听数据:
// 监听设备连接状态 device.connectionState.listen((state) { if (state == BluetoothConnectionState.connected) { // 发现设备服务 device.discoverServices().then((services) { for (var service in services) { if (service.uuid.toString() == "0000ffe0-0000-1000-8000-00805f9b34fb") { // 找到串口特征值 for (var char in service.characteristics) { if (char.uuid.toString() == "0000ffe1-0000-1000-8000-00805f9b34fb") { // 开启通知,监听数据 char.setNotifyValue(true); char.value.listen((bytes) { String receivedData = String.fromCharCodes(bytes); // 处理数据,比如更新UI显示 }); } } } } }); } });
4. ESP32端配合代码
用BluetoothSerial库实现蓝牙串口发送,示例代码:
#include "BluetoothSerial.h" BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("ESP32_BT"); // 蓝牙名称需与Flutter端匹配 } void loop() { // 每秒发送一次测试数据 SerialBT.println("Temp: 25°C, Humid: 60%"); delay(1000); }
三、常见踩坑解决
- 依赖报错:执行
flutter pub upgrade更新所有依赖,再flutter clean后重新编译。 - 连接失败:检查手机蓝牙权限是否授予,ESP32是否正常上电,两者保持近距离。
- 数据乱码:确保ESP32与Flutter端编码一致(默认UTF-8),SPP协议会自动适配波特率,无需手动设置。
内容的提问来源于stack exchange,提问作者Delta88
相关产品推荐
相关产品推荐

