Flutter蓝牙通信插件bluetooth_connector的使用

发布于 1周前 作者 nodeper 来自 Flutter

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

1 回复

更多关于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();
  }
}

解释

  1. 初始化蓝牙连接:在initState方法中初始化BluetoothConnector实例,并设置设备发现、设备状态变化和数据接收的监听器。

  2. 扫描设备:调用startDiscovery方法开始扫描蓝牙设备。扫描到的设备会被添加到_devices列表中,并在UI中展示。

  3. 连接设备:点击设备列表项时,调用_connectToDevice方法连接到选中的设备。

  4. 发送数据:在文本字段中输入数据,完成编辑后调用_sendData方法发送数据到已连接的设备。

  5. 接收数据:当接收到数据时,更新_receivedData字符串,并在UI中显示。

注意

  • 请确保你的设备具有蓝牙权限,并在AndroidManifest.xml中声明必要的权限。
  • 蓝牙通信可能会因设备而异,因此在实际应用中需要进行更多的错误处理和兼容性测试。
  • 示例代码省略了一些细节,例如处理连接失败的情况,你可以根据需要进一步完善。

希望这个示例能帮助你更好地理解如何使用bluetooth_connector插件进行蓝牙通信。

回到顶部