首页 文章

使用PJSIP通过TCP进行SIP呼叫

提问于
浏览
2

我正在使用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数据包到达移动端就好了 . 当呼叫 Build 时,我们可以在移动设备中听到音频 .

我们从数据包跟踪中发现,我们在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数据包跟踪可根据要求提供 . 非常感谢您的帮助和意见 .

2 回答

  • 1

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

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

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

    我猜你在谈论的UDP设置有STUN服务器设置和你在哪里谈论的TCP设置没有 .

    没有进一步的信息,我无能为力 .

  • 0

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

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

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

相关问题