2

I am creating a SIP client in java using JAIN SIP.

I have managed to register and send INVITE but when sending the ACK back to the server I am getting error which says:

Cannot Create ACK - no remote Target

I checked the value of Dialog and it is null

In the processResponce(), I get the value it is also null

this.dialog = responseEvent.getClientTransaction().getDialog();

I pass it to ack(responseEvent.getResponse(), dialog)

request =this.dialog.createAck(((CSeqHeader)response.getHeader("CSeq")).getSeqNumber());
dialog.sendAck(request);

Also in the Register() and Call()

this.dialog = inviteTid.getDialog();

the value of dialog is also null here

I also tried

dialog = sipProvider.getNewDialog(inviteID);

but it gives the error as

AUTOMATIC_DIALOG_SUPPORT is on

Do I have to initialize the Dialog or make some more calls to set its Value?

How Do I implement the ACK?

REGISTER sip:SipIP SIP/2.0
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 1 REGISTER
From: <sip:username@SipIP>;tag=1626086046
To: <sip:username@SipIP>
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-33f876b2e3720a123b62c68fc23cfa68
Max-Forwards: 70
Contact: <sip:username@localHost:52216;transport=UDP>
Content-Length: 0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP localHost:52216;branch=z9hG4bK-363935-33f876b2e3720a123b62c68fc23cfa68;received=localHost;rport=52216
From: <sip:username@SipIP>;tag=1626086046
To: <sip:username@SipIP>;tag=as3c3695d2
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 1 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="65dfb3ad"
Content-Length: 0


REGISTER sip:SipIP SIP/2.0
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 2 REGISTER
From: <sip:username@SipIP>;tag=1626086046
To: <sip:username@SipIP>
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-150b07c1e9409d05aafaa7652859024a
Max-Forwards: 70
Contact: <sip:username@localHost:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="65dfb3ad",uri="sip:SipIP",algorithm=MD5,response="b34005eb8ded9180fb5f5667f1ee842d"
Content-Length: 0


---------------------------Registered200--------------------

SIP/2.0 200 OK
Via: SIP/2.0/UDP localHost:52216;branch=z9hG4bK-363935-    150b07c1e9409d05aafaa7652859024a;received=localHost;rport=52216
From: <sip:username@SipIP>;tag=1626086046
To: <sip:username@SipIP>;tag=as3c3695d2
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 2 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Expires: 240
Contact: <sip:username@localHost:52216;transport=UDP>;expires=240
Date: Wed, 22 Apr 2015 23:52:44 GMT
Content-Length: 0


Dialog created: gov.nist.javax.sip.stack.SIPDialog@d15ad713
Dialog: gov.nist.javax.sip.stack.SIPDialog@d15ad713

INVITE sip:SipIP SIP/2.0
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 3 INVITE
From: <sip:username@SipIP>;tag=1626086046
To: <sip:160@SipIP>
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-3d3a34f99499b96c6c1f709065ed4c85
Max-Forwards: 70
Content-Type: application/sdp
Contact: <sip:username@localHost:52216;transport=UDP>
Content-Length: 300

v=0
o=fraunhofer 392867480 292042336 IN IP4 localHost
s=-
c=IN IP4 localHost
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
------------------Invite 401--------------------

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP localHost:52216;branch=z9hG4bK-363935-        3d3a34f99499b96c6c1f709065ed4c85;received=localHost;rport=52216
From: <sip:username@SipIP>;tag=1626086046
To: <sip:160@SipIP>;tag=as3c3695d2
Call-ID: b83eb80b195f6802c283c5927fb6415a@localHost
CSeq: 3 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="4c1d89c8"
Content-Length: 0


-------------------------Dialog:gov.nist.javax.sip.stack.SIPDialog@d15ad713
Dialog get Remote Target: null
javax.sip.SipException: Cannot create ACK - no remote Target!
at gov.nist.javax.sip.stack.SIPDialog.createAck(SIPDialog.java:3021)
at test.ack(test.java:507)
at test.processResponse(test.java:214)
at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:296)
at gov.nist.javax.sip.EventScanner.run(EventScanner.java:519)
at java.lang.Thread.run(Thread.java:745)

