Flutter蓝牙外设插件ble_peripheral的使用
Flutter蓝牙外设插件ble_peripheral的使用
Ble Peripheral
Ble peripheral
是一个Flutter插件,允许您的设备作为蓝牙低能耗(BLE)外围设备使用。它是一个与操作系统无关的插件,用于创建BLE通用属性配置文件(GATT)服务器以广播用户定义的服务和特征。这在不同设备上原型设计和测试服务器时特别有用,目的是确保所有系统的行为符合预期。
使用方法
初始化
确保首先进行初始化(必须具有蓝牙权限才能初始化)
await BlePeripheral.initialize();
添加服务
在开始广播之前添加服务
String serviceBattery = "0000180F-0000-1000-8000-00805F9B34FB";
await BlePeripheral.addService(
BleService(
uuid: serviceBattery,
primary: true,
characteristics: [
BleCharacteristic(
uuid: "00002A19-0000-1000-8000-00805F9B34FB",
properties: [
CharacteristicProperties.read.index,
CharacteristicProperties.notify.index
],
value: null,
permissions: [
AttributePermissions.readable.index
],
),
],
),
);
// 获取已添加的服务列表
await BlePeripheral.getServices();
// 移除特定服务
await BlePeripheral.removeService(String serviceId);
// 移除所有已添加的服务
await BlePeripheral.clearServices();
开始广播
设置广告状态回调函数,并开始广播
/// 设置广告状态更新回调函数
BlePeripheral.setAdvertisingStatusUpdateCallback((bool advertising, String? error) {
print("AdvertisingStatus: $advertising Error $error")
});
// 开始广播
await BlePeripheral.startAdvertising(
services: [serviceBattery],
localName: "TestBle",
);
停止广播
await BlePeripheral.stopAdvertising();
BLE通信
此回调适用于Android和Apple,当中央设备可用时会通知我们,在Android中,当中央设备准备好使用时,我们会在setConnectionStateChangeCallback
中获取设备;在iOS中,当中央设备准备好使用时,我们会在setCharacteristicSubscriptionChangeCallback
中获取设备
// 当中心订阅特征时调用
BlePeripheral.setCharacteristicSubscriptionChangeCallback(CharacteristicSubscriptionChangeCallback callback);
// 仅限Android,当中心连接或断开连接时调用
BlePeripheral.setConnectionStateChangeCallback(ConnectionStateChangeCallback callback);
要更新订阅特征的值,在Apple和Android上都可以传递deviceId,以便只为特定设备更新特征,否则所有订阅此特征的设备都将收到通知
BlePeripheral.updateCharacteristic(characteristicId: characteristicTest,value: utf8.encode("Test Data"));
其他可用回调处理器
// 广告启动、停止或失败时调用
BlePeripheral.setAdvertisingStatusUpdateCallback(AdvertisementStatusUpdateCallback callback);
// 当设备上的蓝牙无线电打开或关闭时调用
BlePeripheral.setBleStateChangeCallback(BleStateCallback callback);
// 当中心设备尝试读取特征时调用
BlePeripheral.setReadRequestCallback(ReadRequestCallback callback);
// 当中心尝试写入特征时调用
BlePeripheral.setWriteRequestCallback(WriteRequestCallback callback);
// 成功添加服务时调用
BlePeripheral.setServiceAddedCallback(ServiceAddedCallback callback);
// 当mtu更改时调用,在Apple和Windows上,当设备订阅特征时将调用此函数
BlePeripheral.setMtuChangeCallback(MtuChangeCallback callback);
// 仅限Android,当中心配对或取消配对时调用
BlePeripheral.setBondStateChangeCallback(BondStateCallback callback);
设置
Android
在您的AndroidManifest.xml
文件中添加所需的蓝牙权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
使用permission_handler插件请求权限
IOS/Macos
在info.plist中添加权限
<key>NSBluetoothAlwaysUsageDescription</key>
<string>For advertise as ble peripheral</string>
对于MacOS
,请确保在Xcode中启用蓝牙
Windows
应该可以在Windows上直接使用
注意事项
欢迎贡献或报告任何错误!
示例代码
以下是完整的示例demo:
import 'package:ble_peripheral_example/home_controller.dart';
import 'package:ble_peripheral_example/home_view.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
Get.put(HomeController());
runApp(
const GetMaterialApp(
debugShowCheckedModeBanner: false,
title: "BlePeripheral",
home: HomeView(),
),
);
}
更多关于Flutter蓝牙外设插件ble_peripheral的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter蓝牙外设插件ble_peripheral的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter中使用ble_peripheral
插件来实现蓝牙外设功能的代码案例。这个插件允许你的Flutter应用充当蓝牙低功耗(BLE)外设,并广播服务和特征值。
首先,确保你已经在pubspec.yaml
文件中添加了ble_peripheral
依赖:
dependencies:
flutter:
sdk: flutter
ble_peripheral: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的示例代码,展示如何使用ble_peripheral
插件来广播一个服务和一个特征值:
import 'package:flutter/material.dart';
import 'package:ble_peripheral/ble_peripheral.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
BlePeripheral _blePeripheral = BlePeripheral();
bool _advertising = false;
@override
void initState() {
super.initState();
initBle();
}
Future<void> initBle() async {
// 初始化BLE外设
await _blePeripheral.init();
// 定义服务和特征值
Uuid serviceUuid = Uuid.parse('12345678-1234-5678-1234-56789abcdef0');
Uuid characteristicUuid = Uuid.parse('12345678-1234-5678-1234-56789abcdef1');
BleCharacteristic characteristic = BleCharacteristic(
uuid: characteristicUuid,
properties: CharacteristicProperties.broadcast,
);
BleService service = BleService(
uuid: serviceUuid,
characteristics: [characteristic],
);
// 添加服务到外设
await _blePeripheral.addService(service);
// 开始广播
startAdvertising();
}
Future<void> startAdvertising() async {
if (!_advertising) {
_advertising = true;
try {
await _blePeripheral.startAdvertising();
print('BLE advertising started.');
} catch (e) {
print('Failed to start BLE advertising: $e');
}
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('BLE Peripheral Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('BLE Peripheral is $_advertising ? Running : Not Running'),
],
),
),
),
);
}
@override
void dispose() {
// 停止广播并释放资源
if (_advertising) {
_blePeripheral.stopAdvertising();
}
_blePeripheral.dispose();
super.dispose();
}
}
代码说明:
- 依赖安装:在
pubspec.yaml
文件中添加ble_peripheral
依赖。 - 初始化BLE外设:在
initState
方法中调用_blePeripheral.init()
来初始化BLE外设。 - 定义服务和特征值:创建一个BLE服务和特征值,并设置特征值的属性为
CharacteristicProperties.broadcast
,这意味着这个特征值将被广播出去。 - 添加服务:通过
_blePeripheral.addService(service)
将服务添加到外设。 - 开始广播:调用
_blePeripheral.startAdvertising()
开始广播服务。 - UI显示:在UI中显示当前BLE外设的广播状态。
- 资源释放:在
dispose
方法中停止广播并释放BLE外设资源。
请注意,ble_peripheral
插件的某些功能可能受限于设备和操作系统版本。确保在支持BLE外设的设备上测试你的应用,并查阅插件的官方文档以获取更多信息和更新。