基于Flutter与HM-10的手机BLE外设识别问题求助
解决方案:让HM-10识别Flutter BLE广播的手机
1. 修正HM-10的AT指令配置(核心问题)
你的代码错误地将HM-10设置为从机模式(AT+ROLE1),只有主机模式才能主动扫描BLE设备。同时扫描指令使用错误,需调整如下:
- 替换
AT+ROLE1为AT+ROLE0(切换为主机模式) - 替换
AT+DISC?为AT+DISC(启动扫描,而非查询扫描状态) - 新增
AT+TYPE0设置通用扫描模式,避免过滤设备
修正后的Setup代码:
void setup() { Serial.begin(9600); mySerial.begin(9600); Serial.println("Starting BLE scan..."); mySerial.println("AT"); // 测试模块通讯 delay(500); mySerial.println("AT+IMME0"); // 非立即模式 delay(500); mySerial.println("AT+ROLE0"); // 必须设为主机才能扫描 delay(500); mySerial.println("AT+TYPE0"); // 通用扫描模式 delay(500); mySerial.println("AT+DISC"); // 启动BLE扫描 }
2. 确保Flutter端广播符合HM-10扫描规则
flutter_bluetooth_serial默认广播可能缺少HM-10识别所需的关键参数,需明确配置:
- 必须设置可识别的设备名称
- 可选添加HM-10默认兼容的服务UUID(
0000FFE0-0000-1000-8000-00805F9B34FB)
示例Flutter广播代码片段:
BluetoothAdapter adapter = await BluetoothAdapter.instance; await adapter.startAdvertising( BluetoothAdvertisementData( name: "MyFlutterBLE", // 强制设置名称,HM-10依赖此识别 serviceUuids: ["0000FFE0-0000-1000-8000-00805F9B34FB"], // 匹配HM-10默认UUID ), );
3. 修复Arduino的响应解析逻辑
原代码用readString()易因HM-10分块响应导致解析失败,改为按行读取并匹配扫描结果格式:
void loop() { if (mySerial.available()) { String line = mySerial.readStringUntil('\n'); // 按行读取响应 line.trim(); Serial.println("HM-10 Response: " + line); // 扫描结果格式为 "+DISC:设备地址,设备名称,RSSI" int discIndex = line.indexOf("+DISC:"); if (discIndex >= 0) { String result = line.substring(discIndex + 6); int comma1 = result.indexOf(','); int comma2 = result.indexOf(',', comma1 + 1); if (comma1 != -1 && comma2 != -1) { String deviceName = result.substring(comma1 + 1, comma2); Serial.println("Found Device: " + deviceName); } } } }
4. 额外排查点
- 确认HM-10波特率与Arduino的SoftwareSerial一致(均为9600),若之前修改过波特率,用
AT+BAUD8重置回9600 - 手机需开启蓝牙可被发现模式(部分Android版本需手动开启)
- 测试时手机与HM-10距离不超过1米,避免信号过弱导致扫描失败
内容的提问来源于stack exchange,提问作者gms
相关产品推荐
相关产品推荐

