flutter如何实现蓝牙连接demo

最近在学习Flutter开发,想实现一个蓝牙连接的Demo,但不太清楚具体步骤。有没有完整的示例代码可以参考?需要用到哪些插件?在Android和iOS平台上的实现有什么区别吗?调试过程中应该注意哪些常见问题?

2 回复

使用Flutter实现蓝牙连接,步骤如下:

  1. 添加依赖:flutter_blue_plus
  2. 检查设备蓝牙状态并请求权限。
  3. 扫描附近设备并获取列表。
  4. 选择设备并建立连接。
  5. 发现服务并读写特征值。

示例代码可参考官方文档或GitHub示例。

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


在Flutter中实现蓝牙连接需要使用flutter_blue_plus插件,以下是完整的蓝牙连接Demo:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  flutter_blue_plus: ^1.10.0

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.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

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 BluetoothDemo extends StatefulWidget {
  @override
  _BluetoothDemoState createState() => _BluetoothDemoState();
}

class _BluetoothDemoState extends State<BluetoothDemo> {
  List<BluetoothDevice> devices = [];
  BluetoothDevice? connectedDevice;
  bool isScanning = false;

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

  // 检查权限
  Future<void> _checkPermissions() async {
    await FlutterBluePlus.turnOn();
  }

  // 开始扫描
  void _startScan() {
    setState(() {
      devices.clear();
      isScanning = true;
    });

    FlutterBluePlus.scanResults.listen((results) {
      for (ScanResult result in results) {
        if (!devices.contains(result.device)) {
          setState(() {
            devices.add(result.device);
          });
        }
      }
    });

    FlutterBluePlus.startScan(timeout: Duration(seconds: 10));
  }

  // 停止扫描
  void _stopScan() {
    FlutterBluePlus.stopScan();
    setState(() {
      isScanning = false;
    });
  }

  // 连接设备
  Future<void> _connectToDevice(BluetoothDevice device) async {
    try {
      await device.connect();
      setState(() {
        connectedDevice = device;
      });
      print('已连接到: ${device.name}');
    } catch (e) {
      print('连接失败: $e');
    }
  }

  // 断开连接
  Future<void> _disconnectDevice() async {
    if (connectedDevice != null) {
      await connectedDevice!.disconnect();
      setState(() {
        connectedDevice = null;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('蓝牙连接Demo'),
        actions: [
          IconButton(
            icon: Icon(isScanning ? Icons.stop : Icons.search),
            onPressed: isScanning ? _stopScan : _startScan,
          ),
        ],
      ),
      body: Column(
        children: [
          // 连接状态
          ListTile(
            title: Text('连接状态'),
            subtitle: Text(connectedDevice?.name ?? '未连接'),
            trailing: connectedDevice != null
                ? ElevatedButton(
                    onPressed: _disconnectDevice,
                    child: Text('断开'),
                  )
                : null,
          ),
          // 设备列表
          Expanded(
            child: ListView.builder(
              itemCount: devices.length,
              itemBuilder: (context, index) {
                final device = devices[index];
                return ListTile(
                  title: Text(device.name.isEmpty ? '未知设备' : device.name),
                  subtitle: Text(device.remoteId.toString()),
                  trailing: ElevatedButton(
                    onPressed: () => _connectToDevice(device),
                    child: Text('连接'),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

4. 主要功能说明

  • 扫描设备: 调用 startScan() 开始扫描周边蓝牙设备
  • 显示设备: 通过 scanResults 监听器获取扫描结果
  • 连接设备: 使用 device.connect() 建立连接
  • 断开连接: 使用 device.disconnect() 断开连接

5. 注意事项

  1. 需要在实际设备上测试,模拟器不支持蓝牙
  2. iOS需要真实设备且需要配置蓝牙权限描述
  3. Android 12+需要额外处理新的蓝牙权限

这个Demo提供了基础的蓝牙扫描和连接功能,你可以根据需要扩展数据读写等高级功能。

回到顶部