我使用mjsip创建一个sip会话到外部voip提供程序。然后我使用RtpManager将测试wav文件通过rtp发送到提供者。
程序运行没有错误,我接听了SIP呼叫。但是,没有传输音频。当我使用wireshark诊断网络流量时,我看到从我的localhost(在某种nat之后)到voip提供商的一堆RTP流量,没有回来。
过了一会儿,我从提供商那里得到了ICMP错误“目的地无法访问(端口无法访问)”到我的本地主机。
软件linphone使用相同的localhost和voip提供程序 - 虽然它使用不同的sip堆栈。
有什么建议吗?
由于
答案 0 :(得分:3)
你已经回答了自己的问题,但是,你说得对:经过一段时间后,Callee / UAS会认为连接没有收到ACK就无法建立连接。
SIP RFC告诉我们UAS的服务器INVITE事务在发送200 OK时将进入Completed状态。接收到ACK会将其发送到已确认状态。
但是,如果UAS在发送200 OK时出现传输错误或未能及时收到ACK(定时器H触发(64 * T1 = 64 * 500m =默认为32秒),则UAS将移至终止状态。
答案 1 :(得分:2)
D'哦!
发现问题是当我的呼叫监听器类接受了我的呼叫时,我没有向SIP 200消息发送ACK。所以voip客户端忽略了相应的rtp请求。
public void onCallAccepted(Call call, String sdp, Message resp){
System.out.println("call accepted");
call.ackWithAnswer(sdp); //this was the missing line I needed
this.setupRtpSession(call);
}
希望这可以帮助任何有类似问题的人