2014-07-20 1 views
0

Astreisk와 SIP 클라이언트 (모든 softphone) 사이에있는 간단한 SIP 프록시 응용 프로그램을 작성하고 있습니다. 응용 프로그램의 목적은 통화 시간을 계산하는 것입니다. 이하SIP 호출이 시작될 때 알아내는 방법

일정한 흐름의 예이다

  1. 클라이언트 SIP-프록시 INVITE를 전송하고, SIP-프록시는 200 OK와
  2. 별표 답변 아스 테 리스크 INVITE 재전송, SIP-프록시 클라이언트 OK (200)을 다시 보낸다.
  3. 클라이언트가 ACK로 응답하면 SIP-Proxy는 별표로 ACK를 다시 보냅니다.
  4. 당사자 중 하나가 BYE를 보낼 때마다 대화가 완료되어야합니다.

2 단계에서 호출이 시작되었다고 가정합니다 (예 : rtp 미디어 플로우가 시작됨). 그런 다음 BYE 메시지가 호출 기간을 계산할 때까지 기다립니다. 그러나 일부 고객은 3 단계와 4 단계로 이동하지 않는다는 것을 알았습니다. 2 단계 이후에는 어떤 당사자로부터도 통화 종료 알림을받지 못했습니다. 이러한 통화의 기간은 무한합니다.

RTP 플로우를 스니핑하지 않고 SIP 통화의 시작/중지 시간을 찾는 가장 좋은 방법은 무엇입니까? 통화 시작을 표시하려면 3 단계를 기다려야합니까? 클라이언트가 ACK를 생략하거나 네트워크에서 ACK가있는 UDP 데이터 그램을 놓친 경우 어떻게됩니까?

지금은 SIP 통화가 시작되었음을 알 수있는 신뢰할만한 방법이 없다고 생각했습니다. 어쩌면 활성 통화를 추적하는 대신 Astrisk 채널 API를 사용해야합니다.

답변

0

또 다른 옵션은 RE-INVITE를 생성하여 세션의 존재를 테스트하는 것입니다. 타이머 등을 협상하지 않아도됩니다. 다시 초대를 사용하면 도움이 될 수 있습니다. 미디어 변경이 발생하지 않도록 SDP를 재사용하십시오. 그러나 응용 프로그램이 응용 프로그램 서버가되는 경로에서 Proxy가 아닌 다른 곳으로 이동하고 있습니다.

또한이 재 요청 요청에 대해 지속 시간을 가장 가까운 간격으로 제한 할 수 있으며 호출이 해제 된 정확한 시간 일 필요는 없습니다.

+0

마지막으로 debugig 이후에 나는 BYE 패킷이 재전송으로 인해 손실되었을 때 발생한다는 것을 알아 냈습니다. 예를 들어 우리가 10 초 동안의 네트워크 스파이크를 가지면, 바이 패킷은 손실됩니다. 내가 1-2 분 동안 다시 초대하면 전화가 아직 살아 있는지 확인하는 데 도움이됩니까? – user12384512

+0

예를 들어, Re-INvite를 주기적으로 ping하면 원격 서버에서 호출의 유무를 확인할 수 있습니다. 모두 응답하지 않거나 481/408로 회신 할 수 있습니다. 어느 경우이든 전화를 끊을 수 있습니다. – Rajesh

0

프록시가 경로 헤더를 사용하여 메시지 경로에 자신을 추가하지 않기 때문에 문제가 SIP 수준 인 것으로 보입니다. 이 프로세스는 Record Routing입니다. 그렇게하면 대화 상자의 모든 후속 요청도이를 통과합니다 (ACK 및 BYE 포함).

SIP 프록시를 작성하여 휠을 재발 명하면 안됩니다. 예를 들어, 생각할 수있는 가능한 시나리오를 만들기 위해 오픈 소스, 유연하고 강력하며 완벽하게 사용자 정의 할 수있는 SIP 프록시를 사용할 수 있습니다. OpenSIPS!

관련 문제