diff --git a/src/model/VoIP.java b/src/model/VoIP.java index 0f70b46..02b2f3f 100644 --- a/src/model/VoIP.java +++ b/src/model/VoIP.java @@ -12,6 +12,9 @@ import java.text.ParseException; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; +import javax.sdp.SdpException; +import javax.sdp.SdpFactory; +import javax.sdp.SessionDescription; import javax.sip.DialogTerminatedEvent; import javax.sip.IOExceptionEvent; import javax.sip.InvalidArgumentException; @@ -42,10 +45,10 @@ public class VoIP implements SipListenerExt AddressFactory addressFactory; // Used to create SIP URIs. ListeningPoint listeningPoint; // SIP listening IP address/port. Properties properties; // Other properties. - + private int counter; private int myPort = 5060; - + private String myName = "129"; private String protocolTyp = "UDP"; private String myIPAddress; @@ -53,11 +56,10 @@ public class VoIP implements SipListenerExt private int branch = hashCode(); Address contactAddress; private ContactHeader contactHeader; - public VoIP() //Konstruktor für eigene Daten { - + try { //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren @@ -74,7 +76,7 @@ public class VoIP implements SipListenerExt this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp); this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint); this.sipProvider.addSipListener(this); - this.contactAddress = this.addressFactory.createAddress("sip:129@" + this.myIPAddress+ ":" + this.myPort); //+ ":" + this.myPort + this.contactAddress = this.addressFactory.createAddress("sip:129@" + this.myIPAddress + ":" + this.myPort); //+ ":" + this.myPort this.contactHeader = this.headerFactory.createContactHeader(contactAddress); } catch (Exception e) @@ -82,30 +84,26 @@ public class VoIP implements SipListenerExt System.out.println("Shit"); System.exit(-1); } - + } + public int hashCode() - { - int temp = tag*(new Random(100)).nextInt(); + { + int temp = tag * (new Random(100)).nextInt(); return temp; } - public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException + public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException { System.out.println("-----------SendRegister-----------"); Address addressto = this.addressFactory.createAddress("sip:192.168.100.11"); //evtl. mit Port: sip:192.168.100.11:5060 Address addresstob = this.addressFactory.createAddress("sip:192.168.100.11"); //to get example maybe needed - ToHeader to = this.headerFactory.createToHeader(addresstob, null); // Integer.toString(tag) address + tag - URI requestURI = addressto.getURI(); - CallIdHeader callId = this.sipProvider.getNewCallId(); - FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //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)); + ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch)); via.add(viaheader); CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "REGISTER"); MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70); @@ -114,13 +112,11 @@ public class VoIP implements SipListenerExt //Create Request Header System.out.println("----REQUEST HEADER----"); Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards); - request.addHeader(contactHeader); request.addHeader(allow); request.addHeader(expire); System.out.println(request); this.sipProvider.sendRequest(request); - } @Override @@ -131,24 +127,25 @@ public class VoIP implements SipListenerExt @Override public void processRequest(RequestEvent requestEvent) { - System.out.println("----Bekomme Anfrage----"); - if ((Request.OPTIONS).equals(requestEvent.getRequest().getMethod())) + System.out.println("----Bekomme Anfrage----"); + //Kommunikation mit Server das man zur Verfügung steht + if ((Request.OPTIONS).equals(requestEvent.getRequest().getMethod())) //Options Anfrage von Server nach erfolgreicher Registrierung { System.out.println("200 OK zu Server"); try - { - Response response = this.messageFactory.createResponse(200,requestEvent.getRequest()); - response.addHeader((ViaHeader)requestEvent.getRequest().getHeader("Via")); - response.addHeader((FromHeader)requestEvent.getRequest().getHeader("From")); - response.addHeader((ToHeader)requestEvent.getRequest().getHeader("To")); - response.addHeader((CallIdHeader)requestEvent.getRequest().getHeader("Call-ID")); - response.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq")); + { + Response response = this.messageFactory.createResponse(200, requestEvent.getRequest()); + response.addHeader((ViaHeader) requestEvent.getRequest().getHeader("Via")); + response.addHeader((FromHeader) requestEvent.getRequest().getHeader("From")); + response.addHeader((ToHeader) requestEvent.getRequest().getHeader("To")); + response.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); + response.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")); //Kontakt Header response.addHeader(contactHeader); //Accept Header für application/sdp AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); AllowEventsHeader allowevents = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info"); - response.addHeader((CallIdHeader)requestEvent.getRequest().getHeader("Call-ID")); + response.addHeader((CallIdHeader) requestEvent.getRequest().getHeader("Call-ID")); response.addHeader(allow); response.addHeader(allowevents); this.sipProvider.sendResponse(response); @@ -158,110 +155,160 @@ public class VoIP implements SipListenerExt Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); } } - else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) + //Aktive Kommunikation + else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer { System.out.println("Hab invitation bekommen"); System.out.println("Gleich antworte ich"); try { - //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")); - + //Trying Message to Server (Response Trying) + System.out.println("----REquest HEader----"); + 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")); + 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); System.out.println("Trying ist raus"); - //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"); - temptoring.setTag(String.valueOf(this.tag+Math.random())); //evtl. besseren Tag + + //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(this.tag + Math.random()); + temptoring.setTag(tempTag); //evtl. besseren Tag responsering.addHeader(temptoring); - - responsering.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq")); + + 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); System.out.println("Response ist raus"); + + System.out.println("Erstelle 200 Ok + SDP Header(contentHeader)"); //Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP) //Sdp Header erstellen nächster Schritt + System.out.println(requestEvent.getDialog()); + 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"); - } - catch (ParseException | SipException ex) + //Create Session Description Body + SdpFactory sdpFactory = SdpFactory.getInstance(); + SessionDescription sessionDescription = sdpFactory.createSessionDescription(); + sessionDescription.setOrigin(sdpFactory.createOrigin(myName, 8000, 8000, "IN", "IP4", myIPAddress)); + sessionDescription.setSessionName(sdpFactory.createSessionName("SIP Call")); + sessionDescription.setConnection(sdpFactory.createConnection("IN", "IP4", myIPAddress)); + + //Media Body + String sdpformat[] = + { + "0", "4", "18", + }; + Vector mediavec = new Vector(); + mediavec.add(sdpFactory.createMediaDescription("audio", 6022, 1, "RTP/AVP", sdpformat)); + + //Media Attribute + mediavec.add(sdpFactory.createAttribute("sendrecv", null)); + mediavec.add(sdpFactory.createAttribute("rtpmap", "0 PCMU/8000")); + mediavec.add(sdpFactory.createAttribute("rtpmap", "4 G723/8000")); + mediavec.add(sdpFactory.createAttribute("rtpmap", "18 G729A/8000")); + mediavec.add(sdpFactory.createAttribute("ptime", "20")); + + sessionDescription.setAttributes(mediavec); + + + System.out.println("---Beispiel Header---"); + /* + String contentparam = "v=0\r\n" + "o=129 1202 1202" + " IN IP4 192.168.100.247\r\n" + "s=SIP Call\r\n" + + "c=192.168.100.247\r\n" + "t=0 0\r\n" + "m=audio 6022 RTP/AVP 0 4 18\r\n" + + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:4 G723/8000\r\n" + "a=rtpmap:18 G729A/8000\r\n" + + "a=ptime:20\r\n"; + */ + okandSDP.addHeader(content); + okandSDP.setContent(sessionDescription, content); + System.out.println(okandSDP); + this.sipProvider.sendResponse(okandSDP); + } + catch (ParseException | SipException | SdpException ex) { Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); - + } + } else if ((Request.ACK).equals(requestEvent.getRequest().getMethod())) { - + } - - + } @Override - public void processResponse(ResponseEvent responseEvent) + public void processResponse(ResponseEvent responseEvent) { System.out.println("---Response---"); //System.out.println(responseEvent.getResponse()); - - if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED) - { - - try { - Address addresstob = this.addressFactory.createAddress("sip:129@192.168.100.11"); //"sip:Jan@192.168.100.11" - ToHeader temp = (ToHeader)responseEvent.getResponse().getHeader("To"); - + if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED) + { + + try + { + Address addresstob = this.addressFactory.createAddress("sip:129@192.168.100.11"); //"sip:Jan@192.168.100.11" + ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To"); + ToHeader to = this.headerFactory.createToHeader(addresstob, temp.getTag()); // Integer.toString(tag) address + tag URI requestURI = addresstob.getURI(); - + //CallIdHeader tempcall = (CallIdHeader)responseEvent.getResponse().getHeader("Call-ID"); - CallIdHeader callId = (CallIdHeader)responseEvent.getResponse().getHeader("Call-ID"); + CallIdHeader callId = (CallIdHeader) responseEvent.getResponse().getHeader("Call-ID"); FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress - + //set Authorization header evtl. user Name benutzen den es gibt - WWWAuthenticateHeader abc = (WWWAuthenticateHeader)responseEvent.getResponse().getHeader("WWW-Authenticate"); + WWWAuthenticateHeader abc = (WWWAuthenticateHeader) responseEvent.getResponse().getHeader("WWW-Authenticate"); AuthorizationHeader auth = this.headerFactory.createAuthorizationHeader("Digest");//was kommt in den string - + auth.setRealm(abc.getRealm()); auth.setNonce(abc.getNonce()); - Address addresstest = this.addressFactory.createAddress("sip:"+myName+"@192.168.100.11"); //vielleicht passwort setzen "sip:"+myName+":\"\"@192.168.100.11" + Address addresstest = this.addressFactory.createAddress("sip:" + myName + "@192.168.100.11"); //vielleicht passwort setzen "sip:"+myName+":\"\"@192.168.100.11" auth.setURI(addresstest.getURI()); auth.setUsername(myName); - - ArrayList via = new ArrayList(); //Via needs a List as input - ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch+2));// String.valueOf(hashCode())string branch + ViaHeader viaheader = this.headerFactory.createViaHeader(this.myIPAddress, this.myPort, "UDP", String.valueOf(branch + 2));// String.valueOf(hashCode())string branch via.add(viaheader); - + CSeqHeader cSeq = this.headerFactory.createCSeqHeader(2L, "REGISTER"); 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 - + //Zusätzliche Register Header nach Unauthorzied - //Create Request Header System.out.println("----REQUEST HEADER2----"); Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards); @@ -272,10 +319,11 @@ public class VoIP implements SipListenerExt //System.out.println(request); this.sipProvider.sendRequest(request); } - catch (ParseException | SipException |InvalidArgumentException ex) { + catch (ParseException | SipException | InvalidArgumentException ex) + { Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); } - + } else if (responseEvent.getResponse().getStatusCode() == Response.OK) {