Flutter BLE广播器无法发数据包,ESP32检测不到指定UUID
问题排查方向
1. Beacon格式与ESP32扫描逻辑不匹配
beacon_broadcast默认发送的是iBeacon格式,并非普通BLE服务广播。如果ESP32代码仅针对服务UUID或设备名称做扫描过滤,肯定找不到目标——iBeacon的UUID藏在广播帧的特定位置(从第9字节开始的16字节),帧头是固定的0x02 0x01 0x06 0x1A 0xFF 0x4C 0x00 0x02 0x15。
- 先检查ESP32代码有没有专门解析iBeacon帧的逻辑,别用普通BLE广播的解析方式套。
2. 手机端Beacon参数配置错误
核对你的main.dart初始化代码:
- UUID是不是严格的128位小写格式?比如
00000000-0000-0000-0000-000000000000,别写错字符或大小写。 - Major/Minor值别超出0-65535的范围,部分设备碰到非法值会直接拒绝广播。
- txPower设得太低会导致ESP32收不到信号,试试默认值或调高一点。
3. 权限配置细节遗漏(尤其是Android 12+)
别只看静态权限,Android 12及以上必须动态申请权限:
- 除了
BLUETOOTH_ADVERTISE、BLUETOOTH_SCAN、BLUETOOTH_CONNECT,还要添加ACCESS_FINE_LOCATION,而且必须在代码里弹框让用户授权,仅在Manifest里声明没用。 - 确认Manifest里加了BLE硬件要求:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
4. Beacon未真正启动
给启动代码加错误监听,确认是否启动失败:
beaconBroadcast.start().catchError((error) { print('Beacon启动失败: $error'); });
另外,小米、华为这类机型后台会限制BLE广播,测试时别切后台,保持APP在前台。
5. ESP32扫描参数设置问题
- 检查ESP32是否用的被动扫描(
BLE_SCAN_TYPE_PASSIVE),主动扫描可能过滤掉iBeacon帧。 - 别设置过于严格的过滤条件,比如仅扫描特定设备名称——iBeacon的设备名通常是空的,或是苹果厂商ID,过滤名称肯定抓不到。
- 核对ESP32的BLE初始化流程,是否正确开启BLE模式、注册扫描回调。
6. 先确认手机是否真的在发广播
用nRF Connect这类工具在手机上扫描自己的设备,看看有没有iBeacon广播出来。如果工具都扫不到,那是手机端的问题;如果工具能扫到,就是ESP32代码的问题。
内容的提问来源于stack exchange,提问作者Richty lul
相关产品推荐
相关产品推荐

