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

如何扫描蓝牙广播数据?Flutter广播设备nRF无法检测问题

问题解答

1. 如何扫描蓝牙广播数据?

在Flutter中,通常依赖BLE(蓝牙低功耗)相关包实现蓝牙广播数据扫描,推荐使用flutter_blue_plus或flutter_reactive_ble,以下是基于flutter_blue_plus的实现步骤:

  • 添加依赖:在pubspec.yaml中引入包

    dependencies:
      flutter_blue_plus: ^1.13.17
    
  • 配置权限:
    Android端在AndroidManifest.xml添加:

    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
    

    iOS端在Info.plist添加:

    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>需要蓝牙权限扫描设备</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>需要蓝牙权限扫描设备</string>
    
  • 扫描代码示例:

    import 'package:flutter_blue_plus/flutter_blue_plus.dart';
    
    void startBleScan() {
      // 启动扫描,10秒后自动停止
      FlutterBluePlus.startScan(timeout: const Duration(seconds: 10));
      
      // 监听扫描结果
      FlutterBluePlus.scanResults.listen((results) {
        for (ScanResult result in results) {
          print('设备名称: ${result.device.name}, MAC地址: ${result.device.id}');
          print('广播厂商数据: ${result.advertisementData.manufacturerData}');
          print('服务UUID列表: ${result.advertisementData.serviceUuids}');
        }
      });
    }
    

2. nearby_connections广播无法被nRF搜到的原因及解决办法

你使用的nearby_connections包基于Google Nearby Connections API,它并非标准BLE广播协议,而是一套结合BLE、Wi-Fi Direct等技术的私有近场通信方案,因此nRF这类仅支持标准BLE扫描的工具无法识别它的广播信号。

你的代码潜在问题(即使修复仍无法被nRF识别)

  • 权限缺失:Android需要补充ACCESS_FINE_LOCATION、BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT等权限,iOS需配置Nearby相关权限,但这仅能保证Nearby Connections自身正常工作,无法让设备被BLE工具扫描。
  • 策略模式:Strategy.P2P_POINT_TO_POINT为一对一连接模式,广播逻辑与标准BLE差异极大。

替代方案:标准BLE广播实现(可被nRF搜到)

如果需要被nRF等BLE工具扫描,改用BLE相关包实现广播,以下是flutter_blue_plus的广播示例:

import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'dart:typed_data';

void startBleAdvertise() async {
  // 检查并开启蓝牙
  if (!await FlutterBluePlus.isOn) {
    await FlutterBluePlus.turnOn();
  }

  // 配置广播内容
  AdvertiseData advertiseData = AdvertiseData(
    name: 'My BLE Device',
    // 自定义厂商数据(厂商ID + 数据)
    manufacturerData: {0x0001: Uint8List.fromList([0x01, 0x02, 0x03])},
    // 广播服务UUID
    serviceUuids: [Guid('0000ffe0-0000-1000-8000-00805f9b34fb')],
  );

  // 启动广播
  await FlutterBluePlus.startAdvertising(advertiseData);
  print('BLE广播已启动');
}

配置完成后,nRF即可扫描到你的设备,并读取广播名称、厂商数据及服务UUID。

内容的提问来源于stack exchange,提问作者Yolo-cell-hash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:55:19