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.

SIPmodel.java 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  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 gui.Hauptfenster;
  10. import java.net.InetAddress;
  11. import java.text.ParseException;
  12. import java.util.*;
  13. import java.util.logging.Level;
  14. import java.util.logging.Logger;
  15. import javax.sdp.SdpException;
  16. import javax.sdp.SdpFactory;
  17. import javax.sdp.SessionDescription;
  18. import javax.sip.DialogTerminatedEvent;
  19. import javax.sip.IOExceptionEvent;
  20. import javax.sip.InvalidArgumentException;
  21. import javax.sip.ListeningPoint;
  22. import javax.sip.RequestEvent;
  23. import javax.sip.ResponseEvent;
  24. import javax.sip.SipException;
  25. import javax.sip.SipFactory;
  26. import javax.sip.SipProvider;
  27. import javax.sip.SipStack;
  28. import javax.sip.TimeoutEvent;
  29. import javax.sip.TransactionTerminatedEvent;
  30. import javax.sip.address.*;
  31. import javax.sip.header.*;
  32. import javax.sip.message.*;
  33. import logger.OhmLogger;
  34. /**
  35. *
  36. * @author Jan komplettes Model für SIPmodel evtl. Vererbung und für jeden SIP
  37. * Response/Request eigene Klasse oder Interface da es langsam unübersichtlich
  38. * wird :( ACK schicken muss noch ergänzt werden BYE muss noch ergänzt werden.
  39. */
  40. public class SIPmodel implements SipListenerExt
  41. {
  42. Hauptfenster view; //später entfernen wegen Zugriff
  43. public static final Logger lg = OhmLogger.getLogger();
  44. public SipFactory sipFactory; // Used to access the SIP API.
  45. public SipStack sipStack; // The SIP stack.
  46. public SipProvider sipProvider; // Used to send SIP messages.
  47. public MessageFactory messageFactory; // Used to create SIP message factory.
  48. public HeaderFactory headerFactory; // Used to create SIP headers.
  49. public AddressFactory addressFactory; // Used to create SIP URIs.
  50. public ListeningPoint listeningPoint; // SIP listening IP address/port.
  51. public Properties properties; // Other properties.
  52. private String[][] codecs; //unterstütze Codecs[RTP-Parameter][CodecBezeichnung]
  53. public int myPort = 5060;
  54. public String myName = "129";
  55. public String protocolTyp = "UDP";
  56. public String myIPAddress;
  57. public String proxyAddress;
  58. public CallIdHeader callID;
  59. Boolean invite; //Bool für SDP falls ich anrufe
  60. //Hilfsvariablen wenn ich angerufen werde. evtl. noch optimieren
  61. RequestEvent evtWerdeAngerufen;
  62. Boolean werdeAngerufen;
  63. private int countWerdeAngerufen;
  64. public long cSequenz = 1;
  65. public String proxyTag;
  66. public int myTag = (new Random()).nextInt();
  67. public int branch = hashCode();
  68. public Address contactAddress;
  69. public ContactHeader contactHeader;
  70. public SIPmodel(Hauptfenster view) //Konstruktor für eigene Daten
  71. {
  72. this.view = view;
  73. invite = true;
  74. proxyAddress = "";
  75. countWerdeAngerufen = 0;
  76. evtWerdeAngerufen = null;
  77. werdeAngerufen = false;
  78. codecs = new String[4][2]; // Alle unterstützen Codecs eintragen
  79. codecs[0][0] = "0";
  80. codecs[0][1] = "PCMU/8000";
  81. codecs[1][0] = "4";
  82. codecs[1][1] = "G723/8000";
  83. codecs[2][0] = "8";
  84. codecs[2][1] = "PCMA/8000";
  85. codecs[3][0] = "18";
  86. codecs[3][1] = "G729/8000";
  87. try
  88. {
  89. //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren
  90. String abc = InetAddress.getLocalHost().getHostAddress();
  91. this.myIPAddress = InetAddress.getLocalHost().getHostAddress();
  92. this.sipFactory = SipFactory.getInstance();
  93. this.sipFactory.setPathName("gov.nist");
  94. this.properties = new Properties();
  95. this.properties.setProperty("javax.sip.STACK_NAME", "stack");
  96. this.sipStack = this.sipFactory.createSipStack(this.properties);
  97. this.messageFactory = this.sipFactory.createMessageFactory();
  98. this.headerFactory = this.sipFactory.createHeaderFactory();
  99. this.addressFactory = this.sipFactory.createAddressFactory();
  100. this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp);
  101. this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint);
  102. this.sipProvider.addSipListener(this);
  103. //this.contactAddress = this.addressFactory.createAddress("sip:129@" + this.myIPAddress + ":" + this.myPort); //+ ":" + this.myPort
  104. this.contactAddress = this.addressFactory.createAddress("sip:" + myName + "@" + this.myIPAddress + ":" + this.myPort);
  105. this.contactHeader = this.headerFactory.createContactHeader(contactAddress);
  106. }
  107. catch (Exception e)
  108. {
  109. System.out.println("Fehler bei Initialisierung eigener Addresse");
  110. System.exit(-1);
  111. }
  112. }
  113. public int hashCode()
  114. {
  115. int temp = myTag * (new Random(100)).nextInt();
  116. return temp;
  117. }
  118. public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException
  119. {
  120. lg.info("Vorbereiten des Registrierungs Headers");
  121. proxyAddress = serverIP + ":" + serverPort;
  122. Address addressto = this.addressFactory.createAddress("sip:" + proxyAddress); //evtl. mit Port: sip:192.168.100.11:5060
  123. ToHeader to = this.headerFactory.createToHeader(addressto, null); // Integer.toString(myTag) address + myTag
  124. URI requestURI = addressto.getURI();
  125. CallIdHeader callId = this.sipProvider.getNewCallId();
  126. FromHeader from = this.headerFactory.createFromHeader(addressto, String.valueOf(this.myTag)); //this.contactAddress
  127. ArrayList via = new ArrayList(); //Via needs a List as input
  128. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch));
  129. via.add(viaheader);
  130. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "REGISTER");
  131. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  132. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  133. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  134. Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
  135. request.addHeader(contactHeader);
  136. request.addHeader(allow);
  137. request.addHeader(expire);
  138. this.sipProvider.sendRequest(request);
  139. lg.info("Erfolgreiches Senden der Registrierung");
  140. }
  141. public void sendInvitation(String sipaddresse, String proxyaddresse,
  142. int serverPort) throws ParseException, InvalidArgumentException, SipException, SdpException
  143. {
  144. invite = true;
  145. Address addressto = this.addressFactory.createAddress("sip:" + sipaddresse + "@" + proxyaddresse);
  146. ToHeader to = this.headerFactory.createToHeader(addressto, null); // Integer.toString(myTag) address + myTag
  147. URI requestURI = addressto.getURI();
  148. callID = this.sipProvider.getNewCallId();
  149. FromHeader from = this.headerFactory.createFromHeader(addressto, String.valueOf(this.myTag)); //this.contactAddress
  150. ArrayList via = new ArrayList(); //Via needs a List as input
  151. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch));
  152. via.add(viaheader);
  153. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(cSequenz, "INVITE");
  154. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  155. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  156. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  157. Request request = this.messageFactory.createRequest(requestURI, "INVITE", callID, cSeq, from, to, via, maxForwards);
  158. request.addHeader(contactHeader);
  159. request.addHeader(allow);
  160. request.addHeader(expire);
  161. ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp");
  162. request.addHeader(content);
  163. request.setContent(createSDPHeader(null), content);
  164. this.sipProvider.sendRequest(request);
  165. lg.info("Erfolgreiches Senden der Invitation");
  166. }
  167. @Override
  168. public void processRequest(RequestEvent requestEvent)
  169. {
  170. lg.info("Bekomme Anfrage");
  171. if ((Request.OPTIONS).equals(requestEvent.getRequest().getMethod())) //Options Anfrage von Server nach erfolgreicher Registrierung
  172. {
  173. lg.info("Option Request von Server, erstellen 200 OK zu Server");
  174. try
  175. {
  176. this.sipProvider.sendResponse(create200Ok(requestEvent));
  177. view.getTxtArea().append("Server Option Request erfolgreich beantwortet\n");
  178. lg.info("Erfolgreiches senden des Headers");
  179. }
  180. catch (ParseException | SipException ex)
  181. {
  182. lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);
  183. }
  184. }
  185. //Aktive Kommunikation
  186. else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer
  187. {
  188. try
  189. {
  190. this.sipProvider.sendResponse(create180Ringing(requestEvent));
  191. view.getTxtArea().append("Ringing geschickt\n");
  192. }
  193. catch (Exception ex)//Exceptions evtl. genauer definieren
  194. {
  195. lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);
  196. }
  197. countWerdeAngerufen++; //bessere Lösung muss her!!, was schickt andere User oder Proxy bei nicht erreichen
  198. FromHeader abc = (FromHeader) requestEvent.getRequest().getHeader("From");
  199. evtWerdeAngerufen = requestEvent;
  200. System.out.println(countWerdeAngerufen);
  201. if (countWerdeAngerufen < 7)
  202. {
  203. werdeAngerufen = true;
  204. lg.info("Hab Invitation bekommen");
  205. view.getTxtArea().append("Werde von " + abc.getAddress() + " angerufen\n");
  206. }
  207. else
  208. {
  209. werdeAngerufen = false;
  210. lg.info("Leider waren Sie nicht erreichbar");
  211. view.getTxtArea().append("Sie waren nicht erreichbar\n");
  212. countWerdeAngerufen = 0;
  213. }
  214. }
  215. else if ((Request.ACK).equals(requestEvent.getRequest().getMethod()))
  216. {
  217. }
  218. else if ((Request.CANCEL).equals(requestEvent.getRequest().getMethod()))
  219. {
  220. view.getTxtArea().append("Anruf wurde gecancelt");
  221. try
  222. {
  223. //Cancel Request -> Response 200 Ok + Response 487 Request Terminated
  224. //200 Ok
  225. werdeAngerufen = false;
  226. evtWerdeAngerufen = null; // sicher ist sicher
  227. this.sipProvider.sendResponse(create200Ok(requestEvent));
  228. view.getTxtArea().append("Anrufender canceld Anfrage\n");
  229. lg.info("Erfolgreiches senden des 200 OkHeaders auf CancelAnfrage");
  230. //487 Request Terminated
  231. }
  232. catch (ParseException | SipException ex)
  233. {
  234. Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);
  235. }
  236. }
  237. else if ((Request.BYE).equals(requestEvent.getRequest().getMethod()))
  238. {
  239. try
  240. {
  241. this.sipProvider.sendResponse(create200Ok(requestEvent));
  242. }
  243. catch (Exception ex)
  244. {
  245. }
  246. }
  247. }
  248. @Override
  249. public void processResponse(ResponseEvent responseEvent)
  250. {
  251. System.out.println("---Response---");
  252. //System.out.println(responseEvent.getResponse());
  253. if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED)
  254. {
  255. try
  256. {
  257. Address addresstob = this.addressFactory.createAddress("sip:" + myName + "@" + proxyAddress);
  258. ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To");
  259. ToHeader to = this.headerFactory.createToHeader(addresstob, temp.getTag()); // Integer.toString(myTag) address + myTag
  260. URI requestURI = addresstob.getURI();
  261. CallIdHeader callId = (CallIdHeader) responseEvent.getResponse().getHeader("Call-ID");
  262. FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.myTag)); //this.contactAddress
  263. WWWAuthenticateHeader wwwauth = (WWWAuthenticateHeader) responseEvent.getResponse().getHeader("WWW-Authenticate");
  264. //wird bei AuthorizationHeader wirklich alles benötigt? war glaub nur mal Test -> testen!!
  265. AuthorizationHeader auth = this.headerFactory.createAuthorizationHeader("Digest");//was kommt in den string
  266. auth.setRealm(wwwauth.getRealm());
  267. auth.setNonce(wwwauth.getNonce());
  268. //Address addresstest = this.addressFactory.createAddress("sip:" + myName + "@192.168.100.11"); //vielleicht passwort setzen "sip:"+myName+":\"\"@192.168.100.11"
  269. Address addresstest = this.addressFactory.createAddress("sip:" + myName + "@" + proxyAddress);
  270. auth.setURI(addresstest.getURI());
  271. auth.setUsername(myName);
  272. ArrayList via = new ArrayList(); //Via needs a List as input
  273. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch + 2));// String.valueOf(hashCode())string branch
  274. via.add(viaheader);
  275. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(2L, "REGISTER");
  276. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  277. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  278. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  279. //Zusätzliche Register Header nach Unauthorzied
  280. //Create Request Header
  281. Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
  282. request.addHeader(contactHeader);
  283. request.addHeader(allow);
  284. request.addHeader(expire);
  285. request.addHeader(auth);
  286. this.sipProvider.sendRequest(request);
  287. view.getTxtArea().append("Erfolgreich registriert\n");
  288. }
  289. catch (ParseException | SipException | InvalidArgumentException ex)
  290. {
  291. lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);
  292. }
  293. }
  294. else if (responseEvent.getResponse().getStatusCode() == Response.OK)
  295. {
  296. lg.info("Erfolgreichen Response (200 OK) bekommen");
  297. }
  298. else if (responseEvent.getResponse().getStatusCode() == Response.RINGING)
  299. {
  300. ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To");
  301. proxyTag = temp.getTag();
  302. }
  303. }
  304. public Response create200Ok(RequestEvent requestEvent) throws ParseException
  305. {
  306. Response response = this.messageFactory.createResponse(200, requestEvent.getRequest());
  307. response.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via"));
  308. response.addHeader((FromHeader) requestEvent.getRequest().getHeader("From"));
  309. response.addHeader((ToHeader) requestEvent.getRequest().getHeader("To"));
  310. response.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID"));
  311. response.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
  312. response.addHeader(contactHeader);
  313. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  314. AllowEventsHeader allowevents = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info");
  315. response.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID"));
  316. response.addHeader(allow);
  317. response.addHeader(allowevents);
  318. return response;
  319. }
  320. public Response create180Ringing(RequestEvent requestEvent) throws ParseException, SipException
  321. {
  322. Response responsering = this.messageFactory.createResponse(180, requestEvent.getRequest());
  323. responsering.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via"));
  324. responsering.addHeader((FromHeader) requestEvent.getRequest().getHeader("From"));
  325. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  326. //Bei Ringing muss persönlicher Tag ergänzt werden
  327. ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To");
  328. proxyTag = temptoring.getTag();
  329. temptoring.setTag(String.valueOf(this.myTag));
  330. responsering.addHeader(temptoring);
  331. cSequenz = ((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")).getSeqNumber();
  332. responsering.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
  333. responsering.addHeader(contactHeader);
  334. responsering.addHeader(allow);
  335. AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info");// für was gebraucht
  336. responsering.addHeader(allowevent);
  337. return responsering;
  338. }
  339. public SIPmodel()
  340. {
  341. }
  342. public SessionDescription createSDPHeader(ArrayList<String> reqSDP) throws SdpException
  343. {
  344. SdpFactory sdpFactory = SdpFactory.getInstance();
  345. SessionDescription sessionDescription = sdpFactory.createSessionDescription();
  346. sessionDescription.setOrigin(sdpFactory.createOrigin(myName, 8000, 8000, "IN", "IP4", myIPAddress));
  347. sessionDescription.setSessionName(sdpFactory.createSessionName("SIP Call"));
  348. sessionDescription.setConnection(sdpFactory.createConnection("IN", "IP4", myIPAddress));
  349. //Media Body
  350. Vector mediavec = new Vector();
  351. String cods[] = new String[codecs.length];
  352. System.out.println("System out: " + codecs.length);
  353. for (int i = 0; i < cods.length; i++)//Übertragung der RTP-Values in neues Array
  354. {
  355. cods[i] = codecs[i][0];
  356. }
  357. mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", cods)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..)
  358. mediavec.add(sdpFactory.createAttribute("sendrecv", null));
  359. if (invite = true)
  360. {
  361. for (int i = 0; i == codecs[0].length; i++)
  362. {
  363. System.out.println("Codecs: " + codecs[i][0] + " " + codecs[i][1]);
  364. mediavec.add(sdpFactory.createAttribute("rtpmap", codecs[i][0] + " " + codecs[i][1]));
  365. }
  366. }
  367. else//Vergleich von eigenen Codecs mit Codecs der anruft -> Rückgabe entsprechend wählen
  368. {
  369. boolean temp = true; //evtl noch was besseres da so erster Codec nicht bester verwendet wird
  370. for (int i = 0; i == codecs[0].length; i++)
  371. {
  372. if (codecs[i][1].equals(reqSDP) && temp == true)
  373. {
  374. mediavec.add(sdpFactory.createAttribute("rtpmap", "8 G711a/8000"));
  375. temp = false;
  376. }
  377. }
  378. }
  379. sessionDescription.setAttributes(mediavec);
  380. return sessionDescription;
  381. }
  382. public void annehmen() //Fehlende Bedingung
  383. {
  384. RequestEvent requestEvent;
  385. if ((requestEvent = evtWerdeAngerufen) != null && werdeAngerufen == true)
  386. {
  387. countWerdeAngerufen = 0;
  388. try
  389. {
  390. callID = (CallIdHeader) requestEvent.getRequest().getHeader("Call-ID");
  391. //Trying Message to Server (Response Trying)
  392. Response responsetry = this.messageFactory.createResponse(100, requestEvent.getRequest());
  393. responsetry.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via"));
  394. responsetry.addHeader((FromHeader) requestEvent.getRequest().getHeader("From"));
  395. responsetry.addHeader((ToHeader) requestEvent.getRequest().getHeader("To"));
  396. responsetry.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID"));
  397. responsetry.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
  398. CSeqHeader tempcs = (CSeqHeader) requestEvent.getRequest().getHeader("Cseq");
  399. tempcs.getSeqNumber();
  400. SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer"); //nachschauen
  401. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  402. responsetry.addHeader(supp);
  403. responsetry.addHeader(allow);
  404. this.sipProvider.sendResponse(responsetry);
  405. view.getTxtArea().append("Trying geschickt\n");
  406. lg.info("Trying ist raus");
  407. //Ringing Message to Server (Responste Ringing)
  408. Response responsering = this.messageFactory.createResponse(180, requestEvent.getRequest());
  409. responsering.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via"));
  410. responsering.addHeader((FromHeader) requestEvent.getRequest().getHeader("From"));
  411. ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To");
  412. String tempTag = String.valueOf(this.myTag + Math.random());
  413. temptoring.setTag(tempTag); //evtl. besseren Tag
  414. responsering.addHeader(temptoring);
  415. responsering.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
  416. responsering.addHeader(contactHeader);
  417. responsering.addHeader(supp);
  418. responsering.addHeader(allow);
  419. AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold");// für was gebraucht
  420. responsering.addHeader(allowevent);
  421. this.sipProvider.sendResponse(responsering);
  422. view.getTxtArea().append("Ringing geschickt\n");
  423. //Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP)
  424. //Sdp Header erstellen nächster Schritt
  425. invite = false;
  426. Response okandSDP = this.messageFactory.createResponse(Response.OK, requestEvent.getRequest());
  427. //okandSDP.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via"));
  428. okandSDP.addHeader((FromHeader) requestEvent.getRequest().getHeader("From"));
  429. okandSDP.addHeader(temptoring); //evtl noch Ergänzungen
  430. okandSDP.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
  431. okandSDP.addHeader(contactHeader);
  432. okandSDP.addHeader(supp);
  433. okandSDP.addHeader(allow);
  434. okandSDP.addHeader(allowevent);
  435. ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp");
  436. okandSDP.addHeader(content);
  437. String[] reqbody = (requestEvent.getRequest()).toString().split("\\s|" + System.getProperty("line.seperator"));//Req. Body in Zeilen aufteilen
  438. ArrayList<String> reqSDP = new ArrayList<>();
  439. for (String req : reqbody)//jeden String durchgehen und nach Codecs suchen die unterstützt werden
  440. {
  441. if (req.startsWith("a=rtpmap"))
  442. {
  443. reqSDP.add(req.replace("a=rtpmap:", ""));
  444. System.out.println(reqSDP);
  445. }
  446. }
  447. okandSDP.setContent(createSDPHeader(reqSDP), content);
  448. this.sipProvider.sendResponse(okandSDP);
  449. view.getTxtArea().append("Telefonat beginnt\n");
  450. evtWerdeAngerufen = null;
  451. }
  452. catch (ParseException | SipException | SdpException ex)
  453. {
  454. Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);
  455. }
  456. }
  457. else
  458. {
  459. view.getTxtArea().append("Zur Zeit gibt es keinen Anruf\n");
  460. }
  461. }
  462. public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException
  463. {
  464. invite = false;
  465. Address addressLine = this.addressFactory.createAddress("sip:" + calluser + "@" + proxyAddress);
  466. URI requestURI = addressLine.getURI();
  467. Address addressfrom = this.addressFactory.createAddress("sip:" + myName + "@" + myIPAddress);
  468. FromHeader from = this.headerFactory.createFromHeader(addressfrom, String.valueOf(this.myTag));
  469. Address addressTo = this.addressFactory.createAddress("sip:" + myName + "@" + proxyAddress);
  470. ToHeader to = this.headerFactory.createToHeader(addressTo, proxyTag); // Ergänzung TAG!!
  471. ArrayList via = new ArrayList(); //Via needs a List as input
  472. ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch));
  473. via.add(viaheader);
  474. cSequenz++;
  475. CSeqHeader cSeq = this.headerFactory.createCSeqHeader(cSequenz, "BYE");
  476. MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
  477. AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
  478. ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
  479. Request request = this.messageFactory.createRequest(requestURI, "BYE", callID, cSeq, from, to, via, maxForwards);
  480. request.addHeader(contactHeader);
  481. request.addHeader(allow);
  482. request.addHeader(expire);
  483. this.sipProvider.sendRequest(request);
  484. invite = false;
  485. lg.info("Erfolgreiches Senden des BYE Headers");
  486. }
  487. //Get Methoden falls man mal die Parameter braucht
  488. public String getmyName()
  489. {
  490. return myName;
  491. }
  492. public Integer getMyPort()
  493. {
  494. return myPort;
  495. }
  496. public String getMyIPAdress()
  497. {
  498. return myIPAddress;
  499. }
  500. // Herausfinden bei welchen Events die unteren Funktionen aufgerufen werden -> evtl brauchbar
  501. @Override
  502. public void processTimeout(TimeoutEvent timeoutEvent)
  503. {
  504. //view.getTxtArea().append("processTimeout\n");
  505. }
  506. @Override
  507. public void processIOException(IOExceptionEvent exceptionEvent)
  508. {
  509. //view.getTxtArea().append("processIOException\n");
  510. }
  511. @Override
  512. public void processTransactionTerminated(
  513. TransactionTerminatedEvent transactionTerminatedEvent)
  514. {
  515. //view.getTxtArea().append("processTransactionTerminated\n");
  516. }
  517. @Override
  518. public void processDialogTerminated(
  519. DialogTerminatedEvent dialogTerminatedEvent)
  520. {
  521. //view.getTxtArea().append("processDialogTerminated\n");
  522. }
  523. @Override
  524. public void processDialogTimeout(DialogTimeoutEvent timeoutEvent)
  525. {
  526. //view.getTxtArea().append("processDialogTerminated\n");
  527. }
  528. }