Flutter蓝牙通信插件simple_flutter_ble的使用

Flutter蓝牙通信插件simple_flutter_ble的使用

Flutter 插件 simple_flutter_ble 是一个用于低功耗蓝牙(Bluetooth Low Energy, BLE)通信的工具。它支持设备发现、连接管理、数据读写及通知等功能。

特性

  • 可以基于指定的服务 UUID 列表来发现设备。
  • 监听蓝牙连接状态的变化。
  • 支持发送数据并等待响应。
  • 监听设备连接状态的变化。
  • 支持订阅通知。

开始使用

引入插件

在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  simple_flutter_ble: ^版本号

然后运行以下命令安装依赖:

flutter pub get

初始化插件

import 'package:simple_flutter_ble/simple_flutter_ble.dart';

// 初始化插件
FlutterBle flutterBle = FlutterBle();

// 或者通过服务 UUID 过滤设备
// FlutterBle flutterBle = FlutterBle(['ec75916b-2217-401d-a433-80411522b493']);

启动设备发现

// 开始扫描设备
flutterBle.start();

// 监听发现的设备
flutterBle.discoveredDevices.listen((List<BLEDevice> devices) {
  // 设备列表发生变化时触发
});

// 监听蓝牙连接状态
flutterBle.startBluetoothListener();
flutterBle.onBluetoothConnection.listen((bool status) {
  // 蓝牙连接状态变化时触发
});

数据读写与通知

// 写入数据
device.write('uuid', '<动态数据>');

// 等待响应
var data = device.writeWithResponse('uuid', '<动态数据>');

// 读取数据
var data = device.read('uuid');

// 订阅通知
device.notify('uuid').listen((data) {
  // 接收到通知时触发
});

