2015-04-22 7 views
1

Я создаю клиент SIP в java, используя JAIN SIP.SIP ACK Dialog is null

мне удалось зарегистрировать и отправить сообщение INVITE, но при отправке ACK обратно на сервер я получаю сообщение об ошибке, которая говорит:

Cannot Create ACK - no remote Target 

Я проверил значение диалога и является недействительным

В processResponce(), я получаю значение также нуль

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

я передать его Ack (responseEvent.getResponse(), диалоговое)

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

Кроме того, в реестре() и вызова()

this.dialog = inviteTid.getDialog(); 

значение диалога также нуль здесь

Я также попытался

dialog = sipProvider.getNewDialog(inviteID); 

но дает ошибку as

AUTOMATIC_DIALOG_SUPPORT is on 

Должен ли я инициализировать диалоговое окно или сделать несколько звонков, чтобы установить его значение?

Как реализовать ACK?

REGISTER sip:SipIP SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
From: <sip:[email protected]>;tag=1626086046 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-33f876b2e3720a123b62c68fc23cfa68 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=1626086046 
To: <sip:[email protected]>;tag=as3c3695d2 
Call-ID: [email protected] 
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: [email protected] 
CSeq: 2 REGISTER 
From: <sip:[email protected]>;tag=1626086046 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-150b07c1e9409d05aafaa7652859024a 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=1626086046 
To: <sip:[email protected]>;tag=as3c3695d2 
Call-ID: [email protected] 
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:[email protected]:52216;transport=UDP>;expires=240 
Date: Wed, 22 Apr 2015 23:52:44 GMT 
Content-Length: 0 


Dialog created: [email protected] 
Dialog: [email protected] 

INVITE sip:SipIP SIP/2.0 
Call-ID: [email protected] 
CSeq: 3 INVITE 
From: <sip:[email protected]>;tag=1626086046 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP localHost:52216;rport;branch=z9hG4bK-363935-3d3a34f99499b96c6c1f709065ed4c85 
Max-Forwards: 70 
Content-Type: application/sdp 
Contact: <sip:[email protected]: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:[email protected]>;tag=1626086046 
To: <sip:[email protected]>;tag=as3c3695d2 
Call-ID: [email protected] 
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:[email protected] 
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) 

Новый пенчато Changed Call-ID

REGISTER sip:SIPIP SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
From: <sip:[email protected]>;tag=2125326583 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-3833-142aff6ad1e359c2b618eba23fa04453 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=2125326583 
To: <sip:[email protected]>;tag=as2e8e5e8d 
Call-ID: [email protected] 
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: [email protected] 
CSeq: 2 REGISTER 
From: <sip:[email protected]>;tag=2125326583 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-3833-36d48a4c062bbb9e83db9a12f36414b3 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=2125326583 
To: <sip:[email protected]>;tag=as2e8e5e8d 
Call-ID: [email protected] 
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:[email protected]:52216;transport=UDP>;expires=240 
Date: Thu, 23 Apr 2015 08:38:28 GMT 
Content-Length: 0 


Dialog: [email protected] 
INVITE sip:SIPIP SIP/2.0 
Call-ID: [email protected] 
CSeq: 3 INVITE 
From: <sip:[email protected]>;tag=2125326583 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP LOCALIP:52216;rport;branch=z9hG4bK-   3833-0db5ef4b4e463aee4fa22c3379915d5e 
Max-Forwards: 70 
Content-Type: application/sdp 
Contact: <sip:[email protected]: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:[email protected]>;tag=2125326583 
To: <sip:[email protected]>;tag=as54bd3315 
Call-ID: [email protected] 
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 

вызовов (ответ)

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"); 
    } 
} 

журнал для Невозможно создать ACK - отсутствие дистанционного Target

enter REGISTER sip:localIP SIP/2.0 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
From: <sip:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-0dd0a58b853bb23070f706fc3b058461 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78941717 
Call-ID: [email protected] 
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: [email protected] 
CSeq: 2 REGISTER 
From: <sip:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-0a214e6d4a1bc50c0faf1657cf109e31 
Max-Forwards: 70 
Contact: <sip:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78941717 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78941717 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78941717 
Call-ID: [email protected] 
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:[email protected]:52216;transport=UDP>;expires=240 
Date: Fri, 24 Apr 2015 16:58:50 GMT 
Content-Length: 0 