New REsponse with Changed Call-ID

REGISTER sip:SIPIP SIP/2.0
Call-ID: 01bb8e9788fc251f8d44f2c709542fa5@LOCALIP
CSeq: 1 REGISTER
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:username@SIPIP>
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-3833-142aff6ad1e359c2b618eba23fa04453
Max-Forwards: 70
Contact: <sip:username@LOCALIP:52216;transport=UDP>
Content-Length: 0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP LOCALIP:52216;branch=z9hG4bK-3833-142aff6ad1e359c2b618eba23fa04453;received=LOCALIP;rport=52216
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:username@SIPIP>;tag=as2e8e5e8d
Call-ID: 01bb8e9788fc251f8d44f2c709542fa5@LOCALIP
CSeq: 1 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="6223df47"
Content-Length: 0


REGISTER sip:SIPIP SIP/2.0
Call-ID: 01bb8e9788fc251f8d44f2c709542fa5@LOCALIP
CSeq: 2 REGISTER
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:username@SIPIP>
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-3833-36d48a4c062bbb9e83db9a12f36414b3
Max-Forwards: 70
Contact: <sip:username@LOCALIP:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="6223df47",uri="sip:SIPIP",algorithm=MD5,response="d4ac55bbc8dacb87f66cf9f4041af03c"
Content-Length: 0


---------------------------Registered200--------------------

SIP/2.0 200 OK
Via: SIP/2.0/UDP LOCALIP:52216;branch=z9hG4bK-3833-36d48a4c062bbb9e83db9a12f36414b3;received=LOCALIP;rport=52216
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:username@SIPIP>;tag=as2e8e5e8d
Call-ID: 01bb8e9788fc251f8d44f2c709542fa5@LOCALIP
CSeq: 2 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Expires: 240
Contact: <sip:username@LOCALIP:52216;transport=UDP>;expires=240
Date: Thu, 23 Apr 2015 08:38:28 GMT
Content-Length: 0


Dialog: createdgov.nist.javax.sip.stack.SIPDialog@977c31a5
INVITE sip:SIPIP SIP/2.0
Call-ID: a86cc90138ad50d9716664b7925cb205@LOCALIP
CSeq: 3 INVITE
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:160@SIPIP>
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-            3833-0db5ef4b4e463aee4fa22c3379915d5e
Max-Forwards: 70
Content-Type: application/sdp
Contact: <sip:username@LOCALIP:52216;transport=UDP>
Content-Length: 300

v=0
o=fraunhofer 392867480 292042336 IN IP4 LOCALIP
s=-
c=IN IP4 LOCALIP
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
------------------Invite 401--------------------

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP LOCALIP:52216;branch=z9hG4bK-   3833-0db5ef4b4e463aee4fa22c3379915d5e;received=LOCALIP;rport=52216
From: <sip:username@SIPIP>;tag=2125326583
To: <sip:160@SIPIP>;tag=as54bd3315
Call-ID: a86cc90138ad50d9716664b7925cb205@LOCALIP
CSeq: 3 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="1e960014"
Content-Length: 0

Call(response)

