// // udp_data_class.m // myhome // // Created by user on 12-10-31. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #import "UdpHelper.h" #import "Sformat.h" #import "Pub.h" #import "Msg.h" @interface UdpHelper (){ } @end @implementation UdpHelper{ } - (void)Open{ _sysinfo = [Pub getApp].sysinfo; _udp = [[AsyncUdpSocket alloc] initWithDelegate:self]; //NSError *err = nil; //[_udp bindToPort:8366 error:&err]; [_udp receiveWithTimeout:-1 tag:0]; [self udp_send_thr_begin]; _timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(HeartBeat) userInfo:nil repeats:YES]; } - (void)Resume{ _udp = [[AsyncUdpSocket alloc] initWithDelegate:self]; [_udp receiveWithTimeout:-1 tag:0]; } - (void)udp_send_thr_begin { _udp_datas = [[NSMutableArray alloc] init]; udp_data_class *list; _udp_list = [[udp_data_class alloc] init]; for (int i=0; i _sysinfo.reporttime)) {//心跳包时间 如果没有收到_udp回应 则继续发 _udp_last_report_time = [Sformat timestamp]; Byte bb[110]; /* memset(bb, 0, 101); [Pub addHead:@"XXXCID" toByte:bb]; bb[6] = 4; bb[7] = 1; [Pub addEquid:@"P18682150237" toByte:bb at:8]; // [Pub addEquid:_sysinfo.equid toByte:bb at:8]; bb[20] = 0; [Pub addMac:[Pub getMac] toByte:bb at:28]; [Pub addInt:0 toByte:bb at:34]; [Pub addEquid:[Pub getLocalIP] toByte:bb at:38]; //与协议区别 [Pub addGKB:@"token" toByte:bb at:50]; int len = [Pub addGKB:_sysinfo.token toByte:bb at:60]; [Pub addInt:len toByte:bb at:43]; NSData *data = [[NSData alloc] initWithBytes:bb length:60+len]; //NSLog(@"HeartBeat: length = %ld , %@", data.length, [Sformat Hex:data]); self.sysinfo.server_wan = @"192.168.254.23";//测试葛工地址 self.sysinfo.server_port = 8366; NSLog(@"HeartBeat: 服务器=%@:%d; 本地端口 = %d ",self.sysinfo.server_wan,self.sysinfo.server_port, _udp.localPort);] */ memset(bb, 0, 101); [Pub addHead:@"XXXCID" toByte:bb]; bb[6] = 4; bb[7] = 1; [Pub addEquid:@"P18682150237" toByte:bb at:8]; // [Pub addEquid:_sysinfo.equid toByte:bb at:8]; bb[20] = 0; [Pub addMac:@"02:00:00:00:00:00" toByte:bb at:28]; // [Pub addMac:[Pub getMac] toByte:bb at:28]; [Pub addInt:0 toByte:bb at:34]; [Pub addEquid:@"192.168.9.7" toByte:bb at:38]; // [Pub addEquid:[Pub getLocalIP] toByte:bb at:38]; //与协议区别 [Pub addGKB:@"token" toByte:bb at:50]; int len = [Pub addGKB:@"b989fa15f75c2ac02718b7c9bb64f80e" toByte:bb at:60]; // int len = [Pub addGKB:_sysinfo.token toByte:bb at:60]; [Pub addInt:len toByte:bb at:43]; NSData *data = [[NSData alloc] initWithBytes:bb length:60+len]; //打印数据 NSMutableString *str = [[NSMutableString alloc] init]; for (int i = 0; i < sizeof(bb); i++) { [str appendFormat:@"%@", [NSString stringWithFormat:@"%d ", bb[i]]]; } NSLog(@"\n%@", str); /* storeDataInByteArray(bb, @"XXXCID", 0);//包头 storeDataInByteArray(bb, @(4), 6);//命令4 storeDataInByteArray(bb, @(1), 7);//命令类型1 storeDataInByteArray(bb, @"P18682150237", 8);//用户名 storeDataInByteArray(bb, @(0), 20); storeDataInByteArray(bb, @(0), 28);//Mac地址 storeDataInByteArray(bb, @"0.0.0.0", 38);//IP地址 storeDataInByteArray(bb, @"token", 50);//Token storeDataInByteArray(bb, @"34237b42ae0ef7eb8fa6c1adf3ccfabb", 60);//Token值 storeDataInByteArray(bb, @(32), 43);//Token值length NSMutableString *str = [[NSMutableString alloc] init]; for (int i = 0; i < sizeof(bb); i++) { [str appendFormat:@"%@", [NSString stringWithFormat:@"%d ", bb[i]]]; } NSLog(@"\n%@", str); NSData *data = [[NSData alloc] initWithBytes:bb length:60+32]; */ [_udp sendData:data toHost:@"192.168.254.23" port:8366 withTimeout:-1 tag:0]; // if([Pub getApp].p2ptest){ // [_udp sendData:data toHost:@"47.107.109.110" port:self.sysinfo.server_port withTimeout:-1 tag:0]; // } //[_udp sendData:data toHost:self.sysinfo.server_wan port:self.sysinfo.server_port withTimeout:-1 tag:0]; } if (_online == YES && ([Sformat timestamp] - _udp_last_replay_time )/1000 > 3*_sysinfo.reporttime) { //[Msg alert:@"离线"]; _online = NO; } } } @catch (NSException * ex) { NSLog(@"心跳包错误"); } } void storeDataInByteArray(Byte a[], id data, NSUInteger index) { // if (index >= sizeof(a)) { // NSLog(@"索引超出数组容量。"); // return; // } if ([data isKindOfClass:[NSString class]]) { NSString *stringValue = (NSString *)data; const char *utf8String = [stringValue UTF8String]; NSUInteger stringLength = [stringValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; memcpy(a + index, utf8String, stringLength); } else if ([data isKindOfClass:[NSNumber class]]) { NSNumber *numberValue = (NSNumber *)data; a[index] = [numberValue unsignedCharValue]; } else { NSLog(@"不支持的数据类型。"); } } - (BOOL)sendDataInMain { //BOOL res = NSLog(@"sendDataInMain remoteip=%@;port=%d",_udp_list.toHost,_udp_list.port); //NSLog(@"sendDataInMain %@",[Sformat Hex:_udp_list.data]); //NSLog(@"sendDataInMain: 本地端口 = %d ", _udp.localPort); [_udp sendData:_udp_list.data toHost:_udp_list.toHost port:_udp_list.port withTimeout:-1 tag:0]; //NSLog(@"数据长度:%lu",(unsigned long)_udp_list.data.length); //NSLog(@"%@:%d", _udp_list.toHost, _udp_list.port); return YES; } - (void)senddataInThr:(NSData *)data toHost:(NSString *)host toPort:(int)port at:(int)second setTag:(int)tag { for (int i=0; i-1){ [[Pub getApp] OpenDoorSucc:[Pub getEquidFrombb:bb at:9]]; } } else{ if([self stopSend:@"" rr6:150 rr8:10]>-1){ [[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]]; } } } break; case 30:{//对讲结束 if((bb[7]&0x3)==1){//对方结束对讲 NSLog(@"对方结束对讲"); bb[7] = 2; [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] toHost:host port:port withTimeout:-1 tag:0]; [[Pub getApp].talk status_ini]; if([Pub getApp].callOut){ [[Pub getApp].callOut UIClose]; } } else{//结束对讲反馈 NSLog(@"结束对讲反馈"); [self stopSend:@"" rr6:150 rr8:30]; } } break; case 140:{//p2p测试 if([Pub getApp].p2ptest) [[Pub getApp].p2ptest GotMyPortInServer:bb Len:data.length Formip:host fromport:port]; } break; case 141:{//p2p测试 if([Pub getApp].p2ptest) [[Pub getApp].p2ptest GotRemoteIp:bb Len:data.length Formip:host fromport:port]; } break; case 142:{//p2p测试 NSLog(@"p2p被叫"); if([Pub getApp].p2ptest) [[Pub getApp].p2ptest GotCall:bb Len:data.length Formip:host fromport:port]; } break; case 144: case 143:{//p2p测试 NSAsk NSLog(@"p2pNSAskNSAsk"); if([Pub getApp].p2ptest) [[Pub getApp].p2ptest GotNSAsk:bb Len:data.length Formip:host fromport:port]; } break; default: break; } } else if(bb[6] == 152){ switch (bb[8]&0xff) { case 2://被叫 NSLog(@"对方忙"); [self stopSend:@"" rr6:152 rr8:1]; if([Pub getApp].callOut){ [[Pub getApp].callOut UIClose]; } break; case 4:{//监视成功 NSLog(@"监视成功"); [self stopSend:@"" rr6:152 rr8:1]; if([Pub getApp].callOut){ [[Pub getApp].talk watchSucc:bb Len:data.length Formip:host fromport:port]; } else if([Pub getApp].main){ // [[Pub getApp].main OpendoorGo]; [[Pub getApp].main OpenDoorStep2]; } } break; case 7: case 8:{//音视频数据 //NSLog(@"音视频数据"); [[Pub getApp].talk getAVData:bb withLength:data.length]; } break; case 9:{//保持连接 if((bb[7]&0x3)==1){//对方保持连接 //NSLog(@"对方保持连接"); bb[7] = 2; [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] toHost:host port:port withTimeout:-1 tag:0]; [Pub getApp].talk.connect_reg_time = [Sformat timestamp]; } else{ //NSLog(@"保持连接反馈"); [Pub getApp].talk.connect_reg_time = [Sformat timestamp]; } } break; case 10:{//开门反馈 if((bb[7]&0x3)==2){ NSLog(@"开门成功"); if([self stopSend:@"" rr6:152 rr8:10]>-1){ [[Pub getApp] OpenDoorSucc:[Pub getEquidFrombb:bb at:9]]; } } else{ if([self stopSend:@"" rr6:152 rr8:10]>-1){ [[Pub getApp] OpenDoorFail:[Pub getEquidFrombb:bb at:9]]; } } } break; case 30:{//监视结束 if((bb[7]&0x3)==1){//对方结束监视 NSLog(@"对方结束监视"); bb[7] = 2; [[Pub getApp].udp.udp sendData:[[NSData alloc] initWithBytes:bb length:100] toHost:host port:port withTimeout:-1 tag:0]; [[Pub getApp].talk status_ini]; if([Pub getApp].callOut){ [[Pub getApp].callOut UIClose]; } } else{//结束监视反馈 NSLog(@"结束监视反馈"); [self stopSend:@"" rr6:150 rr8:30]; } } break; default: break; } } } @catch (NSException * ex) { NSLog(@"心跳包错误"); } [_udp receiveWithTimeout:-1 tag:0]; return YES; } - (int)stopSend:(NSString *)host rr6:(int)r6 rr8:(int)r8 { for (int i=0; i