Dialog: [email protected] 
INVITE sip:[email protected] SIP/2.0 
Call-ID: [email protected] 
CSeq: 3 INVITE 
From: <sip:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-312eacb8db309d6c6794e2eb7adf8b92 
Max-Forwards: 70 
Content-Type: application/sdp 
Contact: <sip:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as4f6f7f78 
Call-ID: [email protected] 
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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as4f6f7f78 
Call-ID: [email protected] 
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: [email protected] 
INVITE sip:[email protected] SIP/2.0 
Call-ID: [email protected] 
CSeq: 4 INVITE 
From: <sip:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-dae4419c9405bb40dda573fe9c276518 
Max-Forwards: 70 
Content-Type: application/sdp 
Contact: <sip:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as22472833 
Call-ID: [email protected] 
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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as22472833 
Call-ID: [email protected] 
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: [email protected] 
INVITE sip:[email protected] SIP/2.0 
Call-ID: [email protected] 
CSeq: 5 INVITE 
From: <sip:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Via: SIP/2.0/UDP 10.99.136.136:52216;rport;branch=z9hG4bK-363735-633d808b788771fa1e211672ddc3e903 
Max-Forwards: 70 
Content-Type: application/sdp 
Contact: <sip:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]> 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78f593d4 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78f593d4 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78f593d4 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78f593d4 
Call-ID: [email protected] 
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:[email protected]: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:[email protected]>;tag=1825098223 
To: <sip:[email protected]>;tag=as78f593d4 
Call-ID: [email protected] 
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:[email protected]: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 
+0

Возможно, попробуйте 'this.dialog = responseEvent.getDialog();' Я вижу в документации: * "Этот метод отделяет поддержку транзакций от поддержки диалога. Это позволяет разработчикам приложений обращаться к диалоговому окну, связанному с этим событием, без запроса транзакция, связанная с событием. Например, транзакция, связанная с событием, может возвращать «null», потому что окончательный ответ для транзакции уже получен, и в стеке больше нет записи транзакции »* – jsantander

+0

Да, я попробовал это диалоговое окно не было null, но dialog.getRemoteTarget() или dialog.getRemoteTag() возвращает null, и мне нужно создатьAck() – gourig

+0

Теперь, когда вы отправили сообщения, я вижу, что это ответ об ошибке (401): вам не нужно явно указывать ACK - окончательные ответы об ошибках, реализация JAIN SIP - это для вас, см. Мой ответ ниже. BTW, INVITE должен инициировать новый диалог (другой Call-ID, чем REGISTER). – jsantander

ответ

1

Давайте попробуем немного подробнее.

Что я сделал, это взять образец кода UAC, доступный в JAIN SIP 1.2, скачать на JAIN SIP's Jenkins и изменить его, чтобы охватить как РЕГИСТР, так и начальное INVITE.

Я проверил с ядром IMS, поэтому он может немного отличаться от вашего опыта работы с АТС Asterisk, в частности, мне не нужно аутентифицировать INVITE.

С точки зрения высокой структуры уровня, у меня есть:

один класс (TestUAC), который является как основной класс и реализует интерфейс SipListener.

  1. На главном, я инициализировать стек, настройку слушателей, прочитать любую конфигурацию, и, наконец, вызвать sendRegister(), который будет отправлять первый регистр и инициировать процесс.
  2. processResponse() callback. На основе способа по CSeq ответа, я candistinguish между:
    • Ответы на REGISTER (processRegisterResponse())
    • Ответы на INVITE (processInviteResponse())
    • Ответы на BYE (processByeResponse())
  3. На processRequest() и других обратных вызовах у меня остались только следы.

В общем, я держу мало информации вокруг, как атрибуты объекта:

  • Stack материалы: ссылки на sipFactory, sipProvider, sipStack, addressFactory, messageFactory, headerFactory
  • Информация о моей идентификации и кто я 'd хотели бы поговорить с:

