Flutter蓝牙通信插件quick_blue的使用
Flutter蓝牙通信插件quick_blue的使用
quick_blue
quick_blue
是一个跨平台(Android/iOS/macOS/Windows/Linux)的BluetoothLE插件,适用于Flutter。
使用说明
- 扫描BLE外围设备
- 连接BLE外围设备
- 发现BLE外围设备的服务
- 在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
更多关于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
插件进行蓝牙设备的扫描、连接、服务发现、特征值发现以及数据的读写。根据你的实际需求,你可以进一步扩展和修改这些代码。