Flutter蓝牙通信插件flutter_blue的使用
Flutter蓝牙通信插件flutter_blue的使用
FlutterBlue是一个用于Flutter应用的蓝牙插件,支持跨平台(iOS和Android)的低功耗蓝牙(BLE)操作。本文将介绍如何使用flutter_blue
插件进行蓝牙设备的扫描、连接、服务发现以及读写特性等操作。
Alpha版本警告
此库正在积极开发中,并且API可能会在发展过程中发生变化。请确保准备应对可能的破坏性变更。并且该插件必须在真实设备上测试。
跨平台蓝牙LE功能
通过FlutterBlue实例,您可以扫描并连接附近的设备(BluetoothDevice)。一旦连接到设备,可以通过BluetoothDevice对象发现服务(BluetoothService)、特征(BluetoothCharacteristic)和描述符(BluetoothDescriptor),然后直接与这些特征和描述符进行交互。
设置
更改Android的minSdkVersion
由于flutter_blue
仅兼容19及以上版本的Android SDK,请在android/app/build.gradle
文件中修改如下:
android {
defaultConfig {
minSdkVersion: 19
}
}
添加蓝牙权限
需要添加蓝牙和位置访问权限:
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_COARSE_LOCATION"/>
iOS
在ios/Runner/Info.plist
中添加以下权限:
<dict>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Need BLE permission</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Need BLE permission</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Need Location permission</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Need Location permission</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Need Location permission</string>
</dict>
使用示例
获取FlutterBlue实例
FlutterBlue flutterBlue = FlutterBlue.instance;
扫描设备
// 开始扫描
flutterBlue.startScan(timeout: Duration(seconds: 4));
// 监听扫描结果
var subscription = flutterBlue.scanResults.listen((results) {
for (ScanResult r in results) {
print('${r.device.name} found! rssi: ${r.rssi}');
}
});
// 停止扫描
flutterBlue.stopScan();
连接到设备
await device.connect();
// 断开连接
device.disconnect();
发现服务
List<BluetoothService> services = await device.discoverServices();
services.forEach((service) {
// 处理每个服务
});
读写特征值
// 读取所有特征值
var characteristics = service.characteristics;
for(BluetoothCharacteristic c in characteristics) {
List<int> value = await c.read();
print(value);
}
// 写入一个特征值
await c.write([0x12, 0x34]);
设置通知并监听变化
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
// 处理新值
});
示例完整代码
以下是完整的示例程序,展示了如何构建用户界面来管理蓝牙设备的搜索、连接和服务探索等功能。
import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() => runApp(FlutterBlueApp());
class FlutterBlueApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
color: Colors.lightBlue,
home: StreamBuilder<BluetoothState>(
stream: FlutterBlue.instance.state,
initialData: BluetoothState.unknown,
builder: (c, snapshot) {
final state = snapshot.data;
if (state == BluetoothState.on) {
return FindDevicesScreen();
}
return BluetoothOffScreen(state: state);
}),
);
}
}
// 其他部分省略,参照提供的示例代码实现...
请注意,上述代码片段是简化版,具体实现细节可以参考完整的示例代码。
更多关于Flutter蓝牙通信插件flutter_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙通信插件flutter_blue的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter蓝牙通信插件flutter_blue
的代码示例。这个示例展示了如何扫描附近的蓝牙设备、连接到某个设备、发现服务和特征值,以及读写特征值。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_blue
依赖:
dependencies:
flutter:
sdk: flutter
flutter_blue: ^0.13.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤进行蓝牙通信:
1. 初始化FlutterBlue实例
在你的主文件(通常是main.dart
)中,初始化FlutterBlue
实例:
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Flutter Blue Example'),
),
body: BluetoothScreen(),
),
);
}
}
class BluetoothScreen extends StatefulWidget {
@override
_BluetoothScreenState createState() => _BluetoothScreenState();
}
class _BluetoothScreenState extends State<BluetoothScreen> {
final FlutterBlue flutterBlue = FlutterBlue.instance;
@override
void initState() {
super.initState();
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
setState(() {});
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ListTile(
leading: Icon(Icons.bluetooth_searching),
title: Text('Scanning for devices...'),
subtitle: Text('${flutterBlue.state}'),
),
Expanded(
child: DeviceList(flutterBlue.scanResults.value),
),
],
);
}
}
class DeviceList extends StatelessWidget {
final List<ScanResult> devices;
DeviceList(this.devices);
@override
Widget build(BuildContext context) {
return ListView(
children: devices.map((device) => ListTile(
leading: (device.advertisementData.icon != null)
? Image.memory(device.advertisementData.icon)
: Icon(Icons.device_unknown),
title: Text(device.device.name ?? 'Unknown device'),
subtitle: Text(device.device.address.toString()),
trailing: IconButton(
icon: Icon(Icons.bluetooth_connected),
onPressed: () {
// Connect to the device
connectToDevice(device.device);
},
),
)).toList(),
);
}
void connectToDevice(BluetoothDevice device) {
device.connect().then((_) {
// Discover services after connecting
device.discoverServices().then((services) {
// Here you can find services and characteristics
services.forEach((service) {
service.characteristics.forEach((characteristic) {
// You can read or write to characteristics here
characteristic.read().then((value) {
// Handle the value read from characteristic
});
characteristic.write(Uint8List.fromList([/* byte data */])).then((_) {
// Handle the write operation completion
});
});
});
});
}).catchError((error) {
// Handle connection error
});
}
}
2. 处理权限和状态管理
在实际应用中,你可能需要处理权限请求和更复杂的状态管理。例如,在Android上,你可能需要请求位置权限,因为蓝牙扫描需要使用位置信息。
3. 注意事项
- 确保在
AndroidManifest.xml
中添加了必要的权限,例如ACCESS_FINE_LOCATION
和BLUETOOTH
等。 - 在iOS上,你需要在
Info.plist
中添加蓝牙使用描述,并处理蓝牙权限请求。 - 考虑到蓝牙操作的异步性,使用
Future
和async/await
来管理异步操作。
4. 运行和调试
将设备连接到你的开发机器,运行Flutter应用,然后观察控制台输出以调试任何潜在的问题。
以上代码提供了一个基本框架,展示了如何使用flutter_blue
进行蓝牙设备扫描、连接、服务发现和特征值读写。根据你的具体需求,你可以进一步扩展和修改这些功能。