Flutter蓝牙通信插件flutter_ble_lib的使用

Flutter蓝牙通信插件flutter_ble_lib的使用

安装

要使用此插件,将其添加为 pubspec.yaml 文件中的依赖项。

Android

[project]/android/app/build.gradle 文件中设置 minSDKVersion 为 18。

defaultConfig {
  ...
  minSdkVersion 18
  ...
}

请注意,您无需向 AndroidManifest.xml 添加任何与蓝牙相关的权限,因为这些权限已在库的本地模块中声明。但是,您仍然需要在运行时请求 ACCESS_FINE_LOCATION 权限才能扫描外设。详情请参阅示例代码和示例的 pubspec.yaml

iOS

进入 [project]/ios 目录并运行 pod install

[project]/ios/Runner/Info.plist 文件中添加以下键:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>您的描述</string>

使用

该库围绕几个基本实体组织,包括:

  • BleManager
  • Peripheral
  • Service
  • Characteristic
  • Descriptor

您必须创建一个 BleManager 实例并初始化底层原生资源。使用该实例,您可以获取 Peripheral 的实例,从而对相应的外设执行操作。

所有通过 Dart-原生桥传递的操作都是异步的,因此该插件的所有操作都返回 FutureStream

初始化

BleManager bleManager = BleManager();
await bleManager.createClient(); // 准备就绪!
// 您的外设逻辑
bleManager.destroyClient(); // 完成后记得释放原生资源!

处理蓝牙适配器状态

enum BluetoothState {
  UNKNOWN,
  UNSUPPORTED,
  UNAUTHORIZED,
  POWERED_ON,
  POWERED_OFF,
  RESETTING,
}

bleManager.enableRadio(); // ANDROID-ONLY 打开蓝牙。注意:不检查权限
bleManager.disableRadio(); // ANDROID-ONLY 关闭蓝牙。注意:不检查权限
BluetoothState currentState = await bleManager.bluetoothState();
bleManager.observeBluetoothState().listen((btState) {
  print(btState);
  // 做您的蓝牙逻辑,打开不同的屏幕等。
});

扫描外设

bleManager.startPeripheralScan(
  uuids: [
    "F000AA00-0451-4000-B000-000000000000",
  ],
).listen((scanResult) {
  // 扫描一个外设并停止扫描
  print("Scanned Peripheral ${scanResult.peripheral.name}, RSSI ${scanResult.rssi}");
  bleManager.stopPeripheralScan();
});

该代码段启动外设扫描,并在接收到第一个结果后停止扫描。它过滤了广告服务具有指定 UUID 的扫描结果。

连接到已保存的外设

您可以尝试连接到具有已知 ID 的外设,无论是先前扫描的 UUID(iOS)还是 MAC 地址(Android),以避免在应用程序中进行整个扫描操作。为此,您需要使用以下方法创建 Peripheral 实例:

Peripheral myPeripheral = bleManager.createUnsafePeripheral("< 已知ID >");

一旦有了外设实例,您可以继续进行连接。但请注意,即使在 Android 上,也可能仍需要先扫描外设才能找到它。

连接到外设

首先,您必须从 BleManager.startPeripheralScan() 获取 ScanResult

Peripheral peripheral = scanResult.peripheral;
peripheral.observeConnectionState(emitCurrentValue: true, completeOnDisconnect: true)
  .listen((connectionState) {
    print("Peripheral ${scanResult.peripheral.identifier} connection state is $connectionState");
  });
await peripheral.connect();
bool connected = await peripheral.isConnected();
await peripheral.disconnectOrCancelConnection();

上述代码段开始观察外设的连接状态,连接到外设,检查是否连接成功,然后断开连接。

事务

不具有相反效果且是异步的方法接受 String transactionId 作为可选参数,以便用户可以取消此类操作。返回到 Dart 的 Future 将因 BleError(BleErrorCode.operationCancelled...) 而结束,但仅会丢弃操作的结果,操作本身仍会执行。

例如,如果我决定不再运行选定外设上的发现操作:

// 假设外设已连接
peripheral.discoverAllServicesAndCharacteristics(transactionId: "discovery");
// 将在调用以下代码后返回操作取消错误
bleManager.cancelTransaction("discovery");

每次带有相同 transactionId 的新操作都会导致前一个操作被取消(如果尚未完成)。如果将 transactionId 设置为 null 或未指定,则库将为此操作设置唯一的整数 transactionId

注意: 不要将整数设置为 transactionId,因为它们由库使用。

获取特征

为了对外设进行操作,必须首先运行其服务和特征的发现。

