使用PJSIP通过TCP进行SIP呼叫

时间:2013-08-25 02:34:26

标签: sip pjsip sip-server

我正在使用PJSIP的pjsua拨号器(基于pjsua_app.c,PJSIP 2.0.1)和TCP传输以及SIP中继来拨打移动电话。拨号器通过TCP向SIP服务器注册,并通过TCP发送INVITES。没有使用UDP传输。

环境就是这样 -

PJSIP(NAT后面)< --- SIP over TCP ---> SIP服务器< --- SIP干线 - > SIP中继提供商< - PSTN /移动网关 - >移动电话

所有呼叫都是通过TCP从PJSIP到移动设备。要禁用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数据包跟踪可根据要求提供。 非常感谢您的帮助和投入。

3 个答案:

答案 0 :(得分:1)

您的问题实际上没有意义,因为sip端点和sip服务器(UDP或TCP)之间的信令传输与两个sip端点(最可能是UDP)之间的媒体传输无关。所以必须有其他事情发生。

自从你谈论私有IP地址以来,我假设你是从互联网上的NAT背后来到“公共”SIP服务器。

在这些类型的环境中,我建议你在sip端点上设置STUN,TURN和ICE。

我猜你在谈论的UDP设置有STUN服务器设置和你所谈论的TCP设置没有。

如果没有进一步的信息,我无能为力。

答案 1 :(得分:0)

尝试在 客户端和服务器中使用5060以外的端口,和/或减少SIP消息大小。

接缝这是know issue,用于在PJSIP中通过TCP发送INVITE请求。

另外,您可以找到here一些减少SIP邮件大小的建议。

答案 2 :(得分:0)

请确保将 allow_contact_rewrite 设置为 true ,以便将媒体接收到您的终端。

我认为我的回答为时已晚,但这可能对其他一些人有帮助