如何扫描蓝牙广播数据?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
相关产品推荐
相关产品推荐

