flutter_reactive_ble扫描BLE设备无UUID,指定UUID扫描失败求助
问题解决:flutter_reactive_ble扫描BLE设备serviceUuids为空/指定UUID扫不到
一、serviceUuids为空的原因及修复
Android BLE扫描默认不会主动返回广播中的服务UUID,需要手动配置扫描选项并确保ESP32的广播包含服务UUID:
- 修改flutter扫描代码,添加扫描配置以获取完整广播数据:
_scanStream = flutterReactiveBle.scanForDevices( withServices: <Uuid>[], // 留空扫描所有设备 scanMode: ScanMode.lowLatency, requireLocationServicesEnabled: true, // Android 6+必须开启位置服务 ).listen((device) { _foundBleUARTDevices.add(device); print( "${device.serviceUuids}---${device.name}---${device.id}---${device.serviceData}---${device.rssi}"); });
- 检查ESP32的BLE广播配置,确保将服务UUID加入广播包(以Arduino代码为例):
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // 配置广播数据 BLEAdvertisingData advertisingData; advertisingData.setCompleteServices(BLEUUID(SERVICE_UUID)); // 把服务UUID加入广播 pServer->getAdvertising()->setAdvertisingData(advertisingData);
二、指定UUID扫描不到设备的排查步骤
匹配UUID格式:flutter_reactive_ble的
Uuid需与ESP32的UUID完全一致,16位UUID要补全为128位蓝牙标准格式(前缀0000xxxx-0000-1000-8000-00805F9B34FB)。例如ESP32用0xFFE0,flutter中要写:Uuid.parse("0000ffe0-0000-1000-8000-00805f9b34fb")检查Android权限:在
AndroidManifest.xml中添加必要权限,并在代码中动态申请:<!-- 位置权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- BLE基础权限 --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+ 额外权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />验证ESP32广播:用nRF Connect等BLE调试工具扫描ESP32,确认设备可见且服务UUID出现在广播中。如果调试工具也看不到,优先排查ESP32的广播代码。
确认广播完整性:ESP32需配置为广播完整服务UUID,避免只发送缩短格式的UUID,导致扫描过滤失效。
内容的提问来源于stack exchange,提问作者Jephtah Jephtah
相关产品推荐
相关产品推荐

