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 设备 */