2

我使用 mjsip 创建一个与外部 voip 提供商的 sip 会话。然后我使用 RtpManager 通过 rtp 向提供者传输一个测试 wav 文件。

程序运行没有错误,我接听了 sip 电话。但是,不传输音频。当我使用wireshark 诊断网络流量时,我看到一堆RTP 流量从我的本地主机(在某种nat 后面)到voip 提供商,没有任何返回。

过了一会儿,我从提供商收到 ICMP 错误“无法访问目标(无法访问端口)”到我的本地主机。

软件 linphone 使用相同的 localhost 和 voip 提供程序工作 - 尽管它使用不同的 sip 堆栈。

有什么建议么?

谢谢

4

2 回答 2

3

您已经回答了您自己的问题,但是是的,您是对的:如果被呼叫方/UAS 没有收到 ACK,则在一段时间后,被呼叫方/UAS 将认为连接建立失败。

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

但是,如果 UAS 在发送 200 OK 时出现传输错误或未能及时接收 ACK(定时器 H 触发(默认情况下为 64 T1 = 64 500m = 32 秒),则 UAS 将进入 Terminated 状态。

于 2010-04-22T13:37:38.850 回答
2

哦!

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

希望这可以帮助任何有类似问题的人

于 2010-04-20T21:48:58.607 回答