You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中连接Beurer BM96血压计并同步数据至Firebase

实现Flutter连接Beurer BM96血压计并同步数据到Firebase的方案

一、是否选择flutter_blue_plus?

是,flutter_blue_plus是当前Flutter生态中维护最活跃、功能完善的BLE(蓝牙低功耗)库,完全支持Android和iOS平台的设备扫描、连接、服务/特征操作,适合对接医疗BLE设备。

二、完整实现步骤

1. 配置蓝牙权限

  • Android:在AndroidManifest.xml中添加权限:
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
    
  • iOS:在Info.plist中添加权限描述:
    <key>NSBluetoothAlwaysUsageDescription</key>
    <string>需要蓝牙权限连接血压计</string>
    <key>NSBluetoothPeripheralUsageDescription</key>
    <string>需要蓝牙权限获取血压数据</string>
    

2. 设备扫描与连接

使用flutter_blue_plus扫描Beurer BM96,可通过设备名称(通常为Beurer BM96或类似标识)过滤,找到后发起连接:

import 'package:flutter_blue_plus/flutter_blue_plus.dart';

// 扫描设备
void scanDevices() {
  FlutterBluePlus.startScan(timeout: const Duration(seconds: 4));
  FlutterBluePlus.scanResults.listen((results) {
    for (ScanResult result in results) {
      if (result.device.name.contains("Beurer BM96")) {
        // 找到目标设备,停止扫描并连接
        FlutterBluePlus.stopScan();
        connectToDevice(result.device);
        break;
      }
    }
  });
}

// 连接设备
Future<void> connectToDevice(BluetoothDevice device) async {
  try {
    await device.connect();
    // 连接成功后发现服务
    discoverServices(device);
  } catch (e) {
    print("连接失败: $e");
  }
}

3. 发现服务与特征

BLE设备的数据交互依赖服务(Service)和特征(Characteristic),你需要找到BM96负责血压数据传输的特征(通常支持通知功能):

Future<void> discoverServices(BluetoothDevice device) async {
  List<BluetoothService> services = await device.discoverServices();
  for (BluetoothService service in services) {
    // 替换为BM96的血压服务UUID(需通过后文方法获取)
    if (service.uuid.toString() == "00001810-0000-1000-8000-00805f9b34fb") {
      for (BluetoothCharacteristic characteristic in service.characteristics) {
        // 替换为支持通知的血压数据特征UUID
        if (characteristic.uuid.toString() == "00002a35-0000-1000-8000-00805f9b34fb") {
          // 启用通知,监听数据
          await characteristic.setNotifyValue(true);
          characteristic.value.listen((value) {
            // 解析二进制数据
            Map<String, dynamic> bloodData = parseBloodPressureData(value);
            // 更新UI + 同步到Firebase
            updateUI(bloodData);
            syncToFirebase(bloodData);
          });
        }
      }
    }
  }
}

4. 解析血压数据

BM96的BLE数据是二进制格式,需按照厂商协议解析。以常见的血压计BLE规范(符合ISO 11073标准)为例,解析逻辑大致如下:

Map<String, dynamic> parseBloodPressureData(List<int> bytes) {
  // 示例解析逻辑,需根据BM96实际协议调整
  int systolic = bytes[2] + (bytes[1] << 8);
  int diastolic = bytes[4] + (bytes[3] << 8);
  int heartRate = bytes[6];
  return {
    "systolic": systolic,
    "diastolic": diastolic,
    "heartRate": heartRate,
    "timestamp": DateTime.now().toIso8601String()
  };
}

5. 同步数据到Firebase

使用cloud_firestore包将解析后的数据写入Firebase:

import 'package:cloud_firestore/cloud_firestore.dart';

Future<void> syncToFirebase(Map<String, dynamic> data) async {
  try {
    await FirebaseFirestore.instance.collection("blood_pressure").add(data);
    print("数据同步成功");
  } catch (e) {
    print("同步失败: $e");
  }
}

三、必须的设备信息及获取途径

你需要获取BM96的BLE服务UUID和特征UUID(尤其是支持通知的血压数据特征),获取方式:

  • 查看Beurer官方开发者文档:部分医疗设备厂商会公开BLE协议规范,可在官网开发者板块查找。
  • 使用BLE调试工具:比如nRF Connect(手机APP),扫描并连接BM96,查看设备的所有服务和特征,记录下测量时会主动推送数据的特征UUID。
  • 参考同系列设备协议:Beurer BM系列血压计的BLE协议通常大同小异,可查找其他BM型号的公开协议作为参考。

四、注意事项

  • 确保血压计处于可连接状态(通常测量前会自动开启蓝牙广播)。
  • 处理连接断开、权限拒绝等异常场景,提升用户体验。
  • 解析数据时必须严格遵循BM96的实际协议,否则会出现数据错误。

内容的提问来源于stack exchange,提问作者al ice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:11:32