From d6d9a09d505d11148599a95a5be3e1351edbe0ac Mon Sep 17 00:00:00 2001 From: hc Date: Mon, 13 Apr 2026 15:17:52 +0800 Subject: Local iHealth SDK, device detail screen, iOS event fixes --- .../ios/ReactNativeIOSLibrary/BP5SModule.m | 426 +++++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 libs/ihealth-sdk/ios/ReactNativeIOSLibrary/BP5SModule.m (limited to 'libs/ihealth-sdk/ios/ReactNativeIOSLibrary/BP5SModule.m') diff --git a/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/BP5SModule.m b/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/BP5SModule.m new file mode 100644 index 0000000..332fe67 --- /dev/null +++ b/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/BP5SModule.m @@ -0,0 +1,426 @@ +// +// BP5SModule.m +// ReactNativeIOSLibrary +// +// Created by soso on 2019/4/17. +// Copyright © 2019 daiqingquan. All rights reserved. +// + +#import "BP5SModule.h" + +#import "BPProfileModule.h" +#import "BPMacroFile.h" +#import "BP5SController.h" +#import "BP5S.h" +#import "iHealthDeviceManagerModule.h" + +#import "ScanDeviceController.h" +#import "ConnectDeviceController.h" +#define EVENT_NOTIFY @"BP5S.MODULE.NOTIFY" + +@interface BP5SModule () +@property (nonatomic, assign) BOOL isMeasuring; + +@end + + +@implementation BP5SModule +RCT_EXPORT_MODULE() +- (NSArray *)supportedEvents { + return @[@"event_notify", @"event_scan_device", @"event_scan_finish", + @"event_device_connected", @"event_device_connect_failed", + @"event_device_disconnect", @"event_authenticate_result", + @"event_notify_ts28b", @"event_notify_bg1", + @"action_connect_result_for_bg1"]; +} + + +- (NSDictionary *)constantsToExport +{ + return @{ + @"Event_Notify":EVENT_NOTIFY, + + }; +} ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + +-(BP5S*)getDeviceWithMac:(NSString*)mac{ + + BP5SController *controller = [BP5SController sharedController]; + NSArray *bpDeviceArray = [controller getAllCurrentInstance]; + + for(BP5S *tempDevice in bpDeviceArray){ + if([mac isEqualToString:tempDevice.serialNumber]){ + + return tempDevice; + } + } + + return nil; +} + + +#pragma mark - Method + + +#pragma mark-获取连接设备 +RCT_EXPORT_METHOD(getAllConnectedDevices){ + + + NSArray *bp5sArray= [[BP5SController sharedController] getAllCurrentInstance]; + + NSMutableArray *deviceMacArray = [NSMutableArray array]; + + for (int i=0; i<[bp5sArray count]; i++) { + + BP5S *bp5s=[bp5sArray objectAtIndex:i]; + + [deviceMacArray addObject:bp5s.serialNumber]; + + } + + NSDictionary* deviceInfo = @{@"action":@"ACTION_GET_ALL_CONNECTED_DEVICES",@"devices":deviceMacArray}; + + [self sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + +} + + +//开始测量 +RCT_EXPORT_METHOD(startMeasure:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + + [[self getDeviceWithMac:mac] commandStartMeasureWithZeroingState:^(BOOL isComplete) { + weakSelf.isMeasuring = YES; + NSDictionary* response = @{ + @"mac":mac, + kACTION:isComplete ? kACTION_ZOREING_BP : kACTION_ZOREOVER_BP, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } pressure:^(NSArray *pressureArr) { + weakSelf.isMeasuring = YES; + NSLog(@"pressure %@",pressureArr); + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_ONLINE_PRESSURE_BP, + kBLOOD_PRESSURE_BP:pressureArr.firstObject, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } waveletWithHeartbeat:^(NSArray *waveletArr) { + weakSelf.isMeasuring = YES; + NSLog(@"xiaoboWithHeart %@",waveletArr); + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_ONLINE_PULSEWAVE_BP, + kFLAG_HEARTBEAT_BP:@(1), + kPULSEWAVE_BP:waveletArr + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } waveletWithoutHeartbeat:^(NSArray *waveletArr) { + weakSelf.isMeasuring = YES; + NSLog(@"xiaoboNoHeart %@",waveletArr); + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_ONLINE_PULSEWAVE_BP, + kFLAG_HEARTBEAT_BP:@(0), + kPULSEWAVE_BP:waveletArr + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } result:^(NSDictionary *resultDict) { + weakSelf.isMeasuring = NO; + NSLog(@"result %@",resultDict); + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_ONLINE_RESULT_BP, + kHIGH_BLOOD_PRESSURE_BP:resultDict[@"sys"], + kLOW_BLOOD_PRESSURE_BP:resultDict[@"dia"], + kPULSE_BP:resultDict[@"heartRate"], + kMEASUREMENT_AHR_BP:resultDict[@"irregular"], + kDATAID:resultDict[@"dataID"], + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } errorBlock:^(BPDeviceError error) { + weakSelf.isMeasuring = NO; + NSLog(@"error %lu",(unsigned long)error); + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + + }else{ + self.isMeasuring = NO; + NSLog(@"error %lu",(unsigned long)BPDidDisconnect); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + +//停止测量 +RCT_EXPORT_METHOD(stopMeasure:(nonnull NSString *)mac){ + if (!self.isMeasuring) { + NSLog(@"error %d",401); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:401]; + return; + } + __weak typeof(self) weakSelf = self; + if ([self getDeviceWithMac:mac]!=nil) { + [[self getDeviceWithMac:mac] stopBPMeassureSuccessBlock:^{ + + weakSelf.isMeasuring = NO; + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_INTERRUPTED_BP, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + + } errorBlock:^(BPDeviceError error) { + + NSLog(@"error %lu",(unsigned long)error); + weakSelf.isMeasuring = NO; + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + + + }else{ + weakSelf.isMeasuring = NO; + NSLog(@"error %lu",(unsigned long)BPDidDisconnect); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } + + +} + +//删除功能 +RCT_EXPORT_METHOD(deleteData:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + [[self getDeviceWithMac:mac] commandDeleteDataSuccessBlock:^{ + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_Delete_BP, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } errorBlock:^(BPDeviceError error) { + NSLog(@"error %lu",(unsigned long)error); + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + }else{ + NSLog(@"error %lu",(unsigned long)BPDidDisconnect); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + +//设置离线功能 +RCT_EXPORT_METHOD(enbleOffline:(nonnull NSString *)mac mode:(nonnull NSNumber *)mode){ + + if ([self getDeviceWithMac:mac]!=nil) { + __block BOOL success = YES; + __weak typeof(self) weakSelf = self; + + BOOL flag; + + if ([mode boolValue] == YES) { + flag = YES; + }else{ + flag = NO; + } + + [[self getDeviceWithMac:mac] commandSetOffline:flag success:^{ + + if (flag == YES) { + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_ENABLE_OFFLINE_BP, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + }else{ + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_DISENABLE_OFFLINE_BP, + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } + + } error:^(BPDeviceError error) { + success = NO; + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + }else{ + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + + +//查电量 +RCT_EXPORT_METHOD(getBattery:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + [[self getDeviceWithMac:mac] commandEnergy:^(NSNumber *energyValue) { + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_BATTERY_BP, + kBATTERY_BP:energyValue + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } errorBlock:^(BPDeviceError error) { + NSLog(@"error %lu",(unsigned long)error); + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + }else{ + NSLog(@"error %lu",(unsigned long)BPDidDisconnect); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + +//查数据数量 +RCT_EXPORT_METHOD(getOffLineNum:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + [[self getDeviceWithMac:mac]commandTransferMemoryTotalCount:^(NSNumber *num) { + + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_HISTORICAL_NUM_BP, + kHISTORICAL_NUM_BP:num + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + + } errorBlock:^(BPDeviceError error) { + + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + + }]; + + }else{ + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + + +//查离线数据 +RCT_EXPORT_METHOD(getOffLineData:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + + [[self getDeviceWithMac:mac] commandTransferMemoryDataWithTotalCount:^(NSNumber *count) { + if ([count integerValue] == 0) { + NSDictionary* response = @{@"mac":mac,kACTION:kACTION_HISTORICAL_DATA_BP }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } + } progress:^(NSNumber *progress) { + + } dataArray:^(NSArray *array) { + NSMutableArray * tempArr = [[NSMutableArray alloc]init]; + + for(NSDictionary *history in array) + { + + NSNumber *dateNum = [history objectForKey:@"time"]; + + NSDate *tempDate = [NSDate dateWithTimeIntervalSince1970:[dateNum integerValue]]; + //将时间格式转化成字符串,适配plugin和react native + NSDateFormatter *mydateFormatter = [[NSDateFormatter alloc] init]; + [mydateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; + NSString *dateStr = [mydateFormatter stringFromDate:tempDate]; + + NSNumber*bpHSD=[history valueForKey:@"hsdValue"]; + NSDictionary *dic=[NSDictionary dictionary]; + if (bpHSD!=nil) { + dic = @{ + @"mac":mac, + kMEASUREMENT_DATE_BP: dateStr, + kLOW_BLOOD_PRESSURE_BP: [history objectForKey:@"dia"], + kHIGH_BLOOD_PRESSURE_BP: [history objectForKey:@"sys"], + kMEASUREMENT_AHR_BP: [history objectForKey:@"irregular"], + kPULSE_BP: [history objectForKey:@"heartRate"], + kDATAID: [history objectForKey:@"dataID"], + kMEASUREMENT_HSD_BP: history[@"hsdValue"] + }; + }else{ + + + dic = @{ + @"mac":mac, + kMEASUREMENT_DATE_BP: dateStr, + kLOW_BLOOD_PRESSURE_BP: [history objectForKey:@"dia"], + kHIGH_BLOOD_PRESSURE_BP: [history objectForKey:@"sys"], + kMEASUREMENT_AHR_BP: [history objectForKey:@"irregular"], + kPULSE_BP: [history objectForKey:@"heartRate"], + kDATAID: [history objectForKey:@"dataID"] + + }; + } + [tempArr addObject:dic]; + } + + if (tempArr.count > 0) { + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_HISTORICAL_DATA_BP, + kHISTORICAL_DATA_BP:[tempArr copy] + }; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + } + + } errorBlock:^(BPDeviceError error) { + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + }]; + + }else{ + + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } + + +} + +//查询功能 +RCT_EXPORT_METHOD(getFunctionInfo:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + __weak typeof(self) weakSelf = self; + [[self getDeviceWithMac:mac] commandFunction:^(NSDictionary *dic) { + + NSDictionary* response = @{ + @"mac":mac, + kACTION:kACTION_FUNCTION_INFORMATION_BP, + kFUNCTION_IS_UPAIR_MEASURE: [dic objectForKey:@"upAirMeasureFlg"], + kFUNCTION_IS_ARM_MEASURE: [dic objectForKey:@"armMeasureFlg"], + kFUNCTION_HAVE_ANGLE_SENSOR: [dic objectForKey:@"haveAngleSensor"], + kFUNCTION_HAVE_OFFLINE: [dic objectForKey:@"haveOffline"], + kFUNCTION_HAVE_HSD: [dic objectForKey:@"haveHSD"], + kFUNCTION_IS_MULTI_UPLOAD: [dic objectForKey:@"mutableUpload"], + kFUNCTION_HAVE_SELF_UPDATE: [dic objectForKey: @"selfUpdate"]}; + [BPProfileModule sendEventToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithDict:response]; + + } errorBlock:^(BPDeviceError error) { + + [BPProfileModule sendErrorToEmitter:weakSelf eventNotify:EVENT_NOTIFY WithCode:error]; + + }]; + }else{ + + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + +//离线数据 +RCT_EXPORT_METHOD(disconnect:(nonnull NSString *)mac){ + + if ([self getDeviceWithMac:mac]!=nil) { + [[self getDeviceWithMac:mac] commandDisconnectDevice]; + }else{ + NSLog(@"error %lu",(unsigned long)BPDidDisconnect); + [BPProfileModule sendErrorToEmitter:self eventNotify:EVENT_NOTIFY WithCode:BPDidDisconnect]; + } +} + + + +@end -- cgit