enterpublic void call(Response response) {
    try {
        cseq++;
        String callee = "160";
        current_process = cseq + "INVITE";
        ArrayList viaHeaders = new ArrayList();
        ViaHeader viaHeader = headerFactory.createViaHeader(localIP,
                rport, "udp", null);
        viaHeader.setRPort();
        viaHeaders.add(viaHeader);
        // The "Max-Forwards" header.
        MaxForwardsHeader maxForwardsHeader = headerFactory.createMaxForwardsHeader(70);
        // The "Call-Id" header.
        CallIdHeader callIdHeader = this.sipProvider.getNewCallId();;
        // The "CSeq" header.
        CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(cseq, "INVITE");

        Address fromAddress = addressFactory.createAddress("sip:"
                + username + '@' + server);

        Address toAddress = addressFactory.createAddress("sip:"+callee+'@'+sipIP);

        FromHeader fromHeader = headerFactory.createFromHeader(
                fromAddress, String.valueOf(this.tag));
        // The "To" header.
        ToHeader toHeader = headerFactory.createToHeader(toAddress,
                null);

        ContentLengthHeader contentLength = headerFactory.createContentLengthHeader(211);
        ContentTypeHeader contentType = headerFactory.createContentTypeHeader("application", "sdp");

        String sdpData = "v=0\n" + 
                "o=user1 795808818 480847547 IN IP4 10.99.70.106\n" + 
                "s=-\n" + 
                "c=IN IP4 10.99.70.106\n" + 
                "t=0 0\n" + 
                "m=audio 8000 RTP/AVP 0 8 101\n" + 
                "a=rtpmap:0 PCMU/8000\n" + 
                "a=rtpmap:8 PCMA/8000\n" + 
                "a=rtpmap:101 telephone-event/8000\n" + 
                "a=sendrecv";
         byte[] contents = sdpData.getBytes();
         this.contactHeader = this.headerFactory
         .createContactHeader(contactAddress);

         URI requestURI = addressFactory.createURI("sip:"
                +callee+ '@'+ server); 

        request = this.messageFactory.createRequest(requestURI, Request.INVITE, 
                callIdHeader,cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwardsHeader, contentType, contents);

        request.addHeader(contactHeader);
        request.addHeader(contentLength);
        test listener =this;
        if (response != null) {
            boolean retry = true;
            System.out.println("DEBUG: Response: "+response);
        }
        listener.inviteTid = sipProvider.getNewClientTransaction(request);


        if(dialog!= null && logger.isDebugEnabled()){
            logger.debug("Obtain dialog from ClientTransaction: automatic dialog support on");
//              System.out.println("Obtain dialog from ClientTransaction: automatic dialog support on");
        }
        if(dialog == null){
            //Automatic Dialog support turned off

            dialog = sipProvider.getNewDialog(inviteTid);

        }
        System.out.println("Dialog: created" + dialog);
        // send the request out.
        listener.inviteTid.sendRequest();

        this.dialog = this.inviteTid.getDialog();
 //         System.out.println("Dialog:" + dialog);

        // Send the request statelessly through the SIP provider.
        // this.sipProvider.sendRequest(request);
        System.out.println(request.toString());
        // Display the message in the text area.
        logger.debug("Request sent:\n" + "\n\n");
    } catch (Exception e) {
        // If an error occurred, display the error.
        e.printStackTrace();
        logger.debug("Request sent failed: " + e.getMessage() + "\n");
    }
}

log for Cannot Create ACK - no remote Target

enter REGISTER sip:localIP SIP/2.0
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 1 REGISTER
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-0dd0a58b853bb23070f706fc3b058461
Max-Forwards: 70
Contact: <sip:username@10.99.136.136:52216;transport=UDP>
Content-Length: 0


-----------StatusCode:401----------------------------
-----------currentREsponse:Unauthorized----------------------------
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-    363735-0dd0a58b853bb23070f706fc3b058461;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>;tag=as78941717
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 1 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="49a39764"
Content-Length: 0


REGISTER sip:localIP SIP/2.0
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 2 REGISTER
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-0a214e6d4a1bc50c0faf1657cf109e31
Max-Forwards: 70
Contact: <sip:username@10.99.136.136:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="49a39764",uri="sip:localIP",algorithm=MD5,response="1af91bd8169339ec8c77decfab59fd21"
Content-Length: 0


-----------StatusCode:200----------------------------
-----------currentREsponse:OK----------------------------
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-    363735-0a214e6d4a1bc50c0faf1657cf109e31;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>;tag=as78941717
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 2 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Expires: 240
Contact: <sip:username@10.99.136.136:52216;transport=UDP>;expires=240
Date: Fri, 24 Apr 2015 16:58:50 GMT
Content-Length: 0


