From 3531dfd8566973d61e7e61148c11a2686a99d697 Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 30 Jul 2019 19:14:55 +0200 Subject: [PATCH] . --- src/controller/commands/CommandInvite.java | 5 +- src/model/SIP100Trying.java | 62 +++++++++++ src/model/SIP180Ringing.java | 99 +++++++++--------- src/model/SIP200Ok.java | 3 +- src/model/SIPInvite.java | 4 +- src/model/SIPSessionDescription.java | 30 +++--- src/model/SIPmodel.java | 113 ++++----------------- 7 files changed, 159 insertions(+), 157 deletions(-) create mode 100644 src/model/SIP100Trying.java diff --git a/src/controller/commands/CommandInvite.java b/src/controller/commands/CommandInvite.java index 4fa1b6b..dc792de 100644 --- a/src/controller/commands/CommandInvite.java +++ b/src/controller/commands/CommandInvite.java @@ -8,11 +8,8 @@ package controller.commands; import controller.CommandInterface; import gui.Hauptfenster; -import java.text.ParseException; import java.util.logging.Level; import java.util.logging.Logger; -import javax.sdp.SdpException; -import javax.sip.InvalidArgumentException; import javax.sip.SipException; import logger.OhmLogger; import model.SIPmodel; @@ -41,7 +38,7 @@ public class CommandInvite implements CommandInterface view.getTxtArea().append("Einladung an " + view.getTxtcallIP().getText() + " gesendet\n"); model.sendInvitation(view.getTxtcallIP().getText(),view.getTxtServerIP().getText(), 5078); } - catch (ParseException|InvalidArgumentException|SdpException|SipException ex) + catch (SipException ex) { view.getTxtArea().append("Einladung fehlgeschlagen\n"); lginvite.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); diff --git a/src/model/SIP100Trying.java b/src/model/SIP100Trying.java new file mode 100644 index 0000000..6dc8969 --- /dev/null +++ b/src/model/SIP100Trying.java @@ -0,0 +1,62 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model; + +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sip.RequestEvent; +import javax.sip.header.AllowHeader; +import javax.sip.header.CSeqHeader; +import javax.sip.header.CallIdHeader; +import javax.sip.header.FromHeader; +import javax.sip.header.HeaderFactory; +import javax.sip.header.SupportedHeader; +import javax.sip.header.ToHeader; +import javax.sip.header.ViaHeader; +import javax.sip.message.MessageFactory; +import javax.sip.message.Response; +import logger.OhmLogger; + +/** + * + * @author Jan + */ +public class SIP100Trying +{ + private Response tryResponse; + private static final Logger lgTry = OhmLogger.getLogger(); + + public SIP100Trying(MessageFactory messageFactory, RequestEvent requestEvent, + HeaderFactory headerFactory) + { + try + { // + tryResponse = messageFactory.createResponse(100, requestEvent.getRequest()); + tryResponse.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); + tryResponse.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); + tryResponse.addHeader((ToHeader) requestEvent.getRequest().getHeader("To")); + tryResponse.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); + tryResponse.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); + SupportedHeader supp = headerFactory.createSupportedHeader("replace,path,timer"); //nachschauen + AllowHeader allow = headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); + tryResponse.addHeader(supp); + tryResponse.addHeader(allow); + } + catch (Exception ex) + { + lgTry.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + + } + + /** + * @return the tryResponse + */ + public Response getTryResponse() + { + return tryResponse; + } +} diff --git a/src/model/SIP180Ringing.java b/src/model/SIP180Ringing.java index 8088ced..59e5043 100644 --- a/src/model/SIP180Ringing.java +++ b/src/model/SIP180Ringing.java @@ -5,87 +5,90 @@ */ package model; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sip.RequestEvent; +import javax.sip.header.CSeqHeader; +import javax.sip.header.CallIdHeader; +import javax.sip.header.ContactHeader; +import javax.sip.header.FromHeader; +import javax.sip.header.HeaderFactory; +import javax.sip.header.ToHeader; +import javax.sip.header.ViaHeader; +import javax.sip.message.MessageFactory; +import javax.sip.message.Response; +import logger.OhmLogger; /** * * @author Jan */ -public class SIP180Ringing -{/* - private RequestEvent evtubergabe; +public class SIP180Ringing implements Runnable +{ + private RequestEvent requestEvent; private ExecutorService threadring; - private boolean run; - private Response responsering; + private boolean callIncoming; + private Response responseRing; private MessageFactory messageFactory; private HeaderFactory headerFactory; private String myTag; private String proxyTag; - public static final Logger lg = OhmLogger.getLogger(); + public static final Logger lgRing = OhmLogger.getLogger(); //private SubmissionPublisher publisherZahl; - public SIP180Ringing(RequestEvent evtubergabe, String myTag, ContactHeader contact) + public SIP180Ringing(RequestEvent requestEvent, String myTag, String proxyTag, ContactHeader contact, HeaderFactory headerFactory) { - this.evtubergabe = evtubergabe; - threadring = Executors.newSingleThreadExecutor(); - + this.requestEvent = requestEvent; + this.headerFactory = headerFactory; + threadring = Executors.newSingleThreadExecutor(); try { - responsering = this.messageFactory.createResponse(180, evtubergabe.getRequest()); - responsering.addHeader((ViaHeader) evtubergabe.getRequest().getHeader("Via")); - responsering.addHeader((FromHeader) evtubergabe.getRequest().getHeader("From")); - AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); - //Bei Ringing muss persönlicher Tag ergänzt werden - ToHeader temptoring = (ToHeader) evtubergabe.getRequest().getHeader("To"); - proxyTag = temptoring.getTag(); - temptoring.setTag(String.valueOf(this.myTag)); - responsering.addHeader(temptoring); - long cSequenz = ((CSeqHeader) evtubergabe.getRequest().getHeader("Cseq")).getSeqNumber(); - responsering.addHeader((CSeqHeader) evtubergabe.getRequest().getHeader("Cseq")); - responsering.addHeader(contact); - responsering.addHeader(allow); - AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info");// für was gebraucht - responsering.addHeader(allowevent); - lg.info("Ringing Header erfolgreich erstellt"); + responseRing = this.messageFactory.createResponse(180, this.requestEvent.getRequest()); + responseRing.addHeader((ViaHeader) this.requestEvent.getRequest().getHeader("Via")); + responseRing.addHeader((FromHeader) this.requestEvent.getRequest().getHeader("From")); + //persönlichen Tag muss beim To-Header ergänzt werden + ToHeader tempTo = ((ToHeader) this.requestEvent.getRequest().getHeader("To")); + tempTo.setTag(myTag); + responseRing.addHeader(tempTo); + responseRing.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); + responseRing.addHeader((CSeqHeader) this.requestEvent.getRequest().getHeader("Cseq")); + responseRing.addHeader(contact); + responseRing.addHeader(headerFactory.createSupportedHeader("replace,path,timer")); + responseRing.addHeader(this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE")); + responseRing.addHeader(this.headerFactory.createAllowEventsHeader("talk,hold,refer")); //für was wird er gebraucht + lgRing.info("Ringing Header erfolgreich erstellt"); } catch (Exception ex) { - lg.info("Fehler bei erstellen des Ringing Headers"); - lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + lgRing.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); } } public void start() { - run = true; - threadring.submit(this); + callIncoming = true; } public void stop() { - run = false; + callIncoming = false; } @Override public void run() { - while (run) + while (callIncoming) { - try - { - this.sipProvider.sendResponse(responsering); - } - catch (SipException ex) - { - Logger.getLogger(SIP180Ringing.class.getName()).log(Level.SEVERE, null, ex); - } - try - { - sleep(1000); - } - catch (Exception e) - { - } } } -*/ + + /** + * @return the responseRing + */ + public Response getResponseRing() + { + return responseRing; + } } diff --git a/src/model/SIP200Ok.java b/src/model/SIP200Ok.java index 7bb935d..862fdd0 100644 --- a/src/model/SIP200Ok.java +++ b/src/model/SIP200Ok.java @@ -72,6 +72,7 @@ public class SIP200Ok response.addHeader(temptoring); //evtl noch Ergänzungen SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer");//nachschauen für was es gebraucht wird response.addHeader(supp); + ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); response.addHeader(content); response.setContent(sdp, content); @@ -81,7 +82,7 @@ public class SIP200Ok lg200Ok.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); } } - + /** * @return the response */ diff --git a/src/model/SIPInvite.java b/src/model/SIPInvite.java index 20f9fb8..f8aec81 100644 --- a/src/model/SIPInvite.java +++ b/src/model/SIPInvite.java @@ -6,6 +6,7 @@ package model; import java.util.ArrayList; +import java.util.logging.Level; import java.util.logging.Logger; import javax.sdp.SessionDescription; import javax.sip.address.Address; @@ -63,8 +64,9 @@ public class SIPInvite inviterequest.setContent(sessionDescription, content); System.out.println(inviterequest); } - catch (Exception e) + catch (Exception ex) { + lgInvite.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); } } diff --git a/src/model/SIPSessionDescription.java b/src/model/SIPSessionDescription.java index 5336983..6895ba8 100644 --- a/src/model/SIPSessionDescription.java +++ b/src/model/SIPSessionDescription.java @@ -40,7 +40,7 @@ public class SIPSessionDescription codecs[3][0] = "18"; codecs[3][1] = "G729/8000"; cods = new String[codecs.length]; - for (int i = 0; i < cods.length; i++)//Übertragung der RTP-Values in neues Array + for (int i = 0; i < 4; i++)//Übertragung der RTP-Values in neues Array { cods[i] = codecs[i][0]; } @@ -54,11 +54,12 @@ public class SIPSessionDescription sessionDescription.setConnection(sdpFactory.createConnection("IN", "IP4", myIPAddress)); //Media Body - mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", cods)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) - mediavec.add(sdpFactory.createAttribute("sendrecv", null)); - if (anfrage = true) + + if (anfrage == true) { - for (int i = 0; i == codecs[0].length; i++) + mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", cods)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) + mediavec.add(sdpFactory.createAttribute("sendrecv", null)); + for (int i = 0; i == 4; i++) { System.out.println("Codecs: " + codecs[i][0] + " " + codecs[i][1]); mediavec.add(sdpFactory.createAttribute("rtpmap", codecs[i][0] + " " + codecs[i][1])); @@ -66,7 +67,6 @@ public class SIPSessionDescription } else//Vergleich von eigenen Codecs mit Codecs der anruft -> Rückgabe entsprechend wählen { - //herausfiltern der zulässigen bei Nachrichtenanfrage String[] reqbody = (requestEvent.getRequest()).toString().split("\\s|" + System.getProperty("line.seperator")); ArrayList reqSDP = new ArrayList<>(); for (String req : reqbody) @@ -74,17 +74,24 @@ public class SIPSessionDescription if (req.startsWith("a=rtpmap")) { reqSDP.add(req.replace("a=rtpmap:", "")); - System.out.println(reqSDP); } } boolean temp = true; //evtl noch was besseres da so erster Codec nicht bester verwendet wird - for (int i = 0; i == codecs[0].length; i++) + int position = 0; + for (String stcodec : cods) { - if (codecs[i][1].equals(reqSDP) && temp == true) - { - mediavec.add(sdpFactory.createAttribute("rtpmap", "8 G711a/8000")); + + System.out.println("------Auswahl des codecs----"); + if (reqSDP.contains(stcodec) && temp == true) + { + String tempcodec[]= new String [1]; + tempcodec[0] = codecs[position][1]; + mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", tempcodec)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) + mediavec.add(sdpFactory.createAttribute("sendrecv", null)); + mediavec.add(sdpFactory.createAttribute("rtpmap", codecs[position][0] + " " + codecs[position][1])); temp = false; } + position++; } } sessionDescription.setAttributes(mediavec); @@ -100,7 +107,6 @@ public class SIPSessionDescription */ public SessionDescription getSessionDescription() { - System.out.println(sessionDescription); return sessionDescription; } } diff --git a/src/model/SIPmodel.java b/src/model/SIPmodel.java index 1fd15e9..4bb5f6e 100644 --- a/src/model/SIPmodel.java +++ b/src/model/SIPmodel.java @@ -13,7 +13,6 @@ import java.text.ParseException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; -import javax.sdp.SdpException; import javax.sip.DialogTerminatedEvent; import javax.sip.IOExceptionEvent; import javax.sip.InvalidArgumentException; @@ -118,13 +117,11 @@ public class SIPmodel implements SipListenerExt System.exit(-1); } } - public int hashCode() { int temp = Integer.valueOf(myTag)* (new Random(100)).nextInt(); return temp; } - public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException { proxyAddress = serverIP + ":" + serverPort; @@ -132,41 +129,14 @@ public class SIPmodel implements SipListenerExt this.sipProvider.sendRequest(register.getRequest()); lg.info("Erfolgreiches Senden der Registrierung"); } - public void sendInvitation(String sipaddresse, String proxyaddresse, - int serverPort) throws ParseException, InvalidArgumentException, SipException, SdpException + int serverPort) throws SipException { //ServerPort wird nicht verwendet? invite = true; callID = this.sipProvider.getNewCallId(); - - Address addressto = this.addressFactory.createAddress("sip:" + sipaddresse + "@" + proxyaddresse); - ToHeader to = this.headerFactory.createToHeader(addressto, null); // Integer.toString(myTag) address + myTag - URI requestURI = addressto.getURI(); - FromHeader from = this.headerFactory.createFromHeader(addressto, myTag); //this.contactAddress - ArrayList via = new ArrayList(); //Via needs a List as input - ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch)); - via.add(viaheader); - - CSeqHeader cSeq = this.headerFactory.createCSeqHeader(cSequenz, "INVITE"); - - MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70); - AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); - ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value - Request request = this.messageFactory.createRequest(requestURI, "INVITE", callID, cSeq, from, to, via, maxForwards); - request.addHeader(contactHeader); - request.addHeader(allow); - request.addHeader(expire); - ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); - request.addHeader(content); - - - SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, evtWerdeAngerufen, invite); - - request.setContent(sdp.getSessionDescription(), content); - + SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, evtWerdeAngerufen, true); SIPInvite sipinvite = new SIPInvite(sipaddresse, proxyaddresse, myIPAddress, myPort, myTag, branch, callID, cSequenz, addressFactory, sdp.getSessionDescription(), headerFactory, messageFactory, contactHeader); this.sipProvider.sendRequest(sipinvite.getInviterequest()); - lg.info("Erfolgreiches Senden der Invitation"); } @@ -359,76 +329,37 @@ public class SIPmodel implements SipListenerExt { countWerdeAngerufen = 0; try - { + { + //Werte für weitere Kommunikation abspeichern callID = (CallIdHeader) requestEvent.getRequest().getHeader("Call-ID"); - //Trying Message to Server (Response Trying) - Response responsetry = this.messageFactory.createResponse(100, requestEvent.getRequest()); - responsetry.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); - responsetry.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); - responsetry.addHeader((ToHeader) requestEvent.getRequest().getHeader("To")); - responsetry.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); - responsetry.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); - - CSeqHeader tempcs = (CSeqHeader) requestEvent.getRequest().getHeader("Cseq"); - tempcs.getSeqNumber(); - SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer"); //nachschauen - AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); - - responsetry.addHeader(supp); - responsetry.addHeader(allow); - this.sipProvider.sendResponse(responsetry); + CSeqHeader tempCs = (CSeqHeader) requestEvent.getRequest().getHeader("Cseq"); + cSequenz = tempCs.getSeqNumber(); + FromHeader tempFrom = (FromHeader) requestEvent.getRequest().getHeader("From"); + proxyTag = tempFrom.getTag(); + //Trying Header erzeugen und abschicken + SIP100Trying tempTrying = new SIP100Trying(messageFactory, requestEvent, headerFactory); + this.sipProvider.sendResponse(tempTrying.getTryResponse()); view.getTxtArea().append("Trying geschickt\n"); lg.info("Trying ist raus"); - //Ringing Message to Server (Responste Ringing) - Response responsering = this.messageFactory.createResponse(180, requestEvent.getRequest()); - responsering.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); - responsering.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); - - ToHeader temptoring = (ToHeader) requestEvent.getRequest().getHeader("To"); - String tempTag = String.valueOf(Integer.valueOf(myTag)+ Math.random()); - temptoring.setTag(tempTag); //evtl. besseren Tag - responsering.addHeader(temptoring); - - responsering.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); - responsering.addHeader(contactHeader); - responsering.addHeader(supp); - responsering.addHeader(allow); - - AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold");// für was gebraucht - responsering.addHeader(allowevent); - this.sipProvider.sendResponse(responsering); + //Ringing Message to Server (Responste Ringing)From tag: proxyTag, To Tag, persönlicher Tag + SIP180Ringing tempRinging = new SIP180Ringing(requestEvent, myTag, proxyTag, contactHeader, headerFactory); + sipProvider.sendResponse(tempRinging.getResponseRing()); view.getTxtArea().append("Ringing geschickt\n"); //Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP) //Sdp Header erstellen nächster Schritt - /* - //invite = false; - //Response okandSDP = this.messageFactory.createResponse(Response.OK, requestEvent.getRequest()); - //okandSDP.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); - okandSDP.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); - - okandSDP.addHeader(temptoring); //evtl noch Ergänzungen - - okandSDP.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); - okandSDP.addHeader(contactHeader); - okandSDP.addHeader(supp); - okandSDP.addHeader(allow); - okandSDP.addHeader(allowevent); - ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); - okandSDP.addHeader(content); - - SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, invite); - okandSDP.setContent(sdp.getSessionDescription(), content); - this.sipProvider.sendResponse(okandSDP); - */ - SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); - SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, invite); - tempOk.addSDP(sdp.getSessionDescription(), myTag); + + invite = false; + SIP200Ok respcall = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); + SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, false); + respcall.addSDP(sdp.getSessionDescription(), myTag); + System.out.println(respcall.getResponse()); + this.sipProvider.sendResponse(respcall.getResponse()); view.getTxtArea().append("Telefonat beginnt\n"); evtWerdeAngerufen = null; } - catch (ParseException | SipException ex) + catch (SipException ex) { Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex);