2

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

环境是这样的——

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

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

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

我按照此处给出的说明通过 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 数据包跟踪可根据要求提供。非常感谢您的帮助和投入。

4

3 回答 3

1

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

由于您谈论的是私有 IP 地址,我假设您是通过互联网从 NAT 后面到“公共” sip 服务器。

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

我猜你所说的 UDP 设置有 STUN 服务器设置,而你所说的 TCP 设置没有。

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

于 2014-02-22T23:38:16.467 回答
0

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

它接缝这是在 PJSIP 中通过 TCP 发送 INVITE 请求的已知问题

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

于 2014-05-29T09:01:11.367 回答
0

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

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

于 2019-05-02T10:57:45.340 回答