// // webRtcPingManager.m // 双子星云手机 // // Created by xd h on 2024/12/24. // #import "webRtcPingManager.h" #import "WHPingTester.h" @interface webRtcPingManager () { WHPingTester *whPingTester; NSInteger pingRoomIndex;//开始ping的第x个机房IP CGFloat allTimeInPingOneIP;//一个IP ping多少次的总延时 NSInteger pingOneIPNumber;//一个IPping多少次 NSInteger pingOneIPErrorNumber;//一个IP 错了多少次 } @end @implementation webRtcPingManager + (instancetype)shareManager { static webRtcPingManager *_instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } - (instancetype)init { if (self = [super init]) { pingRoomIndex = 0; //[self registeNotification]; } return self; } - (void)startPingNextFun { pingRoomIndex++; [self startPingFun]; } #pragma mark ---ping-----站点 判断是否是局域网 - (void)startPingFun { allTimeInPingOneIP = 0; pingOneIPNumber = 0; pingOneIPErrorNumber = 0; NSString* roomInternetIp = @""; NSArray* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList; if (!webrtcServerList) { return; } else if(webrtcServerList.count > pingRoomIndex) { webrtcServerModel *model = webrtcServerList[pingRoomIndex]; roomInternetIp = model.turnIp; } else{//完成遍历了 NSString *logstr = [[NSString alloc] initWithFormat:@"ping 结束 当前最佳机房IP:%@--延时:%.02fms",ksharedAppDelegate.bestWebrtcServerModel.turnIp,ksharedAppDelegate.bestWebrtcServerModel.delayedms]; HLog(@"%@",logstr) [cachesFileManager writeLogsWithMsg:logstr]; NSDictionary *bestdict = [ksharedAppDelegate.bestWebrtcServerModel toDictionary]; if(bestdict){ [HWDataManager setObjectWithKey:@"Const_best_webRtc_IPRoom" value:bestdict]; } [[webRtcManager shareManager] relinkWebRtcFun]; [[NSNotificationCenter defaultCenter] postNotificationName:didPingBestWebRtcIPRoomNotification object:nil]; return; } //IP 出错 if(!roomInternetIp || roomInternetIp.length ==0){ if(webrtcServerList && webrtcServerList.count > pingRoomIndex ){ [self startPingNextFun]; } return; } if (self->whPingTester) { [self->whPingTester stopPing]; self->whPingTester = nil; } self->whPingTester = [[WHPingTester alloc] initWithHostName:roomInternetIp]; self->whPingTester.delegate = self; //self->whPingTester.countdownTime = 1; //1秒ping一次 [self->whPingTester startPing]; /// 启动定时器监听 10秒后 whPingTester的状态 KWeakSelf dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ if(self->whPingTester){ [weakSelf didGetPingStateIsOK:NO]; } }); } #pragma mark ---ping---- 代理回调 - (void)didPingSucccessWithTime:(float)time withError:(NSError*) error { HLog(@"time:%f \n error: %@",time,error) //if(error.code == 111 || time > 1000) //超时或者延时超过100ms,就要记录数据 if(error != nil) { pingOneIPErrorNumber += 1; } else if(time > 0){ allTimeInPingOneIP += time; pingOneIPNumber +=1 ; //[self didGetPingStateIsOK:YES]; //test code //[self didGetPingStateIsOK:NO]; } if(pingOneIPErrorNumber >= 3){ [self didGetPingStateIsOK:NO]; } else if (pingOneIPNumber >= 9){ [self didGetPingStateIsOK:YES]; } } - (void)didPingfialewithError:(NSError*)error { HLog(@" error error: %@",error) pingOneIPErrorNumber += 1; [self didGetPingStateIsOK:NO]; } -(void)didGetPingStateIsOK:(BOOL)isOk { [self->whPingTester stopPing]; self->whPingTester = nil; if (allTimeInPingOneIP > 0) { CGFloat averageDelayedms = allTimeInPingOneIP/pingOneIPNumber; webrtcServerModel*preBestModel = ksharedAppDelegate.bestWebrtcServerModel; NSArray* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList; if (!webrtcServerList || webrtcServerList.count > pingRoomIndex) { webrtcServerModel *model = webrtcServerList[pingRoomIndex]; model.delayedms = averageDelayedms; NSString *logstr = [[NSString alloc] initWithFormat:@"time: 平均:%f --%@",averageDelayedms,model.turnIp]; HLog(@"%@",logstr) [cachesFileManager writeLogsWithMsg:logstr]; if([model.turnIp isEqualToString:preBestModel.turnIp]){ preBestModel.delayedms = averageDelayedms; } else{ if(preBestModel.delayedms > 0 && model.delayedms < preBestModel.delayedms){ //找到耗时更短的机房 ksharedAppDelegate.bestWebrtcServerModel = model; } } } } [self startPingNextFun]; } @end