Flutter教程实现蓝牙低功耗通信

在Flutter中实现蓝牙低功耗(BLE)通信时,连接设备经常不稳定,有什么可靠的解决方案吗?

目前尝试使用flutter_blue_plus插件,但遇到以下问题:

  1. 安卓设备扫描不到部分BLE外设,iOS却可以正常识别
  2. 连接成功后频繁自动断开,需要反复重连
  3. 数据传输过程中会出现数据包丢失的情况

想请教:

  • 如何优化BLE设备的扫描和连接稳定性?
  • 是否有更好的Flutter BLE插件推荐?
  • 针对不同平台的兼容性问题该怎么处理?
  • 数据通信时有没有保证可靠性的最佳实践?
3 回复

要实现基于Flutter的蓝牙低功耗(BLE)通信,你可以使用插件如flutter_blueble_client。以下是基本步骤:

  1. 添加依赖:在pubspec.yaml中添加flutter_blue
dependencies:
  flutter_blue: ^0.8.0
  1. 初始化和扫描蓝牙设备:
import 'package:flutter_blue/flutter_blue.dart';

final FlutterBlue flutterBlue = FlutterBlue.instance;

void startScan() {
  flutterBlue.scan(timeout: Duration(seconds: 4)).listen((scanResult) {
    print('发现设备: ${scanResult.device.name}');
  });
}
  1. 连接设备并读取服务/特征值:
Future<void> connectAndDiscover(BluetoothDevice device) async {
  await device.connect();
  for (var service in await device.discoverServices()) {
    if (service.uuid.toString() == "目标UUID") {
      for (var characteristic in service.characteristics) {
        if (characteristic.properties.read) {
          List<int> value = await characteristic.read();
          print('读取到的值: $value');
        }
      }
    }
  }
}
  1. 处理通知(如果需要实时数据):
characteristic.setNotifyValue(true).then((_) {
  characteristic.value.listen((value) {
    print('收到通知: $value');
  });
});
  1. 注意权限:在Android上需添加蓝牙权限至AndroidManifest.xml

  2. 测试时确保你的手机支持BLE,并且实际设备已开启蓝牙和可被发现。

此代码仅作为基础示例,实际应用中需根据具体需求调整UUID、错误处理等细节。

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


作为屌丝程序员,我来分享下实现BLE通信的简单思路:

  1. 首先需要初始化蓝牙:await FlutterBlue.instance.startScan(timeout: Duration(seconds: 4));

  2. 扫描设备:监听扫描结果FlutterBlue.instance.scanResults.listen((results) {...}

  3. 连接设备:BluetoothDevice device = results[0].device; await device.connect();

  4. 发现服务和特征值:

List<BluetoothService> services = await device.discoverServices();
for (var service in services) {
    if (service.uuid.toString() == "目标UUID") {
        List<BluetoothCharacteristic> characteristics = service.characteristics;
        for(var char in characteristics){
            if(char.uuid.toString() == "接收UUID"){
                _rxChar = char;
            }
            if(char.uuid.toString() == "发送UUID"){
                _txChar = char;
            }
        }
    }
}
  1. 接收数据:注册通知await _rxChar.setNotifyValue(true);

  2. 发送数据:await _txChar.write([0x01, 0x02]);

记得处理异常和断开连接。这个流程能完成基本的BLE通信,适合初学者练习。

Flutter蓝牙低功耗(BLE)通信教程

以下是使用Flutter实现蓝牙低功耗(BLE)通信的基本步骤:

1. 添加依赖

pubspec.yaml中添加以下依赖:

dependencies:
  flutter_blue_plus: ^1.10.0 # 最流行的Flutter BLE插件

2. 基本权限设置

Android: 在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: 在Info.plist中添加:

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

3. 基本代码实现

import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 1. 扫描设备
void scanDevices() {
  FlutterBluePlus.startScan(timeout: Duration(seconds: 4));
  
  FlutterBluePlus.scanResults.listen((results) {
    for (ScanResult result in results) {
      print('发现设备: ${result.device.name} - ${result.device.id}');
      // RSSI: 信号强度
      // AdvertisementData: 广播数据
    }
  });
}

// 2. 连接设备
Future<void> connectToDevice(BluetoothDevice device) async {
  await device.connect(autoConnect: false);
  print('已连接到 ${device.name}');
  
  // 发现服务
  List<BluetoothService> services = await device.discoverServices();
  for (BluetoothService service in services) {
    print('服务 UUID: ${service.uuid}');
    
    // 发现特征
    for (BluetoothCharacteristic characteristic in service.characteristics) {
      print('特征 UUID: ${characteristic.uuid}');
    }
  }
}

// 3. 读写数据
Future<void> readWriteCharacteristic(BluetoothCharacteristic characteristic) async {
  // 读取
  List<int> value = await characteristic.read();
  print('读取的值: $value');
  
  // 写入
  await characteristic.write([0x12, 0x34]);
  
  // 订阅通知
  characteristic.setNotifyValue(true);
  characteristic.value.listen((value) {
    print('收到通知: $value');
  });
}

// 4. 断开连接
void disconnectDevice(BluetoothDevice device) {
  device.disconnect();
  print('已断开连接');
}

4. 注意事项

  1. 在Android 6.0+上需要动态请求位置权限
  2. iOS需要物理设备测试,模拟器不支持蓝牙
  3. 不同设备的服务UUID和特征UUID可能不同
  4. 连接前最好先停止扫描

5. 进阶功能

  • 根据服务UUID过滤设备
  • 处理连接状态变化
  • 实现重连机制
  • 数据协议解析

希望这个基本教程能帮助你开始Flutter的BLE开发!如果需要更具体的实现细节,可以查阅flutter_blue_plus的官方文档。

回到顶部