| 4022F2E32BA2CD7900891BEF /* RingTestDemoVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4022F2D12BA2CD7900891BEF /* RingTestDemoVC.m */; }; | 4022F2E32BA2CD7900891BEF /* RingTestDemoVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 4022F2D12BA2CD7900891BEF /* RingTestDemoVC.m */; }; | ||||
| 4022F2E42BA2CD7900891BEF /* RingTestDemoVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4022F2D22BA2CD7900891BEF /* RingTestDemoVC.xib */; }; | 4022F2E42BA2CD7900891BEF /* RingTestDemoVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4022F2D22BA2CD7900891BEF /* RingTestDemoVC.xib */; }; | ||||
| 4022F2E52BA2CD7900891BEF /* ELDemoScanVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4022F2D32BA2CD7900891BEF /* ELDemoScanVC.xib */; }; | 4022F2E52BA2CD7900891BEF /* ELDemoScanVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4022F2D32BA2CD7900891BEF /* ELDemoScanVC.xib */; }; | ||||
| 402947A02BA44E3400822888 /* AICareComponentRingBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4029479F2BA44E3400822888 /* AICareComponentRingBleSDK.framework */; }; | |||||
| 418693CB2DA79EFF00A4D507 /* AICareComponentRingBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4029479F2BA44E3400822888 /* AICareComponentRingBleSDK.framework */; }; | |||||
| 418693CC2DA79EFF00A4D507 /* AICareComponentRingBleSDK.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 4029479F2BA44E3400822888 /* AICareComponentRingBleSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; | |||||
| /* End PBXBuildFile section */ | /* End PBXBuildFile section */ | ||||
| /* Begin PBXContainerItemProxy section */ | /* Begin PBXContainerItemProxy section */ | ||||
| dstPath = ""; | dstPath = ""; | ||||
| dstSubfolderSpec = 10; | dstSubfolderSpec = 10; | ||||
| files = ( | files = ( | ||||
| 418693CC2DA79EFF00A4D507 /* AICareComponentRingBleSDK.framework in CopyFiles */, | |||||
| ); | ); | ||||
| runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
| }; | }; | ||||
| isa = PBXFrameworksBuildPhase; | isa = PBXFrameworksBuildPhase; | ||||
| buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
| files = ( | files = ( | ||||
| 402947A02BA44E3400822888 /* AICareComponentRingBleSDK.framework in Frameworks */, | |||||
| 418693CB2DA79EFF00A4D507 /* AICareComponentRingBleSDK.framework in Frameworks */, | |||||
| ); | ); | ||||
| runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
| }; | }; |
| <?xml version="1.0" encoding="UTF-8"?> | |||||
| <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | |||||
| <plist version="1.0"> | |||||
| <dict> | |||||
| <key>SchemeUserState</key> | |||||
| <dict> | |||||
| <key>healthRingDemo.xcscheme_^#shared#^_</key> | |||||
| <dict> | |||||
| <key>orderHint</key> | |||||
| <integer>0</integer> | |||||
| </dict> | |||||
| </dict> | |||||
| </dict> | |||||
| </plist> |
| #define AICareComponentRingBleSDK_Version | #define AICareComponentRingBleSDK_Version | ||||
| //版本号 SDK Version | //版本号 SDK Version | ||||
| #define AICareComponentRingBleSDKVersion @"1.0.0" // 20231211 | |||||
| #define AICareComponentRingBleSDKVersion @"1.0.1" // 20250410 | |||||
| #endif /* AILinkBleSDK_Version_h */ | #endif /* AILinkBleSDK_Version_h */ |
| /* 获取RRI */ | /* 获取RRI */ | ||||
| - (NSData *)smartRingGetRRI; | - (NSData *)smartRingGetRRI; | ||||
| /* 设置/获取睡眠步数周期 */ | |||||
| -(NSData *)smartRingSetSleepDetectionPeriodWithInterval:(NSInteger)interval; | |||||
| /* 获取睡眠步数历史记录 */ | |||||
| -(NSData *)smartRingSleepReocrdWithType:(NSInteger)type; | |||||
| /* 1. APP 收到任何 A7 指令,都需要返回一组确认指令 | |||||
| 2. 返回确认指令后,再返回其他通信指令 */ | |||||
| - (NSData *)receiveA7Reply; | |||||
| @end | @end | ||||
| NS_ASSUME_NONNULL_END | NS_ASSUME_NONNULL_END |
| ELSmartRingCMDSetRRI_Type010 = 0x0b,// /* APP 设置定时监测rri 数量 */ | ELSmartRingCMDSetRRI_Type010 = 0x0b,// /* APP 设置定时监测rri 数量 */ | ||||
| ELSmartRingCMDHaveRecord_Type011 = 0x0c,// /* 设备产生历史记录提示 */ | ELSmartRingCMDHaveRecord_Type011 = 0x0c,// /* 设备产生历史记录提示 */ | ||||
| ELSmartRingCMDSetSleepPeriod_Type12 = 0x10,// / /* 设置/获取睡眠步数周期 */ | |||||
| ELSmartRingCMDGetSleepReocrd_Type13 = 0x11,// 获取睡眠/步数历史记录 | |||||
| ELSmartRingCMDHaveSleepReocrd_Type14 = 0x12,// /* 设备产生睡眠/步数历史记录提示 */ | |||||
| ELSmartRingCMDReceviceA7Reply_Type88 = 0x88,// /* APP 收到任何 A7 指令,都需要返回一组确认指令 */ | |||||
| }; | }; | ||||
| ELSmartRingDeviceStatus_success = 0x02, //历史时间已就绪(此状态才可获取设备历史记录) | ELSmartRingDeviceStatus_success = 0x02, //历史时间已就绪(此状态才可获取设备历史记录) | ||||
| }; | }; | ||||
| #endif /* ELSmartRingBleHeader_h */ | #endif /* ELSmartRingBleHeader_h */ |
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | ||||
| RRI:(NSInteger)RRI; | RRI:(NSInteger)RRI; | ||||
| ///* 设备产生数据提示*/(Type:11) | ///* 设备产生数据提示*/(Type:11) | ||||
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | ||||
| haveRecord:(NSInteger)haveRecord; | haveRecord:(NSInteger)haveRecord; | ||||
| ///* /* 设置/获取睡眠步数周期 */*/(Type:12) | |||||
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | |||||
| SleepDetectionPeriod:(NSUInteger)interval; | |||||
| ///* 备产生睡眠/步数历史记录提示*/(Type:14) | |||||
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser | |||||
| haveSleepRecord:(NSInteger)haveRecord; | |||||
| // /* 设备产生睡眠/步数历史记录提示 */ | |||||
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser SleepRecordArray:(NSArray *)smartRingBleModelArray; | |||||
| @end | @end | ||||
| @interface ELSmartRingBleModel : NSObject | @interface ELSmartRingBleModel : NSObject | ||||
| @property (nonatomic, assign) BOOL isDataValid; //数据是否有效 | @property (nonatomic, assign) BOOL isDataValid; //数据是否有效 | ||||
| //睡眠状态 | |||||
| @property (nonatomic, assign) UInt8 sleepType; | |||||
| //步数 | |||||
| @property (nonatomic, assign) long long step; | |||||
| @end | @end | ||||
| @interface ELSmartRingSleepDataModel: NSObject | |||||
| //时间戳 | |||||
| @property (nonatomic, assign) long long uploadTime; | |||||
| //睡眠状态(等级: 深睡,浅睡等由app划分区间,一般0-2:清醒,3-5:浅睡,6-7:深睡) | |||||
| @property (nonatomic, assign) NSInteger type; | |||||
| //步数 | |||||
| @property (nonatomic, assign) NSInteger step; | |||||
| @end | |||||
| NS_ASSUME_NONNULL_END | NS_ASSUME_NONNULL_END |
| @property (nonatomic, weak) id<ELSmartRingManagerDelegate> delegate; | @property (nonatomic, weak) id<ELSmartRingManagerDelegate> delegate; | ||||
| //判断是否需要常链接 | |||||
| @property (nonatomic, assign) BOOL needLongConnected; | |||||
| //监测间隔 | //监测间隔 | ||||
| @property (nonatomic, assign) NSInteger interval; | @property (nonatomic, assign) NSInteger interval; | ||||
| -(void)smartRingGetDeviceStatus;//获取设备状态,电量和佩戴状况 | -(void)smartRingGetDeviceStatus;//获取设备状态,电量和佩戴状况 | ||||
| -(void)smartRingReocrdWithType:(NSInteger)type;//获取日常检测历史记录 //0 开始获取 1 继续获取 2 结束获取 3 删除历史记录 | -(void)smartRingReocrdWithType:(NSInteger)type;//获取日常检测历史记录 //0 开始获取 1 继续获取 2 结束获取 3 删除历史记录 | ||||
| - (void)smartRingSleepReocrdWithType:(NSInteger)type;//获取睡眠步数历史记录 //0 开始获取 1 继续获取 2 结束获取 3 删除历史记录 | |||||
| -(void)smartRingSetUnix;//设置Unix时间 | -(void)smartRingSetUnix;//设置Unix时间 | ||||
| -(void)syncMCUNowDate; // 同步时间到设备 | -(void)syncMCUNowDate; // 同步时间到设备 | ||||
| - (void)disconnectPeripheral; | - (void)disconnectPeripheral; | ||||
| - (void)clearInformation; | |||||
| - (void)clearUserInformation; | |||||
| @end | @end | ||||
| @protocol ELSmartRingManagerDelegate <NSObject> | @protocol ELSmartRingManagerDelegate <NSObject> | ||||
| //设备固件bmVersion | //设备固件bmVersion | ||||
| - (void)smartRingManager:(ELSmartRingManager *)smartRingManager getBmVersion:(NSString *)bmVersion; | - (void)smartRingManager:(ELSmartRingManager *)smartRingManager getBmVersion:(NSString *)bmVersion; | ||||
| //蓝牙状态 | //蓝牙状态 | ||||
| - (void)smartRingManager:(ELSmartRingManager *)smartRingManager managerDidUpdateState:(CBCentralManager *)central; | - (void)smartRingManager:(ELSmartRingManager *)smartRingManager managerDidUpdateState:(CBCentralManager *)central; | ||||
| //OTA 失败或成功回调 | //OTA 失败或成功回调 | ||||
| - (void)smartRingOTAUpdateResult:(BOOL)isSuccess errorMsg:(NSString*)errorMsg; | - (void)smartRingOTAUpdateResult:(BOOL)isSuccess errorMsg:(NSString*)errorMsg; | ||||
| // 步数/睡眠数据记录 | |||||
| - (void)smartRingManager:(ELSmartRingManager *)smartRingManager SleepRecordArray:(nonnull NSArray *)smartRingBleModelArray; | |||||
| @end | @end | ||||
| - (IBAction)shareLogAction:(id)sender { | - (IBAction)shareLogAction:(id)sender { | ||||
| } | } | ||||
| - (IBAction)sleepStepDataAction:(UIButton *)sender { | |||||
| [[ELSmartRingManager sharedManager] smartRingSleepReocrdWithType:0]; | |||||
| } | |||||
| #pragma mark - BleManagerDelegate | #pragma mark - BleManagerDelegate | ||||
| - (void)initBle { | - (void)initBle { | ||||
| } | } | ||||
| //步数,睡眠数据 | |||||
| - (void)smartRingBleParser:(ELSmartRingBleParser *)bleParser SleepRecordArray:(nonnull NSArray *)smartRingBleModelArray { | |||||
| for (ELSmartRingBleModel * smartRingBleModel in smartRingBleModelArray) { | |||||
| ELSmartRingSleepDataModel *model = [[ELSmartRingSleepDataModel alloc]init]; | |||||
| model.type = smartRingBleModel.sleepType; | |||||
| model.step = smartRingBleModel.step; | |||||
| model.uploadTime = smartRingBleModel.recordTime/1000; | |||||
| NSLog(@"%s smartRingBleModelArray :%@", __func__, model); | |||||
| } | |||||
| } | |||||
| #pragma mark - addLog | #pragma mark - addLog | ||||
| - (void)addLog:(NSString *)log { | - (void)addLog:(NSString *)log { |
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |||||
| <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |||||
| <device id="retina6_12" orientation="portrait" appearance="light"/> | <device id="retina6_12" orientation="portrait" appearance="light"/> | ||||
| <dependencies> | <dependencies> | ||||
| <deployment identifier="iOS"/> | <deployment identifier="iOS"/> | ||||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/> | |||||
| <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/> | |||||
| <capability name="Safe area layout guides" minToolsVersion="9.0"/> | <capability name="Safe area layout guides" minToolsVersion="9.0"/> | ||||
| <capability name="System colors in document resources" minToolsVersion="11.0"/> | <capability name="System colors in document resources" minToolsVersion="11.0"/> | ||||
| <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> | ||||
| <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||
| <subviews> | <subviews> | ||||
| <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="K5I-eH-HGA"> | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="K5I-eH-HGA"> | ||||
| <rect key="frame" x="16" y="540" width="31" height="30"/> | |||||
| <rect key="frame" x="16" y="540" width="30" height="30"/> | |||||
| <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> | <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> | ||||
| <state key="normal" title="清空"/> | <state key="normal" title="清空"/> | ||||
| <connections> | <connections> | ||||
| </connections> | </connections> | ||||
| </button> | </button> | ||||
| <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lwE-Xr-Dac"> | <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="lwE-Xr-Dac"> | ||||
| <rect key="frame" x="346" y="540" width="31" height="30"/> | |||||
| <rect key="frame" x="347" y="540" width="30" height="30"/> | |||||
| <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> | <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> | ||||
| <state key="normal" title="分享"/> | <state key="normal" title="分享"/> | ||||
| <connections> | <connections> | ||||
| <state key="normal" title="Button"/> | <state key="normal" title="Button"/> | ||||
| <buttonConfiguration key="configuration" style="filled" title="McuVersion"/> | <buttonConfiguration key="configuration" style="filled" title="McuVersion"/> | ||||
| <connections> | <connections> | ||||
| <action selector="getMcuVersionAction:" destination="-1" eventType="touchUpInside" id="oVb-mw-Y4Z"/> | |||||
| <action selector="getMcuVersionAction:" destination="-1" eventType="touchUpInside" id="TyZ-tx-zBR"/> | |||||
| </connections> | </connections> | ||||
| </button> | </button> | ||||
| <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mDO-P1-1UC"> | <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mDO-P1-1UC"> | ||||
| <action selector="setRRI30Action:" destination="-1" eventType="touchUpInside" id="1CD-aw-Ckq"/> | <action selector="setRRI30Action:" destination="-1" eventType="touchUpInside" id="1CD-aw-Ckq"/> | ||||
| </connections> | </connections> | ||||
| </button> | </button> | ||||
| <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fw7-Bx-zco"> | |||||
| <rect key="frame" x="149" y="267" width="135" height="35"/> | |||||
| <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> | |||||
| <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/> | |||||
| <state key="normal" title="Button"/> | |||||
| <buttonConfiguration key="configuration" style="filled" title="步数/睡眠数据"/> | |||||
| <connections> | |||||
| <action selector="sleepStepDataAction:" destination="-1" eventType="touchUpInside" id="wTa-ho-ptM"/> | |||||
| </connections> | |||||
| </button> | |||||
| </subviews> | </subviews> | ||||
| <color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/> | <color key="backgroundColor" systemColor="systemGroupedBackgroundColor"/> | ||||
| </view> | </view> | ||||
| </objects> | </objects> | ||||
| <resources> | <resources> | ||||
| <systemColor name="labelColor"> | <systemColor name="labelColor"> | ||||
| <color red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||||
| <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | |||||
| </systemColor> | </systemColor> | ||||
| <systemColor name="opaqueSeparatorColor"> | <systemColor name="opaqueSeparatorColor"> | ||||
| <color red="0.77647058823529413" green="0.77647058823529413" blue="0.78431372549019607" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||||
| <color red="0.77647058820000003" green="0.77647058820000003" blue="0.7843137255" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||||
| </systemColor> | </systemColor> | ||||
| <systemColor name="systemBackgroundColor"> | <systemColor name="systemBackgroundColor"> | ||||
| <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> | ||||
| </systemColor> | </systemColor> | ||||
| <systemColor name="systemGroupedBackgroundColor"> | <systemColor name="systemGroupedBackgroundColor"> | ||||
| <color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||||
| <color red="0.94901960780000005" green="0.94901960780000005" blue="0.96862745100000003" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> | |||||
| </systemColor> | </systemColor> | ||||
| </resources> | </resources> | ||||
| </document> | </document> |