如何确定何时启动SIP呼叫

时间:2014-07-20 16:12:10

标签: sip sip-server

我正在编写简单的SIP代理应用程序,它位于Astreisk和SIP客户端(任何软电话)之间。该应用程序的目的是计算呼叫的持续时间。

以下是常规流程示例:

  1. 客户端向SIP-Proxy发送INVITE,SIP-Proxy将INVITE重新发送到Asterisk
  2. Asterisk以200 OK回答,SIP-Proxy向客户端重新发送200 OK。
  3. 客户端回答ACK,SIP-Proxy重新发送ACK到Asterisk
  4. 每当其中一方发送BYE时,应该完成对话。
  5. 在步骤2中,我假设呼叫已开始(例如,rtp媒体流已启动)。然后我等待BYE消息来计算呼叫的持续时间。但是我注意到有些客户从未进入第3步和第4步。在第2步之后没有收到来自任何一方的通话结束通知。此类通话的持续时间是无限的。

    在不嗅探RTP流的情况下找出SIP呼叫的开始/停止时间的最佳方法是什么?我应该等第3步来标记通话的开始吗?如果客户端忽略ACK或者如果在网络中错过了带有ACK的UDP数据报怎么办?

    目前我曾经认为没有可靠的方法来确定SIP呼叫是否已启动。也许我应该使用Astrisk渠道API来跟踪活动呼叫。

2 个答案:

答案 0 :(得分:0)

您的问题似乎是在SIP级别,因为您的代理不会使用路由标头将自身添加到邮件路径中。此过程称为记录路由。如果这样做,对话框中的所有后续请求也将遍历它(包括ACK和BYE)。

您不应该通过编写SIP代理来重新发明轮子。例如,您可以使用开源,灵活,功能强大且可完全自定义的SIP代理,以构建您可以想到的任何可能的场景:OpenSIPS

答案 1 :(得分:0)

另一种选择是生成RE-INVITE以测试Session的存在。不必谈判计时器或任何东西。只是使用重新邀请可能会有所帮助。重用SDP以确保不会发生媒体更改。但是,您的应用程序正在成为应用程序服务器调用路径中的代理。

此持续时间只能限制为此重新邀请请求的最近时间间隔,而不一定是发布呼叫的确切时间。

相关问题