---------------------------Registered: 200--------------------

SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-0a214e6d4a1bc50c0faf1657cf109e31;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>;tag=as78941717
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 2 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Expires: 240
Contact: <sip:username@10.99.136.136:52216;transport=UDP>;expires=240
Date: Fri, 24 Apr 2015 16:58:50 GMT
Content-Length: 0


DEBUG: Response: SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-    363735-0a214e6d4a1bc50c0faf1657cf109e31;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:username@localIP>;tag=as78941717
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 2 REGISTER
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Expires: 240
Contact: <sip:username@10.99.136.136:52216;transport=UDP>;expires=240
Date: Fri, 24 Apr 2015 16:58:50 GMT
Content-Length: 0


Dialog: createdgov.nist.javax.sip.stack.SIPDialog@393895ed
INVITE sip:160@localIP SIP/2.0
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 3 INVITE
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-312eacb8db309d6c6794e2eb7adf8b92
Max-Forwards: 70
Content-Type: application/sdp
Contact: <sip:username@10.99.136.136:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="49a39764",uri="sip:localIP",algorithm=MD5,response="1af91bd8169339ec8c77decfab59fd21"
Content-Length: 211

v=0
o=user1 795808818 480847547 IN IP4 localIP
s=-
c=IN IP4 localIP
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv


Request OPTIONSreceived at stackwith server transaction idnull
-----------StatusCode:401----------------------------
-----------currentREsponse:Unauthorized----------------------------
------------------Invite 401--------------------

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-    363735-312eacb8db309d6c6794e2eb7adf8b92;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as4f6f7f78
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 3 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="7e048345"
Content-Length: 0


DEBUG: Response: SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-312eacb8db309d6c6794e2eb7adf8b92;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as4f6f7f78
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 3 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="7e048345"
Content-Length: 0


Dialog: createdgov.nist.javax.sip.stack.SIPDialog@393895ed
INVITE sip:160@localIP SIP/2.0
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 4 INVITE
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-dae4419c9405bb40dda573fe9c276518
Max-Forwards: 70
Content-Type: application/sdp
Contact: <sip:username@10.99.136.136:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="49a39764",uri="sip:localIP",algorithm=MD5,response="1af91bd8169339ec8c77decfab59fd21"
Content-Length: 211

v=0
o=user1 795808818 480847547 IN IP4 localIP
s=-
c=IN IP4 localIP
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
-----------StatusCode:401----------------------------
-----------currentREsponse:Unauthorized----------------------------
------------------Invite 401--------------------

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-1a2fd8de5c389de950ecbb1a3d9a7d3e;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as22472833
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 4 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="599cd63b"
Content-Length: 0


DEBUG: Response: SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-1a2fd8de5c389de950ecbb1a3d9a7d3e;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as22472833
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 4 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
WWW-Authenticate: Digest algorithm=MD5,realm="xyz.com",nonce="599cd63b"
Content-Length: 0


Dialog: createdgov.nist.javax.sip.stack.SIPDialog@393895ed
INVITE sip:160@localIP SIP/2.0
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-633d808b788771fa1e211672ddc3e903
Max-Forwards: 70
Content-Type: application/sdp
Contact: <sip:username@10.99.136.136:52216;transport=UDP>
Authorization: Digest username="username",realm="xyz.com",nonce="49a39764",uri="sip:localIP",algorithm=MD5,response="1af91bd8169339ec8c77decfab59fd21"
Content-Length: 211

v=0
o=user1 795808818 480847547 IN IP4 localIP
s=-
c=IN IP4 localIP
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=sendrecv
-----------StatusCode:401----------------------------
-----------currentREsponse:Unauthorized----------------------------
-----------StatusCode:100----------------------------
-----------currentREsponse:Trying----------------------------
------------------- Status Code: 100--------------------------
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Length: 0


