I need to implement next flow using SIP servlets:
1) My SIP Servlet should catch INVITE message 2) Look on SIP TO header, and if it match by some pattern I need comeback REFER message.
I google it, and found this manual (Basic Transfer): www.dialogic.com/webhelp/IMG1010/10.5.1/WebHelp/sip_rfr_calltrans.htm
As I understood correctly, this flow looks like bellow: 1) userA send INVITE message to SIP App 2) SIP App should send 200 OK back 3) UserA sending ACK message 4) SIP App send REFER message to UserA 5) UserA should send back 202Accepted and than NOTIFY
My enviroment:
1) mss-2.0.0.FINAL-jboss-as-7.1.2.Final as SIP PROXY Server 127.0.0.1:5080
2) [email protected]:5060 --- MicroSIP (http://www.microsip.org/)
3) [email protected]:5090 --- Zoiper_Free_2.41
DAR File:
INVITE:("org.call.forwarding.CallForward","DAR:From","ORIGINATING","","NO_ROUTE", "0")
REGISTER:("org.call.forwarding.CallForward","DAR:From", "ORIGINATING", "", "NO_ROUTE", "0")
SUBSCRIBE:("org.call.forwarding.CallForward","DAR:From","ORIGINATING","","NO_ROUTE", "0")
OPTIONS:("org.call.forwarding.CallForward","DAR:From","ORIGINATING", "", "NO_ROUTE", "0")
NOTIFY:("org.call.forwarding.CallForward", "DAR:From", "ORIGINATING", "", "NO_ROUTE", "0")
REFER:("org.call.forwarding.CallForward", "DAR:From", "ORIGINATING", "", "NO_ROUTE", "0")
From [email protected] I calling to [email protected]
So my source code looks like bellow: 1) Catching INVITE package and make 200 OK response:
@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
And my response: 200 OK Respnose like bellow:
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
Then I trying to process ACK package and generate REFER package:
@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
And my REFER package:
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
Then I see at log file TRYING message:
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
And after ~30 secs I see that Microsip show "Not Acceptable" message:
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
Can any body explaine: whats wrong with this guy??? Also another point that blow my brain: in some cases after sending 200 OK message (when I processed INVITE) I immediatly recive BYE message before ACK... Why its happens?
It looks like in your REFER header that your Contact and CallID does not link up with your original ACK and 200OK messages. So that's why you are getting a 100 Trying eventually because there is no outstanding message waiting for any sort of response.