我正在编写简单的SIP代理应用程序,它位于Astreisk和SIP客户端(任何软电话)之间。该应用程序的目的是计算呼叫的持续时间。
以下是常规流程示例:
在步骤2中,我假设呼叫已开始(例如,rtp媒体流已启动)。然后我等待BYE消息来计算呼叫的持续时间。但是我注意到有些客户从未进入第3步和第4步。在第2步之后没有收到来自任何一方的通话结束通知。此类通话的持续时间是无限的。
在不嗅探RTP流的情况下找出SIP呼叫的开始/停止时间的最佳方法是什么?我应该等第3步来标记通话的开始吗?如果客户端忽略ACK或者如果在网络中错过了带有ACK的UDP数据报怎么办?
目前我曾经认为没有可靠的方法来确定SIP呼叫是否已启动。也许我应该使用Astrisk渠道API来跟踪活动呼叫。
答案 0 :(得分:0)
您的问题似乎是在SIP级别,因为您的代理不会使用路由标头将自身添加到邮件路径中。此过程称为记录路由。如果这样做,对话框中的所有后续请求也将遍历它(包括ACK和BYE)。
您不应该通过编写SIP代理来重新发明轮子。例如,您可以使用开源,灵活,功能强大且可完全自定义的SIP代理,以构建您可以想到的任何可能的场景:OpenSIPS!
答案 1 :(得分:0)
另一种选择是生成RE-INVITE以测试Session的存在。不必谈判计时器或任何东西。只是使用重新邀请可能会有所帮助。重用SDP以确保不会发生媒体更改。但是,您的应用程序正在成为应用程序服务器调用路径中的代理。
此持续时间只能限制为此重新邀请请求的最近时间间隔,而不一定是发布呼叫的确切时间。