顯示具有 VoIP 標籤的文章。 顯示所有文章
顯示具有 VoIP 標籤的文章。 顯示所有文章

2010年12月29日

[VoIP] SIP 封包尋找 E.164 號碼 filter

適用於 wireshark 系列

"sip contains 070號碼 and not sip.CSeq contains REGISTER and not sip.CSeq contains PING"

2010年5月27日

利用 ICMP 模擬 G.729 語音封包來測試 VoIP 品質

G.729 語音壓縮的標準,是採用週期性的方式每 20 ms 產生一個 20 bytes 的語音封包 (Voice Payload),之後當語音封包封裝成IP 格式,其實在裡面已經增加了 3 個 header,分別是 RTP (12 bytes), UDP (8 bytes), IP (20 bytes),共 60 bytes 所以在設定參數如下:

-s size 參數設定為 52 (ICMP 自己會加上 8bytes 在 header , 所以最後大小為 60 bytes)
-i interval 設定為 0.02 (G.729 預設為 20 ms)
-c count 設定為 100 , 即送 100 個封包,此處可視情況增減

需先切換為 root
su -
再下 ping 指令
ping -s 52 -i 0.02 -c 100 Destination IP

如果 ping 的統計結果有出現 packet loss 的情況,可能即為該線路頻寬不足 (小於1M/64k)、不良(雜訊)或者是內部流量過大等情形,即使用者打 VoIP 會有通話斷斷續續的情況。

2008年12月5日

如何將Wireshark擷取的封包內的G.729還原?

目前網路電話由於頻寬問題,多半採用G.729當作Codec,而此codec目前並非是open source的授權,所以處理起來較為麻煩,以下為codec還原的方式

前置準備
先下載 open G.729 的 decoder
Windows 下可使用 Goldwave
Linux 下可使用 Perl 的Script

整個轉檔流程大概需經過以下的手續:
Wireshark(raw) -> open G.729 decoder (pcm) -> Goldwave (wav) or perl script (au) -> 播放器


步驟1. Wireshark(raw)

選單 Statistics -> RTP -> Show All Streams, 進入後會找出總共有多少RTP Stream

















RTP封包解開通常會長成這個樣子
-- 2個主叫端的聲音
-- 1個被叫端的聲音

第一個主叫端為接通前的聲音,通常是響鈴或來電答鈴音樂
第二個為被叫端的聲音,也就是接通回應
第三個為主叫端的聲音,也是接通開始說話

選擇要還原的RTP再按 Analyze ,通常是依序一個一個解








接下來的畫面選擇 Save Payload....
再下個畫面
Format 選 .raw
Channel 選 forward
再命名為 filename.raw




















步驟2. open G.729 decoder (pcm)
此時再借助這個opensource的小程式,將raw檔轉成pcm格式
將G729.zip解開,進入Dos模式執行裡面的程式如下:
va_g729_decoder.exe 來源.raw 目的.pcm


步驟3.1 Goldwave (wav), Windows適用
將轉好的pcm檔用Goldwave打開,並選擇下面的格式,打開後即可直接播放或轉成wav檔













步驟3.2 Perl script (au) , Linux適用

請將以下的Perl script存檔,檔名為 pcm2au.pl
--------我是分隔線--------
#
# USAGE: perl pcm2au.pl inputFile outputFile


$usage = "Usage: 'perl $0 ' ";

$srcFile = shift @ARGV || die $usage;
$dstFile = shift @ARGV || die $usage;

open(SRCFILE, "$srcFile") || die "Unable to open file: $!\n";
binmode SRCFILE;

open(DSTFILE, "> $dstFile") || die "Unable to open file: $!\n";
binmode DSTFILE;

###################################
# Write the AU header
###################################

print DSTFILE ".snd";

$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;

$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0x1f,0x40);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;

#############################
# swap the PCM samples
#############################

while (read(SRCFILE, $inWord, 2) == 2) {

@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}

close(DSTFILE);
close(SRCFILE);

--------我是分隔線--------
然後再執行 perl pcm2au.pl 來源.pcm 目的.au
就可產生 au 檔了

PS1. G.711的話,Wireshark可以直接分析之後轉存為 au 檔,就可以直接播放了。
PS2. 參考資料: http://wiki.wireshark.org/HowToDecodeG729