2013-08-25 86 views
2

我使用的是PJSIP的pjsua撥號器(基於pjsua_app.c,PJSIP 2.0.1)與TCP傳輸和SIP中繼做出手機電話通話中通過TCP。撥號程序通過TCP向SIP服務器註冊,並通過TCP發送出邀請。 UDP傳輸未被使用。使得SIP使用PJSIP

的環境是這樣的 -

PJSIP(後面NAT)< --- SIP通過TCP ---> SIP服務器< --- SIP中繼 - > SIP中繼提供商< - PSTN /移動網關 - >移動電話

所有的呼叫都是由PJSIP通過TCP連接到移動設備。要禁用UDP傳輸創造我插線"cfg->no_udp = true;"在功能

"static void default_config(struct app_config *cfg)" in pjsua_app.c 

結束時,我跟着給here做出了TCP調用指令。

問題是我們沒有收到從移動端發送到PJSIP撥號器的音頻。 但是來自PJSIP撥號器的RTP數據包恰好到達移動端。通話建立後,我們可以聽到移動電話中的音頻。

我們發現從數據包跟蹤,我們不要在PJSIP撥號器接收媒體的原因是,SIP服務器發送接收的SIP中繼RTP數據包的私有IP地址。

但是,當我們切換到UDP註冊並通過TCP發送INVITES調用工作正常(音頻兩端)。

Wireshark的數據包捕獲顯示如下 -

1. PJSIP registers with server over TCP. 
    2. Server sends 401 with PJ's public IP and port in VIA 
    3. PJ registers again but inserts its public ip and port in the 
     contact header in the next REGISTER message sequence. 
    So far so good. Same sequence of messages seen when UDP is used to REGISTER. 
    4. INVITE sent over TCP. Dialog establishment works fine. 
     But in the record-route header nat=yes is missing. 
    5. Server sends media to private IP. No media received at PJSIP. 

這是PJSIP的錯誤嗎?如果是這樣如何解決。 Wireshark數據包追蹤可根據要求提供。 您的幫助和投入非常感謝。

回答

1

你的問題實際上並沒有什麼意義的SIP終端和SIP服務器(UDP或TCP)之間的信令的傳輸對兩個SIP端點之間的媒體傳輸無軸承(最有可能UDP)。所以一定還有其他的事情要做。

既然你在談論私有IP地址,我假設你是從一個NAT後面通過互聯網來到一個「公共」sip服務器。

在這些類型的環境中,我建議您在sip端點上設置STUN,TURN和ICE。

我猜你在哪裏談論的UDP設置有STUN服務器設置和TCP設置你在哪裏談論沒有。

沒有進一步的信息,我不能幫助更多。

0

嘗試使用這兩個客戶端和服務器中除5060之外的端口,和/或減少SIP消息大小。

它接收這是一個know issue用於在PJSIP中通過TCP發送INVITE請求。你

也可以找到here一些建議減少SIP消息的大小。