Flutter模拟数据插件blemulator的使用

概述

BLEMulator 是一个用于模拟低功耗蓝牙外设(Bluetooth Low Energy peripherals)的Flutter插件。它允许开发者在iOS模拟器或Android虚拟机上测试BLE应用程序,并且可以运行自动化测试。

注意: BLEMulator 只能在与 FlutterBleLib 配合使用时工作。

BLEMulator 模拟了 MultiPlatformBleAdapter 的行为,并让你在Dart中创建模拟的外设。由于模拟是在FlutterBleLib的原生桥接层下插入的,因此你的Flutter BLE处理代码不会意识到它正在运行在一个模拟环境中。

功能

  • 在iOS模拟器和Android虚拟机上开发BLE应用。
  • 运行自动化测试。

如何使用

以下是使用 BLEMulator 的步骤:

  1. 获取 BLEMulator 实例。
  2. 添加一个模拟外设。
  3. 调用 blemulator.simulate() 方法。
  4. 调用 FlutterBleLibbleManager.createClient() 方法。

示例代码

// 导入必要的库
import 'package:blemulator/blemulator.dart';
import 'package:flutter_ble_lib/flutter_ble_lib.dart';

void main() {
  // 初始化BLEMulator
  Blemulator blemulator = Blemulator();

  // 创建一个模拟外设
  blemulator.addSimulatedPeripheral(ExamplePeripheral());

  // 开始模拟
  blemulator.simulate();

  // 初始化BLE管理器
  BleManager bleManager = BleManager();
  bleManager.createClient(); // 创建原生BLE客户端实例
}

定义简单的模拟外设

以下是一个基于 Texas Instruments CC2541 SensorTag 的简单模拟外设示例。仅模拟了红外温度服务。

// 导入必要的库
import 'dart:typed_data';
import 'package:blemulator/blemulator.dart';
import 'package:flutter_ble_lib/flutter_ble_lib.dart';

// 定义模拟外设类
class SensorTag extends SimulatedPeripheral {
  SensorTag({
    String id = "4C:99:4C:34:DE:76",
    String name = "SensorTag",
    String localName = "SensorTag",
  }) : super(
          name: name,
          id: id,
          advertisementInterval: Duration(milliseconds: 800), // 广播间隔
          services: [
            // 模拟服务
            SimulatedService(
              uuid: "F000AA00-0451-4000-B000-000000000000", // UUID
              isAdvertised: true, // 是否广播
              characteristics: [
                // 模拟特征值
                SimulatedCharacteristic(
                  uuid: "F000AA01-0451-4000-B000-000000000000",
                  value: Uint8List.fromList([101, 254, 64, 12]), // 特征值
                  convenienceName: "IR Temperature Data", // 易读名称
                ),
                SimulatedCharacteristic(
                  uuid: "F000AA02-0451-4000-B000-000000000000",
                  value: Uint8List.fromList([0]),
                  convenienceName: "IR Temperature Config",
                ),
                SimulatedCharacteristic(
                  uuid: "F000AA03-0451-4000-B000-000000000000",
                  value: Uint8List.fromList([50]),
                  convenienceName: "IR Temperature Period",
                ),
              ],
              convenienceName: "Temperature service",
            )
          ],
        ) {
    scanInfo.localName = localName; // 设置本地名称
  }

  // 处理连接请求
  @override
  Future<bool> onConnectRequest() async {
    await Future.delayed(Duration(milliseconds: 200)); // 模拟延迟
    return super.onConnectRequest(); // 返回连接结果
  }
}

解释

  • advertisementInterval: 每隔800毫秒广播一次。
  • services: 包含三个特征值的模拟服务。
  • onConnectRequest: 模拟连接请求的延迟。

修改广告数据或扫描信息

你可以通过修改 scanInfo 属性来控制广告数据。scanInfo 是自动广播的,每次广告间隔内都会发送。

class SensorTag extends SimulatedPeripheral {
  // 构造函数中设置扫描信息
  SensorTag({
    String id = "4C:99:4C:34:DE:76",
    String name = "SensorTag",
    String localName = "SensorTag",
  }) : super(
          name: name,
          id: id,
          advertisementInterval: Duration(milliseconds: 800),
          services: [...], // 服务定义
        ) {
    scanInfo.rssi = -60; // RSSI值
    scanInfo.isConnectable = true; // 是否可连接
    scanInfo.serviceUuids = ["F000AA00-0451-4000-B000-000000000000"];
  }
}

