Flutter蓝牙外设插件ble_peripheral的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter蓝牙外设插件ble_peripheral的使用

Ble Peripheral

ble_peripheral version

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

1 回复

更多关于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();
  }
}

代码说明:

  1. 依赖安装:在pubspec.yaml文件中添加ble_peripheral依赖。
  2. 初始化BLE外设:在initState方法中调用_blePeripheral.init()来初始化BLE外设。
  3. 定义服务和特征值:创建一个BLE服务和特征值,并设置特征值的属性为CharacteristicProperties.broadcast,这意味着这个特征值将被广播出去。
  4. 添加服务:通过_blePeripheral.addService(service)将服务添加到外设。
  5. 开始广播:调用_blePeripheral.startAdvertising()开始广播服务。
  6. UI显示:在UI中显示当前BLE外设的广播状态。
  7. 资源释放:在dispose方法中停止广播并释放BLE外设资源。

请注意,ble_peripheral插件的某些功能可能受限于设备和操作系统版本。确保在支持BLE外设的设备上测试你的应用,并查阅插件的官方文档以获取更多信息和更新。

回到顶部