Flutter蓝牙通信插件flutter_bluetooth_serial的使用
Flutter蓝牙通信插件 flutter_bluetooth_serial
的使用
概述
flutter_bluetooth_serial
是一个用于Flutter应用中实现经典蓝牙(仅支持RFCOMM)通信的插件。它提供了从设备发现到数据传输等一系列功能,适用于需要与蓝牙设备进行串行通信的应用场景。
特性
- 适配器状态监控
- 开启/关闭蓝牙适配器
- 打开设置界面
- 发现设备(并请求可发现性)
- 列出已配对设备及新设备配对
- 同时连接多个设备
- 发送和接收数据(支持多连接)
当前版本仅支持Android平台,并且使用的是Serial Port Profile (SPP)来通过RFCOMM传输数据。
快速开始
添加依赖
在项目的pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter_bluetooth_serial: ^0.3.2
安装
使用以下命令安装依赖:
flutter pub get
导入
在Dart代码中导入该库:
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';
使用示例
这里提供了一个简单的示例,展示了如何连接到指定地址的蓝牙设备,并监听来自该设备的数据输入流:
try {
BluetoothConnection connection = await BluetoothConnection.toAddress(address);
print('Connected to the device');
connection.input.listen((Uint8List data) {
print('Data incoming: ${ascii.decode(data)}');
connection.output.add(data); // Echo back received data
if (ascii.decode(data).contains('!')) {
connection.finish(); // Close the connection
print('Disconnecting by local host');
}
}).onDone(() {
print('Disconnected by remote request');
});
} catch (exception) {
print('Cannot connect, exception occurred');
}
示例应用
查看完整的示例应用程序,包括如何与Arduino HC-05以及Raspberry Pi上的RFCOMM接口建立连接。你可以参考官方示例,其中包含了一些截图展示主要功能页面如主屏幕、发现设备、简单聊天服务器模式以及后台连接等。
示例应用入口文件
以下是示例应用的入口文件内容:
import 'package:flutter/material.dart';
import './MainPage.dart';
void main() => runApp(new ExampleApplication());
class ExampleApplication extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(home: MainPage());
}
}
请确保你已经阅读了库中的文档函数或查看了提供的例子代码以获取更详细的用法指导。此外,项目团队正在努力简化通信操作,使其比字节流的操作更加简便,具体讨论可以参见#41。
更多关于Flutter蓝牙通信插件flutter_bluetooth_serial的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙通信插件flutter_bluetooth_serial的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter蓝牙通信插件flutter_bluetooth_serial
的示例代码。这个示例展示了如何扫描附近的蓝牙设备、连接到设备以及发送和接收数据。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_bluetooth_serial
依赖:
dependencies:
flutter:
sdk: flutter
flutter_bluetooth_serial: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,创建一个Flutter应用,并在main.dart
文件中编写以下代码:
import 'package:flutter/material.dart';
import 'package:flutter_bluetooth_serial/flutter_bluetooth_serial.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
FlutterBluetoothSerial _bluetooth = FlutterBluetoothSerial();
List<BluetoothDevice> _devices = [];
BluetoothConnection? _connection;
bool _isScanning = false;
@override
void initState() {
super.initState();
_bluetooth.onDiscoveredDevice.listen((BluetoothDevice device) {
setState(() {
_devices.add(device);
});
});
_bluetooth.onStateChanged.listen((BluetoothState state) {
print('BluetoothAdapter state: ${state.toString()}');
});
}
Future<void> _startScan() async {
if (!_isScanning) {
setState(() {
_isScanning = true;
});
await _bluetooth.startScan(results: []);
setState(() {
_isScanning = false;
});
}
}
Future<void> _stopScan() async {
await _bluetooth.stopScan();
}
Future<void> _connectToDevice(BluetoothDevice device) async {
_connection = await device.createConnection();
_connection!.input!.listen(_onDataReceived).onDone(() {
print('Disconnected!');
});
}
void _onDataReceived(Uint8List data) {
String receivedData = String.fromCharCodes(data);
print('Received: $receivedData');
}
Future<void> _sendData(String data) async {
if (_connection != null && _connection!.isConnected!) {
Uint8List dataToSend = Uint8List.fromList(data.codeUnits);
await _connection!.output!.add(dataToSend);
} else {
print('No connection available!');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Bluetooth Serial Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
ElevatedButton(
onPressed: _startScan,
child: Text('Start Scan'),
),
ElevatedButton(
onPressed: _stopScan,
child: Text('Stop Scan'),
),
SizedBox(height: 20),
Expanded(
child: ListView.builder(
itemCount: _devices.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_devices[index].name ?? 'Unknown Device'),
subtitle: Text(_devices[index].address),
onTap: () => _connectToDevice(_devices[index]),
);
},
),
),
SizedBox(height: 20),
TextField(
decoration: InputDecoration(labelText: 'Send Data'),
onEditingComplete: () async {
String input = (context.findAncestorStateOfType<EditableTextState>()?.textEditingValue?.text ?? '');
await _sendData(input);
},
),
],
),
),
),
);
}
}
代码说明:
- 依赖导入:在
pubspec.yaml
中添加flutter_bluetooth_serial
依赖。 - 状态管理:使用
StatefulWidget
来管理蓝牙扫描、连接和数据传输的状态。 - 蓝牙扫描:
- 使用
_bluetooth.onDiscoveredDevice.listen
来监听发现的设备。 _startScan
和_stopScan
方法分别用于启动和停止扫描。
- 使用
- 设备连接:
_connectToDevice
方法用于连接到指定的蓝牙设备。- 连接成功后,使用
_connection!.input!.listen
来监听接收到的数据。
- 数据发送:
_sendData
方法用于通过已建立的连接发送数据。
- UI布局:
- 使用
ElevatedButton
和TextField
来创建用户界面,允许用户启动/停止扫描、连接设备和发送数据。
- 使用
这个示例提供了一个基本框架,展示了如何使用flutter_bluetooth_serial
插件进行蓝牙通信。你可以根据实际需求进一步扩展和修改这个示例。