2010-04-20 85 views
2

我使用mjsip为外部voip提供程序创建sip会话。然后,我使用RtpManager将一个测试wav文件通过rtp传输给提供者。使用mjsip/jmf时本地RTP端口无法访问

该程序运行没有错误,我回答了SIP呼叫。但是,不传输音频。当我使用wireshark诊断网络流量时,我看到一些来自本地主机(位于某种nat后面)的RTP流量到voip提供商,并且没有任何回应。

过了一段时间,我从提供程序得到ICMP错误“Destination unreachable(Port unreachable)”到我的本地主机。

linphone软件使用相同的本地主机和voip提供程序 - 虽然它使用不同的SIP堆栈。

有什么建议吗?

谢谢

+0

嗨,我真的对你的项目感兴趣,你能告诉我你是如何使用mjsip调用的吗?你如何流测试wav文件? – B770 2013-07-07 11:58:43

回答

3

你已经回答了你自己的问题,但是,是的,你说得对:被叫方/ UAS会,一段时间之后,视如果连接没有收到ACK,连接失败。

SIP RFC告诉我们,UAS的服务器INVITE事务在发送200 OK时会进入Completed状态。收到ACK会将其发送到确认状态。

但是,如果UAS在发送200 OK时发生传输错误或未能及时收到ACK(定时器H发生(默认为64 * T1 = 64 * 500m = 32秒),则UAS将移动到终止状态

2

D'oh!

发现问题是我的呼叫监听器类中接受了我的呼叫时,我没有向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); 
} 

希望这有助于任何人有类似的问题