为何使用PJSUA连接Bodhicom 3408 VoIP网关时无RTP包且通话中断
该故障为Bodhicom 3408系列网关的SIP兼容性缺陷触发,核心原因是PC端PJSUA发送的INVITE请求SDP内容与网关预期不符,网关处理异常后中断RTP流。对比两份INVITE报文后可按以下优先级排查修复:
优先调整编码顺序与禁用冗余编码
网关对SDP的编码顺序敏感度极高,仅会优先匹配排在最前的编码。安卓端正常请求的编码顺序为G722→SILK→PCMU→PCMA→电话事件,而PJSUA默认将speex、iLBC、GSM等网关不兼容的编码放在前列,同时上报了3种不同采样率的电话事件,导致网关SDP协商失败。
操作方法:修改PJSUA配置,仅保留G722、PCMU、PCMA三种编码,按G722→PCMU→PCMA顺序设置优先级,同时仅保留8000Hz采样率的telephone-event,禁用其余所有冗余编码。禁用SDP扩展字段
PJSUA默认上报的b=AS:84、b=TIAS:64000、a=X-nat:0、a=ssrc等扩展字段,多数低端VoIP网关无法识别,会直接触发SDP解析错误。
操作方法:在PJSUA配置中关闭带宽参数上报、NAT状态上报、SSRC字段上报功能,确保SDP结构与安卓端CSipSimple的SDP结构一致。验证100rel扩展处理逻辑
两份请求都携带了Supported: 100rel头,如果网关返回的183 Session Progress报文携带了Require: 100rel头,需要确认PJSUA是否正确回复PRACK报文,未按要求回复PRACK也会导致网关主动中断会话。可选:对齐SIP头格式
部分网关会对SIP头的显示名称做校验,可修改PJSUA的From、Contact头,添加和安卓端一致的显示名称字段,降低网关的差异化拦截概率。
按照以上步骤调整后,确保PJSUA发送的INVITE报文与安卓端正常报文结构高度一致,即可解决网关断流问题。
内容的提问来源于stack exchange,提问作者Adam Głowacki

