lossprob.pl
上传用户:wzkunzhan
上传日期:2022-04-23
资源大小:2618k
文件大小:10k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. # File: lossprob.pl
  2. #
  3. # Modified OpenPhone based Voice Evaluation Tool (MOBVET) Version 0.1
  4. # --------------------------------------------------------------------
  5. # Voice Over IP Laboratory (http://www.voip.nce.ufrj.br)
  6. # Federal University of Rio de Janeiro
  7. # Copyright (c) 2002-2004 UFRJ (Federal University of Rio de Janeiro).
  8. # The contents of this file are subject to the Mozilla Public License
  9. # Version 1.0 (the "License"); you may not use this file except in
  10. # compliance with the License. You may obtain a copy of the License at
  11. # http://www.mozilla.org/MPL/
  12. #! c:/perl/bin/perl.exe -w
  13. #Receives value in milliseconds and converts it to the string format "mm:ss.xxxx" or "hh:mm:ss.xxxx"
  14.  
  15. sub ms
  16. {
  17. my $arg = shift;
  18. my ($h, $r, $m, $s, $ms);
  19. $h = int ($arg / 3600000);
  20. $r = $arg % 3600000;
  21. $m = int ($r / 60000);
  22. $r = $r % 60000;
  23. $s = int ($r / 1000); 
  24. $ms = $r % 1000;
  25. if ($h > 0) {
  26. return (sprintf("%d:%02d:%02d.%03d",$h,$m,$s,$ms));
  27. } else {
  28. return (sprintf("%d:%02d.%03d",$m,$s,$ms));
  29. }
  30. }
  31. #Receives the string int the "mm:ss.xxxx <lixo>" 
  32. #ou "hh:mm:ss.xxxx <lixo>" format and converts it to milliseconds
  33. sub converte_para_Milisegundos
  34. {
  35.         my $arg = shift;
  36.         if ($arg =~ /(d*):(d*):(d*).(d*)/o ) {
  37.                 return ( (($1*3600)+$2*60+$3)*1000 +$4 );
  38.         } elsif ($arg =~ /(d*):(d*).(d*)/o ) {
  39.                 return ( (($1*60)+$2)*1000 +$3 );
  40.         }
  41.         printf ("Parametro Invalido: %sn", $arg);
  42. }
  43. sub calculappl {
  44. my $origem = shift;
  45. my $destino = shift;
  46. my $notfirst = 0;
  47. my $too_late_ant = 0;
  48. my $lost_ant = 0;
  49. # Envio 
  50. @eventosL = (); 
  51. # Recebimento
  52. @eventosR = ();
  53. $buffer_size = 116; # initial value for dejitter buffer 
  54. open(LOG_ORIGEM, "$origem.H323") or die "reading source file $origem";
  55. foreach $line (<LOG_ORIGEM>)
  56. {
  57. #0:02.910       LogChanRx:8076cd0 RTP Jitter buffer size decreased to 925 (115ms)
  58. if($line =~ /Jitter buffer size .*tos(d*)s/o ) {
  59. #refresh buffer size
  60. $buffer_size = int($1/8);
  61. }
  62. # 0:49.961      RTP Jitter:86527e0 RTP Receive statistics:  packets=410 octets=11360 lost=1 tooLate=0 order=0 avgTime=120 maxTime=120 minTime=120 jitterInstant=8 jitter=2
  63. elsif($line =~ /RTP Jitter.*Receive statistics.*tooLate=(d*)s.*jitter=(d*)/o ) {
  64. $too_late = $1;
  65. $Djitter = $2;
  66. }
  67. elsif($line =~ /(.*)SentSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
  68. $rtp = $4;
  69. $psent = $5;
  70. $time = converte_para_Milisegundos ($1);
  71. # L1
  72. push @eventosL, "SS:".$time.":".$rtp."-".$psent;
  73. }
  74.          elsif($line =~ /(.*)OnRxSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
  75. $rtp = $4;
  76. $psent = $5;
  77. $time = converte_para_Milisegundos ($1);
  78. # L2
  79. push @eventosL, "RS:".$time.":".$rtp."-".$psent;
  80. }
  81.          elsif($line =~ /(.*)SentReceiverReport:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)s*lsr=(d*)s*dlsr=(d*)/o ) {
  82.                  $lost = $4;
  83.   $last_seq = $5;
  84.                 $jitter = $6;
  85. $time = converte_para_Milisegundos ($1);
  86. # L3
  87. push @eventosL, "SR:".$time.":".$last_seq."-".$jitter.":".$lost.":".$too_late.":".$Djitter.":".$buffer_size;
  88. }
  89.          elsif($line =~ /(.*)OnRxSenderReport *RR:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)/o ) {
  90.                  $last_seq = $5;
  91.                  $jitter = $6;
  92. $time = converte_para_Milisegundos ($1);
  93. # L4
  94. push @eventosL, "RR:".$time.":".$last_seq."-".$jitter;
  95. }
  96. }
  97. close(LOG_ORIGEM);
  98. $buffer_size = 116; # tamanho inicial do buffer de conpensacao de jitter
  99. open(LOG_DESTINO,"$destino.H323");
  100. foreach $line (<LOG_DESTINO>)
  101. {
  102. #0:02.910       LogChanRx:8076cd0 RTP Jitter buffer size decreased to 925 (115ms)
  103. if($line =~ /Jitter buffer size .*tos(d*)s/o ) {
  104. #atualiza tamanho do buffer
  105. $buffer_size = int($1/8);
  106. }
  107. if ($line =~ /RTP Jitter.*Receive statistics.*tooLate=(d*)s.*jitter=(d*)/o ) {
  108. $too_late = $1;
  109. $Djitter = $2;
  110. }
  111. elsif($line =~ /(.*)SentSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
  112. $rtp = $4;
  113. $psent = $5;
  114. $time = converte_para_Milisegundos ($1);
  115. # R1 
  116. push @eventosR, "SS:".$time.":".$rtp."-".$psent;
  117. }
  118.          elsif($line =~ /(.*)OnRxSenderReport:s*ssrc=(d*)s*ntp=(.*)s*rtp=(d*)s*psent=(d*)s*osent=(d*)/o ) {
  119. $rtp = $4;
  120. $psent = $5;
  121. $time = converte_para_Milisegundos ($1);
  122. # R2
  123. push @eventosR, "RS:".$time.":".$rtp."-".$psent;
  124. }
  125.          elsif($line =~ /(.*)SentReceiverReport:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)s*lsr=(d*)s*dlsr=(d*)/o ) {
  126.                 $lost = $4;
  127.                 $last_seq = $5;
  128.                 $jitter = $6;
  129. $time = converte_para_Milisegundos ($1);
  130. # R3
  131. push @eventosR, "SR:".$time.":".$last_seq."-".$jitter.":".$lost.":".$too_late.":".$Djitter.":".$buffer_size;
  132. }
  133.          elsif($line =~ /(.*)OnRxSenderReport *RR:s*ssrc=(d*)s*fraction=(d*)s*lost=(d*)s*last_seq=(d*)s*jitter=(d*)/o ) {
  134.                  $last_seq = $5;
  135.                  $jitter = $6;
  136. $time = converte_para_Milisegundos ($1);
  137. # R4
  138. push @eventosR, "RR:".$time.":".$last_seq."-".$jitter;
  139. }
  140. }
  141. close(LOG_DESTINO);
  142. # Pesquisa:
  143. # 1- Pega o proximo registro Sender Report do log Local (ssrL)
  144. # 2- Procura pela recepcao do mesmo no log Remoto (rsrR), com o mesmo RTP.
  145. #    Senao achar, volta para o passo 1
  146. # 3- Procura pelo primeiro registro Sent Receiver Report (srrR), que tenha
  147. #    ocorrido imediatamente apos o rsrR do item 2, tambem no log Remoto
  148. # 4- Procura por Receiver Receiver Report (rrrL) no log Local com o mesmo 
  149. #    lost last_seq jitter do srrR do item 3.
  150. # 5- Calcula RTT (rrrL - ssrL) - (srrR - rsrR) e grava registro no
  151. #    arquivo com tempo do rrrL e rtt
  152. $totL = @eventosL;
  153. $totR = @eventosR;
  154. $dbg=0;
  155. if ($dbg > 0) { print "Origem $origemn Destino $destinon Total de registros L=$totL R=$totRn"; }
  156. open (PPL, ">$origem.ppl");
  157. for ($indL=0; $indL<$totL-1; $indL++) { # Para cada valor de L1
  158.         # Procura pelo envio de um Send Receiver Report
  159.          if ($eventosL[$indL] =~ /^SR/o ) {
  160.          ($tipo_L, $timestamp, $id_L, $lost, $too_late, $Djitter, $buffer) = split (":", $eventosL[$indL]);
  161.          ($last_seq, $jitter) = split ("-", $id_L);
  162.          } else {
  163.          next;
  164.          }
  165.         
  166.         
  167. $t4 = 0;
  168. for ($j=$indL-1; $j>0; $j--) {
  169. if ($eventosL[$j] =~ /^R/o ) {
  170. ($tipo_L, $t4, $id_L) = split (":", $eventosL[$j]);
  171. $posicao = $j;
  172.          last;
  173.          }
  174.   }
  175. if ($t4 == 0) {
  176. #print "Nao achei evento de recepcao antes de $indL ($eventosL[$indL])n";
  177. next;
  178. }
  179. if ($tipo_L eq "RR") {
  180. $target = "SR";
  181. } else {
  182. $target = "SS";
  183. }
  184. $t3 = 0;
  185. $proximo = 0;
  186. # Procura por registro recebido com mesmo psent ou last_seq
  187. for ($j=0; $j<$totR; $j++) {
  188. ($tipo_R, $time, $id_R) = split (":", $eventosR[$j]); # R2
  189. if ( ($tipo_R eq $target) and ($id_L eq $id_R) ) {
  190. $proximo = $j-1;
  191. $t3 = $time;
  192. if ($indL == $dbg) { print "Achei a recepcao em $j $eventosR[$j]n"; }
  193. last;
  194. }
  195. }
  196. if ($proximo == 0) {
  197. #print "Nao tem nenhum recepcao (T2) antes do envio (T3) de $destino para $origemn"; 
  198. next;
  199. }
  200. # Se nao achou o envio do SR, volta pro inicio;
  201. if ($t3 == 0) {
  202. #print "Nao achei o envio (T3) da recepcao (T4 $target $t1) de $origem para $destinon"; 
  203. next;
  204. }
  205. # Procura agora por uma recepcao anterior de um Receiver Report
  206. $t2 = 0;
  207. for ($j=$proximo; $j>0; $j--) {
  208. ($proximotipo_R, $time, $id_R) = split (":", $eventosR[$j]); # R3
  209. if ($proximotipo_R =~ /^R/o) {
  210. $t2 = $time;
  211. if ($indL == $dbg) { print "T3 no registro $j $eventosR[$j], $t3n"; }
  212. last; 
  213. }
  214. }
  215. # Se nao achou nenhum Receive antes de T3, volta pro inicio;
  216. if ($t2 == 0) {
  217. #print "Nao achei receive report antes (T3 $t3) de $destino para $origemn"; 
  218. next;
  219. }
  220. if ($proximotipo_R eq "RR") {
  221. $target = "SR";
  222. } else {
  223. $target = "SS";
  224. }
  225. if ($indL == $dbg) { print "Agora vou procurar $target com $id_R n"; }
  226.                 $t1 = 0;
  227. for ($j=$posicao-1; $j>0; $j--) {
  228. if ($indL == $dbg) { print "Analizando $j $eventosL[$j]n"; }
  229. ($tipo_L, $time, $id_L) = split (":", $eventosL[$j]);
  230. if ( ($tipo_L eq $target) and ($id_L eq $id_R) ) {
  231. $t1 = $time;
  232. last;
  233. }
  234. }
  235. if ($t1 == 0) {
  236. #printf ("Nao achei o envio (T1)  do receive (T2 $t2 $target) de $origem para $destinon");
  237. next;
  238. }
  239. # Se chegamos ate'  aqui, temos os quatro registros. Vamos calcular o
  240. # rtt e gravar no arquivo. Vou considerar o instante da medida o tempo
  241. # medio entre o envio do sender report e a recepcao do receiver report.
  242. $rtt = ($t4 - $t1) - ($t3 - $t2);
  243. if ($rtt < 0) {
  244. #print "EEEEPPPAAAAAAAA!!!!!!!!!! $rtt < 0 arquivo $origem $destino  , registro $indLn $eventosL[$indL]n";
  245. next;
  246. }
  247. if ($notfirst) {
  248. printf PPL ("%s %d %d %d %d %d %dn", ms($timestamp_ant), $rtt_ant, ($last_seq-$last_seq_ant), ($lost_ant-$lost_ant_ant), ($too_late_ant-$too_late_ant_ant), $Djitter_ant, $buffer );
  249. }
  250. $notfirst=1;
  251. $timestamp_ant=$timestamp;
  252. $lost_ant_ant = $lost_ant;
  253. $too_late_ant_ant = $too_late_ant;
  254. $rtt_ant = $rtt;
  255. $lost_ant = $lost;
  256. $too_late_ant = $too_late;
  257. $last_seq_ant = $last_seq;
  258. $Djitter_ant = $Djitter;
  259. } # fim do loop 
  260. close (PPL);
  261. } # fim da subtorina calculappl
  262. ############################################
  263. $nomeorigem = "sideA";
  264. $nomedestino = "sideB";
  265. calculappl ($nomeorigem, $nomedestino);
  266. calculappl ($nomedestino, $nomeorigem);