flutter_blue_plus示例无法扫描ESP32 BLE设备的问题求助
Flutter Blue Plus无法扫描到ESP32的问题排查方案
核心原因:Android模拟器不支持真实BLE扫描
Android Studio的模拟器无法识别物理蓝牙设备,只能处理虚拟BLE设备。你用iPhone的nRF能搜到ESP32,说明ESP32广播正常,问题出在模拟器的硬件限制上。
具体解决步骤
1. 改用真实Android设备测试
这是最直接有效的方法,模拟器本身不具备与真实BLE设备通信的能力,换成实体Android手机运行Flutter应用,大概率能正常扫描到ESP32。
2. 补全Android 11的权限配置
Android 11(API 30)对蓝牙权限有严格要求,检查android/app/src/main/AndroidManifest.xml,确保包含以下权限:
<!-- 旧版蓝牙权限(兼容到API30) --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 11+ 专属蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- BLE扫描必须的位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 声明支持BLE --> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
同时,在Flutter代码中动态申请权限,因为Android 6+以上危险权限(位置、蓝牙扫描)需要运行时授权。可以用permission_handler包,在扫描前调用权限申请逻辑,确保BLUETOOTH_SCAN和ACCESS_FINE_LOCATION权限已被用户授予。
3. 调整Flutter Blue Plus的扫描逻辑
默认扫描可能过滤了设备,尝试修改扫描代码:
- 精准扫描:指定ESP32的服务UUID,避免无关设备干扰:
FlutterBluePlus.startScan( timeout: const Duration(seconds: 5), withServices: [Guid("你的ESP32服务UUID")] );
- 全量扫描:关闭服务过滤,扫描所有可见BLE设备:
FlutterBluePlus.startScan(timeout: const Duration(seconds: 10));
- 检查示例代码中是否有额外过滤逻辑(比如只显示已配对设备),确保扫描回调没有丢弃ESP32的广播数据。
4. 确认ESP32的广播状态
检查ESP32代码,确保广播正常启动:
- 确认调用了
esp_ble_gap_start_advertising(),且广播参数配置正确(比如广播名称、可发现模式)。 - 重启ESP32,避免蓝牙模块处于异常状态。
5. 排除环境干扰
- 确保ESP32与测试设备距离在1-2米内,避开金属遮挡物。
- 关闭周围其他蓝牙设备,减少广播信号冲突。
内容的提问来源于stack exchange,提问作者susanliu
相关产品推荐
相关产品推荐

