You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中flutter_blue_plus无法正常识别蓝牙设备求助

Flutter Blue Plus扫描蓝牙设备无名称、目标设备找不到的解决方案

问题原因拆解

  1. 设备名称不显示:BLE设备的名称分两种存储方式——广播包中的localName和设备GAP服务中的device.name。系统蓝牙会主动发起轻量连接获取设备名称,但flutter_blue_plus默认只读取广播包中的信息,若设备未在广播中携带名称,就会显示为空。
  2. 目标设备扫不到:可能是扫描模式灵敏度不足、未指定目标设备的服务UUID过滤、权限缺失,或者目标设备广播频率/功率较低。

针对性解决方案

1. 修复设备名称为空问题

优先读取广播包中的本地名称,若为空则主动读取设备GAP服务的名称:

scanSubScription = flutterBlue.scan(
  scanMode: ScanMode.lowLatency, // 提高扫描灵敏度
).listen((scanResult) async {
  print('------');
  // 优先取广播包中的本地名称
  String deviceName = scanResult.advertisementData.localName.isNotEmpty 
      ? scanResult.advertisementData.localName 
      : scanResult.device.name;
  print("$deviceName --- ${scanResult.rssi}");
  print(scanResult.device);

  // 广播无名称时主动读取设备名称
  if (deviceName.isEmpty) {
    try {
      await scanResult.device.readName();
      print("读取到设备名称:${scanResult.device.name}");
    } catch (e) {
      print("读取名称失败:$e");
    }
  }

  // 匹配目标设备时同时检查两种名称
  if (deviceName == TARGET_DEVICE_NAME || scanResult.device.name == TARGET_DEVICE_NAME) {
    print('DEVICE found');
    stopScan();
    setState(() {
      connectionText = "Found Target Device";
    });

    targetDevice = scanResult.device;
    connectToDevice();
  }
}, onDone: () => stopScan());

2. 确保扫描到目标设备

  • 指定服务UUID过滤:如果目标设备有固定的BLE服务UUID,扫描时过滤可精准定位:
flutterBlue.scan(
  withServices: [Guid("替换为目标设备的服务UUID")],
  scanMode: ScanMode.lowLatency,
)
  • 检查权限配置:
    • Android:在AndroidManifest.xml中添加BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,并动态申请。
    • iOS:在Info.plist中添加NSBluetoothAlwaysUsageDescription权限描述。
  • 延长扫描时长:避免过早调用stopScan(),给低频率广播的设备足够的被发现时间。

3. 额外排查步骤

  • 重启设备蓝牙或调用flutterBlue.stopScan()后重新扫描,清除蓝牙缓存。
  • 确认目标设备处于可发现模式(部分设备需手动开启,默认仅广播不允许被发现)。
  • 用第三方工具(如nRF Connect)扫描,验证目标设备是否正常广播,排除设备自身问题。

内容的提问来源于stack exchange,提问作者Happy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:45:32