-----------StatusCode:401----------------------------
-----------currentREsponse:Unauthorized----------------------------


Request OPTIONSreceived at stackwith server transaction idnull
-----------StatusCode:180----------------------------
-----------currentREsponse:Ringing----------------------------

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as78f593d4
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Length: 0

-


Request OPTIONSreceived at stackwith server transaction idnull


Request OPTIONSreceived at stackwith server transaction idnull


Request OPTIONSreceived at stackwith server transaction idnull
-----------StatusCode:200----------------------------
-----------currentREsponse:OK----------------------------
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as78f593d4
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Type: application/sdp
Content-Length: 256

v=0
o=root 698934329 698934329 IN IP4 localIP
s=Asterisk PBX 10.5.1
c=IN IP4 localIP
t=0 0
m=audio 23142 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

javax.sip.SipException: Cannot create ACK - no remote Target!
    at gov.nist.javax.sip.stack.SIPDialog.createAck(SIPDialog.java:3021)
    at test.processResponse(test.java:323)
    at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:296)
    at gov.nist.javax.sip.EventScanner.run(EventScanner.java:519)
    at java.lang.Thread.run(Thread.java:745)
-----------StatusCode:200----------------------------
-----------currentREsponse:OK----------------------------
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as78f593d4
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Type: application/sdp
Content-Length: 256

v=0
o=root 698934329 698934329 IN IP4 localIP
s=Asterisk PBX 10.5.1
c=IN IP4 localIP
t=0 0
m=audio 23142 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

javax.sip.SipException: Cannot create ACK - no remote Target!
    at gov.nist.javax.sip.stack.SIPDialog.createAck(SIPDialog.java:3021)
    at test.processResponse(test.java:323)
    at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:296)
    at gov.nist.javax.sip.EventScanner.run(EventScanner.java:519)
    at java.lang.Thread.run(Thread.java:745)
-----------StatusCode:200----------------------------
-----------currentREsponse:OK----------------------------
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as78f593d4
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Type: application/sdp
Content-Length: 256

v=0
o=root 698934329 698934329 IN IP4 localIP
s=Asterisk PBX 10.5.1
c=IN IP4 localIP
t=0 0
m=audio 23142 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

javax.sip.SipException: Cannot create ACK - no remote Target!
    at gov.nist.javax.sip.stack.SIPDialog.createAck(SIPDialog.java:3021)
    at test.processResponse(test.java:323)
    at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:296)
    at gov.nist.javax.sip.EventScanner.run(EventScanner.java:519)
    at java.lang.Thread.run(Thread.java:745)


Request OPTIONSreceived at stackwith server transaction idnull
-----------StatusCode:200----------------------------
-----------currentREsponse:OK----------------------------
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.99.136.136:52216;branch=z9hG4bK-363735-a872936256c40065a4b147d4981cc74a;received=10.99.136.136;rport=52216
From: <sip:username@localIP>;tag=1825098223
To: <sip:160@localIP>;tag=as78f593d4
Call-ID: 5fd6c07f15259d4aaeabdfb9e306cd12@10.99.136.136
CSeq: 5 INVITE
Server: Asterisk PBX 10.5.1
Allow: INVITE,ACK,CANCEL,OPTIONS,BYE,REFER,SUBSCRIBE,NOTIFY,INFO,PUBLISH
Supported: replaces,timer
Contact: <sip:160@localIP:5060>
Content-Type: application/sdp
Content-Length: 256

v=0
o=root 698934329 698934329 IN IP4 localIP
s=Asterisk PBX 10.5.1
c=IN IP4 localIP
t=0 0
m=audio 23142 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=silenceSupp:off - - - -
a=ptime:20
a=sendrecv

javax.sip.SipException: Cannot create ACK - no remote Target!
    at gov.nist.javax.sip.stack.SIPDialog.createAck(SIPDialog.java:3021)
    at test.processResponse(test.java:323)
    at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:296)
    at gov.nist.javax.sip.EventScanner.run(EventScanner.java:519)
    at java.lang.Thread.run(Thread.java:745)




