Flutter蓝牙通信插件bluetooth_connector的使用
Flutter蓝牙通信插件bluetooth_connector的使用
1. 简介
bluetooth_connector
是一个Flutter插件,用于在Android平台上暴露蓝牙适配器的功能。它主要用于实现Flutter与已配对的Wear OS设备之间的蓝牙通信。该插件基于 bluetoothadapter
包开发,并且支持null-safety。
2. 主要功能
- 设置UUID:用户可以从应用程序端设置UUID。
- 检查蓝牙连接状态:可以检查蓝牙是否已打开,并在蓝牙关闭或配置不正确时给出提示。
- 获取已配对设备列表:可以获取所有已配对的蓝牙设备列表。
- 获取特定已配对设备信息:可以根据设备地址获取特定已配对设备的信息。
- 启动蓝牙服务器:可以启动蓝牙服务器以接收来自其他设备的连接请求。
- 启动蓝牙客户端:可以启动蓝牙客户端以连接到其他设备。
- 发送消息:可以向已连接的设备发送消息。
- 监听接收到的消息:可以通过流(Stream)监听接收到的消息。
- 监听连接状态:可以通过流(Stream)监听连接状态的变化(如已连接、正在连接、连接失败、监听中、已断开等)。
3. 使用示例
以下是一个完整的示例代码,展示了如何使用 bluetooth_connector
插件进行蓝牙通信。这个示例包括了启动蓝牙服务器、获取已配对设备列表、连接到设备、发送和接收消息等功能。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:bluetooth_connector/bluetooth_connector.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
// 初始化蓝牙连接器
BluetoothConnector flutterbluetoothadapter = BluetoothConnector();
// 监听连接状态和接收到的消息的流订阅
StreamSubscription? _btConnectionStatusListener, _btReceivedMessageListener;
// 当前连接状态
String _connectionStatus = "NONE";
// 已配对设备列表
List<BtDevice> devices = [];
// 接收到的消息
String? _recievedMessage;
// 输入框控制器
TextEditingController _controller = TextEditingController();
[@override](/user/override)
void initState() {
super.initState();
// 设置UUID
flutterbluetoothadapter.initBlutoothConnection("20585adb-d260-445e-934b-032a2c8b2e14");
// 检查蓝牙是否开启
flutterbluetoothadapter.checkBluetooth().then((value) => print(value.toString()));
// 开始监听连接状态和接收到的消息
_startListening();
}
// 开始监听连接状态和接收到的消息
_startListening() {
// 监听连接状态变化
_btConnectionStatusListener = flutterbluetoothadapter.connectionStatus().listen((dynamic status) {
setState(() {
_connectionStatus = status.toString();
});
});
// 监听接收到的消息
_btReceivedMessageListener = flutterbluetoothadapter.receiveMessages().listen((dynamic newMessage) {
setState(() {
_recievedMessage = newMessage.toString();
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Column(
children: <Widget>[
// 按钮行:启动服务器和列出已配对设备
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Flexible(
fit: FlexFit.tight,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: OutlinedButton(
onPressed: () async {
// 启动蓝牙服务器
await flutterbluetoothadapter.startServer();
},
child: const Text('LISTEN'),
),
),
),
Flexible(
fit: FlexFit.tight,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: OutlinedButton(
onPressed: () async {
// 获取已配对设备列表
devices = await flutterbluetoothadapter.getDevices();
setState(() {});
},
child: const Text('LIST DEVICES'),
),
),
)
],
),
// 显示当前连接状态
Text("STATUS - $_connectionStatus"),
// 显示已配对设备列表
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 20,
),
child: ListView(
shrinkWrap: true,
children: _createDevices(),
),
),
// 显示接收到的消息
Text(
_recievedMessage ?? "NO MESSAGE",
style: const TextStyle(fontSize: 24),
),
// 输入框和发送按钮
Row(
children: <Widget>[
Flexible(
flex: 4,
fit: FlexFit.tight,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
controller: _controller,
decoration: const InputDecoration(hintText: "Write message"),
),
),
),
Flexible(
fit: FlexFit.tight,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: OutlinedButton(
onPressed: () {
// 发送消息
flutterbluetoothadapter.sendMessage(
_controller.text ?? "no msg",
sendByteByByte: false,
);
_controller.text = "";
},
child: const Text('SEND'),
),
),
)
],
)
],
),
),
);
}
// 创建已配对设备列表
_createDevices() {
if (devices.isEmpty) {
return [
const Center(
child: Text("No Paired Devices listed..."),
)
];
}
List<Widget> deviceList = [];
devices.forEach((element) {
deviceList.add(
InkWell(
key: UniqueKey(),
onTap: () {
// 连接到选中的设备
flutterbluetoothadapter.startClient(devices.indexOf(element), true);
},
child: Container(
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(border: Border.all()),
child: Text(
element.name.toString(),
style: const TextStyle(fontSize: 18),
),
),
),
);
});
return deviceList;
}
}
更多关于Flutter蓝牙通信插件bluetooth_connector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙通信插件bluetooth_connector的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用Flutter蓝牙通信插件bluetooth_connector
的示例代码。这个示例将展示如何扫描蓝牙设备、连接到设备以及发送和接收数据。
首先,确保你的pubspec.yaml
文件中已经添加了bluetooth_connector
依赖:
dependencies:
flutter:
sdk: flutter
bluetooth_connector: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来是主代码文件main.dart
的示例:
import 'package:flutter/material.dart';
import 'package:bluetooth_connector/bluetooth_connector.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
BluetoothConnector? _bluetoothConnector;
List<BluetoothDevice> _devices = [];
BluetoothDevice? _connectedDevice;
String _receivedData = "";
@override
void initState() {
super.initState();
_initBluetooth();
}
void _initBluetooth() async {
_bluetoothConnector = BluetoothConnector();
_bluetoothConnector!.onDiscoverDevices!.listen((devices) {
setState(() {
_devices = devices;
});
});
_bluetoothConnector!.onDeviceStateChanged!.listen((event) {
if (event.isConnected) {
setState(() {
_connectedDevice = event.device;
});
}
});
_bluetoothConnector!.onDataReceived!.listen((data) {
setState(() {
_receivedData += String.fromCharCodes(data);
});
});
// 开始扫描设备
await _bluetoothConnector!.startDiscovery();
}
void _connectToDevice(BluetoothDevice device) async {
await _bluetoothConnector!.connectToDevice(device);
}
void _sendData(String data) async {
if (_connectedDevice != null) {
await _bluetoothConnector!.sendData(_connectedDevice!, Uint8List.fromList(data.codeUnits));
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Bluetooth Communication'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: _devices.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_devices[index].name),
trailing: IconButton(
icon: Icon(Icons.connect_without_contact),
onPressed: () {
_connectToDevice(_devices[index]);
},
),
);
},
),
),
TextField(
decoration: InputDecoration(labelText: 'Send Data'),
onEditingComplete: () {
_sendData(textEditingController.text);
textEditingController.clear();
},
controller: textEditingController,
),
Text('Received Data: $_receivedData'),
],
),
),
),
);
}
final TextEditingController textEditingController = TextEditingController();
@override
void dispose() {
_bluetoothConnector?.dispose();
textEditingController.dispose();
super.dispose();
}
}
解释
-
初始化蓝牙连接:在
initState
方法中初始化BluetoothConnector
实例,并设置设备发现、设备状态变化和数据接收的监听器。 -
扫描设备:调用
startDiscovery
方法开始扫描蓝牙设备。扫描到的设备会被添加到_devices
列表中,并在UI中展示。 -
连接设备:点击设备列表项时,调用
_connectToDevice
方法连接到选中的设备。 -
发送数据:在文本字段中输入数据,完成编辑后调用
_sendData
方法发送数据到已连接的设备。 -
接收数据:当接收到数据时,更新
_receivedData
字符串,并在UI中显示。
注意
- 请确保你的设备具有蓝牙权限,并在AndroidManifest.xml中声明必要的权限。
- 蓝牙通信可能会因设备而异,因此在实际应用中需要进行更多的错误处理和兼容性测试。
- 示例代码省略了一些细节,例如处理连接失败的情况,你可以根据需要进一步完善。
希望这个示例能帮助你更好地理解如何使用bluetooth_connector
插件进行蓝牙通信。