Flutter如何实现蓝牙通信功能flutterblueplus

在Flutter项目中使用flutterblueplus实现蓝牙通信时遇到了问题:扫描设备时返回的结果不稳定,有时能发现设备有时却扫描不到。请问该如何优化扫描流程?另外,在建立连接后经常出现断开的情况,有没有办法提高连接稳定性?是否需要特殊配置或处理?希望能分享一些最佳实践或代码示例。

2 回复

使用flutterblueplus库实现Flutter蓝牙通信:

  1. 添加依赖:flutter pub add flutter_blue_plus
  2. 权限配置:在AndroidManifest.xml和Info.plist中添加蓝牙权限
  3. 核心功能:
    • 扫描设备:FlutterBluePlus.scan()
    • 连接设备:device.connect()
    • 读写特征值:characteristic.write()/read()
  4. 支持BLE设备通信,需处理连接状态和数据处理回调

更多关于Flutter如何实现蓝牙通信功能flutterblueplus的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中实现蓝牙通信功能,推荐使用 flutter_blue_plus 插件(FlutterBlue 的升级版本),它支持 BLE(蓝牙低功耗)通信。以下是基本实现步骤和代码示例:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  flutter_blue_plus: ^1.30.0

运行 flutter pub get 安装。

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" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

注意:从 Android 12 开始,需额外声明 BLUETOOTH_CONNECT 等权限。

iOS

ios/Runner/Info.plist 中添加:

<dict>
  <key>NSBluetoothAlwaysUsageDescription</key>
  <string>需要蓝牙权限以连接设备</string>
</dict>

3. 基本使用代码

初始化与权限检查

import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 检查蓝牙是否开启
if (await FlutterBluePlus.isAvailable == false) {
  print("设备不支持蓝牙");
  return;
}

// 请求权限(需配合 permission_handler 插件)
// 示例代码省略具体权限请求过程

// 监听蓝牙状态
FlutterBluePlus.adapterState.listen((state) {
  if (state == BluetoothAdapterState.on) {
    print("蓝牙已开启");
  }
});

扫描设备

List<ScanResult> scanResults = [];

// 开始扫描
FlutterBluePlus.startScan(timeout: Duration(seconds: 10));

// 监听扫描结果
var subscription = FlutterBluePlus.scanResults.listen((results) {
  scanResults = results;
  // 更新UI显示设备列表
});

// 停止扫描
FlutterBluePlus.stopScan();

连接设备

// 选择设备后连接
BluetoothDevice device = ... // 从扫描结果中获取
await device.connect();
print("已连接至: ${device.localName}");

发现服务与特征

List<BluetoothService> services = await device.discoverServices();
for (var service in services) {
  for (var characteristic in service.characteristics) {
    // 找到可读/写的特征值
    if (characteristic.properties.read) {
      List<int> value = await characteristic.read();
      print("特征值: $value");
    }
  }
}

写入数据

// 向特征写入数据
await characteristic.write([0x12, 0x34]);

监听数据

// 订阅特征通知
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
  print("收到数据: $value");
});

4. 断开连接

await device.disconnect();

注意事项:

  1. 真机测试:蓝牙功能需在真机上测试,模拟器不支持。
  2. 权限处理:需要动态申请位置权限(Android)和蓝牙使用权限(iOS)。
  3. 设备配对:部分设备可能需要先手动配对才能连接。
  4. 错误处理:添加 try-catch 处理连接和通信异常。

通过以上步骤,你可以在 Flutter 应用中实现基本的蓝牙通信功能。建议参考 flutter_blue_plus 官方文档 获取更详细说明。

回到顶部