Request OPTIONSreceived at stackwith server transaction idnull


Request BYEreceived at stackwith server transaction idnull
----------------Received a BYE-----------------------
 null TID


Request BYEreceived at stackwith server transaction idnull
----------------Received a BYE-----------------------
 null TID


Request BYEreceived at stackwith server transaction idnull
----------------Received a BYE-----------------------
     null TID
gourig
  • 81
  • 1
  • 11
  • Perhaps try `this.dialog = responseEvent.getDialog();` I see in the documentation: *"This method separates transaction support from dialog support. This enables application developers to access the dialog associated to this event without having to query the transaction associated to the event. For example the transaction associated with the event may return 'null' because the final response for the transaction has already been received and the stack has no more record of the transaction"* – jsantander Apr 22 '15 at 22:19
  • Yes I tried it the dialog was not null but the dialog.getRemoteTarget() or dialog.getRemoteTag() returns null and I need to createAck() – gourig Apr 22 '15 at 22:41
  • Now that you posted the messages, I see that's an error response (401): You don't need to explicitly ACK the final error responses, JAIN SIP implementation does it for you, see my answer below. BTW, the INVITE should initiate a new dialog (different Call-ID than the REGISTER). – jsantander Apr 23 '15 at 04:55
  • Ok. My apologies in the delay in answering. I had to find the time to write a working example and test in my environment. Since it is kind of long, I've tried to provide the most relevant excerpts in a new answer. – jsantander Apr 28 '15 at 14:48

2 Answers2

2

For a final error response, JAIN SIP implementation should take care of sending the ACK for you. See for example at SipListener.processResponse() javadoc:

A UAC needs to send an ACK for every final Response it receives, however the procedure for sending the ACK depends on the type of Response. For final responses between 300 and 699, the ACK processing is done by the transaction layer i.e. handled by the implementation. For 2xx responses, the ACK processing is done by the UAC application, to guarantee the three way handshake of an INVITE transaction

For a 200 OK, you have to explicitly send the ACK, and the procedure will be to get the this.dialog = responseEvent.getDialog();. That dialog will have remote target and remote tag.


Updating the answer with the new problems.

  1. You were trying to send an ACK for the 200 OK of the REGISTER. This is wrong. ACK is only used when a reliable answer is required. Currently INVITE is the only SIP Method that requires it.

  2. When you send the INVITE you get a 401 Unauthorized response back. It seems that your SIP Proxy is configured to require authorization of INVITE. You solve that in the same way as with the REGISTER:

    • You send the INVITE and receive a 401 Unathorized back. Look for the WWW-Authenticate header for the challenge.
    • The JAIN SIP stack will take care of the ACK for the final response.
    • Sent the INVITE again within the same Call-ID, this time with the Authorization header, responding to the challenge.
