如何在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
相关产品推荐
相关产品推荐

