webRtcPingManager.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // webRtcPingManager.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/12/24.
  6. //
  7. #import "webRtcPingManager.h"
  8. #import "WHPingTester.h"
  9. @interface webRtcPingManager ()<WHPingDelegate>
  10. {
  11. WHPingTester *whPingTester;
  12. NSInteger pingRoomIndex;//开始ping的第x个机房IP
  13. CGFloat allTimeInPingOneIP;//一个IP ping多少次的总延时
  14. NSInteger pingOneIPNumber;//一个IPping多少次
  15. NSInteger pingOneIPErrorNumber;//一个IP 错了多少次
  16. }
  17. @end
  18. @implementation webRtcPingManager
  19. + (instancetype)shareManager {
  20. static webRtcPingManager *_instance;
  21. static dispatch_once_t onceToken;
  22. dispatch_once(&onceToken, ^{
  23. _instance = [[self alloc] init];
  24. });
  25. return _instance;
  26. }
  27. - (instancetype)init {
  28. if (self = [super init]) {
  29. pingRoomIndex = 0;
  30. //[self registeNotification];
  31. }
  32. return self;
  33. }
  34. - (void)startPingNextFun
  35. {
  36. pingRoomIndex++;
  37. [self startPingFun];
  38. }
  39. #pragma mark ---ping-----站点 判断是否是局域网
  40. - (void)startPingFun
  41. {
  42. allTimeInPingOneIP = 0;
  43. pingOneIPNumber = 0;
  44. pingOneIPErrorNumber = 0;
  45. NSString* roomInternetIp = @"";
  46. NSArray<webrtcServerModel>* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList;
  47. if (!webrtcServerList)
  48. {
  49. return;
  50. }
  51. else if(webrtcServerList.count > pingRoomIndex) {
  52. webrtcServerModel *model = webrtcServerList[pingRoomIndex];
  53. roomInternetIp = model.turnIp;
  54. }
  55. else{//完成遍历了
  56. NSString *logstr = [[NSString alloc] initWithFormat:@"ping 结束 当前最佳机房IP:%@--延时:%.02fms",ksharedAppDelegate.bestWebrtcServerModel.turnIp,ksharedAppDelegate.bestWebrtcServerModel.delayedms];
  57. HLog(@"%@",logstr)
  58. [cachesFileManager writeLogsWithMsg:logstr];
  59. NSDictionary *bestdict = [ksharedAppDelegate.bestWebrtcServerModel toDictionary];
  60. if(bestdict){
  61. [HWDataManager setObjectWithKey:@"Const_best_webRtc_IPRoom" value:bestdict];
  62. }
  63. [[webRtcManager shareManager] relinkWebRtcFun];
  64. [[NSNotificationCenter defaultCenter] postNotificationName:didPingBestWebRtcIPRoomNotification object:nil];
  65. return;
  66. }
  67. //IP 出错
  68. if(!roomInternetIp || roomInternetIp.length ==0){
  69. if(webrtcServerList && webrtcServerList.count > pingRoomIndex ){
  70. [self startPingNextFun];
  71. }
  72. return;
  73. }
  74. if (self->whPingTester)
  75. {
  76. [self->whPingTester stopPing];
  77. self->whPingTester = nil;
  78. }
  79. self->whPingTester = [[WHPingTester alloc] initWithHostName:roomInternetIp];
  80. self->whPingTester.delegate = self;
  81. //self->whPingTester.countdownTime = 1; //1秒ping一次
  82. [self->whPingTester startPing];
  83. /// 启动定时器监听 10秒后 whPingTester的状态
  84. KWeakSelf
  85. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  86. if(self->whPingTester){
  87. [weakSelf didGetPingStateIsOK:NO];
  88. }
  89. });
  90. }
  91. #pragma mark ---ping---- 代理回调
  92. - (void)didPingSucccessWithTime:(float)time withError:(NSError*) error
  93. {
  94. HLog(@"time:%f \n error: %@",time,error)
  95. //if(error.code == 111 || time > 1000) //超时或者延时超过100ms,就要记录数据
  96. if(error != nil)
  97. {
  98. pingOneIPErrorNumber += 1;
  99. }
  100. else if(time > 0){
  101. allTimeInPingOneIP += time;
  102. pingOneIPNumber +=1 ;
  103. //[self didGetPingStateIsOK:YES];
  104. //test code
  105. //[self didGetPingStateIsOK:NO];
  106. }
  107. if(pingOneIPErrorNumber >= 3){
  108. [self didGetPingStateIsOK:NO];
  109. }
  110. else if (pingOneIPNumber >= 9){
  111. [self didGetPingStateIsOK:YES];
  112. }
  113. }
  114. - (void)didPingfialewithError:(NSError*)error
  115. {
  116. HLog(@" error error: %@",error)
  117. pingOneIPErrorNumber += 1;
  118. [self didGetPingStateIsOK:NO];
  119. }
  120. -(void)didGetPingStateIsOK:(BOOL)isOk
  121. {
  122. [self->whPingTester stopPing];
  123. self->whPingTester = nil;
  124. if (allTimeInPingOneIP > 0) {
  125. CGFloat averageDelayedms = allTimeInPingOneIP/pingOneIPNumber;
  126. webrtcServerModel*preBestModel = ksharedAppDelegate.bestWebrtcServerModel;
  127. NSArray<webrtcServerModel>* webrtcServerList = ksharedAppDelegate.DeviceWebRtcMsgMod.data.webrtcServerList;
  128. if (!webrtcServerList || webrtcServerList.count > pingRoomIndex) {
  129. webrtcServerModel *model = webrtcServerList[pingRoomIndex];
  130. model.delayedms = averageDelayedms;
  131. NSString *logstr = [[NSString alloc] initWithFormat:@"time: 平均:%f --%@",averageDelayedms,model.turnIp];
  132. HLog(@"%@",logstr)
  133. [cachesFileManager writeLogsWithMsg:logstr];
  134. if([model.turnIp isEqualToString:preBestModel.turnIp]){
  135. preBestModel.delayedms = averageDelayedms;
  136. }
  137. else{
  138. if(preBestModel.delayedms > 0 && model.delayedms < preBestModel.delayedms){
  139. //找到耗时更短的机房
  140. ksharedAppDelegate.bestWebrtcServerModel = model;
  141. }
  142. }
  143. }
  144. }
  145. [self startPingNextFun];
  146. }
  147. @end