jsantander
  • 4,972
  • 16
  • 27
  • Hi even when i getDialog after 200 OK for Register, I am still getting a null – gourig Apr 23 '15 at 08:19
  • why do you want to send an ACK for a REGISTER? – jsantander Apr 23 '15 at 08:32
  • aah ohk. But after Receiving 200 OK for Register. I make INVITE, and the INVITE sends Unauthorized. Is the problem with INVITE then? – gourig Apr 23 '15 at 08:37
  • @gourig, Might be because you are sending the INVITE within the same Dialog (Call-ID) as the REGISTER. – jsantander Apr 23 '15 at 08:38
  • No i changed the Call -Id. I'll paste the new Responses. – gourig Apr 23 '15 at 08:41
  • @gourig, the Request-URI in the INVITE is funny: `sip:SIPIP`, try with the SIP URI of the party you are trying to contact (it might be the one you have in the To: `sip:160@SIPIP` – jsantander Apr 23 '15 at 08:52
  • I somehow deleted it I think , I added it back but still same error. I am adding my call(). – gourig Apr 23 '15 at 09:06
  • @gourig.... Then you might need to a) either check the configuration of your SIP Server... (seem to be Asterisk... found this googling for configuration options `;insecure=invite ; Do not require authentication of incoming INVITEs`) b) or you need to perform authentication for the outgoing INVITE... so you should proceed in the same way as for the REGISTER, sending back the Authorization header.... – jsantander Apr 23 '15 at 09:22
  • I cannot change configuration for the server. I added the authorization to the Invite but it says unauthorized. but when I use a Java application I can connect and make calls. I am adding the log of this application. In the log I see that the client is sending a Ok to the server after Registration. I didnt not understand it. Also after the first INVITE was unauthorized it send an ACK. – gourig Apr 23 '15 at 10:55
  • Hi I sent a request with Authentication helper and now it works. Thank you for your support :) – gourig Apr 23 '15 at 11:54
  • Hi the invite worked. I can make the call and once I pick up the call I get a SIP 200 OK for INVITE but i still get Cannot create ACK - no remote Target! And since I cannot Acknowledge I receive a Bye. – gourig Apr 24 '15 at 17:17
  • Hi gourig, i am currently stuck in sending an ACK for the 200 OK response. I am able to send it, but the receive doesnt receive it or some sort. Any help from your side? – Nikhil Kumar Jan 31 '18 at 07:02
  • @jsantander Can you please provide any comments on my previous comment? Thanks a lot. – Nikhil Kumar Jan 31 '18 at 07:04
  • @Nihil Kumar, I guess it will be best if you post a full question. – jsantander Feb 02 '18 at 11:53
2

Let's try to be a bit more detailed.

What I've done is to take the sample UAC Code available in the JAIN SIP 1.2 download at JAIN SIP's Jenkins and modify it to cover both the REGISTER and an initial INVITE.

I've tested with an IMS core, so it might be slightly different from your experience with an Asterisk PBX, in particular I don't have to authenticate the INVITEs.

In terms of high level structure, I have:

One single class (TestUAC) that is both the main class and implements the SipListener interface.

  1. On main, I initialize the stack, setup the listeners, read any configuration, and finally I call a sendRegister() that will send the first REGISTER and initiate the process.
  2. On processResponse() callback. Based on the method of the CSeq of the response, I candistinguish between:
    • Responses to the REGISTER (processRegisterResponse())
    • Responses to the INVITE (processInviteResponse())
    • Responses to a BYE (processByeResponse())
  3. On processRequest() and the other callbacks I just have traces.

In general, I keep little information around as object attributes:

  • Stack stuff: references to sipFactory, sipProvider, sipStack, addressFactory, messageFactory, headerFactory
  • Info about my identification and who I'd like to talk to:

For example

   private String callingURI;
   private String calledURI;
   private String username;
   private String password;
   private Address fromNameAddress;
   private ContactHeader contactHeader;

Also I keep an incrementing counter for the cseq and (following the JAIN SIP example) a copy of the ackRequest to be used to reply to retransmitted 200 OK.

// Save the created ACK request, to respond to retransmitted 2xx
private Request ackRequest;

private long cseq=1L;

As I said, the processResponse() just distributes based on the CSeq method:

public void processResponse(ResponseEvent responseReceivedEvent) {
    System.out.println("Got a response");
    Response response = (Response) responseReceivedEvent.getResponse();
    CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);

    System.out.println("Response received : Status Code = "
            + response.getStatusCode() + " " + cseq);

    try {
        if(cseq.getMethod().equals(Request.REGISTER)) {
            processRegisterResponse(responseReceivedEvent);
        }
        else if(cseq.getMethod().equals(Request.INVITE)) {
            processInviteResponse(responseReceivedEvent);
        }
        else if(cseq.getMethod().equals(Request.BYE)) {
            processByeResponse(responseReceivedEvent);
        }
        else {
            System.out.println("Response to unexpected request");
        }
    } catch(Exception e)  {
        e.printStackTrace();
    }
}

