Flutter蓝牙通信插件win_ble_backend的使用

Flutter蓝牙通信插件win_ble_backend的使用

使用方法

要使用 win_ble_backend 插件进行蓝牙通信,首先需要创建一个 WinBleCentral 实例。以下是一个完整的示例代码,展示了如何初始化插件并执行基本的蓝牙操作。

import 'package:flutter/material.dart';
import 'package:win_ble_backend/win_ble_backend.dart'; // 导入插件

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

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

class BluetoothExample extends StatefulWidget {
  @override
  _BluetoothExampleState createState() => _BluetoothExampleState();
}

class _BluetoothExampleState extends State<BluetoothExample> {
  final bleCentral = WinBleCentral(); // 创建WinBleCentral实例
  List<String> devicesList = []; // 存储已扫描到的蓝牙设备列表

  @override
  void initState() {
    super.initState();
    scanForDevices(); // 初始化时开始扫描蓝牙设备
  }

  // 扫描蓝牙设备
  Future<void> scanForDevices() async {
    try {
      await bleCentral.startScan(); // 开始扫描
      bleCentral.onDeviceDiscovered.listen((device) {
        setState(() {
          devicesList.add(device.name); // 将扫描到的设备名称添加到列表中
        });
      });
    } catch (e) {
      print('Error during scanning: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Win BLE Backend 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('扫描到的蓝牙设备:', style: TextStyle(fontSize: 18)),
            SizedBox(height: 20),
            Expanded(
              child: ListView.builder(
                itemCount: devicesList.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(devicesList[index]),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

说明

  1. 导入插件
    在 Dart 文件中导入 win_ble_backend 插件:

    import 'package:win_ble_backend/win_ble_backend.dart';
    
  2. 创建实例
    使用 WinBleCentral() 创建蓝牙中央设备实例:

    final bleCentral = WinBleCentral();
    

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

1 回复

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


win_ble_backend 是一个用于在 Windows 平台上进行蓝牙低功耗(BLE)通信的 Flutter 插件。它允许 Flutter 应用程序与 BLE 设备进行通信,支持扫描、连接、读取、写入和通知等操作。

以下是如何使用 win_ble_backend 插件进行蓝牙通信的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  win_ble_backend: ^0.0.1  # 请使用最新版本

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

2. 初始化插件

在你的 Dart 代码中,首先需要初始化 win_ble_backend 插件:

import 'package:win_ble_backend/win_ble_backend.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await WinBleBackend.initialize();
  runApp(MyApp());
}

3. 扫描设备

使用 WinBleBackend 提供的 API 来扫描附近的 BLE 设备:

void scanDevices() async {
  await WinBleBackend.startScan();
  WinBleBackend.scanResults.listen((device) {
    print('Found device: ${device.name}, RSSI: ${device.rssi}');
  });
}

4. 连接设备

扫描到设备后,你可以通过设备的 id 来连接它:

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

5. 发现服务与特征

连接成功后,你可以发现设备提供的服务和特征:

void discoverServices(String deviceId) async {
  List<BleService> services = await WinBleBackend.discoverServices(deviceId);
  for (var service in services) {
    print('Service: ${service.uuid}');
    for (var characteristic in service.characteristics) {
      print('Characteristic: ${characteristic.uuid}');
    }
  }
}

6. 读取和写入特征值

你可以读取或写入特定特征的值:

void readCharacteristic(String deviceId, String characteristicId) async {
  List<int> value = await WinBleBackend.readCharacteristic(deviceId, characteristicId);
  print('Characteristic value: $value');
}

void writeCharacteristic(String deviceId, String characteristicId, List<int> value) async {
  await WinBleBackend.writeCharacteristic(deviceId, characteristicId, value);
  print('Characteristic value written');
}

7. 启用通知

你可以启用特征的通知功能,以便在特征值发生变化时接收通知:

void enableNotification(String deviceId, String characteristicId) async {
  await WinBleBackend.setNotification(deviceId, characteristicId, true);
  WinBleBackend.onValueChanged.listen((value) {
    print('Notification received: $value');
  });
}

8. 断开连接

完成通信后,记得断开与设备的连接:

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

9. 处理错误

在使用过程中,可能会遇到各种错误,建议添加错误处理逻辑:

void handleErrors() {
  WinBleBackend.onError.listen((error) {
    print('Error occurred: $error');
  });
}

10. 清理资源

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

void dispose() async {
  await WinBleBackend.dispose();
}

示例代码

以下是一个简单的示例,展示了如何使用 win_ble_backend 插件进行 BLE 通信:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await WinBleBackend.initialize();
  runApp(MyApp());
}

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

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

class _BLEPageState extends State<BLEPage> {
  String _deviceId;

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

  void scanDevices() async {
    await WinBleBackend.startScan();
    WinBleBackend.scanResults.listen((device) {
      print('Found device: ${device.name}, RSSI: ${device.rssi}');
      if (device.name == 'YourDeviceName') {
        _deviceId = device.id;
        connectToDevice(_deviceId);
      }
    });
  }

  void connectToDevice(String deviceId) async {
    await WinBleBackend.connect(deviceId);
    print('Connected to device: $deviceId');
    discoverServices(deviceId);
  }

  void discoverServices(String deviceId) async {
    List<BleService> services = await WinBleBackend.discoverServices(deviceId);
    for (var service in services) {
      print('Service: ${service.uuid}');
      for (var characteristic in service.characteristics) {
        print('Characteristic: ${characteristic.uuid}');
        if (characteristic.uuid == 'YourCharacteristicUUID') {
          readCharacteristic(deviceId, characteristic.uuid);
          enableNotification(deviceId, characteristic.uuid);
        }
      }
    }
  }

  void readCharacteristic(String deviceId, String characteristicId) async {
    List<int> value = await WinBleBackend.readCharacteristic(deviceId, characteristicId);
    print('Characteristic value: $value');
  }

  void enableNotification(String deviceId, String characteristicId) async {
    await WinBleBackend.setNotification(deviceId, characteristicId, true);
    WinBleBackend.onValueChanged.listen((value) {
      print('Notification received: $value');
    });
  }

  [@override](/user/override)
  void dispose() {
    WinBleBackend.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BLE Communication'),
      ),
      body: Center(
        child: Text('BLE Communication with win_ble_backend'),
      ),
    );
  }
}
回到顶部