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

如何通过经典蓝牙从ESP32向Flutter App读取数据?

Flutter 蓝牙串口对接ESP32入门指导

一、选对依赖,避开过时坑

  • 别用停更的flutter_blue,直接上flutter_blue_plus——它是前者的维护分支,适配最新Flutter版本,安装命令:
    flutter pub add flutter_blue_plus
    
  • ESP32的蓝牙串口用SPP协议,对应固定UUID:服务UUID0000ffe0-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:34:51