Astraisk と SIP クライアント (任意のソフトフォン) の間に立つ単純な SIP プロキシ アプリケーションを作成しています。アプリケーションの目的は、通話時間を計算することです。
以下は通常の流れの例です。
- クライアントは INVITE を SIP プロキシに送信し、SIP プロキシは INVITE をアスタリスクに再送信します。
- アスタリスクは 200 OK で応答し、SIP プロキシは 200 OK をクライアントに再送信します。
- クライアントは ACK で応答し、SIP プロキシは ACK をアスタリスクに再送信します。
- いずれかの当事者が BYE を送信するたびに、会話は終了する必要があります。
ステップ 2 では、コールが開始されたと仮定します (たとえば、rtp メディア フローが開始されます)。次に、BYE メッセージが通話時間を計算するのを待ちます。ただし、一部のクライアントはステップ 3 と 4 に進まないことに気付きました。ステップ 2 の後で、どの当事者からも通話終了通知が受信されません。そのような通話の期間は無限です。
RTP フローをスニッフィングせずに、SIP コールの開始/終了時間を確認する最良の方法は何ですか? 手順 3 で通話の開始をマークするまで待つ必要がありますか? クライアントが ACK を省略した場合、または ACK を含む UDP データグラムがネットワークで失われた場合はどうなりますか?
今のところ、SIP コールが開始されたことを確認する信頼できる方法はないと考えていました。アクティブな通話を追跡するには、代わりに Astrisk チャネル API を使用する必要があるかもしれません。