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