// 假设外设已连接
await peripheral.discoverAllServicesAndCharacteristics();
List&lt;Service&gt; services = await peripheral.services(); // 获取所有服务
List&lt;Characteristic&gt; characteristics1 = await peripheral.characteristics("F000AA00-0451-4000-B000-000000000000");
List&lt;Characteristic&gt; characteristics2 = await services.firstWhere(
  (service) =&gt; service.uuid == "F000AA00-0451-4000-B000-000000000000").characteristics();

// characteristics1 和 characteristics2 具有相同的内容

表示特征的对象具有唯一的标识符,因此它们指向一个特定的特征,即使存在多个服务/特征 UUID 匹配。

操作特征

以下是写入特征的三种方法,假设只有一个服务具有指定 UUID 且只有一个特征具有指定 UUID,则这些方法将产生相同的效果。

peripheral.writeCharacteristic(
  "F000AA00-0451-4000-B000-000000000000",
  "F000AA02-0451-4000-B000-000000000000",
  Uint8List.fromList([0]),
  false); // 返回 Characteristic 以更轻松地链式操作

service.writeCharacteristic(
  "F000AA02-0451-4000-B000-000000000000",
  Uint8List.fromList([0]),
  false); // 返回 Characteristic 以更轻松地链式操作

characteristic.write(Uint8List.fromList([0]), false); // 返回 void

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

1 回复

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


flutter_ble_lib 是一个用于在 Flutter 应用中实现蓝牙低功耗(BLE)通信的插件。它提供了与蓝牙设备进行扫描、连接、发现服务、读写特征值等操作的功能。以下是如何使用 flutter_ble_lib 插件的基本步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_ble_lib: ^2.0.0

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

2. 初始化 BLE 管理器

在使用蓝牙功能之前,需要初始化 BleManager

import 'package:flutter_ble_lib/flutter_ble_lib.dart';

BleManager bleManager = BleManager();

void initBle() async {
  await bleManager.createClient(); // 初始化 BLE 客户端
  // 检查蓝牙是否开启
  bool isBluetoothOn = await bleManager.isClientCreated();
  if (!isBluetoothOn) {
    // 处理蓝牙未开启的情况
  }
}

3. 扫描蓝牙设备

使用 startPeripheralScan 方法扫描附近的蓝牙设备:

void startScan() {
  bleManager.startPeripheralScan().listen((scanResult) {
    print('Found device: ${scanResult.peripheral.name}');
    print('RSSI: ${scanResult.rssi}');
    print('Advertisement data: ${scanResult.advertisementData}');
  });
}

void stopScan() {
  bleManager.stopPeripheralScan();
}

4. 连接蓝牙设备

扫描到设备后,可以选择连接设备:

void connectToDevice(Peripheral peripheral) async {
  await peripheral.connect();
  print('Connected to device: ${peripheral.name}');
}

5. 发现服务与特征值

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

void discoverServices(Peripheral peripheral) async {
  List<Service> services = await peripheral.discoverAllServicesAndCharacteristics();
  for (Service service in services) {
    print('Service UUID: ${service.uuid}');
    for (Characteristic characteristic in service.characteristics) {
      print('Characteristic UUID: ${characteristic.uuid}');
    }
  }
}

6. 读写特征值

发现特征值后,可以进行读写操作:

void readCharacteristic(Characteristic characteristic) async {
  List<int> value = await characteristic.read();
  print('Read value: $value');
}

void writeCharacteristic(Characteristic characteristic, List<int> value) async {
  await characteristic.write(value, false); // false 表示不带响应
  print('Write value: $value');
}

7. 断开连接

使用完毕后,记得断开连接:

void disconnectDevice(Peripheral peripheral) async {
  await peripheral.disconnectOrCancelConnection();
  print('Disconnected from device: ${peripheral.name}');
}

8. 销毁 BLE 客户端

在应用退出或不再需要蓝牙功能时,销毁 BLE 客户端:

void destroyBle() async {
  await bleManager.destroyClient();
}

9. 处理权限

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

并在 Flutter 中请求权限:

import 'package:permission_handler/permission_handler.dart';

void requestPermissions() async {
  if (await Permission.location.request().isGranted) {
    // 权限已授予
  } else {
    // 处理权限被拒绝的情况
  }
}

10. 处理蓝牙状态变化

监听蓝牙状态变化,以便在蓝牙关闭或开启时做出响应:

void listenToBluetoothState() {
  bleManager.observeBluetoothState().listen((bluetoothState) {
    print('Bluetooth state: $bluetoothState');
  });
}
回到顶部