/* * 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 gov.nist.javax.sip.DialogTimeoutEvent; import gov.nist.javax.sip.SipListenerExt; import java.net.InetAddress; 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; import javax.sip.ListeningPoint; import javax.sip.RequestEvent; import javax.sip.ResponseEvent; import javax.sip.SipException; import javax.sip.SipFactory; import javax.sip.SipProvider; import javax.sip.SipStack; import javax.sip.TimeoutEvent; import javax.sip.TransactionTerminatedEvent; import javax.sip.address.*; import javax.sip.header.*; import javax.sip.message.*; import logger.OhmLogger; /** * * @author Normal */ public class VoIP implements SipListenerExt { private static final Logger lg = OhmLogger.getLogger(); SipFactory sipFactory; // Used to access the SIP API. SipStack sipStack; // The SIP stack. SipProvider sipProvider; // Used to send SIP messages. MessageFactory messageFactory; // Used to create SIP message factory. HeaderFactory headerFactory; // Used to create SIP headers. 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; int tag = (new Random()).nextInt(); 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 String abc = InetAddress.getLocalHost().getHostAddress(); this.myIPAddress = InetAddress.getLocalHost().getHostAddress(); this.sipFactory = SipFactory.getInstance(); this.sipFactory.setPathName("gov.nist"); this.properties = new Properties(); this.properties.setProperty("javax.sip.STACK_NAME", "stack"); this.sipStack = this.sipFactory.createSipStack(this.properties); this.messageFactory = this.sipFactory.createMessageFactory(); this.headerFactory = this.sipFactory.createHeaderFactory(); this.addressFactory = this.sipFactory.createAddressFactory(); 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.contactHeader = this.headerFactory.createContactHeader(contactAddress); } catch (Exception e) { System.out.println("Shit"); System.exit(-1); } } public int hashCode() { int temp = tag * (new Random(100)).nextInt(); return temp; } public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException { lg.info("Vorbereiten des Registrierungs Headers"); Address addressto = this.addressFactory.createAddress("sip:192.168.100.11"); //evtl. mit Port: sip:192.168.100.11:5060 ToHeader to = this.headerFactory.createToHeader(addressto, null); // Integer.toString(tag) address + tag URI requestURI = addressto.getURI(); CallIdHeader callId = this.sipProvider.getNewCallId(); FromHeader from = this.headerFactory.createFromHeader(addressto, 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)); via.add(viaheader); CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "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 Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards); request.addHeader(contactHeader); request.addHeader(allow); request.addHeader(expire); this.sipProvider.sendRequest(request); lg.info("Erfolgreiches Senden der Registrierung"); } public void sendInvitation(String sipaddresse, int serverPort)throws ParseException, InvalidArgumentException, SipException, SdpException { Address addressto = this.addressFactory.createAddress(sipaddresse); //evtl. mit Port: sip:192.168.100.11:5060 ToHeader to = this.headerFactory.createToHeader(addressto, null); // Integer.toString(tag) address + tag URI requestURI = addressto.getURI(); CallIdHeader callId = this.sipProvider.getNewCallId(); FromHeader from = this.headerFactory.createFromHeader(addressto, 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)); via.add(viaheader); CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "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, "REGISTER", callId, cSeq, from, to, via, maxForwards); request.addHeader(contactHeader); request.addHeader(allow); request.addHeader(expire); ContentTypeHeader content = headerFactory.createContentTypeHeader("application", "sdp"); request.addHeader(content); request.setContent(createSDPHeader(), content); System.out.println("---Invitation Header---"); System.out.println(request); this.sipProvider.sendRequest(request); //lg.info("Erfolgreiches Senden der Invitation"); } @Override public void processDialogTimeout(DialogTimeoutEvent timeoutEvent) { } @Override public void processRequest(RequestEvent requestEvent) { lg.info("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 { lg.info("Option Request von Server, erstellen 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")); //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(allow); response.addHeader(allowevents); this.sipProvider.sendResponse(response); lg.info("Erfolgreiches senden des Headers"); } catch (ParseException | SipException ex) { lg.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); } } //Aktive Kommunikation else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer { lg.info("Hab Invitation bekommen"); try { //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); 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(this.tag + 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); 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"); okandSDP.addHeader(content); okandSDP.setContent(createSDPHeader(), 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) { 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"); 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"); 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"); 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" 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 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); request.addHeader(contactHeader); request.addHeader(allow); request.addHeader(expire); request.addHeader(auth); this.sipProvider.sendRequest(request); } catch (ParseException | SipException | InvalidArgumentException ex) { lg.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); } } else if (responseEvent.getResponse().getStatusCode() == Response.OK) { lg.info("Erfolgreichen Response (200 OK) bekommen"); } } public SessionDescription createSDPHeader() throws SdpException { /* 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"; */ 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)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) //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); return sessionDescription; } @Override public void processTimeout(TimeoutEvent timeoutEvent) { } @Override public void processIOException(IOExceptionEvent exceptionEvent) { } @Override public void processTransactionTerminated( TransactionTerminatedEvent transactionTerminatedEvent) { } @Override public void processDialogTerminated( DialogTerminatedEvent dialogTerminatedEvent) { } }