The processRegisterResponse() distinguishes between the 401 Unauthorized and 200 OK responses. In the first case it will trigger sending the REGISTER with authentication. In the second case it will request to send the INVITE:

private void processRegisterResponse(ResponseEvent responseReceivedEvent) throws TransactionUnavailableException, ParseException, InvalidArgumentException, SipException, NoSuchAlgorithmException {
    Response response = (Response) responseReceivedEvent.getResponse();

    if(response.getStatusCode() == Response.UNAUTHORIZED) {
        sendRegister(response);
    }
    else if (response.getStatusCode() == Response.OK) {
        contactHeader=(ContactHeader)response.getHeader(ContactHeader.NAME);
        sendInvite();
    }               
}

Now, for the sendInvite() (I'll try to distill it to the relevant parts).

private void sendInvite() throws ParseException, InvalidArgumentException, TransactionUnavailableException, SipException {

    // create To Header
    URI toAddress = addressFactory.createURI(calledURI);
    Address toNameAddress = addressFactory.createAddress(toAddress);
    ToHeader toHeader = headerFactory.createToHeader(toNameAddress,null);

    FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, "12345");
    // Create ViaHeaders
    ArrayList<ViaHeader> viaHeaders = getViaHeaders();

    // Create a new CallId header
    CallIdHeader callIdHeader = sipProvider.getNewCallId();

    // Create a new Cseq header
    CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(cseq,Request.INVITE);
    cseq++;

    // Create a new MaxForwardsHeader
    MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70);

    // Create the request.
    Request request = messageFactory.createRequest(toAddress,
            Request.INVITE, callIdHeader, cSeqHeader, fromHeader,
            toHeader, viaHeaders, maxForwards);

    request.addHeader(contactHeader);

    // at this point you should add the rest of the headers, content, etc.

    // Create the client transaction.
    ClientTransaction currentTid = sipProvider.getNewClientTransaction(request);
    // send the request out.
    currentTid.sendRequest();
}

Finally, the next thing that will happen is that we will receive the 200 OK for the INVITE. This is mostly code from the JAIN SLEE example that I've moved around into the processInviteResponse() (again I'll try to distill it to the basic).

private void processInviteResponse(ResponseEvent responseReceivedEvent) throws SipException, InvalidArgumentException {
    Response response = (Response) responseReceivedEvent.getResponse();
    ClientTransaction tid = responseReceivedEvent.getClientTransaction();
    CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);     
    Dialog dialog = responseReceivedEvent.getDialog();

    if (tid == null) {
        // RFC3261: MUST respond to every 2xx
        if (ackRequest!=null && dialog!=null) {
            System.out.println("re-sending ACK");
            dialog.sendAck(ackRequest);
        }
        return;
    }

    if (response.getStatusCode() == Response.OK) {
        System.out.println("Dialog after 200 OK  " + dialog);
        System.out.println("Dialog State after 200 OK  " + dialog.getState());
        ackRequest = dialog.createAck(cseq.getSeqNumber() );
        System.out.println("Sending ACK");
        dialog.sendAck(ackRequest);
    }
}

After receiving the 200 OK and sending the ACK you should probably consider what to do next: for example, in the JAIN SLEE UAC example, it starts a TimerTask to send a BYE after some time.

You can add also the handling of other error (or provisional) responses there. But remember that the stack will ACK automatically (no code needed) the final error response.

jsantander
  • 4,972
  • 16
  • 27
  • I did not handle the response correctly For INVITE so I got the error. Now it works as you explained. But I still have some doubts, why does the TimerTask send a Bye even though I add the Contents and type in the request . Do I still need ti handle it? – gourig Apr 29 '15 at 16:42
  • @gourig, the JAIN Example uses a TimerTask to close the call after some time.... It explicitly creates and schedules the task after sending the ACK, but you don't have to do it. If you have more questions, you should probably start a new question... this one is already too convoluted. – jsantander Apr 29 '15 at 16:46