flutter如何调用蓝牙

在Flutter中如何调用蓝牙功能?需要导入哪些插件?能否提供一个简单的示例代码,说明如何搜索、连接蓝牙设备并进行数据传输?目前遇到的主要问题是设备搜索不到,不知道是不是权限配置有问题,Android和iOS分别需要哪些权限?

2 回复

Flutter 调用蓝牙主要使用 flutter_blueflutter_blue_plus 插件。步骤如下:

  1. 添加依赖:在 pubspec.yaml 中添加:

    dependencies:
      flutter_blue_plus: ^1.0.0
    
  2. 权限配置

    • 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"/>
      
    • iOS:在 Info.plist 中添加:
      <key>NSBluetoothAlwaysUsageDescription</key>
      <string>需要蓝牙连接设备</string>
      
  3. 基本使用

    • 扫描设备:
      FlutterBluePlus.scanResults.listen((results) {
        for (ScanResult r in results) {
          print('发现设备: ${r.device.name}');
        }
      });
      FlutterBluePlus.startScan();
      
    • 连接设备并读写特征值:
      await device.connect();
      List<BluetoothService> services = await device.discoverServices();
      // 遍历服务与特征值进行读写操作
      

注意:不同平台需处理权限请求,并遵守蓝牙协议规范。建议测试时使用真实设备。

更多关于flutter如何调用蓝牙的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中调用蓝牙功能,可以通过以下步骤实现:

1. 添加依赖

pubspec.yaml 文件中添加蓝牙插件:

dependencies:
  flutter_blue_plus: ^1.10.0

然后运行:

flutter pub get

2. 权限配置

Android

android/app/src/main/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" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

iOS

ios/Runner/Info.plist 中添加:

<dict>
  <key>NSBluetoothAlwaysUsageDescription</key>
  <string>需要蓝牙权限来连接设备</string>
</dict>

3. 基本使用代码

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

class BluetoothScreen extends StatefulWidget {
  @override
  _BluetoothScreenState createState() => _BluetoothScreenState();
}

class _BluetoothScreenState extends State<BluetoothScreen> {
  FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
  List<BluetoothDevice> devices = [];

  @override
  void initState() {
    super.initState();
    _startScan();
  }

  void _startScan() {
    // 开始扫描设备
    flutterBlue.startScan(timeout: Duration(seconds: 4));

    // 监听扫描结果
    flutterBlue.scanResults.listen((results) {
      setState(() {
        devices = results.map((r) => r.device).toList();
      });
    });
  }

  void _connectToDevice(BluetoothDevice device) async {
    // 连接设备
    await device.connect();
    
    // 发现服务
    List<BluetoothService> services = await device.discoverServices();
    
    // 处理服务特性等
    for (var service in services) {
      print("Service: ${service.uuid}");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('蓝牙设备')),
      body: ListView.builder(
        itemCount: devices.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(devices[index].name ?? '未知设备'),
            subtitle: Text(devices[index].id.toString()),
            onTap: () => _connectToDevice(devices[index]),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _startScan,
        child: Icon(Icons.bluetooth),
      ),
    );
  }
}

4. 主要功能

  • 扫描设备: flutterBlue.startScan()
  • 连接设备: device.connect()
  • 发现服务: device.discoverServices()
  • 读写数据: 通过服务的特性(characteristics)进行数据交互

注意事项

  1. 在真实设备上测试,模拟器不支持蓝牙
  2. iOS需要物理设备且需要蓝牙权限
  3. 处理连接状态变化和错误情况
  4. 及时断开连接释放资源

这样就完成了Flutter中蓝牙的基本调用。

回到顶部