Flutter如何使用flutter_blue_plus接收解析蓝牙广播数据
在Flutter中使用flutter_blue_plus库时,如何正确接收并解析蓝牙设备的广播数据?我已经尝试通过startScan获取设备列表,但不知道如何从AdvertisementData中提取具体的广播信息(如厂商数据、服务UUID等)。能否提供一个完整的代码示例,展示从扫描到解析广播包的全过程?包括如何处理不同类型的广播数据格式(如iBeacon、Eddystone等)?
2 回复
使用flutter_blue_plus接收蓝牙广播数据步骤:
- 扫描设备:
flutterBluePlus.scanResults.listen - 获取广播数据:
scanResult.advertisementData.manufacturerData - 解析数据:根据设备协议转换字节数据
- 处理数据:提取所需字段信息
需先申请蓝牙权限,注意iOS和Android的配置差异。
更多关于Flutter如何使用flutter_blue_plus接收解析蓝牙广播数据的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中使用 flutter_blue_plus 接收并解析蓝牙广播数据,步骤如下:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
flutter_blue_plus: ^1.30.0
2. 配置权限
Android (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
iOS (ios/Runner/Info.plist):
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限扫描设备</string>
</dict>
3. 核心代码实现
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BluetoothManager {
// 开始扫描设备
void startScan() {
FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
// 监听扫描结果
FlutterBluePlus.scanResults.listen((results) {
for (ScanResult result in results) {
// 获取广播数据
List<int> manufacturerData = _getManufacturerData(result.advertisementData);
if (manufacturerData.isNotEmpty) {
// 解析自定义广播数据(示例:解析16位制造商数据)
String parsedData = _parseManufacturerData(manufacturerData);
print('设备: ${result.device.name} | 数据: $parsedData');
}
}
});
}
// 提取制造商数据
List<int> _getManufacturerData(AdvertisementData adv) {
if (adv.manufacturerData.isEmpty) return [];
// 获取第一个制造商ID对应的数据
int manufacturerId = adv.manufacturerData.keys.first;
return adv.manufacturerData[manufacturerId]!;
}
// 解析制造商数据(示例:转为16进制字符串)
String _parseManufacturerData(List<int> data) {
return data.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(':');
}
// 停止扫描
void stopScan() {
FlutterBluePlus.stopScan();
}
}
4. 使用示例
// 在页面中调用
BluetoothManager manager = BluetoothManager();
// 开始扫描
manager.startScan();
// 10秒后停止
Future.delayed(Duration(seconds: 10), () {
manager.stopScan();
});
关键说明:
- 广播数据获取:通过
advertisementData.manufacturerData获取制造商特定数据 - 数据解析:需要根据设备的广播协议自定义解析逻辑
- 权限处理:需要动态申请位置权限(Android 12+ 需要
BLUETOOTH_SCAN权限) - 数据处理:广播数据通常包含设备ID、传感器数据等,需按设备协议解析
实际使用时请根据具体设备的广播数据格式调整解析逻辑。

