// // Socketsingleton.m // Ifish // // Created by imac on 15/10/17. // Copyright © 2015年 imac. All rights reserved. #import "Socketsingleton.h" #import "appLogin.h" #import "searchDeviceModel.h" @implementation Socketsingleton +(Socketsingleton *) sharedInstance { static Socketsingleton *sharedInstace = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstace = [[self alloc] init]; }); return sharedInstace; } // socket连接 -(void)socketConnectHost{ //每次请求建立连接前先断开 // if (self.clientSocket.isConnected) { // [self.clientSocket disconnect]; // } if (self.clientSocket.canSafelySetDelegate) { NSLog(@"self.clientSocket.canSafelySetDelegateYES"); }else{ NSLog(@"self.clientSocket.canSafelySetDelegateNO"); } if (self.clientSocket) { self.clientSocket =nil; } self.clientSocket=[[AsyncSocket alloc] initWithDelegate:self]; [self.clientSocket connectToHost:SOCKETPORT onPort:9955 error:nil]; } -(void)cutOffSocket{ if (self.clientSocket.isConnected) { self.clientSocket.userData = SocketOfflineByUser;// 声明是由用户主动切断 [self.clientSocket disconnectAfterReadingAndWriting]; self.clientSocket=nil; } } #pragma mark AsyncSocketDelegate #pragma mark当已经和服务端断开连接后调用该代理方法 //断线重连功能需要在这里进行 - (void)onSocketDidDisconnect:(AsyncSocket *)sock { if (self.clientSocket.userData==SocketOfflineByUser) { //主动断开 NSLog(@"SocketOfflineByUser"); }else{ //[self showTitle:@"" messsage:@"已经和服务端断开连接"]; NSLog(@"SocketOfflineByServer"); } if (!self.communiteDelegate) { NSLog(@"self.communiteDelegate%@",self.communiteDelegate); } if (self.communiteDelegate ) { [self.communiteDelegate ifishSocketDidDisconnect:sock]; } } #pragma mark soket错误断开 -(void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err{ NSLog(@"soket错误断开:%@",err); NSLog(@"存留数据%@",[sock unreadData]); if (self.communiteDelegate&&[self.communiteDelegate respondsToSelector:@selector(ifishSocket:willDisconnectWithError:)]) { [self.communiteDelegate ifishSocket:sock willDisconnectWithError:err]; } } - (BOOL)onSocketWillConnect:(AsyncSocket *)sock{ if (self.communiteDelegate&&[self.communiteDelegate respondsToSelector:@selector(ifishSocketWillConnect:)]) { [self.communiteDelegate ifishSocketWillConnect:sock]; }; return YES; } #pragma mark 当已经与服务端建立连接后调用的代理方法 -(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port { //[self requesDeviceData]; //设备登陆 [self deviceLogInWith:self.macAddress]; if (self.communiteDelegate) { [self.communiteDelegate ifishSocket:sock ifishSocketdidConnectToHost:host port:port]; } NSLog(@"服务器建立连接%d macAddress%@", self.clientSocket.isConnected,self.macAddress); } - (void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{ NSLog(@" 新socket"); if (self.communiteDelegate) { [self.communiteDelegate ifishSocket:sock didAcceptNewSocket:newSocket]; }; } //发送完成处理 - (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag { //[self endRefreshing]; if (self.communiteDelegate) { [self.communiteDelegate ifishSocket:sock didWriteDataWithTag:tag]; } NSLog(@"发送数据完成"); } #pragma mark 收到服务端的回执之后,调用的代理方法 -(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag { [sock readDataWithTimeout:-1 tag:0]; NSString*string1=[dataContorl dataToHexString:data]; NSString*string2=[string1 substringWithRange:NSMakeRange(30, 2)]; if ([string2 isEqualToString:@"01"]&&string1.length==52) { // 查询 // AppDelegate*delegate=[[UIApplication sharedApplication]delegate]; // [delegate.window makeToast:@"设备登陆成功"]; [self getDeviceInfo]; if (self.communiteDelegate) { NSLog(@"登录"); [self.communiteDelegate ifishDeviceLogInSuccees]; } }else if([string2 isEqualToString:@"00"]&&string1.length==52){ AppDelegate*delegate=(AppDelegate*)[[UIApplication sharedApplication]delegate]; // [delegate.window makeToast:@"设备已离线"]; if (self.communiteDelegate) { NSLog(@"离线"); [self.communiteDelegate ifishDeviceLogInFail]; } }else{ if (self.communiteDelegate) { [self.communiteDelegate socketDidGetBackmsgData:data onsoket:sock]; } NSLog(@"readData--->%@",data); } } #pragma mark -设备登陆服务器指令 -(void)deviceLogInWith:(NSString *)macaddress{ appLogin *logModel=[[appLogin alloc]init]; logModel.sendmacId = macaddress; logModel.resavemacId = macaddress; // 十六进制转NSdata NSData*data=[dataContorl stringToHexData:logModel.description];//1337AE5 [ self.clientSocket writeData:data withTimeout:-1 tag:0 ]; //为了得到服务端的回执,这里等待接受数据 [ self.clientSocket readDataWithTimeout:-1 tag:0]; if (self.clientSocket.isConnected) { //soket 未断开时显示 //[_indicatorView startAnimating]; } } #pragma mark - 查询设备信息指令 -(void)getDeviceInfo{ searchDeviceModel*xinxiModel=[[searchDeviceModel alloc]init]; xinxiModel.resavemacId = self.macAddress; xinxiModel.sendmacId = self.macAddress; NSString*requestStr=xinxiModel.description; NSData*data1=[dataContorl stringToHexData:requestStr]; [ self.clientSocket writeData:data1 withTimeout:-1 tag:0]; [ self.clientSocket readDataWithTimeout:-1 tag:0]; } #pragma mark - 写入通信指令 -(void)soketWriteData:(NSData *)data{ [ self.clientSocket writeData:data withTimeout:-1 tag:0]; NSLog(@"sendData:%@",data); [self.clientSocket readDataWithTimeout:-1 tag:0];// 会出现接受服务器心跳包粘包问题 //[ self.singletonSocket.clientSocket readDataToLength:99 withTimeout:-1 tag:0];// 防止心跳包粘包 } #pragma mark 设置灯控指令mac -(void)setSoketLightDataWith:( manulswitchMSModel *)model{ model.sendmacId = self.macAddress; model.resavemacId = self.macAddress; } #pragma mark 设置灯控指令mac 炫多 -(void)setXuToSoketLightDataWith:( XuToLightModel *)model{ model.sendmacId = self.macAddress; model.resavemacId = self.macAddress; } -(void)setXuToJiaReBangDataWith:( JiaReWenDuModel *)model{ model.sendmacId = self.macAddress; model.resavemacId = self.macAddress; } #pragma mark- 设置开启关闭报警 @end