自定义特征行为

如果需要更复杂的逻辑,比如验证值或触发其他特征的变化,可以扩展 SimulatedServiceSimulatedCharacteristic 类。

示例:限制特征值范围

class ExampleCharacteristic extends SimulatedCharacteristic {
  ExampleCharacteristic({@required String uuid, String convenienceName})
      : super(
          uuid: uuid,
          value: Uint8List.fromList([0]),
          convenienceName: convenienceName,
        );

  @override
  Future<void> write(Uint8List value, {bool sendNotification = true}) {
    int valueAsInt = value[0];
    if (valueAsInt != 0 && valueAsInt != 1) {
      return Future.error(SimulatedBleError(
          BleErrorCode.CharacteristicWriteFailed, "Unsupported value"));
    } else {
      return super.write(value);
    }
  }
}

描述符

特征值可以包含描述符,用于提供更多上下文信息。

SimulatedCharacteristic(
  uuid: "F000AA13-0451-4000-B000-000000000000",
  value: Uint8List.fromList([30]),
  descriptors: [
    SimulatedDescriptor(
      uuid: "F0002901-0451-4000-B000-000000000000",
      value: Uint8List.fromList([0]),
      convenienceName: "Example descriptor (Characteristic User Description)",
    ),
  ],
  convenienceName: "Accelerometer Period",
);
1 回复

更多关于Flutter模拟数据插件blemulator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


blemulator 是一个用于 Flutter 的模拟数据插件,特别适用于在开发过程中模拟蓝牙低功耗(BLE)设备的行为。它可以帮助开发者在没有实际硬件设备的情况下进行开发和测试。以下是使用 blemulator 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 blemulator 依赖:

dependencies:
  flutter:
    sdk: flutter
  blemulator: ^1.0.0  # 请检查最新版本

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

2. 初始化 Blemulator

在你的 Flutter 应用中初始化 blemulator。通常,你可以在 main.dart 文件中进行初始化:

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

void main() {
  Blemulator().initialize();
  runApp(MyApp());
}

3. 配置模拟设备

你可以配置一个或多个模拟的 BLE 设备。以下是一个简单的示例,展示如何配置一个模拟设备:

import 'package:blemulator/blemulator.dart';

void configureBlemulator() {
  Blemulator().addDevice(
    id: 'device1',
    name: 'My BLE Device',
    services: [
      BleService(
        uuid: '0000180d-0000-1000-8000-00805f9b34fb',
        characteristics: [
          BleCharacteristic(
            uuid: '00002a37-0000-1000-8000-00805f9b34fb',
            value: [0x01, 0x02, 0x03],
            properties: CharacteristicProperties(
              read: true,
              write: true,
              notify: true,
            ),
          ),
        ],
      ),
    ],
  );
}

main 函数中调用 configureBlemulator

void main() {
  Blemulator().initialize();
  configureBlemulator();
  runApp(MyApp());
}

4. 使用 BLE 功能

在你的应用中使用 BLE 功能时,blemulator 会模拟这些设备的行为。你可以使用 flutter_blue 或其他 BLE 插件来与这些模拟设备进行交互。

例如,使用 flutter_blue 扫描设备:

import 'package:flutter_blue/flutter_blue.dart';

void scanDevices() {
  FlutterBlue flutterBlue = FlutterBlue.instance;

  flutterBlue.scan().listen((scanResult) {
    print('Found device: ${scanResult.device.name}');
  });
}

5. 运行应用

现在你可以运行你的 Flutter 应用,并使用 blemulator 模拟的 BLE 设备进行开发和测试。

6. 调试和测试

在开发过程中,你可以通过 blemulator 提供的 API 来动态修改模拟设备的行为,以便测试不同的场景。

7. 移除模拟设备

如果你不再需要某个模拟设备,可以通过以下方式移除它:

Blemulator().removeDevice('device1');

8. 清理

在应用退出时,可以清理 blemulator

Blemulator().dispose();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!