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-原生桥传递的操作都是异步的,因此该插件的所有操作都返回 Future
或 Stream
。
初始化
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<Service> services = await peripheral.services(); // 获取所有服务
List<Characteristic> characteristics1 = await peripheral.characteristics("F000AA00-0451-4000-B000-000000000000");
List<Characteristic> characteristics2 = await services.firstWhere(
(service) => 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
更多关于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');
});
}