我正在编写简单的 SIP 代理应用程序,它位于 Astreisk 和 SIP 客户端(任何软件电话)之间。该应用程序的目的是计算通话的持续时间。
以下是常规流程的示例:
- 客户端向 SIP-Proxy 发送 INVITE,SIP-Proxy 向 Asterisk 重新发送 INVITE
- Asterisk 回答 200 OK,SIP-Proxy 向客户端重新发送 200 OK。
- 客户端用 ACK 应答,SIP-Proxy 向 Asterisk 重新发送 ACK
- 每当其中一方发送 BYE 时,对话就应该结束。
在第 2 步,我假设呼叫已启动(例如 rtp 媒体流已启动)。然后我等待 BYE 消息来计算通话时间。但是我注意到有些客户从不进入第 3 步和第 4 步。在第 2 步之后没有收到任何一方的通话结束通知。并且这种通话的持续时间是无限的。
在不嗅探 RTP 流的情况下找出 SIP 呼叫的开始/停止时间的最佳方法是什么?我应该等待第 3 步来标记通话的开始吗?如果客户端忽略 ACK 或网络中丢失带有 ACK 的 UDP 数据报怎么办?
现在我曾经认为没有可靠的方法来确定 SIP 呼叫是否启动。也许我应该使用 Astrisk 频道 API 来跟踪活动呼叫。