From 8a5b14e087abf332d38fc1973e96f00a1c1b04e1 Mon Sep 17 00:00:00 2001 From: iven Date: Tue, 28 Apr 2026 19:27:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(mp):=20DeviceType=20=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20blood=5Fpressure/blood=5Fglucose=20+=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=E5=99=A8=E6=8E=A5=E5=8F=A3=E6=94=B9=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/miniprogram/src/services/ble/BLEManager.ts | 8 ++++---- .../src/services/ble/adapters/XiaomiBandAdapter.ts | 12 ++++++------ apps/miniprogram/src/services/ble/types.ts | 12 ++++++++---- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/apps/miniprogram/src/services/ble/BLEManager.ts b/apps/miniprogram/src/services/ble/BLEManager.ts index d0c33ed..147b70b 100644 --- a/apps/miniprogram/src/services/ble/BLEManager.ts +++ b/apps/miniprogram/src/services/ble/BLEManager.ts @@ -172,14 +172,14 @@ export class BLEManager { // 监听数据通知 Taro.onBLECharacteristicValueChange((res: any) => { if (res.deviceId !== device.deviceId) return; - const reading = device.adapter!.parseNotification( + const newReadings = device.adapter!.parseNotification( res.serviceId, res.characteristicId, res.value, ); - if (reading) { - this.readings = [...this.readings, reading]; - this.onReadings?.([reading]); + if (newReadings.length > 0) { + this.readings = [...this.readings, ...newReadings]; + this.onReadings?.(newReadings); } }); diff --git a/apps/miniprogram/src/services/ble/adapters/XiaomiBandAdapter.ts b/apps/miniprogram/src/services/ble/adapters/XiaomiBandAdapter.ts index 859c99c..d5287f9 100644 --- a/apps/miniprogram/src/services/ble/adapters/XiaomiBandAdapter.ts +++ b/apps/miniprogram/src/services/ble/adapters/XiaomiBandAdapter.ts @@ -56,27 +56,27 @@ export const XiaomiBandAdapter: DeviceAdapter = { _serviceUUID: string, charUUID: string, data: ArrayBuffer, - ): NormalizedReading | null { + ): NormalizedReading[] { if (charUUID.toUpperCase().includes('2A37')) { const hr = parseHeartRate(data); if (hr !== null && hr > 0 && hr < 300) { - return { + return [{ device_type: 'heart_rate', values: { heart_rate: hr }, measured_at: new Date().toISOString(), - }; + }]; } } - return null; + return []; }, parseReadResponse( _serviceUUID: string, _charUUID: string, _data: ArrayBuffer, - ): NormalizedReading | null { + ): NormalizedReading[] { // 读取模式暂不支持,使用通知模式获取数据 - return null; + return []; }, }; diff --git a/apps/miniprogram/src/services/ble/types.ts b/apps/miniprogram/src/services/ble/types.ts index 5a3467c..9350fd9 100644 --- a/apps/miniprogram/src/services/ble/types.ts +++ b/apps/miniprogram/src/services/ble/types.ts @@ -7,12 +7,16 @@ export type DeviceType = | 'steps' | 'sleep' | 'temperature' - | 'stress'; + | 'stress' + | 'blood_pressure' + | 'blood_glucose'; /** 标准化的设备读数 */ export interface NormalizedReading { device_type: DeviceType; - values: Record; + values: Record; + /** 多指标设备的具体指标(如 systolic/diastolic) */ + metric?: string; measured_at: string; } @@ -38,14 +42,14 @@ export interface DeviceAdapter { serviceUUID: string, charUUID: string, data: ArrayBuffer, - ): NormalizedReading | null; + ): NormalizedReading[]; /** 解析 BLE 读取数据为标准读数 */ parseReadResponse( serviceUUID: string, charUUID: string, data: ArrayBuffer, - ): NormalizedReading | null; + ): NormalizedReading[]; } /** 扫描发现的 BLE 设备 */