【问题标题】:local RTP port unreachable when using mjsip/jmf使用 mjsip/jmf 时本地 RTP 端口无法访问
【发布时间】:2011-02-10 07:44:56
【问题描述】:

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

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

一段时间后,我从提供商收到 ICMP 错误“无法访问目标(无法访问端口)”到我的本地主机。

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

有什么建议吗?

谢谢

【问题讨论】:

  • 嗨,我真的对你的项目很感兴趣。你能告诉我你是怎么用mjsip打电话的吗?您如何流式传输测试 wav 文件?

标签: sip jmf nat rtp mjsip


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 2012-02-21
      • 2021-11-21
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2021-04-14
      • 2015-05-12
      相关资源
      最近更新 更多