Например,

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

Кроме того, я сохраняю счетчик приращений для cseq и (по примеру JAIN SIP) копию ackRequest, которая будет использоваться для ответа на повторную передачу 200 OK.

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

private long cseq=1L; 

Как я сказал, processResponse() просто распределяет основанный на методе CSeq:

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(); 
    } 
} 

processRegisterResponse() различает 401 Несанкционированное и 200 OK ответов. В первом случае это приведет к отправке REGISTER с аутентификацией. Во втором случае он будет просить, чтобы отправить сообщение 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(); 
    }    
} 

Теперь для sendInvite() (я буду стараться, чтобы отогнать его к соответствующим частям).

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(); 
} 

И, наконец, следующее, что произойдет, это то, что мы получим 200 OK для INVITE. Это в основном код из примера JAIN SLEE, который я переместил в processInviteResponse() (опять же я попытаюсь перевести его на базовый).

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); 
    } 
} 

После получения 200 OK и отправки ACK вы, вероятно, следует рассмотреть, что делать дальше, например, в примере JAIN SLEE UAC, он начинает TimerTask послать BYE через какое-то время.

Вы можете добавить и обработку других сообщений об ошибках (или предварительных) там. Но помните, что стек автоматически активирует (не требует кода) окончательный ответ об ошибке.

+0

Я не обработал ответ правильно. Для INVITE так что я получил ошибку. Теперь это работает, как вы объяснили. Но у меня все еще есть некоторые сомнения, почему TimerTask отправляет Bye, хотя я добавляю содержимое и печатаю в запросе. Должен ли я все еще обращаться с ним? – gourig

+0

@gourig, пример JAIN использует TimerTask для закрытия вызова через некоторое время ... Он явно создает и планирует задачу после отправки ACK, но вам не нужно это делать. Если у вас больше вопросов, вы, вероятно, должны начать новый вопрос ... этот уже слишком запутан. – jsantander

+0

ok Я создаю новый вопрос. :) – gourig

1

Для окончательный ответ об ошибке, реализация JAIN SIP должна позаботьтесь о том, чтобы отправить ACK для вас. Смотри, например, на SipListener.processResponse() Javadoc:

ОАК необходимо отправить ACK для каждого окончательного ответа, он получает однако процедура для отправки ACK зависит от типа Response. Для окончательных ответов от 300 до 699 обработка ACK выполняется с помощью уровня транзакции, то есть обрабатываемого реализацией. Для 2xx ответов, обработка ACK осуществляется путем применения UAC, гарантировать три рукопожатия из инвайтой сделки

Для 200 OK, вы должны явно отправить ACK, и процедура будет , чтобы получить this.dialog = responseEvent.getDialog();. Это диалоговое окно будет иметь удаленный целевой и удаленный тег.


Обновление ответа с новыми проблемами.

  1. Вы пытались отправить ACK для 200 OK РЕГИСТРА. Это не верно. ACK используется только тогда, когда требуется надежный ответ. В настоящее время INVITE - это единственный метод SIP, который требует этого.

  2. Когда вы отправляете INVITE, вы получаете 401 неуполномоченный ответ. Кажется, что ваш SIP-прокси настроен на авторизацию INVITE. Вы решаете это так же, как и с РЕГИСТРАТОРОМ:

    • Вы отправляете INVITE и получаете 401 Unathorized назад. Посмотрите заголовок WWW-Authenticate для вызова.
    • Стек JAIN SIP позаботится об ACK для окончательного ответа.
    • Отправил INVITE снова в пределах того же Call-ID, на этот раз с заголовком авторизации, отвечая на вызов.
+0

Привет, даже когда я getDialog после 200 OK для регистрации, я все еще получаю null – gourig

+0

, почему вы хотите отправить ACK для РЕГИСТРА? – jsantander

+0

aah ohk. Но после получения 200 OK для регистрации. Я делаю INVITE, а INVITE отправляет Unauthorized. Тогда возникает ли проблема с INVITE? – gourig