在Flutter中实现蓝牙通信时,如何正确扫描和连接附近的蓝牙设备?

在Flutter中实现蓝牙通信时,如何正确扫描和连接附近的蓝牙设备?连接成功后,有哪些可靠的方法可以稳定传输数据?我遇到了设备列表刷新不全、连接经常断开的问题,该如何解决?另外,不同安卓/iOS版本对蓝牙权限的处理有差异,该如何兼容?求推荐Flutter蓝牙通信的最佳实践和常用库。

3 回复

作为一个屌丝程序员,我可以给你简单介绍下Flutter蓝牙通信。

首先需要添加依赖包flutter_blue。获取蓝牙实例FlutterBlue.instance,扫描设备scanResults,然后监听状态变化。

连接设备时调用connect(),监听onConnectionStateChange。获取服务discoverServices(),找到对应特征值setCharacteristicValue()setNotifyValue(true)

发送数据时写入特征值write(),接收数据监听onValueChange。记得处理权限和异常,Android需申请ACCESS_FINE_LOCATION

完整代码较复杂,建议参考官方文档和示例代码。这是一个简单的框架:

final BluetoothDevice device = ...;
await device.connect();
final service = await device.discoverServices().firstWhere(...);
final characteristic = service.characteristics.first;
await characteristic.write(value);
characteristic.value.listen((data) { ... });

希望能帮到你这个同样奋斗的屌丝程序员!

更多关于在Flutter中实现蓝牙通信时,如何正确扫描和连接附近的蓝牙设备?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


以下为简单的Flutter蓝牙通信教程:

  1. 引入依赖
    pubspec.yaml中添加flutter_blue

    dependencies:
      flutter_blue: ^0.8.0
    
  2. 初始化蓝牙
    检查蓝牙是否开启,若未开启则提示用户打开:

    final BluetoothAdapter bluetooth = BluetoothAdapter();
    if (!await bluetooth.enable()) {
      print("蓝牙未开启");
    }
    
  3. 扫描设备
    开始扫描附近的蓝牙设备:

    final FlutterBlue flutterBlue = FlutterBlue.instance;
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    await for (var scanResult in flutterBlue.scanResults) {
      print(scanResult.device.name);
    }
    
  4. 连接设备
    找到目标设备后进行连接:

    BluetoothDevice device = scanResult.device;
    await device.connect();
    
  5. 数据传输
    建立服务和特征值后发送/接收数据:

    List<BluetoothService> services = await device.discoverServices();
    for (var service in services) {
      if (service.uuid.toString() == "目标UUID") {
        for (var characteristic in service.characteristics) {
          await characteristic.write([0x01, 0x02]);
          List<int> data = await characteristic.read();
          print(data);
        }
      }
    }
    
  6. 断开连接
    完成后断开连接:

    await device.disconnect();
    

注意:确保蓝牙权限已配置,并处理异常情况。

Flutter蓝牙通信教程:设备连接与数据传输

基本设置

首先添加必要的依赖到pubspec.yaml:

dependencies:
  flutter_blue_plus: ^1.8.0

设备扫描与连接

import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 扫描设备
void scanDevices() {
  FlutterBluePlus.startScan(timeout: Duration(seconds: 4));
  FlutterBluePlus.scanResults.listen((results) {
    for (ScanResult r in results) {
      print('发现设备: ${r.device.name} ${r.device.id}');
    }
  });
}

// 连接设备
Future<void> connectDevice(BluetoothDevice device) async {
  await device.connect(autoConnect: false);
  print('设备已连接');
}

发现服务与特征

Future<void> discoverServices(BluetoothDevice device) async {
  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}');
    }
  }
}

数据传输

// 读取数据
Future<void> readData(BluetoothCharacteristic characteristic) async {
  List<int> value = await characteristic.read();
  print('读取的数据: $value');
}

// 写入数据
Future<void> writeData(BluetoothCharacteristic characteristic) async {
  await characteristic.write([0x12, 0x34]);
  print('数据已写入');
}

// 订阅通知
void subscribeToNotifications(BluetoothCharacteristic characteristic) {
  characteristic.setNotifyValue(true);
  characteristic.value.listen((value) {
    print('收到通知: $value');
  });
}

注意事项

  1. 在Android上需要BLUETOOTH和BLUETOOTH_ADMIN权限
  2. iOS需要在Info.plist中添加蓝牙使用描述
  3. 正确处理连接断开和重连逻辑
  4. 注意特征属性的读写权限

这是Flutter蓝牙通信的基本框架,实际开发中需要根据具体设备和协议进行调整。

回到顶部