Flutter经典蓝牙通信插件psdk_bluetooth_classic的使用

Flutter经典蓝牙通信插件psdk_bluetooth_classic的使用

在本教程中,我们将详细介绍如何使用 psdk_bluetooth_classic 插件进行经典的蓝牙通信。通过这个插件,你可以轻松地实现设备之间的蓝牙数据传输。

准备工作

首先,确保你的项目依赖了 psdk_bluetooth_classic 插件。在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  psdk_bluetooth_classic: ^1.0.0

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

初始化蓝牙

在使用蓝牙之前,你需要初始化蓝牙适配器。以下是一个简单的示例:

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

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

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

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

class _BluetoothPageState extends State<BluetoothPage> {
  BluetoothAdapter _bluetoothAdapter;

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

  void _initBluetooth() async {
    _bluetoothAdapter = await PsdkBluetoothClassic.getAdapter();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('蓝牙通信'),
      ),
      body: Center(
        child: Text('初始化蓝牙适配器...'),
      ),
    );
  }
}

扫描蓝牙设备

初始化蓝牙适配器后,我们可以开始扫描附近的蓝牙设备。以下是如何扫描蓝牙设备的示例代码:

  Future<List<BluetoothDevice>> _scanDevices() async {
    List<BluetoothDevice> devices = await _bluetoothAdapter.scanForDevices();
    return devices;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('蓝牙通信'),
      ),
      body: FutureBuilder<List<BluetoothDevice>>(
        future: _scanDevices(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(snapshot.data[index].name ?? '未知设备'),
                  subtitle: Text(snapshot.data[index].address),
                );
              },
            );
          } else if (snapshot.hasError) {
            return Center(child: Text('错误: ${snapshot.error}'));
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }

连接蓝牙设备

扫描到设备后,选择一个设备并连接它。以下是如何连接蓝牙设备的示例代码:

  BluetoothDevice _selectedDevice;

  Future<void> _connectToDevice(BluetoothDevice device) async {
    await device.connect();
    setState(() {
      _selectedDevice = device;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('蓝牙通信'),
      ),
      body: FutureBuilder<List<BluetoothDevice>>(
        future: _scanDevices(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(snapshot.data[index].name ?? '未知设备'),
                  subtitle: Text(snapshot.data[index].address),
                  onTap: () {
                    _connectToDevice(snapshot.data[index]);
                  },
                );
              },
            );
          } else if (snapshot.hasError) {
            return Center(child: Text('错误: ${snapshot.error}'));
          } else {
            return Center(child: CircularProgressIndicator());
          }
        },
      ),
    );
  }

发送和接收数据

连接到设备后,你可以发送和接收数据。以下是如何发送和接收数据的示例代码:

  StreamController<String> _dataStreamController = StreamController<String>.broadcast();

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

  void _listenForIncomingData() {
    _selectedDevice.onDataReceived.listen((data) {
      _dataStreamController.add(data);
    });
  }

  Future<void> sendData(String data) async {
    await _selectedDevice.send(data);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('蓝牙通信'),
      ),
      body: Column(
        children: [
          Expanded(
            child: StreamBuilder<String>(
              stream: _dataStreamController.stream,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return Text('收到的数据: ${snapshot.data}');
                } else if (snapshot.hasError) {
                  return Text('错误: ${snapshot.error}');
                } else {
                  return Text('等待接收数据...');
                }
              },
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: TextField(
              controller: _textEditingController,
              decoration: InputDecoration(hintText: '输入要发送的数据'),
            ),
          ),
          ElevatedButton(
            onPressed: () {
              sendData(_textEditingController.text);
            },
            child: Text('发送数据'),
          ),
        ],
      ),
    );
  }

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

1 回复

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


psdk_bluetooth_classic 是一个用于 Flutter 的经典蓝牙通信插件,允许开发者在 Flutter 应用中实现蓝牙设备的搜索、连接和数据传输等功能。以下是如何使用 psdk_bluetooth_classic 插件的详细步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 psdk_bluetooth_classic 插件的依赖:

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

然后运行 flutter pub get 来安装依赖。

2. 配置权限

在 Android 和 iOS 上使用蓝牙功能需要相应的权限配置。

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"/>

如果目标 SDK 版本为 Android 12 或更高版本,还需要添加以下权限:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

iOS

Info.plist 文件中添加以下权限:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>我们需要使用蓝牙来连接设备</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>我们需要使用蓝牙来连接设备</string>

3. 使用插件

在 Flutter 代码中导入插件并开始使用。

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

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

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

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

class _BluetoothExampleState extends State<BluetoothExample> {
  final PsdkBluetoothClassic _bluetooth = PsdkBluetoothClassic();
  List<BluetoothDevice> _devices = [];
  BluetoothDevice? _connectedDevice;

  [@override](/user/override)
  void initState() {
    super.initState();
    _bluetooth.onDeviceFound.listen((device) {
      setState(() {
        _devices.add(device);
      });
    });
  }

  Future<void> _scanDevices() async {
    setState(() {
      _devices.clear();
    });
    await _bluetooth.startScan();
  }

  Future<void> _connectToDevice(BluetoothDevice device) async {
    await _bluetooth.connect(device);
    setState(() {
      _connectedDevice = device;
    });
  }

  Future<void> _sendData(String data) async {
    if (_connectedDevice != null) {
      await _bluetooth.write(data);
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bluetooth Classic Example'),
      ),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: _scanDevices,
            child: Text('Scan Devices'),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: _devices.length,
              itemBuilder: (context, index) {
                final device = _devices[index];
                return ListTile(
                  title: Text(device.name ?? 'Unknown'),
                  subtitle: Text(device.address),
                  onTap: () => _connectToDevice(device),
                );
              },
            ),
          ),
          if (_connectedDevice != null)
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text('Connected to: ${_connectedDevice!.name}'),
            ),
          ElevatedButton(
            onPressed: () => _sendData('Hello, Bluetooth!'),
            child: Text('Send Data'),
          ),
        ],
      ),
    );
  }
}

4. 解释代码

  • 扫描设备: 调用 _bluetooth.startScan() 开始扫描附近的蓝牙设备,并通过 onDeviceFound 事件监听发现的设备。
  • 连接设备: 使用 _bluetooth.connect(device) 连接到选定的设备。
  • 发送数据: 使用 _bluetooth.write(data) 向已连接的设备发送数据。

5. 处理连接状态

你可以通过 onStateChanged 监听蓝牙连接状态的变化:

_bluetooth.onStateChanged.listen((state) {
  // 处理连接状态变化
  if (state == BluetoothState.connected) {
    print('Connected to device');
  } else if (state == BluetoothState.disconnected) {
    print('Disconnected from device');
  }
});

6. 断开连接

当你不再需要连接时,可以调用 _bluetooth.disconnect() 来断开连接。

Future<void> _disconnect() async {
  await _bluetooth.disconnect();
  setState(() {
    _connectedDevice = null;
  });
}

7. 处理错误

在蓝牙操作中可能会遇到各种错误,建议在关键操作中添加错误处理:

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

8. 清理资源

dispose 方法中释放资源:

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