Flutter蓝牙通信插件quick_blue的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter蓝牙通信插件quick_blue的使用

quick_blue

quick_blue 是一个跨平台(Android/iOS/macOS/Windows/Linux)的BluetoothLE插件,适用于Flutter。

使用说明

  1. 扫描BLE外围设备
  2. 连接BLE外围设备
  3. 发现BLE外围设备的服务
  4. 在BLE中央与外围设备之间传输数据

下表列出了各个API在不同操作系统上的支持情况:

API Android iOS macOS Windows Linux
isBluetoothAvailable ✔️ ✔️ ✔️ ✔️ ✔️
startScan/stopScan ✔️ ✔️ ✔️ ✔️ ✔️
connect/disconnect ✔️ ✔️ ✔️ ✔️ ✔️
discoverServices ✔️ ✔️ ✔️ ✔️ ✔️
setNotifiable ✔️ ✔️ ✔️ ✔️ ✔️
readValue ✔️ ✔️ ✔️ ✔️ ✔️
writeValue ✔️ ✔️ ✔️ ✔️ ✔️
requestMtu ✔️ ✔️ ✔️ ✔️ ✔️

扫描BLE外围设备

QuickBlue.scanResultStream.listen((result) {
  print('onScanResult $result');
});

QuickBlue.startScan();
// ...
QuickBlue.stopScan();

连接BLE外围设备

连接到从 QuickBlue.scanResultStream 接收到的 deviceId

QuickBlue.setConnectionHandler(_handleConnectionChange);

void _handleConnectionChange(String deviceId, BlueConnectionState state) {
  print('_handleConnectionChange $deviceId, $state');
}

QuickBlue.connect(deviceId);
// ...
QuickBlue.disconnect(deviceId);

发现BLE外围设备的服务

发现 deviceId 的的服务。

QuickBlue.setServiceHandler(_handleServiceDiscovery);

void _handleServiceDiscovery(String deviceId, String serviceId) {
  print('_handleServiceDiscovery $deviceId, $serviceId');
}

QuickBlue.discoverServices(deviceId);

在BLE中央与外围设备之间传输数据

  • 拉取外围设备的数据

    数据会在 QuickBlue.setValueHandler 的值处理器中接收。这是因为 iOS/macOS 上的 peripheral(_:didUpdateValueFor:error:) 工作方式。

    // Data would receive from value handler of `QuickBlue.setValueHandler`
    QuickBlue.readValue(deviceId, serviceId, characteristicId);
    
  • 发送数据到外围设备

    QuickBlue.writeValue(deviceId, serviceId, characteristicId, value);
    
  • 接收外围设备的数据

    QuickBlue.setValueHandler(_handleValueChange);
    
    void _handleValueChange(String deviceId, String characteristicId, Uint8List value) {
      print('_handleValueChange $deviceId, $characteristicId, ${hex.encode(value)}');
    }
    
    QuickBlue.setNotifiable(deviceId, serviceId, characteristicId, true);
    

更多关于Flutter蓝牙通信插件quick_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙通信插件quick_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter应用中使用quick_blue插件进行蓝牙通信的示例代码。quick_blue是一个强大的Flutter插件,用于实现蓝牙设备的扫描、连接、数据读写等功能。

首先,确保你已经在pubspec.yaml文件中添加了quick_blue依赖:

dependencies:
  flutter:
    sdk: flutter
  quick_blue: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以按照以下步骤在你的Flutter应用中使用quick_blue插件:

1. 初始化QuickBlue

在你的主文件(通常是main.dart)中,初始化QuickBlue服务:

import 'package:flutter/material.dart';
import 'package:quick_blue/quick_blue.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await QuickBlue.instance.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BluetoothScreen(),
    );
  }
}

2. 扫描蓝牙设备

创建一个新的屏幕(例如BluetoothScreen.dart)来扫描蓝牙设备:

import 'package:flutter/material.dart';
import 'package:quick_blue/quick_blue.dart';

class BluetoothScreen extends StatefulWidget {
  @override
  _BluetoothScreenState createState() => _BluetoothScreenState();
}

class _BluetoothScreenState extends State<BluetoothScreen> {
  List<ScannedDevice> scannedDevices = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bluetooth Scanner'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: startScanning,
            child: Text('Start Scanning'),
          ),
          SizedBox(height: 20),
          Expanded(
            child: ListView.builder(
              itemCount: scannedDevices.length,
              itemBuilder: (context, index) {
                final device = scannedDevices[index];
                return ListTile(
                  title: Text(device.name ?? 'Unknown Device'),
                  subtitle: Text(device.address),
                  trailing: IconButton(
                    icon: Icon(Icons.connect_without_contact),
                    onPressed: () => connectToDevice(device),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }

  void startScanning() async {
    setState(() {
      scannedDevices.clear();
    });
    QuickBlue.instance.scanResults.listen((results) {
      setState(() {
        scannedDevices = results;
      });
    });
    await QuickBlue.instance.startScan(withServices: []);
  }

  void connectToDevice(ScannedDevice device) async {
    // 停止扫描
    await QuickBlue.instance.stopScan();

    // 连接设备
    final deviceInfo = await device.device.connect();
    // 你可以在这里继续处理连接后的逻辑,例如发现服务和特征值
  }
}

3. 连接设备并读写数据

connectToDevice方法中,你可以进一步处理连接后的逻辑,例如发现服务和特征值,并进行数据读写。以下是一个简单的示例:

void connectToDevice(ScannedDevice device) async {
  // 停止扫描
  await QuickBlue.instance.stopScan();

  // 连接设备
  final connectedDevice = await device.device.connect();

  // 发现服务
  final services = await connectedDevice.discoverServices();

  // 假设我们知道要交互的服务UUID
  final serviceUuid = BluetoothUuid.fromString('0000180d-0000-1000-8000-00805f9b34fb'); // 示例UUID
  BluetoothService? service = services.firstWhereOrNull((s) => s.uuid == serviceUuid);

  if (service != null) {
    // 发现特征值
    final characteristics = await service.discoverCharacteristics();

    // 假设我们知道要读写的特征值UUID
    final characteristicUuid = BluetoothUuid.fromString('00002a37-0000-1000-8000-00805f9b34fb'); // 示例UUID
    BluetoothCharacteristic? characteristic = characteristics.firstWhereOrNull((c) => c.uuid == characteristicUuid);

    if (characteristic != null) {
      // 读取数据
      final data = await characteristic.read();
      print('Read data: ${data.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('')}');

      // 写入数据
      final writeData = Uint8List.fromList([0x01, 0x02, 0x03]); // 示例数据
      await characteristic.write(writeData, withoutResponse: false);
    }
  }

  // 断开连接(可选)
  // await connectedDevice.disconnect();
}

请注意,上述代码中的UUID是示例值,你需要根据实际情况替换为你要交互的蓝牙设备的服务UUID和特征值UUID。

这个示例展示了如何使用quick_blue插件进行蓝牙设备的扫描、连接、服务发现、特征值发现以及数据的读写。根据你的实际需求,你可以进一步扩展和修改这些代码。

回到顶部