Flutter如何使用flutter_blue_plus接收解析蓝牙广播数据

在Flutter中使用flutter_blue_plus库时,如何正确接收并解析蓝牙设备的广播数据?我已经尝试通过startScan获取设备列表,但不知道如何从AdvertisementData中提取具体的广播信息(如厂商数据、服务UUID等)。能否提供一个完整的代码示例,展示从扫描到解析广播包的全过程?包括如何处理不同类型的广播数据格式(如iBeacon、Eddystone等)?

2 回复

使用flutter_blue_plus接收蓝牙广播数据步骤:

  1. 扫描设备:flutterBluePlus.scanResults.listen
  2. 获取广播数据:scanResult.advertisementData.manufacturerData
  3. 解析数据:根据设备协议转换字节数据
  4. 处理数据:提取所需字段信息

需先申请蓝牙权限,注意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();
});

关键说明:

  1. 广播数据获取:通过 advertisementData.manufacturerData 获取制造商特定数据
  2. 数据解析:需要根据设备的广播协议自定义解析逻辑
  3. 权限处理:需要动态申请位置权限(Android 12+ 需要 BLUETOOTH_SCAN 权限)
  4. 数据处理:广播数据通常包含设备ID、传感器数据等,需按设备协议解析

实际使用时请根据具体设备的广播数据格式调整解析逻辑。

回到顶部