当前位置: 首页 > news >正文

使用 flutter_blue_plus 连接蓝牙

1. 介绍

Flutter Blue Plus 是一个用于 Flutter 的 Bluetooth Low Energy (BLE) 插件,简化了 Flutter 应用程序中的 BLE 开发。它支持跨平台(iOS、Android 和 macOS),提供了丰富的 API,用于扫描、连接、发现服务和特征、读写数据、订阅通知等

https://pub.dev/packages/flutter_blue_plus

2. 安装和配置

pubspec.yaml 文件中添加 flutter_blue_plus 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_blue_plus: ^1.35.3

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

flutter pub get

3. 平台特定权限

Android:在 AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

iOS:在 Info.plist 文件中添加以下描述:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>This app needs access to Bluetooth to function properly.</string>

4. 基本使用案例

基本案例,包括扫描设备、连接设备、发现服务和特征、读取和写入特征值等操作

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

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BluetoothScanner(),
    );
  }
}

class BluetoothScanner extends StatefulWidget {
  
  _BluetoothScannerState createState() => _BluetoothScannerState();
}

class _BluetoothScannerState extends State<BluetoothScanner> {
  FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
  List<BluetoothDevice> lstDevices = [];

  
  void initState() {
    super.initState();
    startScanning();
  }

  void startScanning() async {
    await flutterBlue.startScan();
    flutterBlue.scanResults.listen((results) {
      for (ScanResult result in results) {
        if (!lstDevices.contains(result.device)) {
          setState(() {
            lstDevices.add(result.device);
          });
        }
      }
    });
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BLE Scanner'),
      ),
      body: ListView.builder(
        itemCount: lstDevices.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(lstDevices[index].name),
            subtitle: Text(lstDevices[index].id.toString()),
            onTap: () {
              // 点击连接蓝牙
              connectToDevice(lstDevices[index]);
            },
          );
        },
      ),
    );
  }

  Future<void> connectToDevice(BluetoothDevice device) async {
    await device.connect();
    // 在这里可以进一步发现服务和特征
    List<BluetoothService> services = await device.discoverServices();
    services.forEach((service) {
      // 处理服务和特征
      handleService(service);
    });
  }

  void handleService(BluetoothService service) async {
    // 遍历服务中的特征
    for (BluetoothCharacteristic characteristic in service.characteristics) {
      // 读取特征值
      List<int> value = await characteristic.read();
      print('Characteristic value: $value');

      // 写入特征值(示例)
      if (characteristic.uuid.toString() == 'your_characteristic_uuid') {
        await characteristic.write([0x12, 0x34]);
        print('Characteristic written successfully');
      }

      // 设置通知并监听特征值变化
      await characteristic.setNotifyValue(true);
      characteristic.value.listen((value) {
        print('Notification received: $value');
      });
    }
  }

  
  void dispose() {
    flutterBlue.stopScan();
    super.dispose();
  }
}

通过上述代码,你可以扫描附近的 BLE 设备,连接到设备,发现其服务和特征,并进行读写操作以及订阅通知。

代码说明

  1. 扫描设备:
    • 使用 flutterBlue.startScan() 开始扫描附近的 BLE 设备。
    • 通过监听 flutterBlue.scanResults 获取扫描结果,并将其添加到 lstDevices 列表中。
  2. 连接设备:
    • 点击列表项时,调用 connectToDevice 方法连接到设备。
    • 使用 device.connect() 建立连接。
  3. 发现服务和特征:
    • 连接成功后,调用 device.discoverServices() 发现设备提供的服务。
    • 遍历服务中的特征,读取特征值。
  4. 读取和写入特征值:
    • 使用 characteristic.read() 读取特征值。
    • 使用 characteristic.write() 写入特征值。
  5. 设置通知并监听特征值变化:
    • 使用 characteristic.setNotifyValue(true) 启用通知。
    • 监听 characteristic.value 流,接收特征值变化的通知。

注意事项:

  • 在实际应用中,需要根据具体设备的 UUID 来访问特定的服务和特征。
  • 确保在 Info.plist 和 AndroidManifest.xml 文件中添加了必要的蓝牙权限。
  • 不同的 BLE 设备可能有不同的服务和特征 UUID,需要参考设备的文档来确定正确的 UUID。

相关文章:

  • 3月28号
  • Redis:Hash 类型 内部实现、命令及应用场景
  • 51c嵌入式~MOS~合集1
  • 计算机网络基础:网络流量工程与优化策略
  • Three.js 快速入门教程【二十】3D模型加载优化实战:使用gltf-pipeline与Draco对模型进行压缩,提高加载速度和流畅性
  • Kafka 偏移量
  • python-59-基于python内置库解析html获取标签关键信息
  • python项目整体文件和依赖打包
  • ​Flink/Kafka在python中的用处
  • 局域网共享失败?打印机/文件夹共享工具
  • 机器学习中的数学知识
  • 【 C 语言实现顺序表的基本操作】(数据结构)
  • 使用matlab进行分位数回归
  • 三数之和
  • B494:开关电源领域的PWM控制新星
  • [特殊字符] AI 编程工具推荐与场景指南 ——提升研发效率的智能助
  • 练习题:109
  • 【机密计算顶会解读】12:机密提示——保护云LLM推理服务中的用户提示词
  • vue将页面导出成word
  • LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析
  • 广西壮族自治区党委政法委副书记李文博接受审查调查
  • 中美日内瓦经贸会谈联合声明
  • 消费维权周报|上周涉手机投诉较多,涉拍照模糊、屏幕漏液等
  • 1156万+1170万,静安、宝山购彩者击中大乐透头奖
  • 人民日报读者点题·共同关注:今天我们为什么还需要图书馆?
  • 巴基斯坦外长:印巴已同意立即停火