мне нужно реализовать следующий поток с использованием SIP-сервлет:Java SIP сервлет, как отправить СМОТРИТЕ сообщение
1) Мой SIP Servlet должны поймать INVITE сообщения 2) Посмотрите на SIP в заголовке, и если он соответствует некоторым pattern Мне нужно возвратить сообщение REFER.
Я Google, и нашел это руководство (Basic Transfer): www.dialogic.com/webhelp/IMG1010/10.5.1/WebHelp/sip_rfr_calltrans.htm
Как я правильно понял, то этот поток выглядит сильфоном : 1) USERA отправить INVITE сообщение для SIP App 2) SIP-App должен отправить 200 OK назад 3) UserA посылает ACK сообщение 4) SIP-приложение отправить REFER сообщение для UserA 5) UserA должен послать назад 202Accepted и чем NOTIFY
My enviroment:
1) mss-2.0.0.FINAL-jboss-as-7.1.2.Final в качестве SIP-прокси-сервер 127.0.0.1:5080
2) [email protected]: 5060 --- MicroSIP (http://www.microsip.org/)
3) [email protected]: 5090 --- Zoiper_Free_2.41
DAR Файл:
INVITE :("org.call.forwarding.CallForward", "ДАР: От",» ORIGINATING "," "," NO_ROUTE "," 0 ")
REGISTER :(" org.call.forwarding.CallForward "," DAR: From "," ORIGINATI «NO», «0»)
SUBSCRIBE: ")
OPTIONS :(" org.call.forwarding.CallForward " "DAR: От", "составляемых", "", "NO_ROUTE", "0")
УВЕДОМИТЬ :(" орг. «0»)
REFER :(«org.call.forwarding.CallForward», «DAR: From», «DAR: From», «ORIGINATING», «», «NO_ROUTE», «0») , "ORIGINATING", "", "NO_ROUTE", "0")
Fro m [email protected] Я звоню в [email protected]
Так мой исходный код выглядит как ниже: 1) Ловля INVITE пакет и сделать 200 OK ответ:
@Override
protected void doInvite(SipServletRequest request) throws Exception {
// Pattern match logic ommited
SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);
String str = response.toString();
response.send()
}
INVITE sip:[email protected]:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPjb1570e34df4c442093af6fb2fa238667;received=127.0.0.1
Max-Forwards: 70
From: "user3" <sip:[email protected]>;tag=87be8901c4e242fbb5c696d90d0ec068
To: <sip:[email protected]>
Contact: "user3" <sip:[email protected]:5060;ob>
Call-ID: 983d9572c4a541d49566699b3edec1e0
CSeq: 22256 INVITE
Allow: PRACK,INVITE,ACK,BYE,CANCEL,UPDATE,INFO,SUBSCRIBE,NOTIFY,REFER,MESSAGE,OPTIONS
Supported: replaces,100rel,timer,norefersub
Session-Expires: 1800
Min-SE: 90
User-Agent: MicroSIP/3.3.21
Content-Type: application/sdp
Content-Length: 673
И мой ответ: 200 OK Respnose как ниже:
SIP/2.0 200 OK
To: <sip:[email protected]>;tag=25395207_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPjb1570e34df4c442093af6fb2fa238667;received=127.0.0.1
CSeq: 22256 INVITE
Call-ID: 983d9572c4a541d49566699b3edec1e0
From: "user3" <sip:[email protected]>;tag=87be8901c4e242fbb5c696d90d0ec068
Contact: <sip:127.0.0.1:5080>
Content-Length: 0
Тогда Я пытаюсь обработать пакет ACK и создать пакет REFER:
@Override
protected void doAck(SipServletRequest request) throws ServletException, IOException {
String ack = request.toString();
logger.info("Got ASK!!!: " + request.toString());
SipFactory sipFactory = (SipFactory) getServletContext().getAttribute(SIP_FACTORY);
SipApplicationSession appSession = request.getApplicationSession();
SipServletRequest refer = sipFactory.createRequest(appSession, "REFER",
sipFactory.createURI("sip:[email protected]:5080"), // from sipFactory.createURI("sip:[email protected]:5090")); // to
refer.addHeader("Refer-To", "sip:[email protected]:5080");
refer.addHeader("Referred-By", "sip:[email protected]:5080");
logger.info("!!!!!!!!!!!THIS IS REFER: \n" + refer.toString());
String strRefer = refer.toString();
refer.send();
}
ACK sip:127.0.0.1:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPje03842cfb4104d379db989f2d77a871a;received=127.0.0.1
Max-Forwards: 70
From: "user3" <sip:[email protected]>;tag=87be8901c4e242fbb5c696d90d0ec068
To: <sip:[email protected]>;tag=25395207_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Call-ID: 983d9572c4a541d49566699b3edec1e0
CSeq: 22256 ACK
Content-Length: 0
, и мой СМОТРИТЕ пакет:
REFER sip:[email protected]:5090 SIP/2.0
Call-ID: [email protected]
CSeq: 1 REFER
From: <sip:[email protected]:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
To: <sip:[email protected]:5090>
Max-Forwards: 70
Contact: <sip:[email protected]:5080>
Refer-To: <sip:[email protected]:5080>
Referred-By: <sip:[email protected]:5080>
Content-Length: 0
Затем я вижу в лог-файл ПЫТАЮТСЯ сообщение:
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK8479416b-da5c-4dca-baef- f9b7db279b9e_da1be872_1872624593941
To: <sip:[email protected]:5090>
From: <sip:[email protected]:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Call-ID: [email protected]
CSeq: 1 REFER
Content-Length: 0
И после ~ 30 секунд я вижу, что Microsip шоу "Не Приемлемое" сообщение:
SIP/2.0 408 Request timeout
To: <sip:[email protected]:5090>;tag=37903989_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK8479416b-da5c-4dca-baef-f9b7db279b9e_da1be872_1872624593941
CSeq: 1 REFER
Call-ID: [email protected]
From: <sip:[email protected]:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Contact: <sip:127.0.0.1:5080>
Content-Length: 0
Может ли любое тело объяснить: что случилось с этим парнем ??? Еще один момент, который взорвал мой мозг: в некоторых случаях после отправки сообщения 200 OK (когда я обрабатывал INVITE) я немедленно возвращал сообщение BYE перед ACK ... Почему это происходит?