You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VoIP.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package model;
  7. import gov.nist.javax.sip.DialogTimeoutEvent;
  8. import gov.nist.javax.sip.SipListenerExt;
  9. import java.net.InetAddress;
  10. import java.text.ParseException;
  11. import java.util.*;
  12. import java.util.logging.Level;
  13. import java.util.logging.Logger;
  14. import javax.sip.DialogTerminatedEvent;
  15. import javax.sip.IOExceptionEvent;
  16. import javax.sip.InvalidArgumentException;
  17. import javax.sip.ListeningPoint;
  18. import javax.sip.RequestEvent;
  19. import javax.sip.ResponseEvent;
  20. import javax.sip.SipException;
  21. import javax.sip.SipFactory;
  22. import javax.sip.SipProvider;
  23. import javax.sip.SipStack;
  24. import javax.sip.TimeoutEvent;
  25. import javax.sip.TransactionTerminatedEvent;
  26. import javax.sip.address.*;
  27. import javax.sip.header.*;
  28. import javax.sip.message.*;
  29. /**
  30. *
  31. * @author Normal
  32. */
  33. public class VoIP implements SipListenerExt
  34. {
  35. SipFactory sipFactory; // Used to access the SIP API.
  36. SipStack sipStack; // The SIP stack.
  37. SipProvider sipProvider; // Used to send SIP messages.
  38. MessageFactory messageFactory; // Used to create SIP message factory.
  39. HeaderFactory headerFactory; // Used to create SIP headers.
  40. AddressFactory addressFactory; // Used to create SIP URIs.
  41. ListeningPoint listeningPoint; // SIP listening IP address/port.
  42. Properties properties; // Other properties.
  43. private int counter;
  44. private int myPort = 5060;
  45. private String myName = "129";
  46. private String protocolTyp = "UDP";
  47. private String myIPAddress;
  48. int tag = (new Random()).nextInt();
  49. private int branch = hashCode();
  50. Address contactAddress;
  51. private ContactHeader contactHeader;
  52. public VoIP() //Konstruktor für eigene Daten
  53. {
  54. try
  55. {
  56. //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren
  57. String abc = InetAddress.getLocalHost().getHostAddress();
  58. this.myIPAddress = InetAddress.getLocalHost().getHostAddress();
  59. this.sipFactory = SipFactory.getInstance();
  60. this.sipFactory.setPathName("gov.nist");
  61. this.properties = new Properties();
  62. this.properties.setProperty("javax.sip.STACK_NAME", "stack");
  63. this.sipStack = this.sipFactory.createSipStack(this.properties);
  64. this.messageFactory = this.sipFactory.createMessageFactory();
  65. this.headerFactory = this.sipFactory.createHeaderFactory();
  66. this.addressFactory = this.sipFactory.createAddressFactory();
  67. this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp);
  68. this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint);
  69. this.sipProvider.addSipListener(this);
  70. this.contactAddress = this.addressFactory.createAddress("sip:129@" + this.myIPAddress+ ":" + this.myPort); //+ ":" + this.myPort
  71. this.contactHeader = this.headerFactory.createContactHeader(contactAddress);
  72. }
  73. catch (Exception e)
  74. {
  75. System.out.println("Shit");
  76. System.exit(-1);
  77. }
  78. }
  79. public int hashCode()
  80. {
  81. int temp = tag*(new Random(100)).nextInt();
  82. return temp;
  83. }
  84. public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException
  85. {
  86. System.out.println("-----------SendRegister-----------");
  87. Address addressto = this.addressFactory.createAddress("sip:192.168.100.11"); //evtl. mit Port: sip:192.168.100.11:5060
  88. Address addresstob = this.addressFactory.createAddress("sip:192.168.100.11"); //to get example maybe needed
  89. ToHeader to = this.headerFactory.createToHeader(addresstob, null); // Integer.toString(tag) address + tag
  90. URI requestURI = addressto.getURI();
  91. CallIdHeader callId = this.sipProvider.getNewCallId();
  92. FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress
  93. ArrayList via = new ArrayList(); //Via needs a List as input
  94. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch));
  95. via.add(viaheader);
  96. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "REGISTER");
  97. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  98. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  99. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  100. //Create Request Header
  101. System.out.println("----REQUEST HEADER----");
  102. Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
  103. request.addHeader(contactHeader);
  104. request.addHeader(allow);
  105. request.addHeader(expire);
  106. System.out.println(request);
  107. this.sipProvider.sendRequest(request);
  108. }
  109. @Override
  110. public void processDialogTimeout(DialogTimeoutEvent timeoutEvent)
  111. {
  112. }
  113. @Override
  114. public void processRequest(RequestEvent requestEvent)
  115. {
  116. System.out.println("----Bekomme Anfrage----");
  117. if ((Request.OPTIONS).equals(requestEvent.getRequest().getMethod()))
  118. {
  119. System.out.println("200 OK zu Server");
  120. try
  121. {
  122. Response response = this.messageFactory.createResponse(200,requestEvent.getRequest());
  123. response.addHeader((ViaHeader)requestEvent.getRequest().getHeader("Via"));
  124. response.addHeader((FromHeader)requestEvent.getRequest().getHeader("From"));
  125. response.addHeader((ToHeader)requestEvent.getRequest().getHeader("To"));
  126. response.addHeader((CallIdHeader)requestEvent.getRequest().getHeader("Call-ID"));
  127. response.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq"));
  128. //Kontakt Header
  129. response.addHeader(contactHeader);
  130. //Accept Header für application/sdp
  131. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  132. AllowEventsHeader allowevents = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info");
  133. response.addHeader((CallIdHeader)requestEvent.getRequest().getHeader("Call-ID"));
  134. response.addHeader(allow);
  135. response.addHeader(allowevents);
  136. this.sipProvider.sendResponse(response);
  137. }
  138. catch (ParseException | SipException ex)
  139. {
  140. Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex);
  141. }
  142. }
  143. else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod()))
  144. {
  145. System.out.println("Hab invitation bekommen");
  146. System.out.println("Gleich antworte ich");
  147. try
  148. {
  149. //Trying
  150. Response responsetry = this.messageFactory.createResponse(100,requestEvent.getRequest());
  151. responsetry.addHeader((ViaHeader)requestEvent.getRequest().getHeader("Via"));
  152. responsetry.addHeader((FromHeader)requestEvent.getRequest().getHeader("From"));
  153. responsetry.addHeader((ToHeader)requestEvent.getRequest().getHeader("To"));
  154. responsetry.addHeader((CallIdHeader)requestEvent.getRequest().getHeader("Call-ID"));
  155. responsetry.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq"));
  156. SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer"); //nachschauen
  157. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  158. responsetry.addHeader(supp);
  159. responsetry.addHeader(allow);
  160. this.sipProvider.sendResponse(responsetry);
  161. System.out.println("Trying ist raus");
  162. //Ringing
  163. Response responsering = this.messageFactory.createResponse(180,requestEvent.getRequest());
  164. responsering.addHeader((ViaHeader)requestEvent.getRequest().getHeader("Via"));
  165. responsering.addHeader((FromHeader)requestEvent.getRequest().getHeader("From"));
  166. ToHeader temptoring = (ToHeader)requestEvent.getRequest().getHeader("To");
  167. temptoring.setTag(String.valueOf(this.tag+Math.random())); //evtl. besseren Tag
  168. responsering.addHeader(temptoring);
  169. responsering.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq"));
  170. responsering.addHeader(contactHeader);
  171. responsering.addHeader(supp);
  172. responsering.addHeader(allow);
  173. AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold");// für was gebraucht
  174. responsering.addHeader(allowevent);
  175. this.sipProvider.sendResponse(responsering);
  176. System.out.println("Response ist raus");
  177. //Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP)
  178. //Sdp Header erstellen nächster Schritt
  179. ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp");
  180. }
  181. catch (ParseException | SipException ex)
  182. {
  183. Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex);
  184. }
  185. }
  186. else if ((Request.ACK).equals(requestEvent.getRequest().getMethod()))
  187. {
  188. }
  189. }
  190. @Override
  191. public void processResponse(ResponseEvent responseEvent)
  192. {
  193. System.out.println("---Response---");
  194. //System.out.println(responseEvent.getResponse());
  195. if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED)
  196. {
  197. try {
  198. Address addresstob = this.addressFactory.createAddress("sip:129@192.168.100.11"); //"sip:Jan@192.168.100.11"
  199. ToHeader temp = (ToHeader)responseEvent.getResponse().getHeader("To");
  200. ToHeader to = this.headerFactory.createToHeader(addresstob, temp.getTag()); // Integer.toString(tag) address + tag
  201. URI requestURI = addresstob.getURI();
  202. //CallIdHeader tempcall = (CallIdHeader)responseEvent.getResponse().getHeader("Call-ID");
  203. CallIdHeader callId = (CallIdHeader)responseEvent.getResponse().getHeader("Call-ID");
  204. FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress
  205. //set Authorization header evtl. user Name benutzen den es gibt
  206. WWWAuthenticateHeader abc = (WWWAuthenticateHeader)responseEvent.getResponse().getHeader("WWW-Authenticate");
  207. AuthorizationHeader auth = this.headerFactory.createAuthorizationHeader("Digest");//was kommt in den string
  208. auth.setRealm(abc.getRealm());
  209. auth.setNonce(abc.getNonce());
  210. Address addresstest = this.addressFactory.createAddress("sip:"+myName+"@192.168.100.11"); //vielleicht passwort setzen "sip:"+myName+":\"\"@192.168.100.11"
  211. auth.setURI(addresstest.getURI());
  212. auth.setUsername(myName);
  213. ArrayList via = new ArrayList(); //Via needs a List as input
  214. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch+2));// String.valueOf(hashCode())string branch
  215. via.add(viaheader);
  216. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(2L, "REGISTER");
  217. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  218. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  219. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  220. //Zusätzliche Register Header nach Unauthorzied
  221. //Create Request Header
  222. System.out.println("----REQUEST HEADER2----");
  223. Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
  224. request.addHeader(contactHeader);
  225. request.addHeader(allow);
  226. request.addHeader(expire);
  227. request.addHeader(auth);
  228. //System.out.println(request);
  229. this.sipProvider.sendRequest(request);
  230. }
  231. catch (ParseException | SipException |InvalidArgumentException ex) {
  232. Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex);
  233. }
  234. }
  235. else if (responseEvent.getResponse().getStatusCode() == Response.OK)
  236. {
  237. //System.out.println("responseEvent.getResponse()" + responseEvent.getResponse());
  238. System.out.println("Server hat Registrierung akzeptiert");
  239. }
  240. }
  241. @Override
  242. public void processTimeout(TimeoutEvent timeoutEvent)
  243. {
  244. }
  245. @Override
  246. public void processIOException(IOExceptionEvent exceptionEvent)
  247. {
  248. }
  249. @Override
  250. public void processTransactionTerminated(
  251. TransactionTerminatedEvent transactionTerminatedEvent)
  252. {
  253. }
  254. @Override
  255. public void processDialogTerminated(
  256. DialogTerminatedEvent dialogTerminatedEvent)
  257. {
  258. }
  259. }