Flutter Blue Plus扫描无法发现HC-05设备的问题求助
Flutter Blue Plus 无法扫描到HC-05的解决方案
以下是针对你遇到的扫描不到HC-05模块问题的排查和修复步骤:
1. 确认HC-05硬件处于可发现状态
HC-05只有在配对模式(指示灯快速闪烁)下才会被蓝牙扫描发现,正常连接状态下可能不会广播自身信息。请按HC-05的重置/配对按钮,确保进入可发现模式后再尝试扫描。
2. 完善权限申请(Android端)
Android 12+及部分低版本系统需要位置权限才能正常扫描蓝牙设备,你的代码中缺少位置权限申请,补充如下:
修改_requestPermissions方法:
void _requestPermissions() async { // 申请位置权限(蓝牙扫描依赖) var locationStatus = await Permission.location.status; if (!locationStatus.isGranted) { await Permission.location.request(); } var scanStatus = await Permission.bluetoothScan.status; if (!scanStatus.isGranted) { await Permission.bluetoothScan.request(); } var connectStatus = await Permission.bluetoothConnect.status; if (!connectStatus.isGranted) { await Permission.bluetoothConnect.request(); } }
同时在android/app/src/main/AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="false" />
3. 修改扫描逻辑,避免依赖设备名称
部分HC-05模块可能未设置名称,或名称被修改为非"HC-05"的值。修改扫描监听代码,打印所有扫描到的设备信息,同时支持通过MAC地址或服务UUID匹配:
FlutterBluePlus.scanResults.listen((results) { for (ScanResult result in results) { // 打印完整设备信息,方便排查 print('发现设备: 名称=${result.device.name}, MAC=${result.device.id}, RSSI=${result.rssi}'); // 匹配逻辑:名称或MAC地址或服务UUID bool isHC05 = result.device.name == 'HC-05' || result.device.id.toString() == '你的HC-05 MAC地址' // 替换为实际MAC || result.advertisementData.serviceUuids.contains(Guid("00001101-0000-1000-8000-00805F9B34FB")); // HC-05 SPP服务UUID if (isHC05) { setState(() { _deviceToConnect = result.device; }); _connectToDevice(result.device); FlutterBluePlus.stopScan(); // 找到设备后立即停止扫描 break; } } });
4. 优化扫描参数
调整扫描时长、添加服务UUID过滤,提高HC-05的识别率:
void _startScan() async { // 检查蓝牙是否已开启 if (!(await FlutterBluePlus.isOn)) { setState(() { _status = '请先打开蓝牙'; }); return; } setState(() { _isScanning = true; }); // 扫描HC-05的SPP服务UUID,缩小扫描范围 FlutterBluePlus.startScan( timeout: Duration(seconds: 20), withServices: [Guid("00001101-0000-1000-8000-00805F9B34FB")] ); // 后续监听逻辑... }
5. 检查代码中的扫描停止逻辑
当前代码在找到设备后未主动停止扫描,可能导致状态更新异常。在匹配到HC-05后调用FlutterBluePlus.stopScan(),避免重复处理。
内容的提问来源于stack exchange,提问作者somaya mohamad
相关产品推荐
相关产品推荐

