// // HintViewController.m // LCOpenSDKDemo // // Created by chenjian on 16/7/11. // Copyright (c) 2016年 lechange. All rights reserved. // #import "openApiService.h" #import "LCOpenSDK_Prefix.h" #import "AddDeviceViewController.h" #import "DeviceOperationViewController.h" #import "DeviceViewController.h" #import "LiveVideoViewController.h" #import "MessageViewController.h" #import "RecordViewController.h" #import #import "OpenApiInfo.h" #import "MJExtension.h" @interface DeviceViewController () { NSInteger m_devKeyIndex; NSInteger m_chnKeyIndex; LCOpenSDK_Utils* m_util; OpenApiService* m_openApi; } @end @implementation DeviceViewController - (void)viewDidLoad { [super viewDidLoad]; m_util = [[LCOpenSDK_Utils alloc] init]; m_openApi = [[OpenApiService alloc] init]; // Do any additional setup after loading the view, typically from a nib. UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(DEVICE_TITLE_TXT, nil)]; super.m_navigationBar.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; UIButton* right = [UIButton buttonWithType:UIButtonTypeCustom]; [right setFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 5 - 40, 0, 50, 30)]; [right setBackgroundImage:[UIImage leChangeImageNamed:AddDevice_Png] forState:UIControlStateNormal]; [right addTarget:self action:@selector(onAddDevice:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem* rightBtn = [[UIBarButtonItem alloc] initWithCustomView:right]; [item setRightBarButtonItem:rightBtn animated:NO]; //[bar pushNavigationItem:item animated:NO]; UIButton* left = [UIButton buttonWithType:UIButtonTypeCustom]; [left setFrame:CGRectMake(0, 0, 50, 30)]; UIImage* imgLeft = [UIImage leChangeImageNamed:Back_Btn_Png]; [left setBackgroundImage:imgLeft forState:UIControlStateNormal]; [left addTarget:self action:@selector(onBack:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem* leftBtn = [[UIBarButtonItem alloc] initWithCustomView:left]; [item setLeftBarButtonItem:leftBtn animated:NO]; [super.m_navigationBar pushNavigationItem:item animated:NO]; [self.view addSubview:super.m_navigationBar]; m_devListView = [[UITableView alloc] initWithFrame:CGRectMake(0, super.m_yOffset, self.view.frame.size.width, self.view.frame.size.height - super.m_yOffset - 10)]; m_devListView.estimatedRowHeight = 0; m_devListView.estimatedSectionHeaderHeight = 0; m_devListView.estimatedSectionFooterHeight = 0; [self.view addSubview:m_devListView]; m_devListView.delegate = self; m_devListView.dataSource = self; m_devListView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; m_devListView.separatorColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; m_devListView.allowsSelection = YES; m_progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; m_progressInd.transform = CGAffineTransformMakeScale(2.0, 2.0); m_progressInd.center = CGPointMake(self.view.center.x, self.view.center.y); [self.view addSubview:m_progressInd]; m_toastLab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 50)]; m_toastLab.center = self.view.center; m_toastLab.backgroundColor = [UIColor whiteColor]; m_toastLab.textAlignment = NSTextAlignmentCenter; [self.view addSubview:m_toastLab]; [self.view bringSubviewToFront:m_toastLab]; [self.view bringSubviewToFront:m_progressInd]; LCOpenSDK_ApiParam * apiParam = [[LCOpenSDK_ApiParam alloc] init]; apiParam.procotol = 80 == m_iPort ? PROCOTOL_TYPE_HTTP : PROCOTOL_TYPE_HTTPS; apiParam.addr = m_strSvr; apiParam.port = m_iPort; apiParam.token = _m_accessToken; self.m_hc = [[LCOpenSDK_Api shareMyInstance] initOpenApi:apiParam]; RestApiService* restApiService = [RestApiService shareMyInstance]; m_devList = [[NSMutableArray alloc] init]; if (nil != self.m_hc && nil != self.m_accessToken) { [restApiService initComponent:self.m_hc Token:self.m_accessToken]; } else { NSLog(@"DeviceViewController, m_hc or m_accessToken is nil"); } for (int i = 0; i < DEV_CHANNEL_MAX * DEV_NUM_MAX; i++) { m_downloadPicture[i] = [[DownloadPicture alloc] init]; } m_iPos = 0; m_downloadingPos = -1; m_downStatusLock = [[NSLock alloc] init]; m_devLock = [[NSLock alloc] init]; m_looping = YES; m_conn = nil; self.m_imgDeviceNULL.hidden = YES; m_toastLab.hidden = YES; [self showLoading]; [self getDevList]; dispatch_queue_t downQueue = dispatch_queue_create("thumbnailDown", nil); dispatch_async(downQueue, ^{ [self downloadThread]; }); } - (void)onBack:(id)sender { [self destroyThread]; [m_openApi cancelRequest]; [self dismissViewControllerAnimated:YES completion:nil]; [self.navigationController popViewControllerAnimated:NO]; } - (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView { return 1; } - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section { [m_devLock lock]; int iChCount = 0; for (Device* dev in m_devList) { if (nil == dev.deviceId) { break; } iChCount += dev.channels.count; } [m_devLock unlock]; return iChCount; } - (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { static NSString* cellIdentifier = @"Cell"; UITableViewCell* cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; [m_devLock lock]; NSInteger devKeyIndex = [self locateDevKeyIndex:[indexPath row]]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:[indexPath row]]; if (devKeyIndex < 0 || chnKeyIndex < 0) { NSLog(@"cellForRowAtIndexPath devKeyIndex[%ld],chnKeyIndex[%ld]", (long)devKeyIndex, (long)chnKeyIndex); [m_devLock unlock]; return cell; } UIImage* imgPic = nil; if (nil != m_downloadPicture[[indexPath row]].picData) { imgPic = [UIImage imageWithData:m_downloadPicture[[indexPath row]].picData]; } else { NSLog(@"test cell image default"); imgPic = [UIImage leChangeImageNamed:DefaultCover_Png]; } UIImageView* imgPicView = [[UIImageView alloc] initWithFrame:CGRectMake(0, Device_Cell_Separate, Device_Cell_Width, Device_Cell_Height - Device_Cell_Separate)]; [imgPicView setImage:imgPic]; [cell addSubview:imgPicView]; UILabel* lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(10, 0, Device_Cell_Width, Device_Cell_Separate)]; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; lblTitle.text = channel.channelName; [lblTitle setFont:[UIFont systemFontOfSize:14.0f]]; lblTitle.textColor = [UIColor colorWithRed:159.0 / 255 green:159.0 / 255 blue:166 / 255 alpha:1]; lblTitle.backgroundColor = [UIColor whiteColor]; [cell addSubview:lblTitle]; UIButton* btnDelDev = [UIButton buttonWithType:UIButtonTypeCustom]; btnDelDev.frame = CGRectMake(Device_Cell_Width - 40 - 5, 0, 40, Device_Cell_Separate); UIImage* imgDelDev = [UIImage leChangeImageNamed:Trash_Png]; [btnDelDev setImage:imgDelDev forState:UIControlStateNormal]; [cell addSubview:btnDelDev]; btnDelDev.tag = [indexPath row]; [btnDelDev addTarget:self action:@selector(onDelete:) forControlEvents:UIControlEventTouchUpInside]; UIImage* imgBottom = [UIImage leChangeImageNamed:Toast_Png]; UIImageView* imgBottomView = [[UIImageView alloc] initWithFrame:CGRectMake(-50, Device_Cell_Height - 60, Device_Cell_Width + 100, 60)]; imgBottomView.layer.masksToBounds = YES; imgBottomView.contentMode = UIViewContentModeScaleAspectFill; [imgBottomView setImage:imgBottom]; [cell addSubview:imgBottomView]; UIImage* imgLive = [UIImage leChangeImageNamed:LiveVideo_Png]; UIButton* btnLive = [UIButton buttonWithType:UIButtonTypeCustom]; btnLive.frame = CGRectMake(5, Device_Cell_Height - 50, 50, 40); CGFloat step = (Device_Cell_Width - 2 * 5 - 5 * 50) / 4; [btnLive setImage:imgLive forState:UIControlStateNormal]; [cell addSubview:btnLive]; btnLive.tag = [indexPath row]; [btnLive addTarget:self action:@selector(onLive:) forControlEvents:UIControlEventTouchUpInside]; UIImage* imgVideo = [UIImage leChangeImageNamed:Video_Png]; UIButton* btnVideo = [UIButton buttonWithType:UIButtonTypeCustom]; btnVideo.frame = CGRectMake(btnLive.frame.origin.x + btnLive.frame.size.width + step, Device_Cell_Height - 50, 50, 40); [btnVideo setImage:imgVideo forState:UIControlStateNormal]; [cell addSubview:btnVideo]; btnVideo.tag = [indexPath row]; [btnVideo addTarget:self action:@selector(onVideo:) forControlEvents:UIControlEventTouchUpInside]; UIImage* imgCloud = [UIImage leChangeImageNamed:CloudVideo_Png]; UIButton* btnCloud = [UIButton buttonWithType:UIButtonTypeCustom]; btnCloud.frame = CGRectMake(btnVideo.frame.origin.x + btnVideo.frame.size.width + step, Device_Cell_Height - 50, 50, 40); [btnCloud setImage:imgCloud forState:UIControlStateNormal]; [cell addSubview:btnCloud]; btnCloud.tag = [indexPath row]; [btnCloud addTarget:self action:@selector(onCloud:) forControlEvents:UIControlEventTouchUpInside]; UIImage* imgMessage = [UIImage leChangeImageNamed:Message_Png]; UIButton* btnMessage = [UIButton buttonWithType:UIButtonTypeCustom]; btnMessage.frame = CGRectMake(btnCloud.frame.origin.x + btnCloud.frame.size.width + step, Device_Cell_Height - 50, 50, 40); [btnMessage setImage:imgMessage forState:UIControlStateNormal]; [cell addSubview:btnMessage]; btnMessage.tag = [indexPath row]; [btnMessage addTarget:self action:@selector(onMessage:) forControlEvents:UIControlEventTouchUpInside]; UIImage* imgSetting = [UIImage leChangeImageNamed:Setting_Png]; UIButton* btnSetting = [UIButton buttonWithType:UIButtonTypeCustom]; btnSetting.frame = CGRectMake(btnMessage.frame.origin.x + btnMessage.frame.size.width + step, Device_Cell_Height - 50, 50, 40); [btnSetting setImage:imgSetting forState:UIControlStateNormal]; [cell addSubview:btnSetting]; btnSetting.tag = [indexPath row]; [btnSetting addTarget:self action:@selector(onSetting:) forControlEvents:UIControlEventTouchUpInside]; if ([NSLocalizedString(LANGUAGE_TXT, nil) isEqualToString:@"en"]) { // btnSetting.enabled = NO; } if (((Device*)[m_devList objectAtIndex:devKeyIndex]).channels.count > 1){ /** Ch:NVR设备逐个通道展示区分是否离线 En:NVR devices are displayed channel by channel to distinguish whether they are offline. */ Channel *chnnel = ((Device *)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; if( [chnnel.status isEqualToString:@"offline"]){ UIImage* imgOffline = [UIImage leChangeImageNamed:Offline_Png]; UIImageView* imgOfflineView = [[UIImageView alloc] initWithFrame:CGRectMake(Device_Cell_Width / 2 - 50, (Device_Cell_Height - Device_Cell_Separate) / 2 + Device_Cell_Separate - 50, 100, 100)]; [imgOfflineView setImage:imgOffline]; UILabel* lblCover = [[UILabel alloc] initWithFrame:CGRectMake(0, Device_Cell_Separate, Device_Cell_Width, Device_Cell_Height - Device_Cell_Separate)]; lblCover.text = @""; lblCover.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; [cell addSubview:lblCover]; [cell addSubview:imgOfflineView]; btnLive.enabled = NO; btnCloud.enabled = NO; btnMessage.enabled = NO; btnSetting.enabled = NO; btnVideo.enabled = NO;; } } else if( ([((Device*)[m_devList objectAtIndex:devKeyIndex]).status isEqualToString:@"offline"]) && (((Device*)[m_devList objectAtIndex:devKeyIndex]).channels.count <= 1) ){ /** Ch:非NVR设备按devOnline字段区分是否离线 En:Non-NVR devices are offline according to the devOnline field. */ UIImage* imgOffline = [UIImage leChangeImageNamed:Offline_Png]; UIImageView* imgOfflineView = [[UIImageView alloc] initWithFrame:CGRectMake(Device_Cell_Width / 2 - 50, (Device_Cell_Height - Device_Cell_Separate) / 2 + Device_Cell_Separate - 50, 100, 100)]; [imgOfflineView setImage:imgOffline]; UILabel* lblCover = [[UILabel alloc] initWithFrame:CGRectMake(0, Device_Cell_Separate, Device_Cell_Width, Device_Cell_Height - Device_Cell_Separate)]; lblCover.text = @""; lblCover.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; [cell addSubview:lblCover]; [cell addSubview:imgOfflineView]; btnLive.enabled = NO; btnCloud.enabled = NO; btnMessage.enabled = NO; btnSetting.enabled = NO; btnVideo.enabled = NO; } else if ((1 == ((Device*)[m_devList objectAtIndex:devKeyIndex]).encryptMode) && ![((Device*)[m_devList objectAtIndex:devKeyIndex]).ability containsString:@"TCM"]) { Channel *chnnel = ((Device *)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; if(chnnel.encryptKey.length == 0) { UILabel* lblCover = [[UILabel alloc] initWithFrame:CGRectMake(0, Device_Cell_Separate, Device_Cell_Width, Device_Cell_Height - Device_Cell_Separate)]; lblCover.text = NSLocalizedString(ENTER_ENCRYPTED_KEY_TXT, nil); [lblCover setFont:[UIFont systemFontOfSize:24.0f]]; [lblCover setTextColor:[UIColor whiteColor]]; lblCover.textAlignment = NSTextAlignmentCenter; lblCover.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]; [cell addSubview:lblCover]; btnLive.enabled = NO; btnCloud.enabled = NO; btnMessage.enabled = NO; btnSetting.enabled = NO; btnVideo.enabled = NO; } } cell.textLabel.font = [UIFont systemFontOfSize:12.0f]; cell.accessoryType = UITableViewCellAccessoryNone; cell.selectionStyle = UITableViewCellSelectionStyleBlue; cell.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0]; cell.selectionStyle = UITableViewCellSelectionStyleNone; [m_devLock unlock]; return cell; } - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { [m_devLock lock]; NSInteger devKeyIndex = [self locateDevKeyIndex:[indexPath row]]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:[indexPath row]]; if ([((Device*)[m_devList objectAtIndex:devKeyIndex]).status isEqualToString:@"offline"]) { [m_devLock unlock]; return; } Channel *channel = ((Device *)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; if (0 != channel.encryptKey.length) { [m_devLock unlock]; return; } if (1 == ((Device*)[m_devList objectAtIndex:devKeyIndex]).encryptMode && ![((Device*)[m_devList objectAtIndex:devKeyIndex]).ability containsString:@"TCM"]) { alertDecryptView = [[UIAlertView alloc] initWithTitle:@"Encrypt Key" message:@"please input correct key" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; alertDecryptView.alertViewStyle = UIAlertViewStylePlainTextInput; [alertDecryptView show]; m_devKeyIndex = devKeyIndex; m_chnKeyIndex = chnKeyIndex; [m_devLock unlock]; } [m_devLock unlock]; } - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath { return Device_Cell_Height; } #pragma mark - 查询设备通道(En:Query device channel) - (NSInteger)locateDevKeyIndex:(NSInteger)index { int iChCount = 0; int i = 0; for (Device* dev in m_devList) { if (nil == dev.deviceId) { break; } iChCount += dev.channels.count; if (iChCount >= index + 1) { break; } i++; } /** CH:返回当前的通道所在的NVR是第几个设备 En:Return which NVR is the current channel. */ return (iChCount >= index + 1) ? i : -1; } - (NSInteger)locateDevChannelKeyIndex:(NSInteger)index { int iChCount = 0; int i = 0; for (Device* dev in m_devList) { if (nil == dev.deviceId) { break; } iChCount += dev.channels.count; if (iChCount >= index + 1) { break; } i++; } /** Ch:返回当前的通道是NVR内的第几个通道 En:Return the current channel is which channel in the NVR. */ return (iChCount >= index + 1) ? (index - iChCount + ((Device*)[m_devList objectAtIndex:i]).channels.count) : -1; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - 设置管理员账号信息(En:Set administrator account information) - (void)setAdminInfo:(NSString*)token protocol:(NSInteger)protocol address:(NSString*)addr port:(NSInteger)port { self.m_accessToken = [token mutableCopy]; m_strSvr = [addr mutableCopy]; m_iPort = port; m_iProtocol = protocol; } #pragma mark - 实时播放(En:Real-time play) - (void)onLive:(id)sender { UIButton* btnLive = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnLive.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnLive.tag]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; self.m_playToken = ((Device*)[m_devList objectAtIndex:devKeyIndex]).playToken; self.m_devAbilitySelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).ability; self.m_accessType = ((Device*)[m_devList objectAtIndex:devKeyIndex]).accessType; self.m_catalog = ((Device*)[m_devList objectAtIndex:devKeyIndex]).catalog; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_devChnSelected = [channel.channelId integerValue]; self.m_chnAbilitySelected = [channel.ability copy]; self.m_imgPicSelected = [UIImage imageWithData:m_downloadPicture[btnLive.tag].picData]; self.m_encryptKey = channel.encryptKey; NSLog(@"onLive device[%@],channel[%ld]", self.m_strDevSelected, (long)self.m_devChnSelected); UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; LiveVideoViewController* liveVideoView = [currentBoard instantiateViewControllerWithIdentifier:@"LiveVideo"]; [self.navigationController pushViewController:liveVideoView animated:NO]; [liveVideoView setInfo:self.m_accessToken Dev:self.m_strDevSelected Key:self.m_encryptKey Chn:self.m_devChnSelected Img:self.m_imgPicSelected Abl:self.m_devAbilitySelected chnAbl:self.m_chnAbilitySelected playToken:self.m_playToken accessType:self.m_accessType catalog:self.m_catalog]; } - (NSString *)arrayToJSONString:(NSArray *)array { NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; return jsonString; } #pragma mark - 设备录像(En:Device video) - (void)onVideo:(id)sender { UIButton* btnVideo = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnVideo.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnVideo.tag]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; self.m_playToken = ((Device*)[m_devList objectAtIndex:devKeyIndex]).playToken; // TODO Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_devChnSelected = [channel.channelId integerValue]; self.m_encryptKey = channel.encryptKey; NSString *accessType = ((Device*)[m_devList objectAtIndex:devKeyIndex]).accessType; NSLog(@"onLive device[%@],channel[%ld]", self.m_strDevSelected, (long)self.m_devChnSelected); UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; RecordViewController* recordView = [currentBoard instantiateViewControllerWithIdentifier:@"Record"]; [recordView setInfo:self.m_accessToken playToken:_m_playToken Dev:self.m_strDevSelected Key:self.m_encryptKey Chn:self.m_devChnSelected Type:DeviceRecord accessType:accessType]; [self.navigationController pushViewController:recordView animated:NO]; } #pragma mark - 云录像(En:Cloud video) - (void)onCloud:(id)sender { UIButton* btnCloudVideo = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnCloudVideo.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnCloudVideo.tag]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_playToken = ((Device*)[m_devList objectAtIndex:devKeyIndex]).playToken; self.m_devChnSelected = [channel.channelId integerValue]; self.m_encryptKey = channel.encryptKey; NSString *accessType = ((Device*)[m_devList objectAtIndex:devKeyIndex]).accessType; NSLog(@"onCloud device[%@],channel[%ld]", self.m_strDevSelected, (long)self.m_devChnSelected); UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; RecordViewController* recordView = [currentBoard instantiateViewControllerWithIdentifier:@"Record"]; [recordView setInfo:self.m_accessToken playToken:_m_playToken Dev:self.m_strDevSelected Key:self.m_encryptKey Chn:self.m_devChnSelected Type:CloudRecord accessType:accessType]; [self.navigationController pushViewController:recordView animated:NO]; } #pragma mark - 报警消息(En:Alarm message) - (void)onMessage:(id)sender { UIButton* btnMessage = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnMessage.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnMessage.tag]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_devChnSelected = [channel.channelId integerValue]; self.m_encryptKey = channel.encryptKey; UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; MessageViewController* msgView = [currentBoard instantiateViewControllerWithIdentifier:@"MessageView"]; [self.navigationController pushViewController:msgView animated:NO]; [msgView setInfo:self.m_accessToken Dev:self.m_strDevSelected Key:self.m_encryptKey Chn:self.m_devChnSelected]; } #pragma mark - 设备设置(En:Device settings) - (void)onSetting:(id)sender { UIButton* btnSetting = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnSetting.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnSetting.tag]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_devChnSelected = [channel.channelId integerValue]; UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; DeviceOperationViewController* deviceOperationView = [currentBoard instantiateViewControllerWithIdentifier:@"DeviceOperation"]; [deviceOperationView setInfo:self.m_hc Token:self.m_accessToken Dev:self.m_strDevSelected Chn:self.m_devChnSelected]; [self.navigationController pushViewController:deviceOperationView animated:NO]; } #pragma mark - 删除设备(En:Delete device) - (void)onDelete:(id)sender { UIButton* btnDetelte = (UIButton*)sender; NSInteger devKeyIndex = [self locateDevKeyIndex:btnDetelte.tag]; NSInteger chnKeyIndex = [self locateDevChannelKeyIndex:btnDetelte.tag]; [m_devLock lock]; self.m_strDevSelected = ((Device*)[m_devList objectAtIndex:devKeyIndex]).deviceId; Channel *channel = ((Device*)[m_devList objectAtIndex:devKeyIndex]).channels[chnKeyIndex]; self.m_devChnSelected = [channel.channelId integerValue]; [m_devLock unlock]; alertDelView = [[UIAlertView alloc] initWithTitle:@"alarm" message:@"confirm to delete?" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES", nil]; [alertDelView show]; return; } #pragma mark - 添加设备(En:Add device) - (void)onAddDevice:(id)sender { UIStoryboard* currentBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; AddDeviceViewController* addDevView = [currentBoard instantiateViewControllerWithIdentifier:@"AddDeviceView"]; [self.navigationController pushViewController:addDevView animated:NO]; [addDevView setInfo:self.m_hc token:self.m_accessToken devView:self]; } #pragma mark - 获取设备列表(En:Get device list) - (void)getDevList { [m_devLock lock]; [m_devList removeAllObjects]; [m_devLock unlock]; [m_downStatusLock lock]; m_iPos = 0; m_downloadingPos = -1; m_conn = nil; for (int i = 0; i < DEV_CHANNEL_MAX * DEV_NUM_MAX; i++) { [m_downloadPicture[i] clearData]; } [m_downStatusLock unlock]; [self showLoading]; m_devListView.hidden = YES; m_toastLab.hidden = YES; dispatch_queue_t get_devList = dispatch_queue_create("get_devList", nil); dispatch_async(get_devList, ^{ NSDictionary *deviceOpenList = [NSDictionary dictionary]; NSDictionary *deviceBaseList = [NSDictionary dictionary]; NSDictionary *deviceOpenDetailList = [NSDictionary dictionary]; NSDictionary *deviceBaseDetailList = [NSDictionary dictionary]; NSString *err; NSString *msg; [m_openApi deviceOpenList:_m_accessToken bindId:-1 limit:10 type:@"bindAndShare" needApInfo:@"false" result:&deviceOpenList errcode:&err errmsg:&msg]; [m_openApi deviceBaseList:_m_accessToken bindId:-1 limit:10 type:@"bindAndShare" needApInfo:@"false" result:&deviceBaseList errcode:&err errmsg:&msg]; if ([deviceOpenList[@"count"] intValue] > 0) { [m_openApi deviceOpenDetailList:_m_accessToken deviceList:[self dealRequestDetailData:deviceOpenList] result:&deviceOpenDetailList errcode:&err errmsg:&msg]; } if ([deviceBaseList[@"count"] intValue] > 0) { [m_openApi deviceBaseDetailList:_m_accessToken deviceList:[self dealRequestDetailData:deviceBaseList] result:&deviceBaseDetailList errcode:&err errmsg:&msg]; } NSArray *openList = [Device mj_objectArrayWithKeyValuesArray:deviceOpenDetailList[@"deviceList"]]; NSArray *baseList = [Device mj_objectArrayWithKeyValuesArray:deviceBaseDetailList[@"deviceList"]]; dispatch_async(dispatch_get_main_queue(), ^{ if (![err isEqualToString:@"0"] && openList.count == 0 && baseList.count == 0) { m_toastLab.text = @"GET DEVICE LIST FAILED"; m_toastLab.hidden = NO; [self hideLoading]; [self.view bringSubviewToFront:m_progressInd]; return; } if (openList.count == 0 && baseList.count == 0) { m_toastLab.text = @"NO DEVICE"; m_toastLab.hidden = NO; [self hideLoading]; [self.view bringSubviewToFront:m_progressInd]; return; } [m_devList removeAllObjects]; [m_devList addObjectsFromArray:openList]; [m_devList addObjectsFromArray:baseList]; m_toastLab.hidden = YES; [self hideLoading]; m_devListView.hidden = NO; [m_devListView reloadData]; [self.view bringSubviewToFront:m_progressInd]; }); }); } #pragma mark - 对话框(En:Dialog box) - (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (alertView == alertDelView) { if (0 == buttonIndex) { NSLog(@"cancel delete[%@]", self.m_strDevSelected); return; } else if (1 == buttonIndex) { [self showLoading]; m_devListView.hidden = YES; dispatch_queue_t unbind_device = dispatch_queue_create("unbind_device", nil); dispatch_async(unbind_device, ^{ NSString* errMsg; RestApiService* restApiService = [RestApiService shareMyInstance]; [restApiService unBindDevice:self.m_strDevSelected Msg:&errMsg]; if (![errMsg isEqualToString:[MSG_SUCCESS mutableCopy]]) { dispatch_async(dispatch_get_main_queue(), ^{ [self hideLoading]; m_devListView.hidden = NO; m_toastLab.text = errMsg; m_toastLab.hidden = NO; [self performSelector:@selector(hideToastDelay) withObject:nil afterDelay:2.0f]; }); return; } dispatch_async(dispatch_get_main_queue(), ^{ [self getDevList]; }); }); } } if (alertView == alertDecryptView) { if (0 == buttonIndex) { return; } if (1 == buttonIndex) { Channel *chanenl = ((Device*)[m_devList objectAtIndex:m_devKeyIndex]).channels[m_chnKeyIndex]; chanenl.encryptKey = [[alertView textFieldAtIndex: 0] text]; [m_devLock unlock]; [m_devListView reloadData]; m_devListView.hidden = NO; return; } } } - (NSArray *)dealRequestDetailData:(NSDictionary *)dic { NSMutableArray *arr = [NSMutableArray array]; NSArray *deviceList = dic[@"deviceList"]; if (deviceList.count > 0) { for (int i = 0; i < deviceList.count && i < 8; i++) { NSArray *channels = deviceList[i][@"channels"]; NSString *channelList; for (int j = 0; j < channels.count; j++) { NSString *chnanelId = channels[j][@"channelId"]; if (j == 0) { channelList = [NSString stringWithFormat:@"%@", chnanelId]; } else { channelList = [NSString stringWithFormat:@"%@,%@", channelList, chnanelId]; } } NSString *deviceId = deviceList[i][@"deviceId"]; if (channelList.length > 0 ) { NSDictionary *resultDic = @{ @"deviceId" : deviceId, @"channelList": channelList}; [arr addObject: resultDic]; } } } return arr; } - (NSString *)dictionaryToJSONString:(NSDictionary *)dictionary { NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; return jsonString; } #pragma mark - 延时隐藏toast(En:Delay hiding toast) - (void)hideToastDelay { m_toastLab.hidden = YES; } #pragma mark - 封面图片下载线程(En:Cover image download thread) - (void)downloadThread { m_iPos = 0; m_downloadingPos = -1; int j; while (m_looping) { usleep(20 * 1000); BOOL bNeedDown = YES; NSString* picUrl; [m_devLock lock]; [m_downStatusLock lock]; NSInteger iDevKey = [self locateDevKeyIndex:m_iPos]; NSInteger iChnKey = [self locateDevChannelKeyIndex:m_iPos]; do { picUrl = nil; if (iDevKey < 0 || iChnKey < 0) { bNeedDown = NO; m_iPos = (m_iPos + 1) % (DEV_CHANNEL_MAX * DEV_NUM_MAX); break; } for (j = 0; j < DEV_CHANNEL_MAX * DEV_NUM_MAX; j++) { if (DOWNLOADING == m_downloadPicture[j].downStatus) { break; } } if (j < DEV_CHANNEL_MAX * DEV_NUM_MAX) { bNeedDown = NO; break; } if (NONE != m_downloadPicture[m_iPos].downStatus) { bNeedDown = NO; m_iPos = (m_iPos + 1) % (DEV_CHANNEL_MAX * DEV_NUM_MAX); break; } if([m_devList count]>0){ Channel *channel = ((Device*)[m_devList objectAtIndex:iDevKey]).channels[iChnKey]; picUrl = [channel.picUrl copy]; } } while (0); [m_devLock unlock]; if (!bNeedDown || !picUrl) { [m_downStatusLock unlock]; continue; } //download m_httpUrl = [NSURL URLWithString:picUrl]; //[m_downStatusLock lock]; m_downloadPicture[m_iPos].downStatus = DOWNLOADING; //[m_downStatusLock unlock]; m_downloadingPos = m_iPos; m_iPos = (m_iPos + 1) % (DEV_CHANNEL_MAX * DEV_NUM_MAX); [m_devLock unlock]; NSURLRequest* request = [NSMutableURLRequest requestWithURL:m_httpUrl cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0]; NSHTTPURLResponse* response = nil; NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; if (m_downloadingPos < 0) { NSLog(@"connectionDidFinishLoading m_downloadingPos[%ld]", (long)m_downloadingPos); return; } if (response == nil) { NSLog(@"download failed"); m_downloadPicture[m_downloadingPos].downStatus = DOWNLOAD_FAILED; } else { if([m_devList count]>0){ if ([((Device*)[m_devList objectAtIndex:iDevKey]).accessType isEqualToString:@"PaaS"]) { NSData* dataOut = [[NSData alloc] init]; Channel *channel = ((Device*)[m_devList objectAtIndex:iDevKey]).channels[iChnKey]; NSInteger iret = [m_util decryptPic:data deviceID:((Device*)[m_devList objectAtIndex:iDevKey]).deviceId key:channel.encryptKey token:_m_accessToken bufOut:&dataOut]; if (0 == iret) { [m_downloadPicture[m_downloadingPos] setData:dataOut status:DOWNLOAD_FINISHED]; } } else { [m_downloadPicture[m_downloadingPos] setData:data status:DOWNLOAD_FINISHED]; } } dispatch_async(dispatch_get_main_queue(), ^{ [m_devListView reloadData]; }); } [m_downStatusLock unlock]; } } #pragma mark - 结束图片下载线程(En:End picture download thread) - (void)destroyThread { m_looping = NO; } #pragma mark - 滚动轮指示器(En:Scroll wheel indicator) - (void)showLoading { [m_progressInd startAnimating]; } - (void)hideLoading { if ([m_progressInd isAnimating]) { [m_progressInd stopAnimating]; } } - (void)dealloc{ NSLog(@"%@ %s", [self class], __func__); } @end