使用PJSIP通过TCP进行SIP调用

使用PJSIP通过TCP进行SIP调用,sip,pjsip,sip-server,Sip,Pjsip,Sip Server,我正在使用PJSIP的pjsua拨号器(基于pjsua_app.c,PJSIP 2.0.1)和TCP传输和SIP中继来拨打手机。拨号程序通过TCP向SIP服务器注册,并通过TCP发送邀请。未使用UDP传输 环境是这样的- PJSIP(NAT后)SIP服务器SIP中继提供商移动电话 所有呼叫都是通过TCP从PJSIP向移动设备发出的。要禁用UDP传输创建,我在函数末尾插入了一行“cfg->no_UDP=true;” "static void default_config(struct app_co

我正在使用PJSIP的pjsua拨号器(基于pjsua_app.c,PJSIP 2.0.1)和TCP传输和SIP中继来拨打手机。拨号程序通过TCP向SIP服务器注册,并通过TCP发送邀请。未使用UDP传输

环境是这样的-

PJSIP(NAT后)SIP服务器SIP中继提供商移动电话

所有呼叫都是通过TCP从PJSIP向移动设备发出的。要禁用UDP传输创建,我在函数末尾插入了一行
“cfg->no_UDP=true;”

"static void default_config(struct app_config *cfg)" in pjsua_app.c
我按照指示通过TCP拨打电话

问题是我们没有收到从移动端发送到PJSIP拨号器的音频。 但是来自PJSIP拨号器的RTP数据包可以很好地到达移动端。当通话建立时,我们可以在手机中听到音频

我们从数据包跟踪中发现,我们在PJSIP拨号器中不接收媒体的原因是SIP服务器正在将通过SIP中继接收到的RTP数据包发送到专用IP地址

但是,当我们切换到UDP进行注册并通过TCP发送邀请时,调用工作正常(两端都有音频)

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数据包跟踪可根据要求提供。
非常感谢您的帮助和投入。

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

既然你说的是私有IP地址,我就假设你是从互联网上的NAT后面的一个“公共”sip服务器来的

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

我猜你谈论的UDP设置有STUN服务器设置,而你谈论的TCP设置没有


没有更多信息,我无能为力。

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

这是在PJSIP中通过TCP发送INVITE请求的方法


您还可以找到一些减少SIP消息大小的建议。

请确保允许联系\u重写设置为,以便将媒体接收到您的终端

我认为我的回答太晚了,但这可能会帮助其他人