buildSettings = { | buildSettings = { | ||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
CODE_SIGN_STYLE = Automatic; | CODE_SIGN_STYLE = Automatic; | ||||
CURRENT_PROJECT_VERSION = 20240910; | |||||
CURRENT_PROJECT_VERSION = 20250305; | |||||
DEVELOPMENT_TEAM = YEU77XR292; | DEVELOPMENT_TEAM = YEU77XR292; | ||||
FRAMEWORK_SEARCH_PATHS = ( | FRAMEWORK_SEARCH_PATHS = ( | ||||
"$(inherited)", | "$(inherited)", | ||||
"$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/HTBodyfat_SDK", | "$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/HTBodyfat_SDK", | ||||
"$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/BhBodyComposition120", | "$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/BhBodyComposition120", | ||||
); | ); | ||||
MARKETING_VERSION = 1.10.0; | |||||
MARKETING_VERSION = 1.11.0; | |||||
OTHER_LDFLAGS = "-ObjC"; | OTHER_LDFLAGS = "-ObjC"; | ||||
PRODUCT_BUNDLE_IDENTIFIER = com.ellinkthings.ailinksdk.app; | PRODUCT_BUNDLE_IDENTIFIER = com.ellinkthings.ailinksdk.app; | ||||
PRODUCT_NAME = "$(TARGET_NAME)"; | PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
buildSettings = { | buildSettings = { | ||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
CODE_SIGN_STYLE = Automatic; | CODE_SIGN_STYLE = Automatic; | ||||
CURRENT_PROJECT_VERSION = 20240910; | |||||
CURRENT_PROJECT_VERSION = 20250305; | |||||
DEVELOPMENT_TEAM = YEU77XR292; | DEVELOPMENT_TEAM = YEU77XR292; | ||||
FRAMEWORK_SEARCH_PATHS = ( | FRAMEWORK_SEARCH_PATHS = ( | ||||
"$(inherited)", | "$(inherited)", | ||||
"$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/HTBodyfat_SDK", | "$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/HTBodyfat_SDK", | ||||
"$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/BhBodyComposition120", | "$(PROJECT_DIR)/AILinkBleSDKDemo/DeviceDemo/13_EightScale/BhBodyComposition120", | ||||
); | ); | ||||
MARKETING_VERSION = 1.10.0; | |||||
MARKETING_VERSION = 1.11.0; | |||||
OTHER_LDFLAGS = "-ObjC"; | OTHER_LDFLAGS = "-ObjC"; | ||||
PRODUCT_BUNDLE_IDENTIFIER = com.ellinkthings.ailinksdk.app; | PRODUCT_BUNDLE_IDENTIFIER = com.ellinkthings.ailinksdk.app; | ||||
PRODUCT_NAME = "$(TARGET_NAME)"; | PRODUCT_NAME = "$(TARGET_NAME)"; |
#define AILinkBleSDK_Version_h | #define AILinkBleSDK_Version_h | ||||
//版本号 SDK Version | //版本号 SDK Version | ||||
#define AiLinkBleSDKVersion @"1.10.0" // 20240910 | |||||
#define AiLinkBleSDKVersion @"1.11.0" // 20250305 | |||||
#endif /* AILinkBleSDK_Version_h */ | #endif /* AILinkBleSDK_Version_h */ |
#pragma mark - connect | #pragma mark - connect | ||||
@interface ELAILinkBleManager (connect) | @interface ELAILinkBleManager (connect) | ||||
//- (void)connectPeripheral:(CBPeripheral *)peripheral; | |||||
- (void)disconnectPeripheral; | - (void)disconnectPeripheral; | ||||
- (void)connectAILinkPeripheral:(ELAILinkPeripheral * _Nonnull)ailinkPeripheral; | - (void)connectAILinkPeripheral:(ELAILinkPeripheral * _Nonnull)ailinkPeripheral; | ||||
/// base method of 'sendA7Payload' & 'sendA6Payload' | /// base method of 'sendA7Payload' & 'sendA6Payload' | ||||
- (void)sendCmd:(NSData *)cmdData; | - (void)sendCmd:(NSData *)cmdData; | ||||
//直接发送 | |||||
- (void)sendDirectCmd:(NSData *)cmdData; | |||||
//最大发送数据长度 | //最大发送数据长度 | ||||
- (NSUInteger)maximumWriteValueLength; | |||||
- (NSUInteger)maximumWriteValueLength DEPRECATED_MSG_ATTRIBUTE("use 'maximumWriteValueLengthForWriteWithResponse' or 'maximumWriteValueLengthForWriteWithoutResponse' instead"); | |||||
//最大发送A7 payload长度 | //最大发送A7 payload长度 | ||||
- (NSUInteger)maximumWriteA7PayloadLength; | |||||
- (NSUInteger)maximumWriteA7PayloadLength DEPRECATED_MSG_ATTRIBUTE("use 'maximumWriteValueLengthForWriteWithResponse' or 'maximumWriteValueLengthForWriteWithoutResponse' instead"); | |||||
//最大发送A6 payload长度 | //最大发送A6 payload长度 | ||||
- (NSUInteger)maximumWriteA6PayloadLength; | |||||
- (NSUInteger)maximumWriteA6PayloadLength DEPRECATED_MSG_ATTRIBUTE("use 'maximumWriteValueLengthForWriteWithResponse' or 'maximumWriteValueLengthForWriteWithoutResponse' instead"); | |||||
//可发送的最大字节数 | |||||
@property(nonatomic, assign, readonly) NSUInteger maximumWriteValueLengthForWriteWithResponse; | |||||
//可发送的最大字节数 | |||||
@property(nonatomic, assign, readonly) NSUInteger maximumWriteValueLengthForWriteWithoutResponse; | |||||
//发送队列发送周期 | //发送队列发送周期 | ||||
- (void)configWriteDataQueueInterval:(CGFloat)interval; | - (void)configWriteDataQueueInterval:(CGFloat)interval; | ||||
- (void)configWriteCharacteristicWriteType:(CBCharacteristicWriteType)type; | |||||
@end | @end | ||||
#pragma mark - Open | #pragma mark - Open |
@param type Equipment type(设备类型) | @param type Equipment type(设备类型) | ||||
*/ | */ | ||||
-(void)sendCmdToMCUWithA7PayloadData:(NSData *)data deviceType:(ELSupportDeviceType)type; | -(void)sendCmdToMCUWithA7PayloadData:(NSData *)data deviceType:(ELSupportDeviceType)type; | ||||
- (void)sendCmdToMCUWithA7PayloadDataNew:(NSData *)data deviceType:(ELSupportDeviceType)type; | |||||
/// 直接发送A7命令,不加载在队列中 | /// 直接发送A7命令,不加载在队列中 | ||||
-(void)immediatelySendCmdToMCUWithA7PayloadData:(NSData *)data deviceType:(ELSupportDeviceType)type; | -(void)immediatelySendCmdToMCUWithA7PayloadData:(NSData *)data deviceType:(ELSupportDeviceType)type; | ||||
*/ | */ | ||||
-(void)sendData:(NSData *)data; | -(void)sendData:(NSData *)data; | ||||
//恢复出厂设置 | |||||
- (void)setFactoryDataReset; | |||||
#pragma mark ============ Please rewrite the following methods in the subclass(请在子类重写以下方法) BEGIN============== | #pragma mark ============ Please rewrite the following methods in the subclass(请在子类重写以下方法) BEGIN============== | ||||
ELBodyFatScaleBleDataType_ReceivedDataResult = 0xFE , | ELBodyFatScaleBleDataType_ReceivedDataResult = 0xFE , | ||||
/** 设备上发错误码 */ | /** 设备上发错误码 */ | ||||
ELBodyFatScaleBleDataType_MCUBackErrorCode = 0xFF , | ELBodyFatScaleBleDataType_MCUBackErrorCode = 0xFF , | ||||
/** APP请求支持的显示项 */ | |||||
ELBodyFatScaleBleDataType_MCUBackSupportDataList = 0x11 , | |||||
/** 6.1.11APP下发显示项和顺序 */ | |||||
ELBodyFatScaleBleDataType_DeliverDisplayItemsTheirSequence = 0x10 , | |||||
}; | }; | ||||
* @param mode : 0:体脂模式(默认),1:体重模式(没有阻抗和体脂数据) | * @param mode : 0:体脂模式(默认),1:体重模式(没有阻抗和体脂数据) | ||||
*/ | */ | ||||
- (void)bodyFatScaleManagerCallBackReportingMode:(NSInteger)mode; | - (void)bodyFatScaleManagerCallBackReportingMode:(NSInteger)mode; | ||||
/** MCU 返回支持数据类型列表 | |||||
*/ | |||||
- (void)bodyFatScaleManagerCallBackSupportDataList:(NSMutableArray*)dataList; | |||||
/** MCU 返回显示项和顺序 | |||||
*/ | |||||
- (void)bodyFatScaleManagerCallBackDisplayItemOrder:(NSMutableArray*)dataList; | |||||
@end | @end | ||||
- (void)sendCurrentUserToBle:(ELBodyFatScaleBleUserModel *)usr; | - (void)sendCurrentUserToBle:(ELBodyFatScaleBleUserModel *)usr; | ||||
-(void)sendReceivedDataResult:(BOOL)result; | -(void)sendReceivedDataResult:(BOOL)result; | ||||
//APP请求支持的显示项(0x0076) | |||||
- (void)get0x0076SupportDataTypeList; | |||||
//APP下发显示项和顺序(0x10) | |||||
- (void)readDeliverDisplayItemsTheirSequence; | |||||
- (void)sendDeliverDisplayItemsTheirSequence:(NSMutableArray*)dataList; | |||||
#pragma mark ============ 下发A6指令 ============== | #pragma mark ============ 下发A6指令 ============== | ||||
-(void)sendOfflineUserListToBle:(NSArray <ELBodyFatScaleBleUserModel *> *)userListArr; | -(void)sendOfflineUserListToBle:(NSArray <ELBodyFatScaleBleUserModel *> *)userListArr; |
CM02_BleDataType_ControlVersion = 0x10 , | CM02_BleDataType_ControlVersion = 0x10 , | ||||
/** 查询仪表固件版本 */ | /** 查询仪表固件版本 */ | ||||
CM02_BleDataType_DashboardVersion = 0x11 , | CM02_BleDataType_DashboardVersion = 0x11 , | ||||
/** 天气信息 */ | |||||
CM02_BleDataType_WeatherPush = 0x13 , | |||||
/** 导航数据 */ | |||||
CM02_BleDataType_NaviData = 0x14 , | |||||
/** 当前时区*/ | |||||
CM02_BleDataType_CurrentTimeZone = 0x15 , | |||||
/** 开始仪表OTA指令 */ | /** 开始仪表OTA指令 */ | ||||
CM02_BleDataType_StartOTA = 0xA0 , | CM02_BleDataType_StartOTA = 0xA0 , | ||||
/** 开锁相关的功能枚举定义 */ | /** 开锁相关的功能枚举定义 */ | ||||
typedef NS_ENUM(NSInteger, CM02_LockState_Type) { | typedef NS_ENUM(NSInteger, CM02_LockState_Type) { | ||||
/** 解锁 */ | /** 解锁 */ | ||||
CM02_LockState_Type_UnLock = 0 , | |||||
CM02_LockState_Type_UnLock = 0 , | |||||
/** 上锁 */ | /** 上锁 */ | ||||
CM02_LockState_Type_Lock = 1 , | |||||
CM02_LockState_Type_Lock = 1 , | |||||
/** 验证密码 */ | /** 验证密码 */ | ||||
CM02_LockState_Type_VerifyPassword = 2 , | |||||
CM02_LockState_Type_VerifyPassword = 2 , | |||||
/** 查询仪表开锁验证密码功能状态 */ | |||||
CM02_LockState_Type_Query_VerifyPassword_Status = 3 , | |||||
/** 打开仪表开锁验证密码功能(需要携带密码) */ | |||||
CM02_LockState_Type_VerifyPassword_On = 4 , | |||||
/** 关闭仪表开锁验证密码功能(需要携带密码) */ | |||||
CM02_LockState_Type_VerifyPassword_Off = 5 , | |||||
}; | }; | ||||
/** 结果枚举定义 */ | /** 结果枚举定义 */ | ||||
CM02_DeviceType_BlePassThrough = 1 , | CM02_DeviceType_BlePassThrough = 1 , | ||||
}; | }; | ||||
/** 导航状态 */ | |||||
typedef NS_ENUM(NSInteger, ElectricScooter_NavigationState) { | |||||
/** 关闭导航 */ | |||||
ElectricScooter_NavigationState_Off = 0 , | |||||
/** 开启导航 */ | |||||
ElectricScooter_NavigationState_On , | |||||
/** 更新导航数据 */ | |||||
ElectricScooter_NavigationState_UpdateData , | |||||
}; | |||||
/** 导航方向代码 */ | |||||
typedef NS_ENUM(NSInteger, ElectricScooter_NavigationPushCode) { | |||||
/** 直行 */ | |||||
ElectricScooter_NavigationPushCode_Straight = 0 , | |||||
/** 左转 */ | |||||
ElectricScooter_NavigationPushCode_TurnLeft , | |||||
/** 右转 */ | |||||
ElectricScooter_NavigationPushCode_TurnRight , | |||||
/** 左转掉头 */ | |||||
ElectricScooter_NavigationPushCode_TurnRoundLeft , | |||||
/** 右转掉头 */ | |||||
ElectricScooter_NavigationPushCode_TurnRoundRight , | |||||
}; | |||||
#endif /* ELCM02_BleHeader_h */ | #endif /* ELCM02_BleHeader_h */ |
/** CM02回复仪表编号,硬件版本和软件版本号 */ | /** CM02回复仪表编号,硬件版本和软件版本号 */ | ||||
- (void)CM02ManagerBackDashboardCode:(NSString *)code hardwareVersion:(NSString *)hardwareVersion softwareVersion:(NSString *)softwareVersion; | - (void)CM02ManagerBackDashboardCode:(NSString *)code hardwareVersion:(NSString *)hardwareVersion softwareVersion:(NSString *)softwareVersion; | ||||
#pragma mark - 仪表OTA | |||||
#pragma mark - 仪表OTA | |||||
/** 返回ota是否可以升级和可以接收的最大长度 */ | /** 返回ota是否可以升级和可以接收的最大长度 */ | ||||
- (void)CM02ManagerBackCanOTA:(BOOL)can maxLength:(int)length; | - (void)CM02ManagerBackCanOTA:(BOOL)can maxLength:(int)length; | ||||
/** 返回ota升级结果 */ | /** 返回ota升级结果 */ | ||||
- (void)CM02ManagerBackOTAUpdateResult:(BOOL)result; | - (void)CM02ManagerBackOTAUpdateResult:(BOOL)result; | ||||
#pragma mark - | |||||
#pragma mark - | |||||
@end | @end | ||||
@interface ELCM02_BleManager : ELBluetoothManager | @interface ELCM02_BleManager : ELBluetoothManager | ||||
@property (nonatomic, weak) id<CM02_BleDelegate> CM02Delegate; | @property (nonatomic, weak) id<CM02_BleDelegate> CM02Delegate; | ||||
@property (nonatomic, assign) ELSupportDeviceType deviceType; | |||||
+ (ELCM02_BleManager *)shareManager; | + (ELCM02_BleManager *)shareManager; | ||||
///** 查询接收端类型及支持的功能 */ | ///** 查询接收端类型及支持的功能 */ | ||||
/** 修改密码 */ | /** 修改密码 */ | ||||
- (void)updatePasswordWithOldPassword:(NSString *)oldPassword newPassword:(NSString *)newPassword; | - (void)updatePasswordWithOldPassword:(NSString *)oldPassword newPassword:(NSString *)newPassword; | ||||
/** 解锁或者锁车(锁车无需传密码) */ | |||||
/** 解锁或者锁车(锁车无需传密码) 、查询仪表开锁验证密码功能状态、打开/关闭仪表开锁验证密码功能(需要携带密码)*/ | |||||
- (void)setLockState:(enum CM02_LockState_Type)lock password:(NSString *)password; | - (void)setLockState:(enum CM02_LockState_Type)lock password:(NSString *)password; | ||||
//查询仪表开锁验证密码功能状态 | |||||
- (void)requestUnlockPasswordState; | |||||
//打开仪表开锁验证密码功能(需要携带密码) | |||||
- (void)setUnlockPasswordOn:(NSString *)password; | |||||
//关闭仪表开锁验证密码功能(需要携带密码) | |||||
- (void)setUnlockPasswordOff:(NSString *)password; | |||||
/** 查询售后密码 */ | /** 查询售后密码 */ | ||||
- (void)getAfterSalesPassword; | - (void)getAfterSalesPassword; | ||||
/** 查询仪表盘固件版本 */ | /** 查询仪表盘固件版本 */ | ||||
- (void)getDashboardVersion; | - (void)getDashboardVersion; | ||||
#pragma mark - 仪表OTA | |||||
/** 导航推送 | |||||
* @param state : 更新导航数据 、开启导航、关闭导航 | |||||
* @param code : 导航方向代码 | |||||
* @param segmentRemainDistance : 当前方向剩余路程 m | |||||
* @param routeRemainDistance : 总剩余路程 m | |||||
*/ | |||||
- (void)setNavigationPushWithState:(enum ElectricScooter_NavigationState)state code:(enum ElectricScooter_NavigationPushCode)code segmentRemainDistance:(NSInteger)segmentRemainDistance routeRemainDistance:(NSInteger)routeRemainDistance; | |||||
/// 当前时区 | |||||
/// @param positive YES:东时区,NO:西时区 | |||||
/// @param value 时区,范围0-12 | |||||
- (void)setCurrentTimeZoneWithPositive:(BOOL)positive value:(NSUInteger)value; | |||||
#pragma mark - 仪表OTA | |||||
/** 发送OTA开始指令 | /** 发送OTA开始指令 | ||||
* @param size : ota文件长度 | * @param size : ota文件长度 | ||||
/** 发送OTA完成指令 */ | /** 发送OTA完成指令 */ | ||||
- (void)sendEndOTACommand; | - (void)sendEndOTACommand; | ||||
#pragma mark - 断开设备清除缓存信息 | |||||
#pragma mark - 断开设备清除缓存信息 | |||||
- (void)cleanData; | - (void)cleanData; | ||||
ELSupportDeviceTypeAIFitScale = 0x005E, //好身材体脂秤(蓝牙连接) | ELSupportDeviceTypeAIFitScale = 0x005E, //好身材体脂秤(蓝牙连接) | ||||
ELSupportDeviceTypeBodyCompositionAnalyzer = 0x0065, //人体成份分析仪(蓝牙连接) | |||||
ELSupportDeviceTypeHMIBodyFatScale = 0x0076, //HMI体脂秤 CID:0x0076(118) | |||||
ELSupportDeviceTypeBroadcastScale = (0xffff +0x01) , //655536 Broadcast body fat scale(AILink广播体脂秤) | ELSupportDeviceTypeBroadcastScale = (0xffff +0x01) , //655536 Broadcast body fat scale(AILink广播体脂秤) | ||||
ELSupportDeviceTypeBroadcastHeightGauge = (0xffff + 0x03) , //65538 广播身高仪 | ELSupportDeviceTypeBroadcastHeightGauge = (0xffff + 0x03) , //65538 广播身高仪 | ||||
ELSupportDeviceTypeBroadcastScale_Lingyang = (0xffff +0x16) , //65557 凌阳广播体脂秤 | ELSupportDeviceTypeBroadcastScale_Lingyang = (0xffff +0x16) , //65557 凌阳广播体脂秤 | ||||
ELSupportDeviceTypeBroadcastScale_T6 = (0xffff + 0x09) , //65544 T6广播体脂秤 | ELSupportDeviceTypeBroadcastScale_T6 = (0xffff + 0x09) , //65544 T6广播体脂秤 | ||||
ELSupportDeviceType_dualFrequencyEightelectrodeMCUAlgorithm = 0x0068, //双频八电极MCU算法秤 | ELSupportDeviceType_dualFrequencyEightelectrodeMCUAlgorithm = 0x0068, //双频八电极MCU算法秤 | ||||
ELSupportDeviceTypeElectricScooter_CM01TouchScreen = 0x0025, // 电动滑板车(邦凯定制)-CM01触摸屏 | |||||
ELSupportDeviceTypeElectricScooter_4G = 0x0046, //电动滑板车(4G) | |||||
}; | }; | ||||
#endif /* ELExSupportDeviceType_h */ | #endif /* ELExSupportDeviceType_h */ |
@class ELHeightBodyFatScaleBleWeightBodyModel; | @class ELHeightBodyFatScaleBleWeightBodyModel; | ||||
@class ELPeripheralModel; | @class ELPeripheralModel; | ||||
@class ELEightScaleBleDataModel; | |||||
@protocol ELHeightBodyFatScaleBleDelegate <NSObject> | @protocol ELHeightBodyFatScaleBleDelegate <NSObject> | ||||
/** MCU回复单位设置结果 */ | /** MCU回复单位设置结果 */ | ||||
- (void)heightBodyFatScaleManagerReportUnitResult:(HeightBodyFatScale_SetupResult)result; | - (void)heightBodyFatScaleManagerReportUnitResult:(HeightBodyFatScale_SetupResult)result; | ||||
/** 人体成份分析仪 MCU回复单位设置结果 */ | |||||
- (void)heightBodyFatScaleManagerReportHeightUnit:(ELDeviceHeightUnit)heightUnit weightUnit:(ELDeviceWeightUnit)weightUnit; | |||||
/** MCU回复工作模式设置结果 */ | /** MCU回复工作模式设置结果 */ | ||||
- (void)heightBodyFatScaleManagerWorkModeResult:(HeightBodyFatScale_SetupResult)result; | - (void)heightBodyFatScaleManagerWorkModeResult:(HeightBodyFatScale_SetupResult)result; | ||||
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit videoState:(BOOL)video DEPRECATED_MSG_ATTRIBUTE("use 'voiceState' instead"); | - (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit videoState:(BOOL)video DEPRECATED_MSG_ATTRIBUTE("use 'voiceState' instead"); | ||||
- (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit voiceState:(BOOL)voice; | - (void)heightBodyFatScaleManagerReportDevStateWithWorkMode:(HeightBodyFatScale_WorkModeType)mode power:(NSInteger)power charging:(BOOL)charging weightUnit:(ELDeviceWeightUnit)weightUnit height:(ELDeviceHeightUnit)heightUnit voiceState:(BOOL)voice; | ||||
/** MCU回复设备支持模式 */ | |||||
- (void)heightBodyFatScaleManagerReportDevModeArray:(NSArray *)modeArray; | |||||
#pragma mark - 身高体脂秤模式 | #pragma mark - 身高体脂秤模式 | ||||
/** MCU上报称重状态 */ | /** MCU上报称重状态 */ | ||||
/** MCU上报身高数据 */ | /** MCU上报身高数据 */ | ||||
- (void)heightBodyFatScaleManagerReportHeightDataWithHeight:(NSInteger)height unit:(ELDeviceHeightUnit)unit point:(NSInteger)point; | - (void)heightBodyFatScaleManagerReportHeightDataWithHeight:(NSInteger)height unit:(ELDeviceHeightUnit)unit point:(NSInteger)point; | ||||
/** MCU上报体脂数据 */ | /** MCU上报体脂数据 */ | ||||
- (void)heightBodyFatScaleManagerReportBodyFatDataWithDataModel:(ELHeightBodyFatScaleBleWeightBodyModel *)model; | - (void)heightBodyFatScaleManagerReportBodyFatDataWithDataModel:(ELHeightBodyFatScaleBleWeightBodyModel *)model; | ||||
/** // 人体成份分析仪 MCU上报阻抗数据 | |||||
*/ | |||||
- (void)heightBodyFatScaleManagerReportAdcDataWithImpedanceState:(HeightBodyFatScale_AdcStateType)state bleDataModelWith:(ELEightScaleBleDataModel *)bleDataModel UseAppAlgorithm:(BOOL)useAppAlgorithm; | |||||
///// 人体成份分析仪 MCU请求补全体脂数据 | |||||
- (void)heightBodyFatScaleManagerCompletionBodyFatDataWith:(ELEightScaleBleDataModel *)bleDataModel; | |||||
#pragma mark - 抱婴模式 | #pragma mark - 抱婴模式 | ||||
/** MCU上报称重状态 | /** MCU上报称重状态 |
@property (nonatomic, assign) NSUInteger obesityGrade; | @property (nonatomic, assign) NSUInteger obesityGrade; | ||||
//以下10个数据的单位以单位和小数点以weight的为准 | |||||
//体脂-右上 | |||||
@property (nonatomic, assign) NSUInteger fatMassRightTop; | |||||
//体脂-右下 | |||||
@property (nonatomic, assign) NSUInteger fatMassRightBottom; | |||||
//体脂-左上 | |||||
@property (nonatomic, assign) NSUInteger fatMassLeftTop; | |||||
//体脂-左下 | |||||
@property (nonatomic, assign) NSUInteger fatMassLeftBottom; | |||||
//体脂-躯干 | |||||
@property (nonatomic, assign) NSUInteger fatMassBody; | |||||
//肌肉-右上 | |||||
@property (nonatomic, assign) NSUInteger musleMassRightTop; | |||||
//肌肉-右下 | |||||
@property (nonatomic, assign) NSUInteger musleMassRightBottom; | |||||
//肌肉-左上 | |||||
@property (nonatomic, assign) NSUInteger musleMassLeftTop; | |||||
//肌肉-左下 | |||||
@property (nonatomic, assign) NSUInteger musleMassLeftBottom; | |||||
//肌肉-躯干 | |||||
@property (nonatomic, assign) NSUInteger musleMassBody; | |||||
@end | @end | ||||
NS_ASSUME_NONNULL_END | NS_ASSUME_NONNULL_END | ||||
ThermometerBleDataType_GetRecordData = 0x03 , | ThermometerBleDataType_GetRecordData = 0x03 , | ||||
/// 6.2.3返回历史数据 | /// 6.2.3返回历史数据 | ||||
ThermometerBleDataType_BackRecordData = 0x04 , | ThermometerBleDataType_BackRecordData = 0x04 , | ||||
/// APP获取历史记录 | |||||
ThermometerBleDataType_RequestHistoryRecord = 0x10, | |||||
/// 返回历史记录 | |||||
ThermometerBleDataType_ReceiveHistoryRecord = 0x11, | |||||
/// 6.2.4获取设备支持功能/返回支持功能 | /// 6.2.4获取设备支持功能/返回支持功能 | ||||
ThermometerBleDataType_SupportFunction = 0x80 , | ThermometerBleDataType_SupportFunction = 0x80 , | ||||
/** The MCU replies to the setting result(MCU回复设置结果) */ | /** The MCU replies to the setting result(MCU回复设置结果) */ | ||||
ThermometerBleDataType_BackSendUnit = 0x82 , | ThermometerBleDataType_BackSendUnit = 0x82 , | ||||
/// 6.2.6获取设备当前单位/返回当前单位 | |||||
ThermometerBleDataType_NowUnit = 0x83 , | |||||
/// App同步unix时间给MCU | |||||
ThermometerBleDataType_AsyncUnixTime = 0x83 , | |||||
/// 6.2.7获取设备测温模式/返回测试模式 | /// 6.2.7获取设备测温模式/返回测试模式 | ||||
ThermometerBleDataType_GetMeasureTemMode = 0x84 , | ThermometerBleDataType_GetMeasureTemMode = 0x84 , | ||||
ThermometerBleMeasureTemMode_Repeatedly = 0x01 , | ThermometerBleMeasureTemMode_Repeatedly = 0x01 , | ||||
}; | }; | ||||
/// 获取历史记录状态定义 | |||||
typedef NS_ENUM(NSInteger, ThermometerBleRequestHistoryRecordStatus) { | |||||
/// 开始获取历史数据 | |||||
ThermometerBleRequestHistoryRecordStatus_Start = 0x00 , | |||||
/// 接收到一帧,请发下一帧 | |||||
ThermometerBleRequestHistoryRecordStatus_Continous = 0x01 , | |||||
/// 数据接收完毕 | |||||
ThermometerBleRequestHistoryRecordStatus_End = 0x02 , | |||||
/// 删除历史记录 | |||||
ThermometerBleRequestHistoryRecordStatus_Delete = 0x03 , | |||||
}; | |||||
/// 体温计蓝牙代理方法 | /// 体温计蓝牙代理方法 | ||||
@protocol ELThermometerBleDelegate <NSObject> | @protocol ELThermometerBleDelegate <NSObject> | ||||
/** App release unit settings(app下发单位设置 )*/ | /** App release unit settings(app下发单位设置 )*/ | ||||
- (void)changeThermometerUnit:(ELDeviceTemperatureUnit)unit; | - (void)changeThermometerUnit:(ELDeviceTemperatureUnit)unit; | ||||
/// 同步unix时间 | |||||
- (void)setUnixTime:(long long)unixTime; | |||||
/// 同步北京时间 | |||||
- (void)setBeijingTimeWithYear:(UInt8)year month:(UInt8)month day:(UInt8)day hour:(UInt8)hour minute:(UInt8)minute second:(UInt8)second weekday:(UInt8)weakday; | |||||
/// 获取设备当前单位 | /// 获取设备当前单位 | ||||
- (void)getNowUnit; | - (void)getNowUnit; | ||||
/// @param model 不需要设置时间字段和dataType | /// @param model 不需要设置时间字段和dataType | ||||
- (void)setHighTemAlarmValue:(ELThermometerBleModel *)model; | - (void)setHighTemAlarmValue:(ELThermometerBleModel *)model; | ||||
/// APP 获取历史记录 | |||||
- (void)getHistoryRecordWithStatus:(ThermometerBleRequestHistoryRecordStatus)status; | |||||
@end | @end | ||||
NS_ASSUME_NONNULL_END | NS_ASSUME_NONNULL_END |
NSString *log = @"开始扫描"; | NSString *log = @"开始扫描"; | ||||
[self addLog:log]; | [self addLog:log]; | ||||
self.urlTexField.text = @"iot.elink.com"; | |||||
self.portTexField.text = @"80"; | |||||
self.pathTexField.text = @""; | |||||
self.urlTexField.text = self.defaultURL;//@"iot.elink.com"; | |||||
self.portTexField.text = self.defaultPort;//@"80"; | |||||
self.pathTexField.text = self.defaultPath;//@""; | |||||
self.dataSource = [NSMutableArray array]; | self.dataSource = [NSMutableArray array]; | ||||
} | } | ||||
#pragma mark - Action | #pragma mark - Action | ||||
- (IBAction)requestWifiNameAction:(id)sender { | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiName]; | |||||
NSString *log = @"获取当前 wifi 名称"; | |||||
[self addLog:log]; | |||||
} | |||||
- (IBAction)requestDeviceStatusAcion:(id)sender { | |||||
//获取蓝牙和WiFi连接状态 | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetConnectState)]; | |||||
NSString *log = [NSString stringWithFormat:@"获取蓝牙和WiFi连接状态"]; | |||||
[self addLog:log]; | |||||
} | |||||
- (IBAction)requestWifiListAction:(id)sender { | - (IBAction)requestWifiListAction:(id)sender { | ||||
[self.dataSource removeAllObjects]; | [self.dataSource removeAllObjects]; | ||||
[self.tableView reloadData]; | [self.tableView reloadData]; | ||||
NSString *port = self.portTexField.text; | NSString *port = self.portTexField.text; | ||||
NSString *path = self.pathTexField.text; | NSString *path = self.pathTexField.text; | ||||
self.defaultURL = url; | |||||
self.defaultPort = port; | |||||
self.defaultPath = path; | |||||
[[ElBloodBleWifiManager shareManager] setDevAccessIpAddress:url portNumber:port.intValue path:path]; | [[ElBloodBleWifiManager shareManager] setDevAccessIpAddress:url portNumber:port.intValue path:path]; | ||||
NSString *log = @"设置 服务器信息"; | NSString *log = @"设置 服务器信息"; | ||||
[self addLog:log]; | [self addLog:log]; | ||||
} | } | ||||
- (IBAction)requestDeviceIdAcion:(id)sender { | |||||
//获取wifi设备的SN号,即设备id | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||||
NSString *log = @"获取 设备ID"; | |||||
[self addLog:log]; | |||||
} | |||||
- (IBAction)switchUintAction:(id)sender { | - (IBAction)switchUintAction:(id)sender { | ||||
static BOOL value = YES; | static BOOL value = YES; | ||||
if (value) { | if (value) { | ||||
[self addLog:log]; | [self addLog:log]; | ||||
} | } | ||||
- (IBAction)restoreFactoryAction:(id)sender { | |||||
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"恢复出厂设置" message:@"确认要恢复出厂设置吗?" preferredStyle:UIAlertControllerStyleAlert]; | |||||
UIAlertAction *conform = [UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { | |||||
NSLog(@"点击了确认按钮"); | |||||
[[ElBloodBleWifiManager shareManager] setFactoryDataReset]; | |||||
NSString *log = @"恢复出厂设置"; | |||||
[self addLog:log]; | |||||
}]; | |||||
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { | |||||
NSLog(@"点击了取消按钮"); | |||||
}]; | |||||
[alert addAction:conform]; | |||||
[alert addAction:cancel]; | |||||
[self presentViewController:alert animated:YES completion:nil]; | |||||
} | |||||
- (IBAction)clearAction:(id)sender { | - (IBAction)clearAction:(id)sender { | ||||
self.logTextView.text = @""; | self.logTextView.text = @""; | ||||
} | } | ||||
- (IBAction)shareLogAction:(id)sender { | - (IBAction)shareLogAction:(id)sender { | ||||
} | } | ||||
#pragma mark - | |||||
- (NSString *)defaultURL { | |||||
return [[NSUserDefaults standardUserDefaults] stringForKey:@"defaultURL"]; | |||||
} | |||||
- (void)setDefaultURL:(NSString *)defautlURL { | |||||
[[NSUserDefaults standardUserDefaults] setObject:defautlURL forKey:@"defaultURL"]; | |||||
[[NSUserDefaults standardUserDefaults] synchronize]; | |||||
} | |||||
- (NSString *)defaultPort { | |||||
return [[NSUserDefaults standardUserDefaults] stringForKey:@"defaultPort"]; | |||||
} | |||||
- (void)setDefaultPort:(NSString *)defaultPort { | |||||
[[NSUserDefaults standardUserDefaults] setObject:defaultPort forKey:@"defaultPort"]; | |||||
[[NSUserDefaults standardUserDefaults] synchronize]; | |||||
} | |||||
- (NSString *)defaultPath { | |||||
return [[NSUserDefaults standardUserDefaults] stringForKey:@"defaultPath"]; | |||||
} | |||||
- (void)setDefaultPath:(NSString *)defaultPath { | |||||
[[NSUserDefaults standardUserDefaults] setObject:defaultPath forKey:@"defaultPath"]; | |||||
[[NSUserDefaults standardUserDefaults] synchronize]; | |||||
} | |||||
#pragma mark - textField Delegate | #pragma mark - textField Delegate | ||||
- (void)textFieldDidEndEditing:(UITextField *)textField { | - (void)textFieldDidEndEditing:(UITextField *)textField { | ||||
// NSString *log = @"正在连接..."; | // NSString *log = @"正在连接..."; | ||||
// [self addLog:log]; | // [self addLog:log]; | ||||
} else if (state == ELBluetoothStateDidValidationPass) { | } else if (state == ELBluetoothStateDidValidationPass) { | ||||
self.bleStatusLabel.text = @"连接成功"; | |||||
NSString *log = @"连接成功"; | |||||
self.bleStatusLabel.text = [@"连接成功 " stringByAppendingString:self.per.macAddressString]; | |||||
NSString *log = [@"连接成功 " stringByAppendingString:self.per.macAddressString]; | |||||
[self addLog:log]; | [self addLog:log]; | ||||
// //获取蓝牙和WiFi连接状态 | |||||
// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:(ELInetGetCmdTypeGetConnectState)]; | |||||
// log = [NSString stringWithFormat:@"获取蓝牙和WiFi连接状态"]; | |||||
// [self addLog:log]; | |||||
} else if (state == ELBluetoothStateDidDisconnect) { | } else if (state == ELBluetoothStateDidDisconnect) { | ||||
self.bleStatusLabel.text = @"连接已断开"; | self.bleStatusLabel.text = @"连接已断开"; | ||||
NSString *log = @"连接已断开"; | NSString *log = @"连接已断开"; | ||||
[[ElBloodBleWifiManager shareManager] bleWifiSetupWifiConnect:YES]; | [[ElBloodBleWifiManager shareManager] bleWifiSetupWifiConnect:YES]; | ||||
} else if (type == ELInetSetCmdTypeBleWifiSetConnectWifi){ | } else if (type == ELInetSetCmdTypeBleWifiSetConnectWifi){ | ||||
//获取连接状态,更新Wi-Fi列表 | //获取连接状态,更新Wi-Fi列表 | ||||
[self.dataSource removeAllObjects]; | |||||
[self.tableView reloadData]; | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | |||||
// [self.dataSource removeAllObjects]; | |||||
// [self.tableView reloadData]; | |||||
// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | |||||
} | } | ||||
} else { | } else { | ||||
//TODO:Wifi配置过程中失败的情况自行处理 | //TODO:Wifi配置过程中失败的情况自行处理 | ||||
//失败 | //失败 | ||||
} | } | ||||
NSString *log = [NSString stringWithFormat:@"bleWifiReceiveWifiSNCode :%@", @(code)]; | |||||
NSString *log = [NSString stringWithFormat:@"会话码(deviceId): %@", @(code)]; | |||||
[self addLog:log]; | [self addLog:log]; | ||||
} | } | ||||
/** 返回wifi名称 */ | /** 返回wifi名称 */ | ||||
- (void)bleWifiName:(NSString *)wifiName { | - (void)bleWifiName:(NSString *)wifiName { | ||||
NSLog(@"## bleWifiName() wifiName:%@", wifiName); | |||||
NSLog(@"## bleWifiName() wifi名称: %@", wifiName); | |||||
NSString *log = [NSString stringWithFormat:@"bleWifiName:%@", wifiName]; | |||||
NSString *log = [NSString stringWithFormat:@"wifi名称: %@", wifiName]; | |||||
[self addLog:log]; | [self addLog:log]; | ||||
} | } | ||||
- (void)bluetoothManagerReceiveMCUConnectedState:(struct ELMCUStateStruct)stateStrct { | |||||
NSLog(@"## bluetoothManagerReceiveMCUConnectedState"); | |||||
BleWiFiConnectState wifiState = stateStrct.wifiState; | |||||
//请求会话码 | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||||
//MARK:1.WiFi配置提示用户配网 | |||||
//TODO:注意:wifi配置过程必须保持蓝牙与设备的连接 | |||||
if (wifiState == BleWiFiConnectStateNoWiFi) { | |||||
//1.如果没有配网,则提示用户去配网 | |||||
//MARK:2.WiFi配置先获取wifi列表 | |||||
[self.dataSource removeAllObjects]; | |||||
[self.tableView reloadData]; | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | |||||
NSString *log = @"获取附近 wifi 列表"; | |||||
[self addLog:log]; | |||||
} else if (wifiState == BleWiFiConnectStateSuccess) { | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiName]; | |||||
NSString *log = @"获取当前 wifi 名称"; | |||||
[self addLog:log]; | |||||
} else { | |||||
// //MARK:2.没网也可以获取Wi-Fi列表,如果需要更新Wi-Fi的话 | |||||
//- (void)bluetoothManagerReceiveMCUConnectedState:(struct ELMCUStateStruct)stateStrct { | |||||
// NSLog(@"## bluetoothManagerReceiveMCUConnectedState"); | |||||
// BleWiFiConnectState wifiState = stateStrct.wifiState; | |||||
// | |||||
//// //请求会话码 | |||||
//// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||||
// //MARK:1.WiFi配置提示用户配网 | |||||
// //TODO:注意:wifi配置过程必须保持蓝牙与设备的连接 | |||||
// if (wifiState == BleWiFiConnectStateNoWiFi) { | |||||
// //1.如果没有配网,则提示用户去配网 | |||||
// //MARK:2.WiFi配置先获取wifi列表 | |||||
// [self.dataSource removeAllObjects]; | // [self.dataSource removeAllObjects]; | ||||
// [self.tableView reloadData]; | // [self.tableView reloadData]; | ||||
// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | // [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | ||||
// NSString *log = @"获取附近 wifi 列表"; | |||||
// [self addLog:log]; | |||||
// } else if (wifiState == BleWiFiConnectStateSuccess) { | |||||
// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiName]; | |||||
// | |||||
// NSString *log = @"获取当前 wifi 名称"; | |||||
// [self addLog:log]; | |||||
// } else { | |||||
//// //MARK:2.没网也可以获取Wi-Fi列表,如果需要更新Wi-Fi的话 | |||||
//// [self.dataSource removeAllObjects]; | |||||
//// [self.tableView reloadData]; | |||||
//// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetNearbyWifi]; | |||||
// } | |||||
// | |||||
// ///MARK:9.wifi配置结果 | |||||
// //wifi相关的其他指令和数据接收,请查看ELBluetoothManager.h文件 | |||||
// if (stateStrct.wifiState == BleWiFiConnectStateSuccess) { | |||||
// //成功 | |||||
// //MARK:10.获取wifi设备的SN号,即设备id | |||||
// [[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||||
// } | |||||
//} | |||||
-(void)bluetoothManagerReceiveWMState:(ELWMStateStruct)stateStrct { | |||||
NSString *bleString = @"0_无连接"; | |||||
if (stateStrct.bleState == WMBleStateConnected) { | |||||
bleString = @"1_已连接"; | |||||
} else if (stateStrct.bleState == WMBleStatePaired) { | |||||
bleString = @"2_配对完成"; | |||||
} | } | ||||
///MARK:9.wifi配置结果 | |||||
//wifi相关的其他指令和数据接收,请查看ELBluetoothManager.h文件 | |||||
if (stateStrct.wifiState == BleWiFiConnectStateSuccess) { | |||||
//成功 | |||||
//MARK:10.获取wifi设备的SN号,即设备id | |||||
[[ElBloodBleWifiManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeBleWifiGetSNNumber]; | |||||
NSString *wifiString = @"0_未配置AP"; | |||||
if (stateStrct.wifiState == WMWiFiStateConnectAPFail) { | |||||
wifiString = @"1_连接AP失败"; | |||||
} else if (stateStrct.wifiState == WMWiFiStateConnectServerFail) { | |||||
wifiString = @"2_与服务器通讯失败"; | |||||
} else if (stateStrct.wifiState == WMWiFiStateConnectedAP) { | |||||
wifiString = @"3_成功连接上AP"; | |||||
} else if (stateStrct.wifiState == WMWiFiStateConnectingAP) { | |||||
wifiString = @"4_正在连接AP"; | |||||
} | } | ||||
} | |||||
-(void)bluetoothManagerReceiveWMState:(ELWMStateStruct)stateStrct { | |||||
NSLog(@"## bluetoothManagerReceiveMCUConnectedState"); | |||||
} | |||||
-(void)bluetoothManagerReceiveWMStateFailCode:(WMWorkStateFailCode)failCode { | |||||
NSLog(@"## bluetoothManagerReceiveMCUConnectedState"); | |||||
NSString *workString = @"0_唤醒"; | |||||
if (stateStrct.workState == WMWorkStateSleep) { | |||||
workString = @"1_进入休眠"; | |||||
} else if (stateStrct.workState == WMWorkStateReady) { | |||||
workString = @"2_模块准备就绪"; | |||||
} | |||||
NSString *errorString = @"0_未知原因"; | |||||
if (stateStrct.failCode == WMWorkStateFailCodeAPSignalBad) { | |||||
errorString = @"1_AP信号差"; | |||||
} else if (stateStrct.failCode == WMWorkStateFailCodeWrongPassword) { | |||||
errorString = @"2_密码错误"; | |||||
} else if (stateStrct.failCode == WMWorkStateFailCodeNoIP) { | |||||
errorString = @"3_获取不到IP"; | |||||
} else { | |||||
errorString = @""; | |||||
} | |||||
NSLog(@"## bluetoothManagerReceiveMCUConnectedState()模块状态 蓝牙状态: %@, wifi状态: %@, 工作状态: %@ 失败原因: %@", bleString, wifiString, workString, errorString); | |||||
if (errorString.length > 0) { | |||||
NSString *log = [NSString stringWithFormat:@"模块状态 蓝牙状态: %@, wifi状态: %@, 工作状态: %@ 失败原因: %@", bleString, wifiString, workString, errorString]; | |||||
[self addLog:log]; | |||||
} else { | |||||
NSString *log = [NSString stringWithFormat:@"模块状态\n 蓝牙状态: %@,\n wifi状态: %@,\n 工作状态: %@", bleString, wifiString, workString]; | |||||
[self addLog:log]; | |||||
} | |||||
} | } | ||||
//-(void)bluetoothManagerReceiveWMStateFailCode:(WMWorkStateFailCode)failCode { | |||||
// NSLog(@"## bluetoothManagerReceiveMCUConnectedState"); | |||||
// | |||||
//} | |||||
#pragma mark - ELBloodBleWifiManagerDelegate | #pragma mark - ELBloodBleWifiManagerDelegate | ||||
/** | /** |
<?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="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> | |||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="22505" 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 version="4352" identifier="iOS"/> | <deployment version="4352" identifier="iOS"/> | ||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/> | |||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/> | |||||
<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"/> | ||||
<outlet property="delegate" destination="-1" id="dnB-TL-dMo"/> | <outlet property="delegate" destination="-1" id="dnB-TL-dMo"/> | ||||
</connections> | </connections> | ||||
</tableView> | </tableView> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="BzV-lX-bbk"> | |||||
<rect key="frame" x="8" y="317" width="69.666666666666671" height="35"/> | |||||
<state key="normal" title="Button"/> | |||||
<buttonConfiguration key="configuration" style="filled" title="wifi名"/> | |||||
<connections> | |||||
<action selector="requestWifiNameAction:" destination="-1" eventType="touchUpInside" id="Cll-bf-THn"/> | |||||
</connections> | |||||
</button> | |||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mMG-sS-kXc"> | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="mMG-sS-kXc"> | ||||
<rect key="frame" x="229.33333333333334" y="317" width="123.66666666666666" height="35"/> | |||||
<rect key="frame" x="264" y="317" width="89" height="35"/> | |||||
<state key="normal" title="Button"/> | <state key="normal" title="Button"/> | ||||
<buttonConfiguration key="configuration" style="filled" title="获取wifi 列表"/> | |||||
<buttonConfiguration key="configuration" style="filled" title="wifi 列表"/> | |||||
<connections> | <connections> | ||||
<action selector="requestWifiListAction:" destination="-1" eventType="touchUpInside" id="kAf-G6-Pi8"/> | <action selector="requestWifiListAction:" destination="-1" eventType="touchUpInside" id="kAf-G6-Pi8"/> | ||||
</connections> | </connections> | ||||
</button> | </button> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="OWb-s3-hjD"> | |||||
<rect key="frame" x="133.66666666666666" y="317" width="94" height="35"/> | |||||
<state key="normal" title="Button"/> | |||||
<buttonConfiguration key="configuration" style="filled" title="设备状态"/> | |||||
<connections> | |||||
<action selector="requestDeviceStatusAcion:" destination="-1" eventType="touchUpInside" id="2s0-hz-E2t"/> | |||||
</connections> | |||||
</button> | |||||
</subviews> | </subviews> | ||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> | <color key="backgroundColor" systemColor="systemBackgroundColor"/> | ||||
<constraints> | <constraints> | ||||
<constraint firstItem="OWb-s3-hjD" firstAttribute="centerX" secondItem="31J-19-s41" secondAttribute="centerX" id="772-0r-j6p"/> | |||||
<constraint firstAttribute="bottom" secondItem="OWb-s3-hjD" secondAttribute="bottom" constant="8" id="8ZO-0P-ys1"/> | |||||
<constraint firstAttribute="height" constant="360" id="8u9-ew-SWT"/> | <constraint firstAttribute="height" constant="360" id="8u9-ew-SWT"/> | ||||
<constraint firstAttribute="trailing" secondItem="mMG-sS-kXc" secondAttribute="trailing" constant="8" id="DhH-2G-SjA"/> | <constraint firstAttribute="trailing" secondItem="mMG-sS-kXc" secondAttribute="trailing" constant="8" id="DhH-2G-SjA"/> | ||||
<constraint firstItem="BzV-lX-bbk" firstAttribute="leading" secondItem="31J-19-s41" secondAttribute="leading" constant="8" id="Guj-8h-L8n"/> | |||||
<constraint firstAttribute="bottom" secondItem="BzV-lX-bbk" secondAttribute="bottom" constant="8" id="N1Q-aX-RVV"/> | |||||
<constraint firstItem="29h-tk-062" firstAttribute="leading" secondItem="31J-19-s41" secondAttribute="leading" id="RvA-4i-asg"/> | <constraint firstItem="29h-tk-062" firstAttribute="leading" secondItem="31J-19-s41" secondAttribute="leading" id="RvA-4i-asg"/> | ||||
<constraint firstAttribute="bottom" secondItem="29h-tk-062" secondAttribute="bottom" id="fTi-ml-ReU"/> | <constraint firstAttribute="bottom" secondItem="29h-tk-062" secondAttribute="bottom" id="fTi-ml-ReU"/> | ||||
<constraint firstAttribute="bottom" secondItem="mMG-sS-kXc" secondAttribute="bottom" constant="8" id="jRj-dV-3d6"/> | <constraint firstAttribute="bottom" secondItem="mMG-sS-kXc" secondAttribute="bottom" constant="8" id="jRj-dV-3d6"/> | ||||
<textInputTraits key="textInputTraits"/> | <textInputTraits key="textInputTraits"/> | ||||
</textField> | </textField> | ||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Port:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TV8-xg-2Rl"> | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Port:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="TV8-xg-2Rl"> | ||||
<rect key="frame" x="8.0000000000000036" y="69" width="49.333333333333343" height="21"/> | |||||
<rect key="frame" x="8" y="69" width="40.666666666666664" height="21"/> | |||||
<fontDescription key="fontDescription" type="system" pointSize="17"/> | <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||||
<nil key="textColor"/> | <nil key="textColor"/> | ||||
<nil key="highlightedColor"/> | <nil key="highlightedColor"/> | ||||
</label> | </label> | ||||
<textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="yit-et-mIS"> | <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="yit-et-mIS"> | ||||
<rect key="frame" x="65.333333333333343" y="62.666666666666629" width="287.66666666666663" height="34"/> | |||||
<rect key="frame" x="56.666666666666657" y="62.666666666666629" width="296.33333333333337" height="34"/> | |||||
<fontDescription key="fontDescription" type="system" pointSize="14"/> | <fontDescription key="fontDescription" type="system" pointSize="14"/> | ||||
<textInputTraits key="textInputTraits"/> | <textInputTraits key="textInputTraits"/> | ||||
</textField> | </textField> | ||||
<textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="54X-qt-4AG"> | <textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="54X-qt-4AG"> | ||||
<rect key="frame" x="68" y="107.66666666666663" width="285" height="34"/> | |||||
<rect key="frame" x="59.333333333333343" y="107.66666666666663" width="293.66666666666663" height="34"/> | |||||
<fontDescription key="fontDescription" type="system" pointSize="14"/> | <fontDescription key="fontDescription" type="system" pointSize="14"/> | ||||
<textInputTraits key="textInputTraits"/> | <textInputTraits key="textInputTraits"/> | ||||
</textField> | </textField> | ||||
</connections> | </connections> | ||||
</button> | </button> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Hu4-ND-jL9"> | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Hu4-ND-jL9"> | ||||
<rect key="frame" x="294.33333333333331" y="157" width="58.666666666666686" height="35"/> | |||||
<rect key="frame" x="82.666666666666671" y="157" width="58.666666666666671" height="35"/> | |||||
<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="Button"/> | <state key="normal" title="Button"/> | ||||
<buttonConfiguration key="configuration" style="filled" title="读取"/> | <buttonConfiguration key="configuration" style="filled" title="读取"/> | ||||
<action selector="requestServerInfoAcion:" destination="-1" eventType="touchUpInside" id="9sH-7O-oVc"/> | <action selector="requestServerInfoAcion:" destination="-1" eventType="touchUpInside" id="9sH-7O-oVc"/> | ||||
</connections> | </connections> | ||||
</button> | </button> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="IXX-Pw-cTG"> | |||||
<rect key="frame" x="276" y="157" width="77" height="35"/> | |||||
<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="读取ID"/> | |||||
<connections> | |||||
<action selector="requestDeviceIdAcion:" destination="-1" eventType="touchUpInside" id="l23-2p-AIJ"/> | |||||
</connections> | |||||
</button> | |||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Path:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jUZ-AG-RFL"> | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Path:" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jUZ-AG-RFL"> | ||||
<rect key="frame" x="8" y="114" width="52" height="21"/> | |||||
<rect key="frame" x="8" y="114" width="43.333333333333336" height="21"/> | |||||
<fontDescription key="fontDescription" type="system" pointSize="17"/> | <fontDescription key="fontDescription" type="system" pointSize="17"/> | ||||
<nil key="textColor"/> | <nil key="textColor"/> | ||||
<nil key="highlightedColor"/> | <nil key="highlightedColor"/> | ||||
</subviews> | </subviews> | ||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/> | <color key="backgroundColor" systemColor="systemBackgroundColor"/> | ||||
<constraints> | <constraints> | ||||
<constraint firstAttribute="trailing" secondItem="Hu4-ND-jL9" secondAttribute="trailing" constant="8" id="7MZ-xz-dwV"/> | |||||
<constraint firstItem="TV8-xg-2Rl" firstAttribute="top" secondItem="Mec-fH-uxd" secondAttribute="bottom" constant="24" id="Aq2-tv-HYZ"/> | <constraint firstItem="TV8-xg-2Rl" firstAttribute="top" secondItem="Mec-fH-uxd" secondAttribute="bottom" constant="24" id="Aq2-tv-HYZ"/> | ||||
<constraint firstItem="Mec-fH-uxd" firstAttribute="top" secondItem="t03-yu-cqg" secondAttribute="top" constant="24" id="BIV-xf-Hfq"/> | <constraint firstItem="Mec-fH-uxd" firstAttribute="top" secondItem="t03-yu-cqg" secondAttribute="top" constant="24" id="BIV-xf-Hfq"/> | ||||
<constraint firstItem="qEW-eA-90Z" firstAttribute="leading" secondItem="Mec-fH-uxd" secondAttribute="trailing" constant="8" id="Bx8-zO-Nfq"/> | <constraint firstItem="qEW-eA-90Z" firstAttribute="leading" secondItem="Mec-fH-uxd" secondAttribute="trailing" constant="8" id="Bx8-zO-Nfq"/> | ||||
<constraint firstItem="54X-qt-4AG" firstAttribute="centerY" secondItem="jUZ-AG-RFL" secondAttribute="centerY" id="J2t-rF-Qen"/> | <constraint firstItem="54X-qt-4AG" firstAttribute="centerY" secondItem="jUZ-AG-RFL" secondAttribute="centerY" id="J2t-rF-Qen"/> | ||||
<constraint firstItem="yit-et-mIS" firstAttribute="centerY" secondItem="TV8-xg-2Rl" secondAttribute="centerY" id="JZp-UT-ceZ"/> | <constraint firstItem="yit-et-mIS" firstAttribute="centerY" secondItem="TV8-xg-2Rl" secondAttribute="centerY" id="JZp-UT-ceZ"/> | ||||
<constraint firstItem="TV8-xg-2Rl" firstAttribute="leading" secondItem="t03-yu-cqg" secondAttribute="leading" constant="8" id="NMo-nC-T3p"/> | <constraint firstItem="TV8-xg-2Rl" firstAttribute="leading" secondItem="t03-yu-cqg" secondAttribute="leading" constant="8" id="NMo-nC-T3p"/> | ||||
<constraint firstItem="Hu4-ND-jL9" firstAttribute="leading" secondItem="r1G-Pa-LaR" secondAttribute="trailing" constant="16" id="Qra-vo-6dg"/> | |||||
<constraint firstItem="r1G-Pa-LaR" firstAttribute="leading" secondItem="t03-yu-cqg" secondAttribute="leading" constant="8" id="R7K-1y-jZW"/> | <constraint firstItem="r1G-Pa-LaR" firstAttribute="leading" secondItem="t03-yu-cqg" secondAttribute="leading" constant="8" id="R7K-1y-jZW"/> | ||||
<constraint firstAttribute="bottom" secondItem="IXX-Pw-cTG" secondAttribute="bottom" constant="8" id="amO-cP-nt3"/> | |||||
<constraint firstAttribute="trailing" secondItem="yit-et-mIS" secondAttribute="trailing" constant="8" id="bXo-XR-uvU"/> | <constraint firstAttribute="trailing" secondItem="yit-et-mIS" secondAttribute="trailing" constant="8" id="bXo-XR-uvU"/> | ||||
<constraint firstAttribute="trailing" secondItem="qEW-eA-90Z" secondAttribute="trailing" constant="8" id="fTu-II-Jt5"/> | <constraint firstAttribute="trailing" secondItem="qEW-eA-90Z" secondAttribute="trailing" constant="8" id="fTu-II-Jt5"/> | ||||
<constraint firstAttribute="trailing" secondItem="IXX-Pw-cTG" secondAttribute="trailing" constant="8" id="iId-60-XWf"/> | |||||
<constraint firstItem="yit-et-mIS" firstAttribute="leading" secondItem="TV8-xg-2Rl" secondAttribute="trailing" constant="8" id="ou3-vt-M7k"/> | <constraint firstItem="yit-et-mIS" firstAttribute="leading" secondItem="TV8-xg-2Rl" secondAttribute="trailing" constant="8" id="ou3-vt-M7k"/> | ||||
<constraint firstAttribute="height" constant="200" id="uDP-93-x7c"/> | <constraint firstAttribute="height" constant="200" id="uDP-93-x7c"/> | ||||
<constraint firstItem="jUZ-AG-RFL" firstAttribute="top" secondItem="TV8-xg-2Rl" secondAttribute="bottom" constant="24" id="w43-3H-5c6"/> | <constraint firstItem="jUZ-AG-RFL" firstAttribute="top" secondItem="TV8-xg-2Rl" secondAttribute="bottom" constant="24" id="w43-3H-5c6"/> | ||||
<action selector="switchSpeechAtion:" destination="-1" eventType="touchUpInside" id="No5-ou-AYf"/> | <action selector="switchSpeechAtion:" destination="-1" eventType="touchUpInside" id="No5-ou-AYf"/> | ||||
</connections> | </connections> | ||||
</button> | </button> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DgV-dr-yv8"> | |||||
<rect key="frame" x="8" y="59" width="93.333333333333329" height="35"/> | |||||
<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="startMeasureAction:" destination="-1" eventType="touchUpInside" id="7kX-En-EC0"/> | |||||
</connections> | |||||
</button> | |||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Xk8-z8-roi"> | <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Xk8-z8-roi"> | ||||
<rect key="frame" x="109.33333333333334" y="59" width="93.333333333333343" height="35"/> | <rect key="frame" x="109.33333333333334" y="59" width="93.333333333333343" height="35"/> | ||||
<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"/> | ||||
<action selector="stopMeasureAction:" destination="-1" eventType="touchUpInside" id="544-Zk-s6x"/> | <action selector="stopMeasureAction:" destination="-1" eventType="touchUpInside" id="544-Zk-s6x"/> | ||||
</connections> | </connections> | ||||
</button> | </button> | ||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DgV-dr-yv8"> | |||||
<rect key="frame" x="8" y="59" width="93.333333333333329" height="35"/> | |||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="PfS-7r-ESZ"> | |||||
<rect key="frame" x="259" y="65" width="94" height="35"/> | |||||
<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="Button"/> | <state key="normal" title="Button"/> | ||||
<buttonConfiguration key="configuration" style="filled" title="开始测量"/> | |||||
<buttonConfiguration key="configuration" style="filled" title="恢复出厂"/> | |||||
<connections> | <connections> | ||||
<action selector="startMeasureAction:" destination="-1" eventType="touchUpInside" id="7kX-En-EC0"/> | |||||
<action selector="restoreFactoryAction:" destination="-1" eventType="touchUpInside" id="l8W-fz-9Cm"/> | |||||
</connections> | </connections> | ||||
</button> | </button> | ||||
</subviews> | </subviews> | ||||
<constraint firstItem="DgV-dr-yv8" firstAttribute="leading" secondItem="Or7-ND-XyK" secondAttribute="leading" constant="8" id="GJN-8E-Dpd"/> | <constraint firstItem="DgV-dr-yv8" firstAttribute="leading" secondItem="Or7-ND-XyK" secondAttribute="leading" constant="8" id="GJN-8E-Dpd"/> | ||||
<constraint firstAttribute="height" constant="108" id="QS8-L3-8uv"/> | <constraint firstAttribute="height" constant="108" id="QS8-L3-8uv"/> | ||||
<constraint firstItem="DgV-dr-yv8" firstAttribute="top" secondItem="0Vr-iT-QuB" secondAttribute="bottom" constant="16" id="TAP-ER-p9t"/> | <constraint firstItem="DgV-dr-yv8" firstAttribute="top" secondItem="0Vr-iT-QuB" secondAttribute="bottom" constant="16" id="TAP-ER-p9t"/> | ||||
<constraint firstAttribute="trailing" secondItem="PfS-7r-ESZ" secondAttribute="trailing" constant="8" id="WIz-FJ-JJb"/> | |||||
<constraint firstItem="Xk8-z8-roi" firstAttribute="top" secondItem="6Nt-Z0-hPE" secondAttribute="bottom" constant="16" id="WTW-9s-pwH"/> | <constraint firstItem="Xk8-z8-roi" firstAttribute="top" secondItem="6Nt-Z0-hPE" secondAttribute="bottom" constant="16" id="WTW-9s-pwH"/> | ||||
<constraint firstItem="6Nt-Z0-hPE" firstAttribute="top" secondItem="Or7-ND-XyK" secondAttribute="top" constant="8" id="oJ9-I1-mlF"/> | <constraint firstItem="6Nt-Z0-hPE" firstAttribute="top" secondItem="Or7-ND-XyK" secondAttribute="top" constant="8" id="oJ9-I1-mlF"/> | ||||
<constraint firstAttribute="bottom" secondItem="PfS-7r-ESZ" secondAttribute="bottom" constant="8" id="tDC-S8-vEL"/> | |||||
<constraint firstItem="0Vr-iT-QuB" firstAttribute="top" secondItem="Or7-ND-XyK" secondAttribute="top" constant="8" id="zAf-d1-0ZK"/> | <constraint firstItem="0Vr-iT-QuB" firstAttribute="top" secondItem="Or7-ND-XyK" secondAttribute="top" constant="8" id="zAf-d1-0ZK"/> | ||||
</constraints> | </constraints> | ||||
</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"/> |
| 1.9.0 | 20240603 | larry | 修改 增加 Privacy Manifest | | | 1.9.0 | 20240603 | larry | 修改 增加 Privacy Manifest | | ||||
| 1.9.0(Demo v1.9.2) | 20240628 | larry | 修改 增加 温湿度计 Demo | | | 1.9.0(Demo v1.9.2) | 20240628 | larry | 修改 增加 温湿度计 Demo | | ||||
| 1.10.0 | 20240910 | larry | 修改 增加 带屏食物探针盒 多探针盒子 | | | 1.10.0 | 20240910 | larry | 修改 增加 带屏食物探针盒 多探针盒子 | | ||||
| 1.11.0 | 20250305 | larry | WIFI 血压计 Demo 优化;SDK问题修复 | |