使用 Implements 实现回调

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> implements DeviceListener {
  final flutterBle = FlutterBle();

  [@override](/user/override)
  void initState() {
    super.initState();
    startListening();
  }

  void startListening() {
    flutterBle.start();
    flutterBle.discoveredDevices.listen((List<BLEDevice> devices) {
      // 设备列表变化时触发
    });
    flutterBle.startBluetoothListener();
    flutterBle.onBluetoothConnection.listen((bool status) {
      // 蓝牙连接状态变化时触发
    });
    flutterBle.setListener(this);
  }

  [@override](/user/override)
  void onBluetoothConnected(bool status) {
    // 蓝牙连接状态变化回调
  }

  [@override](/user/override)
  void onBluetoothDisconnected(bool status) {
    // 蓝牙断开连接回调
  }

  [@override](/user/override)
  void onDeviceConnected(String address, bool status) {
    // 设备连接状态变化回调
  }

  [@override](/user/override)
  void onDeviceDisconnected(String address, bool status) {
    // 设备断开连接回调
  }

  [@override](/user/override)
  void onDiscoveredDevices(List<BLEDevice> devices) {
    // 发现设备回调
  }

  [@override](/user/override)
  void onNotify(data) {
    // 接收到通知回调
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('BLE Plugin Example')),
        body: Center(
          child: ListView.builder(
            itemCount: devices.length,
            itemBuilder: (context, index) {
              BLEDevice device = devices[index];
              return Column(
                children: [
                  Row(
                    children: [
                      Text(device.name ?? ''),
                      Container(
                        decoration: BoxDecoration(
                          shape: BoxShape.circle,
                          color: (device.online ?? false) ? Colors.green : Colors.redAccent,
                        ),
                        width: 10,
                        height: 10,
                      ),
                      const SizedBox(width: 20),
                      TextButton(
                        onPressed: () {
                          device.connect();
                          device.status.listen((status) {
                            // 设备状态变化回调
                          });
                        },
                        child: const Text('Connect'),
                      ),
                      device.online!
                          ? TextButton(
                              onPressed: () {
                                device.write('uuid', '<动态数据>');
                                var data = device.writeWithResponse('uuid', '<动态数据>');
                              },
                              child: const Text('Send Data'),
                            )
                          : const SizedBox(),
                    ],
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

完整示例

以下是完整的示例代码,展示如何使用 simple_flutter_ble 插件实现蓝牙通信功能。

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:simple_flutter_ble/simple_flutter_ble.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> implements DeviceListener {
  final flutterBle = FlutterBle();
  List<BLEDevice> devices = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    startListening();
  }

  void startListening() {
    flutterBle.start();
    flutterBle.discoveredDevices.listen((List<BLEDevice> devices) {
      setState(() {
        this.devices = devices;
      });
    });
    flutterBle.startBluetoothListener();
    flutterBle.onBluetoothConnection.listen((bool status) {
      // 蓝牙连接状态变化
    });
    flutterBle.setListener(this);
  }

  [@override](/user/override)
  void onBluetoothConnected(bool status) {
    // 蓝牙连接状态变化回调
  }

  [@override](/user/override)
  void onBluetoothDisconnected(bool status) {
    // 蓝牙断开连接回调
  }

  [@override](/user/override)
  void onDeviceConnected(String address, bool status) {
    // 设备连接状态变化回调
  }

  [@override](/user/override)
  void onDeviceDisconnected(String address, bool status) {
    // 设备断开连接回调
  }

  [@override](/user/override)
  void onDiscoveredDevices(List<BLEDevice> devices) {
    // 发现设备回调
  }

  [@override](/user/override)
  void onNotify(data) {
    // 接收到通知回调
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('BLE Plugin Example')),
        body: Center(
          child: ListView.builder(
            itemCount: devices.length,
            itemBuilder: (context, index) {
              BLEDevice device = devices[index];
              return Column(
                children: [
                  Row(
                    children: [
                      Text(device.name ?? ''),
                      Container(
                        decoration: BoxDecoration(
                          shape: BoxShape.circle,
                          color: (device.online ?? false) ? Colors.green : Colors.redAccent,
                        ),
                        width: 10,
                        height: 10,
                      ),
                      const SizedBox(width: 20),
                      TextButton(
                        onPressed: () {
                          device.connect();
                          device.status.listen((status) {
                            // 设备状态变化回调
                          });
                        },
                        child: const Text('Connect'),
                      ),
                      device.online!
                          ? TextButton(
                              onPressed: () {
                                device.write('uuid', '<动态数据>');
                                var data = device.writeWithResponse('uuid', '<动态数据>');
                              },
                              child: const Text('Send Data'),
                            )
                          : const SizedBox(),
                    ],
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

更多关于Flutter蓝牙通信插件simple_flutter_ble的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙通信插件simple_flutter_ble的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simple_flutter_ble 是一个用于在 Flutter 应用中实现蓝牙低功耗(BLE)通信的插件。它简化了与 BLE 设备的交互过程,使得开发者可以更轻松地实现蓝牙通信功能。以下是如何使用 simple_flutter_ble 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 simple_flutter_ble 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  simple_flutter_ble: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 Dart 文件中导入插件并初始化它:

import 'package:simple_flutter_ble/simple_flutter_ble.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BleExample(),
    );
  }
}

class BleExample extends StatefulWidget {
  [@override](/user/override)
  _BleExampleState createState() => _BleExampleState();
}

class _BleExampleState extends State<BleExample> {
  SimpleFlutterBle _ble = SimpleFlutterBle();

  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeBle();
  }

  void _initializeBle() async {
    await _ble.initialize();
    // 检查蓝牙是否启用
    bool isEnabled = await _ble.isBluetoothEnabled();
    if (!isEnabled) {
      // 请求用户启用蓝牙
      await _ble.requestBluetoothEnable();
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BLE Example'),
      ),
      body: Center(
        child: Text('BLE Example'),
      ),
    );
  }
}

3. 扫描设备

你可以使用 startScan 方法来扫描附近的 BLE 设备:

void _startScan() async {
  _ble.startScan(
    onDeviceFound: (device) {
      print('Found device: ${device.name}, ${device.id}');
    },
  );
}

4. 连接设备

扫描到设备后,你可以使用 connect 方法来连接设备:

void _connectToDevice(String deviceId) async {
  await _ble.connect(deviceId);
  print('Connected to device: $deviceId');
}

5. 读取和写入特征值

连接成功后,你可以读取或写入设备的特征值:

void _readCharacteristic(String serviceUuid, String characteristicUuid) async {
  List<int> value = await _ble.readCharacteristic(serviceUuid, characteristicUuid);
  print('Read value: $value');
}

void _writeCharacteristic(String serviceUuid, String characteristicUuid, List<int> value) async {
  await _ble.writeCharacteristic(serviceUuid, characteristicUuid, value);
  print('Write value: $value');
}

6. 断开连接

当你不再需要与设备通信时,可以断开连接:

void _disconnectDevice(String deviceId) async {
  await _ble.disconnect(deviceId);
  print('Disconnected from device: $deviceId');
}

7. 处理权限

在 Android 上,你可能需要处理蓝牙和位置权限。确保在 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:permission_handler/permission_handler.dart';

void _requestPermissions() async {
  await Permission.location.request();
  await Permission.bluetooth.request();
  await Permission.bluetoothConnect.request();
  await Permission.bluetoothScan.request();
}

8. 处理错误

在使用 BLE 时,可能会遇到各种错误,例如设备未找到、连接失败等。确保在代码中处理这些错误:

try {
  await _ble.connect(deviceId);
} catch (e) {
  print('Failed to connect: $e');
}

9. 清理资源

在应用退出时,确保释放 BLE 资源:

[@override](/user/override)
void dispose() {
  _ble.dispose();
  super.dispose();
}
回到顶部