Flutter 蓝牙智能硬件操作示例
"我在用Flutter开发一个需要操作蓝牙智能硬件的App,目前遇到几个问题想请教:
- 在Android和iOS上实现蓝牙连接和通信的最佳实践有哪些?
- 有没有推荐的Flutter蓝牙插件,flutter_blue_plus和flutter_reactive_ble哪个更稳定?
- 如何处理不同蓝牙设备的协议差异,特别是数据传输格式不统一的情况?
- 在断开重连时经常出现设备无法识别的问题,该怎么优化重连机制?希望有实际项目经验的大神能分享下解决方案。"
3 回复
以下是一个简单的Flutter蓝牙智能硬件操作示例:
- 添加依赖:
dependencies:
flutter_blue: ^0.8.0
- 请求权限: 在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"/>
- 示例代码:
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: BluetoothPage(),
);
}
}
class BluetoothPage extends StatefulWidget {
@override
_BluetoothPageState createState() => _BluetoothPageState();
}
class _BluetoothPageState extends State<BluetoothPage> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> devicesList = [];
@override
void initState() {
super.initState();
startScan();
}
void startScan() async {
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
setState(() {
devicesList = results;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('蓝牙设备扫描')),
body: ListView.builder(
itemCount: devicesList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(devicesList[index].device.name),
subtitle: Text(devicesList[index].device.id.toString()),
);
},
),
);
}
}
该示例展示了如何扫描附近的蓝牙设备并列出设备名称和ID。
更多关于Flutter 蓝牙智能硬件操作示例的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
以下是一个简单的Flutter蓝牙智能硬件操作示例,使用flutter_blue
插件:
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: BluetoothPage(),
);
}
}
class BluetoothPage extends StatefulWidget {
@override
_BluetoothPageState createState() => _BluetoothPageState();
}
class _BluetoothPageState extends State<BluetoothPage> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<ScanResult> scanResults = [];
@override
void initState() {
super.initState();
startScan();
}
void startScan() async {
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
setState(() {
scanResults = results;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('蓝牙设备扫描')),
body: ListView.builder(
itemCount: scanResults.length,
itemBuilder: (context, index) {
var device = scanResults[index].device;
return ListTile(
title: Text(device.name.isEmpty ? '未知设备' : device.name),
subtitle: Text(device.id.toString()),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => DevicePage(device: device),
),
);
},
);
},
),
);
}
}
class DevicePage extends StatefulWidget {
final BluetoothDevice device;
DevicePage({required this.device});
@override
_DevicePageState createState() => _DevicePageState();
}
class _DevicePageState extends State<DevicePage> {
BluetoothDevice? device;
BluetoothConnection? connection;
@override
void initState() {
super.initState();
connectToDevice();
}
Future<void> connectToDevice() async {
connection = await BluetoothConnection.toAddress(widget.device.id.toString());
setState(() {
device = widget.device;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('${device?.name}')),
body: Center(
child: ElevatedButton(
onPressed: () {
if (connection != null && connection!.isConnected) {
connection!.input?.listen(null).onDone(() {
print('Device disconnected');
});
}
},
child: Text('连接'),
),
),
);
}
}
此代码实现了蓝牙设备的扫描和连接功能。注意需添加flutter_blue
依赖并在Android和iOS中进行相关权限配置。
以下是一个简单的 Flutter 蓝牙操作示例,使用 flutter_blue_plus
插件进行蓝牙设备连接和数据读写:
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
// 1. 初始化蓝牙适配器
FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
// 2. 扫描设备
void scanDevices() {
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
for (ScanResult result in results) {
print('发现设备: ${result.device.name} (${result.device.id})');
}
});
}
// 3. 连接设备
Future connectToDevice(BluetoothDevice device) async {
await device.connect(autoConnect: false);
print('已连接到 ${device.name}');
// 4. 发现服务
List<BluetoothService> services = await device.discoverServices();
for (BluetoothService service in services) {
print('发现服务: ${service.uuid}');
// 5. 获取特征值
for (BluetoothCharacteristic characteristic in service.characteristics) {
print('特征值: ${characteristic.uuid}');
// 6. 读取数据示例
if(characteristic.properties.read) {
List<int> value = await characteristic.read();
print('读取值: $value');
}
// 7. 写入数据示例
if(characteristic.properties.write) {
await characteristic.write([0x12, 0x34]);
print('写入成功');
}
}
}
}
// 使用示例
void main() async {
runApp(MyApp());
scanDevices();
// 假设已经通过扫描获得了设备对象
BluetoothDevice targetDevice = ...;
await connectToDevice(targetDevice);
}
注意事项:
- 需要在
pubspec.yaml
添加依赖:
dependencies:
flutter_blue_plus: ^1.0.0
- Android需要BLUETOOTH和BLUETOOTH_ADMIN权限
- iOS需要在Info.plist添加NSBluetoothAlwaysUsageDescription
完整实现还需要处理设备断开、错误回调等情况,以上是基础操作的核心代码片段。