| @@ -8,6 +8,8 @@ | |||
| /* Begin PBXBuildFile section */ | |||
| 952D19A1276DE80000ED3A0C /* AILinkBleSDK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 952D19A0276DE80000ED3A0C /* AILinkBleSDK.framework */; }; | |||
| 95565B792786EA3B000265EA /* SkipConnectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 95565B752786EA3B000265EA /* SkipConnectionViewController.m */; }; | |||
| 95565B7A2786EA3B000265EA /* SkipScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 95565B782786EA3B000265EA /* SkipScanViewController.m */; }; | |||
| 95572623276C38CD003BFBAC /* BloodConnectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955725BC276C38CC003BFBAC /* BloodConnectViewController.m */; }; | |||
| 95572624276C38CD003BFBAC /* BloodScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955725BD276C38CC003BFBAC /* BloodScanViewController.m */; }; | |||
| 95572625276C38CD003BFBAC /* AiFreshNutritionScaleScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955725C0276C38CC003BFBAC /* AiFreshNutritionScaleScanViewController.m */; }; | |||
| @@ -94,6 +96,10 @@ | |||
| /* Begin PBXFileReference section */ | |||
| 952D19A0276DE80000ED3A0C /* AILinkBleSDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = AILinkBleSDK.framework; sourceTree = "<group>"; }; | |||
| 95565B752786EA3B000265EA /* SkipConnectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SkipConnectionViewController.m; sourceTree = "<group>"; }; | |||
| 95565B762786EA3B000265EA /* SkipScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkipScanViewController.h; sourceTree = "<group>"; }; | |||
| 95565B772786EA3B000265EA /* SkipConnectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkipConnectionViewController.h; sourceTree = "<group>"; }; | |||
| 95565B782786EA3B000265EA /* SkipScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SkipScanViewController.m; sourceTree = "<group>"; }; | |||
| 955725BB276C38CC003BFBAC /* BloodScanViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BloodScanViewController.h; sourceTree = "<group>"; }; | |||
| 955725BC276C38CC003BFBAC /* BloodConnectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BloodConnectViewController.m; sourceTree = "<group>"; }; | |||
| 955725BD276C38CC003BFBAC /* BloodScanViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BloodScanViewController.m; sourceTree = "<group>"; }; | |||
| @@ -277,6 +283,17 @@ | |||
| name = SDK; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 95565B742786EA3B000265EA /* 24_Skip */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 95565B752786EA3B000265EA /* SkipConnectionViewController.m */, | |||
| 95565B762786EA3B000265EA /* SkipScanViewController.h */, | |||
| 95565B772786EA3B000265EA /* SkipConnectionViewController.h */, | |||
| 95565B782786EA3B000265EA /* SkipScanViewController.m */, | |||
| ); | |||
| path = 24_Skip; | |||
| sourceTree = "<group>"; | |||
| }; | |||
| 955725BA276C38CC003BFBAC /* 05_BloodPressure */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| @@ -651,6 +668,7 @@ | |||
| 955725EF276C38CC003BFBAC /* 21_NutritionScale */, | |||
| 955725BF276C38CC003BFBAC /* 22_AiFreshNutritionScale */, | |||
| 955725F4276C38CD003BFBAC /* 23_FaceMask */, | |||
| 95565B742786EA3B000265EA /* 24_Skip */, | |||
| 958B4E74263C08E700476BAE /* Others */, | |||
| 958B4E67263C08E700476BAE /* Tools */, | |||
| E622E26A243F1CA6003C319D /* Assets.xcassets */, | |||
| @@ -774,6 +792,7 @@ | |||
| buildActionMask = 2147483647; | |||
| files = ( | |||
| 9557264A276C38CD003BFBAC /* ToothbrushConnectionViewController.m in Sources */, | |||
| 95565B7A2786EA3B000265EA /* SkipScanViewController.m in Sources */, | |||
| 9557263B276C38CD003BFBAC /* FaceMaskScanViewController.m in Sources */, | |||
| 9557263F276C38CD003BFBAC /* EightScaleConnectionViewController.m in Sources */, | |||
| 9557262B276C38CD003BFBAC /* WheelMonitorScanViewController.m in Sources */, | |||
| @@ -824,6 +843,7 @@ | |||
| 95572633276C38CD003BFBAC /* BabyScaleConnectViewController.m in Sources */, | |||
| 95572644276C38CD003BFBAC /* BodyFatScaleConnectViewController.m in Sources */, | |||
| 958B4EBD263C08E800476BAE /* AppDelegate.m in Sources */, | |||
| 95565B792786EA3B000265EA /* SkipConnectionViewController.m in Sources */, | |||
| 958B4EAE263C08E800476BAE /* ViewController+MASAdditions.m in Sources */, | |||
| 958B4EA8263C08E800476BAE /* CABasicAnimation+ELAnimation.m in Sources */, | |||
| 9557263D276C38CD003BFBAC /* ThermometerConnectViewController.m in Sources */, | |||
| @@ -0,0 +1,20 @@ | |||
| // | |||
| // FaceMaskConnectionViewController.h | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by LarryZhang on 2021/12/13. | |||
| // Copyright © 2021 IOT. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| @class ELPeripheralModel; | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface SkipConnectionViewController : UIViewController | |||
| @property (nonatomic, strong) ELPeripheralModel *p; | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,181 @@ | |||
| // | |||
| // FaceMaskConnectionViewController.m | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by LarryZhang on 2021/12/13. | |||
| // Copyright © 2021 IOT. All rights reserved. | |||
| // | |||
| #import "SkipConnectionViewController.h" | |||
| #import "Masonry.h" | |||
| #import <AILinkBleSDK/ELSkipBleDataModel.h> | |||
| #import <AILinkBleSDK/ELSkipBleManager.h> | |||
| @interface SkipConnectionViewController () <ELSkipBleDelegate, ELBluetoothManagerDelegate> | |||
| @property(nonatomic, strong) UITextView *textView; | |||
| @property(nonatomic, copy) NSArray<NSNumber *> *units; | |||
| @property(nonatomic, strong) UIButton *connectButton; | |||
| @end | |||
| @implementation SkipConnectionViewController | |||
| - (void)viewDidLoad { | |||
| [super viewDidLoad]; | |||
| // Do any additional setup after loading the view. | |||
| self.view.backgroundColor = [UIColor whiteColor]; | |||
| [ELSkipBleManager shareManager].skipDelegate = self; | |||
| [ELSkipBleManager shareManager].delegate = self; | |||
| [[ELSkipBleManager shareManager] connectPeripheral:self.p]; | |||
| [self setupUIView]; | |||
| } | |||
| - (void)viewWillDisappear:(BOOL)animated { | |||
| [[ELSkipBleManager shareManager] disconnectPeripheral]; | |||
| } | |||
| - (void)addLog:(NSString *)log { | |||
| self.textView.text = [NSString stringWithFormat:@"%@\n\n%@", log, self.textView.text]; | |||
| } | |||
| //- (void)connectDevice { | |||
| // [[ELSkipBleManager shareManager] startScan]; | |||
| //} | |||
| - (void)setupUIView { | |||
| // self.connectButton = [[UIButton alloc] initWithFrame:CGRectMake((self.view.frame.size.width - 100) / 2, 88, 100, 40)]; | |||
| // [self.connectButton setTitle:@"点击重连" forState:UIControlStateNormal]; | |||
| // [self.connectButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; | |||
| // [self.view addSubview:self.connectButton]; | |||
| // [self.connectButton addTarget:self action:@selector(connectDevice) forControlEvents:UIControlEventTouchUpInside]; | |||
| // self.connectButton.hidden = YES; | |||
| self.textView = [[UITextView alloc] init]; | |||
| self.textView.backgroundColor = [UIColor blackColor]; | |||
| self.textView.text = @"Log"; | |||
| self.textView.textColor = [UIColor redColor]; | |||
| [self.view addSubview:self.textView]; | |||
| [self.textView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.left.mas_equalTo(10); | |||
| make.right.mas_equalTo(-10); | |||
| make.bottom.offset(-44); | |||
| // make.height.mas_equalTo(350); | |||
| make.top.offset(80); | |||
| }]; | |||
| } | |||
| #pragma mark - ble Delegate | |||
| //- (void)skipManagerScanDevices:(nonnull NSArray<ELPeripheralModel *> *)scanDevices { | |||
| // //reconnect | |||
| //} | |||
| /// 蓝牙连接状态 | |||
| /// @param state 连接状态 | |||
| - (void)skipManagerUpdateState:(ELBluetoothState)state { | |||
| switch (state) { | |||
| case ELBluetoothStateUnavailable: { | |||
| self.title = @"Please open the bluetooth"; | |||
| } | |||
| break; | |||
| case ELBluetoothStateAvailable: { | |||
| self.title = @"Bluetooth is open"; | |||
| } | |||
| break; | |||
| case ELBluetoothStateScaning: { | |||
| self.title = @"Scanning"; | |||
| } | |||
| break; | |||
| case ELBluetoothStateConnectFail: { | |||
| self.title = @"Connect fail"; | |||
| } | |||
| break; | |||
| case ELBluetoothStateDidDisconnect: { | |||
| self.title = @"Disconnected"; | |||
| self.connectButton.hidden = NO; | |||
| } | |||
| break; | |||
| case ELBluetoothStateDidValidationPass: { | |||
| self.connectButton.hidden = YES; | |||
| self.title = @"Connected"; | |||
| //获取版本号 | |||
| [[ELSkipBleManager shareManager] getBluetoothInfoWithELInetGetCmdType:ELInetGetCmdTypeGetBMVersion]; | |||
| //发送绑定命令(如果设备不支持绑定确认,也可以不发) | |||
| [[ELSkipBleManager shareManager] bindDeviceWithType:Skip_BindDeviceType_KeyBinding]; | |||
| //弹出提示框 | |||
| //[self showPopupView]; | |||
| } | |||
| break; | |||
| case ELBluetoothStateFailedValidation: { | |||
| self.title = @"Illegal equipment"; | |||
| } | |||
| break; | |||
| case ELBluetoothStateWillConnect: | |||
| self.title = @"Connecting"; | |||
| break; | |||
| case ELBluetoothStateUnauthorized: | |||
| self.title = @"BLE Unauthorized"; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| //返回绑定结果 | |||
| - (void)skipManagerResult:(enum Skip_ResultType)result bleHeaderType:(enum Skip_BleHeadType)type { | |||
| if (type == Skip_BleHeadType_BindDevice) { | |||
| if (result == Skip_ResultType_Success) { | |||
| [self addLog:@"绑定成功"]; | |||
| //通过验证,同步设备时间 | |||
| [[ELSkipBleManager shareManager] syncDevTimeStamp:[[NSDate date] timeIntervalSince1970]]; | |||
| dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | |||
| //获取离线历史记录 | |||
| [[ELSkipBleManager shareManager] getOfflineHistory]; | |||
| }); | |||
| } else { | |||
| [self addLog:@"绑定失败"]; | |||
| } | |||
| } | |||
| } | |||
| //返回版本号 | |||
| - (void)bluetoothManagerReceiveBMVersion:(NSString *)bmVersion { | |||
| [self addLog:[NSString stringWithFormat:@"ble version:%@", bmVersion]]; | |||
| } | |||
| - (void)skipManagerRealtimeDataWithState:(enum Skip_ReadyStateType)readyState skipModel:(nonnull ELSkipBleDataModel *)model power:(NSUInteger)power { | |||
| [self addLog:[NSString stringWithFormat:@"skip state:%zd num:%zd",readyState, model.sportNum]]; | |||
| } | |||
| - (void)skipManagerReportOfflineHistoryWithHistoryModelList:(nonnull NSArray<ELSkipHistoryDataModel *> *)modelList { | |||
| [self addLog:[NSString stringWithFormat:@"skip history num:%zd",modelList.count]]; | |||
| } | |||
| - (void)skipManagerSportEndReportDataWithHistoryModel:(nonnull ELSkipHistoryDataModel *)model { | |||
| [self addLog:[NSString stringWithFormat:@"skip end, result:%zd",model.dataModel.sportNum]]; | |||
| } | |||
| @end | |||
| @@ -0,0 +1,17 @@ | |||
| // | |||
| // FaceMaskScanViewController.h | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by LarryZhang on 2021/12/13. | |||
| // Copyright © 2021 IOT. All rights reserved. | |||
| // | |||
| #import <UIKit/UIKit.h> | |||
| NS_ASSUME_NONNULL_BEGIN | |||
| @interface SkipScanViewController : UIViewController | |||
| @end | |||
| NS_ASSUME_NONNULL_END | |||
| @@ -0,0 +1,94 @@ | |||
| // | |||
| // FaceMaskScanViewController.m | |||
| // AILinkBleSDKSourceCode | |||
| // | |||
| // Created by LarryZhang on 2021/12/13. | |||
| // Copyright © 2021 IOT. All rights reserved. | |||
| // | |||
| #import "SkipScanViewController.h" | |||
| #import <AILinkBleSDK/ELSkipBleManager.h> | |||
| #import "Masonry.h" | |||
| #import "SkipConnectionViewController.h" | |||
| @interface SkipScanViewController () <UITableViewDelegate, UITableViewDataSource, ELSkipBleDelegate> | |||
| @property(nonatomic, strong) UITableView *tableView; | |||
| @property(nonatomic, strong) NSArray<ELPeripheralModel *> *devices; | |||
| @end | |||
| @implementation SkipScanViewController | |||
| - (void)viewDidLoad { | |||
| [super viewDidLoad]; | |||
| // Do any additional setup after loading the view. | |||
| [self.view addSubview:self.tableView]; | |||
| [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { | |||
| make.top.left.right.bottom.mas_equalTo(0); | |||
| }]; | |||
| } | |||
| - (void)viewWillAppear:(BOOL)animated { | |||
| [[ELSkipBleManager shareManager] startScan]; | |||
| [ELSkipBleManager shareManager].skipDelegate = self; | |||
| } | |||
| - (void)viewWillDisappear:(BOOL)animated { | |||
| [[ELSkipBleManager shareManager] stopScan]; | |||
| } | |||
| #pragma mark - BloodSugarBleDelegate | |||
| - (void)skipManagerUpdateState:(ELBluetoothState)state { | |||
| NSLog(@"---ble state:%ld",state); | |||
| } | |||
| - (void)skipManagerScanDevices:(NSArray<ELPeripheralModel *> *)scanDevices { | |||
| self.devices = scanDevices; | |||
| [self.tableView reloadData]; | |||
| } | |||
| - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { | |||
| return self.devices.count; | |||
| } | |||
| - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { | |||
| return 60; | |||
| } | |||
| - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |||
| static NSString *cellId = @"cellid"; | |||
| UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; | |||
| if (!cell) { | |||
| cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId]; | |||
| } | |||
| ELPeripheralModel *p = self.devices[indexPath.row]; | |||
| cell.textLabel.text = [NSString stringWithFormat:@"Name:%@---Mac:%@\nCID:%ld---VID:%ld---PID:%ld", p.deviceName, p.macAddress, p.deviceType, p.vendorID, p.productID]; | |||
| cell.textLabel.numberOfLines = 2; | |||
| cell.textLabel.textColor = [UIColor blackColor]; | |||
| return cell; | |||
| } | |||
| - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { | |||
| ELPeripheralModel *p = self.devices[indexPath.row]; | |||
| SkipConnectionViewController *vc = [[SkipConnectionViewController alloc] init]; | |||
| vc.p = p; | |||
| [self.navigationController pushViewController:vc animated:YES]; | |||
| } | |||
| - (UITableView *)tableView { | |||
| if (_tableView == nil) { | |||
| _tableView = [[UITableView alloc] init]; | |||
| _tableView.delegate = self; | |||
| _tableView.dataSource = self; | |||
| } | |||
| return _tableView; | |||
| } | |||
| @end | |||
| @@ -30,6 +30,7 @@ | |||
| #import "NutritionScaleScanViewController.h" | |||
| #import "AiFreshNutritionScaleScanViewController.h" | |||
| #import "FaceMaskScanViewController.h" | |||
| #import "SkipScanViewController.h" | |||
| @interface ViewController ()<UITableViewDelegate,UITableViewDataSource> | |||
| @@ -66,6 +67,7 @@ | |||
| @"21_NutritionScale(连接营养秤)", | |||
| @"22_AiFreshNutritionScale(好营养营养秤)", | |||
| @"23_FaceMask(智能口罩)", | |||
| @"24_Skip(跳绳)", | |||
| ]; | |||
| self.vcsArray = @[ | |||
| @@ -90,6 +92,7 @@ | |||
| [[NutritionScaleScanViewController alloc] init], | |||
| [[AiFreshNutritionScaleScanViewController alloc] init], | |||
| [[FaceMaskScanViewController alloc] init], | |||
| [[SkipScanViewController alloc] init] | |||
| ]; | |||
| [self.view addSubview:self.tableView]; | |||