From 41ddd21e348c2e165c350601b922b8318ebee900 Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 16 Aug 2019 15:17:34 +0200 Subject: [PATCH] Single RTP packet successfull --- src/controller/commands/CommandInvite.java | 38 +- src/model/RTPSendSingleString.java | 133 ++++ src/model/SIPSessionDescription.java | 11 +- src/model/SIPmodel.java | 711 +++++++++++---------- src/model/SoundSenderDemo.java | 62 +- 5 files changed, 574 insertions(+), 381 deletions(-) create mode 100644 src/model/RTPSendSingleString.java diff --git a/src/controller/commands/CommandInvite.java b/src/controller/commands/CommandInvite.java index a4dcda2..b0857fa 100644 --- a/src/controller/commands/CommandInvite.java +++ b/src/controller/commands/CommandInvite.java @@ -17,6 +17,7 @@ import logger.OhmLogger; import model.SIPmodel; import java.lang.String; import java.net.UnknownHostException; +import model.RTPSendSingleString; /** * @@ -48,21 +49,7 @@ public class CommandInvite implements CommandInterface { } catch (InterruptedException ex) { Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); } - - System.out.println("Starte RTP Session"); - //String[] s = null; - SoundSenderDemo aDemo = null; - try { - aDemo = new SoundSenderDemo(true); - } catch (UnknownHostException | InterruptedException ex) { - Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); - } - try { - aDemo.SendDemo(null); - } catch (UnknownHostException | InterruptedException ex) { - Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); - } - System.out.println("Beende RTP Session"); + callDemo(); } @Override @@ -74,4 +61,25 @@ public class CommandInvite implements CommandInterface { public Boolean isundoable() { return false; } + + public void callDemo(){ + System.out.println("Starte RTP Session"); + String[] s = null; + SoundSenderDemo aDemo = new SoundSenderDemo(); + + try { + aDemo.SendDemo(s); + } catch (UnknownHostException | InterruptedException ex) { + Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); + } + System.out.println("Beende RTP Session"); + } + + public void callUnicastDemo(){ + System.out.println("Starte RTP Unicast Session"); + String[] s = null; + RTPSendSingleString aDemo = new RTPSendSingleString(); + aDemo.main(s); + System.out.println("Beende RTP Unicast Session"); + } } diff --git a/src/model/RTPSendSingleString.java b/src/model/RTPSendSingleString.java new file mode 100644 index 0000000..71e80ba --- /dev/null +++ b/src/model/RTPSendSingleString.java @@ -0,0 +1,133 @@ +/** + * Java RTP Library (jlibrtp) + * Copyright (C) 2006 Arne Kepp + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +package model; + +import java.net.DatagramSocket; +import jlibrtp.*; + +/** + *

+ * This is an example of how to set up a Unicast session.

+ *

+ * It does not accept any input arguments and is therefore of limited practical + * value, but it shows the basics.

+ * + *

+ * The class has to implement RTPAppIntf.

+ * + * @author Arne Kepp + */ +public class RTPSendSingleString implements RTPAppIntf { + + /** + * Holds a RTPSession instance + */ + RTPSession rtpSession = null; + + public RTPSendSingleString() { + } + + /** + * A minimal constructor + */ + public RTPSendSingleString(RTPSession rtpSession) { + this.rtpSession = rtpSession; + } + + // RTPAppIntf All of the following are documented in the JavaDocs + /** + * Used to receive data from the RTP Library. We expect no data + */ + public void receiveData(DataFrame frame, Participant p) { + /** + * This concatenates all received packets for a single timestamp into a + * single byte[] + */ + byte[] data = frame.getConcatenatedData(); + + /** + * This returns the CNAME, if any, associated with the SSRC that was + * provided in the RTP packets received. + */ + String cname = p.getCNAME(); + + System.out.println("Received data from " + cname); + System.out.println(new String(data)); + } + + /** + * Used to communicate updates to the user database through RTCP + */ + public void userEvent(int type, Participant[] participant) { + //Do nothing + } + + /** + * How many packets make up a complete frame for the payload type? + */ + public int frameSize(int payloadType) { + return 1; + } + // RTPAppIntf/ + + public static void main(String[] args) { + // 1. Create sockets for the RTPSession + DatagramSocket rtpSocket = null; + DatagramSocket rtcpSocket = null; + try { + rtpSocket = new DatagramSocket(5004); + rtcpSocket = new DatagramSocket(5005); + } catch (Exception e) { + System.out.println(e); + System.out.println("RTPSession failed to obtain port"); + } + + // 2. Create the RTP session + RTPSession rtpSession = new RTPSession(rtpSocket, rtcpSocket); + + // 3. Instantiate the application object + RTPSendSingleString uex = new RTPSendSingleString(rtpSession); + + // 4. Add participants we want to notify upon registration + // a. Hopefully nobody is listening on this port. + Participant part = new Participant("192.168.100.11", 5004, 5005); + rtpSession.addParticipant(part); + + // 5. Register the callback interface, this launches RTCP threads too + // The two null parameters are for the RTCP and debug interfaces, not use here + rtpSession.RTPSessionRegister(uex, null, null); + + // Wait 2500 ms, because of the initial RTCP wait + try { + Thread.sleep(2000); + } catch (Exception e) { + System.out.println(e); + } + + // Note: The wait is optional, but insures SDES packets + // receive participants before continuing + // 6. Send some data + String str = "Hi there!"; + rtpSession.sendData(str.getBytes()); + + // 7. Terminate the session, takes a few ms to kill threads in order. + rtpSession.endSession(); + //This may result in "Sleep interrupted" messages, ignore them + } +} diff --git a/src/model/SIPSessionDescription.java b/src/model/SIPSessionDescription.java index 27fc825..d8dccff 100644 --- a/src/model/SIPSessionDescription.java +++ b/src/model/SIPSessionDescription.java @@ -26,8 +26,9 @@ public class SIPSessionDescription private String codsRTP[]; //[RTP-Notation] private String codecs[]; //[Codec/SampelRate] private static final Logger lgSessionDescription = OhmLogger.getLogger(); - - public SIPSessionDescription(String myName, String myIPAddress, + + + public SIPSessionDescription(String myName, String myIPAddress, int myRTPPort, RequestEvent requestEvent, Boolean anfrage) { //Hier alle unterstützen Codecs eintragen [RTP-Notation][Codec/SampelRate] @@ -55,7 +56,7 @@ public class SIPSessionDescription //Media Bod if (anfrage == true) { - mediavec.add(sdpFactory.createMediaDescription("audio", 5004, 1, "RTP/AVP", codsRTP)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) + mediavec.add(sdpFactory.createMediaDescription("audio", myRTPPort, 1, "RTP/AVP", codsRTP)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) mediavec.add(sdpFactory.createAttribute("sendrecv", null)); for (int i = 0; i < codsRTP.length; i++) { @@ -86,7 +87,7 @@ public class SIPSessionDescription position++; } String[] tempArray = tempList.toArray(new String[tempList.size()]); - mediavec.add(sdpFactory.createMediaDescription("audio", 5004, 1, "RTP/AVP", tempArray)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) + mediavec.add(sdpFactory.createMediaDescription("audio", myRTPPort, 1, "RTP/AVP", tempArray)); //(Übertragungstyp, Port, anzahl der Ports, Verbindungstyp,..) mediavec.add(sdpFactory.createAttribute("sendrecv", null)); } sessionDescription.setAttributes(mediavec); @@ -105,4 +106,4 @@ public class SIPSessionDescription { return sessionDescription; } -} +} \ No newline at end of file diff --git a/src/model/SIPmodel.java b/src/model/SIPmodel.java index 5f28ed0..98b2bf9 100644 --- a/src/model/SIPmodel.java +++ b/src/model/SIPmodel.java @@ -5,10 +5,12 @@ */ package model; +import controller.commands.CommandInvite; import gov.nist.javax.sip.DialogTimeoutEvent; import gov.nist.javax.sip.SipListenerExt; import gui.Hauptfenster; import java.net.InetAddress; +import java.net.UnknownHostException; import java.security.SecureRandom; import java.text.ParseException; import java.util.*; @@ -37,381 +39,416 @@ import logger.OhmLogger; * Response/Request eigene Klasse oder Interface da es langsam unübersichtlich * wird :( ACK schicken muss noch ergänzt werden BYE muss noch ergänzt werden. */ -public class SIPmodel implements SipListenerExt -{ - private static final String TEST = "0123456789abcdefghijklmnopqrstuvwxyz";//für Random String - private static final SecureRandom RANDOM = new SecureRandom(); //für Random String +public class SIPmodel implements SipListenerExt { + //Stringhilfen zum erzeugen von RandomString (Branch) - Hauptfenster view; //später entfernen wegen Zugriff - public static final Logger lg = OhmLogger.getLogger(); - public SipFactory sipFactory; // Used to access the SIP API. - public SipStack sipStack; // The SIP stack. - public SipProvider sipProvider; // Used to send SIP messages. - public MessageFactory messageFactory; // Used to create SIP message factory. - public HeaderFactory headerFactory; // Used to create SIP headers. - public AddressFactory addressFactory; // Used to create SIP URIs. - public ListeningPoint listeningPoint; // SIP listening IP address/port. - public Properties properties; // Other properties. + private static final String TEST = "0123456789abcdefghijklmnopqrstuvwxyz";//für Random String + private static final SecureRandom RANDOM = new SecureRandom(); //für Random String + //Verbindungskonstanten + private static final int MYSIPPORT = 5060; + private static final int MYRTPPORT = 5004; + private static final int MYRTCPPORT = 5005; + private static final String PROTOCOLTYP = "UDP"; - private AudioRinging audioRinging; - - private int myPort = 5060; - private String myName = "129"; - public String protocolTyp = "UDP"; - public String myIPAddress = "192.168.100.30"; - public String proxyAddress; - public CallIdHeader callID; + Hauptfenster view; //später entfernen wegen Zugriff + public static final Logger lg = OhmLogger.getLogger(); + public SipFactory sipFactory; // Used to access the SIP API. + public SipStack sipStack; // The SIP stack. + public SipProvider sipProvider; // Used to send SIP messages. + public MessageFactory messageFactory; // Used to create SIP message factory. + public HeaderFactory headerFactory; // Used to create SIP headers. + public AddressFactory addressFactory; // Used to create SIP URIs. + public ListeningPoint listeningPoint; // SIP listening IP address/port. + public Properties properties; // Other properties. - Boolean anrufer; //Hilfsvariable ob ich selbst anrufer bin - Boolean anrufAngenommen; - Boolean anrufCancel; - //Hilfsvariablen wenn ich angerufen werde. evtl. noch optimieren - Boolean werdeAngerufen; + private AudioRinging audioRinging; - private long cSequenz; - private String proxyTag; - private String myTag; - private String branch; - private String line; - private Address contactAddress; - private ContactHeader contactHeader; + //Hilfsbooleans + private Boolean anrufer; //Hilfsvariable ob ich selbst anrufer bin + private Boolean anrufAngenommen; + private Boolean anrufCancel; + private Boolean werdeAngerufen; - public SIPmodel(Hauptfenster view) //Konstruktor für eigene Daten - { - this.view = view; - anrufer = false; - anrufAngenommen = false; - anrufCancel = false; - proxyAddress = ""; - proxyTag = ""; - line = ""; - cSequenz = 1; - werdeAngerufen = false; - - audioRinging = new AudioRinging(); - myTag = createString(8); //erzeugt Random Tag mit Länge 8 - branch = createString(18);//erzeugt Random branch mit Länge 18 + //Variablen die im Laufe des Gespräches ermittelt werden + //Eigene Daten + private String myIPAddress; + private String myName = "129"; + private String myTag; + private Address contactAddress; + private ContactHeader contactHeader; + //ProxyServer + public String proxyAddress; + private int proxyRTPPort; + private String proxyTag; + //CallDaten + private String branch; + public CallIdHeader callID; + private long cSequenz; + private String RTPCodec; - try + public SIPmodel(Hauptfenster view) //Konstruktor für eigene Daten { - //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren - //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:" + this.myName + "@" + this.myIPAddress + ":" + this.myPort); - this.contactHeader = this.headerFactory.createContactHeader(contactAddress); + this.view = view; + anrufer = false; + anrufAngenommen = false; + anrufCancel = false; + proxyAddress = ""; + proxyTag = ""; + cSequenz = 1; + werdeAngerufen = false; + + audioRinging = new AudioRinging(); + myTag = createString(8); //erzeugt Random Tag mit Länge 8 + branch = createString(18);//erzeugt Random branch mit Länge 18 + try { + //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren + 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.MYSIPPORT, this.PROTOCOLTYP); + this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint); + this.sipProvider.addSipListener(this); + this.contactAddress = this.addressFactory.createAddress("sip:" + this.myName + "@" + this.myIPAddress + ":" + this.MYSIPPORT); + this.contactHeader = this.headerFactory.createContactHeader(contactAddress); + } catch (Exception e) { + System.out.println("Fehler bei Initialisierung eigener Addresse"); + System.exit(-1); + } } - catch (Exception e) + + private String createString(int anzahl) //Erzeugt Random String in bestimmter länge für branch und Tag { - System.out.println("Fehler bei Initialisierung eigener Addresse"); - System.exit(-1); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < anzahl; i++) { + sb.append(TEST.charAt(RANDOM.nextInt(TEST.length()))); + } + return sb.toString(); } - } - private String createString(int anzahl) - { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < anzahl; i++) - { - sb.append(TEST.charAt(RANDOM.nextInt(TEST.length()))); + public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException { + proxyAddress = serverIP + ":" + serverPort; + SIPRegister register = new SIPRegister(proxyAddress, myTag, myIPAddress, MYSIPPORT, branch, addressFactory, headerFactory, messageFactory, contactHeader, sipProvider.getNewCallId()); + sipProvider.sendRequest(register.getRequest()); + lg.info("Erfolgreiches Senden der Registrierung"); } - return sb.toString(); - } - public void sendRegister(String serverIP, int serverPort) throws ParseException, InvalidArgumentException, SipException - { - proxyAddress = serverIP + ":" + serverPort; - SIPRegister register = new SIPRegister(proxyAddress, myTag, myIPAddress, myPort, branch, addressFactory, headerFactory, messageFactory, contactHeader, sipProvider.getNewCallId()); - sipProvider.sendRequest(register.getRequest()); - lg.info("Erfolgreiches Senden der Registrierung"); - } - - public void sendInvitation(String sipaddresse, String proxyaddresse, - int serverPort) throws SipException - { //ServerPort wird nicht verwendet? - resetCallParameter(); - anrufer = true; - callID = sipProvider.getNewCallId(); - SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, null, anrufer); - SIPInvite sipinvite = new SIPInvite(sipaddresse, proxyaddresse, myIPAddress, myPort, myTag, branch, callID, cSequenz, addressFactory, sdp.getSessionDescription(), headerFactory, messageFactory, contactHeader); - sipProvider.sendRequest(sipinvite.getInviterequest()); - lg.info("Erfolgreiches Senden der Invitation"); - } - - @Override - public void processRequest(RequestEvent requestEvent) - { - lg.info("Bekomme Anfrage"); - 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 - { - SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); - this.sipProvider.sendResponse(tempOk.getResponse()); - view.getTxtArea().append("Server Option Request erfolgreich beantwortet\n"); - lg.info("Erfolgreiches senden des 200Ok-Headers"); - } - catch (SipException ex) - { - lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); - } + public void sendInvitation(String sipaddresse, String proxyaddresse, + int serverPort) throws SipException { //ServerPort wird nicht verwendet? + resetCallParameter(); + anrufer = true; + callID = sipProvider.getNewCallId(); + SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, getMYRTPPORT(), null, anrufer); + SIPInvite sipinvite = new SIPInvite(sipaddresse, proxyaddresse, myIPAddress, MYSIPPORT, myTag, branch, callID, cSequenz, addressFactory, sdp.getSessionDescription(), headerFactory, messageFactory, contactHeader); + sipProvider.sendRequest(sipinvite.getInviterequest()); + lg.info("Erfolgreiches Senden der Invitation"); } - //Aktive Kommunikation - else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer - { - resetCallParameter(); - anrufer = false; - //Falls Anruf ankommt, wichtige Variablen Zwischenspeichern (Branch, Cseq, CallID, proxyTag) - branch = ((ViaHeader) requestEvent.getRequest().getHeader("Via")).getBranch(); - cSequenz = ((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")).getSeqNumber(); - proxyTag = ((FromHeader) requestEvent.getRequest().getHeader("From")).getTag(); - callID = ((CallIdHeader) requestEvent.getRequest().getHeader("CallID")); - //Standartabfolge sobald man angerufen wird - try - { - //Trying Response erzeugen und abschicken - SIP100Trying tempTrying = new SIP100Trying(messageFactory, requestEvent, headerFactory); - sipProvider.sendResponse(tempTrying.getTryResponse()); - view.getTxtArea().append("Trying geschickt\n"); - lg.info("Trying ist raus"); - //Ringing Response erzeugen und abschicken noch Schleife mit "Anruf annehmen" - SIP180Ringing tempRinging = new SIP180Ringing(requestEvent, myTag, contactHeader, headerFactory, messageFactory); - Timer timer = new Timer(); - timer.scheduleAtFixedRate(new TimerTask() + @Override + public void processRequest(RequestEvent requestEvent) { + lg.info("Bekomme Anfrage"); + if ((Request.OPTIONS).equals(requestEvent.getRequest().getMethod())) //Options Anfrage von Server nach erfolgreicher Registrierung { - @Override - public void run() - { - try - { - if (anrufAngenommen != true) //Falls man nicht abnimmt, klingeln + Ringing schicken - { - sipProvider.sendResponse(tempRinging.getResponseRing()); - audioRinging.startRinging(); - } - else if(anrufAngenommen==true) //bei annehmen, klingeln aufhören, OK mit SDP schicken - { - audioRinging.endRinging(); - SIP200Ok respcall = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); - SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, requestEvent, anrufer); - respcall.addSDP(sdp.getSessionDescription(), myTag); - sipProvider.sendResponse(respcall.getResponse()); - view.getTxtArea().append("Telefonat beginnt\n"); - timer.cancel(); - } + lg.info("Option Request von Server, erstellen 200 OK zu Server"); + try { + SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); + this.sipProvider.sendResponse(tempOk.getResponse()); + view.getTxtArea().append("Server Option Request erfolgreich beantwortet\n"); + lg.info("Erfolgreiches senden des 200Ok-Headers"); + } catch (SipException ex) { + lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); } - catch (SipException ex) - { + } //Aktive Kommunikation + else if ((Request.INVITE).equals(requestEvent.getRequest().getMethod())) // Invite von anderem Benutzer + { + resetCallParameter(); + anrufer = false; + //Falls Anruf ankommt, wichtige Variablen Zwischenspeichern (Branch, Cseq, CallID, proxyTag) + branch = ((ViaHeader) requestEvent.getRequest().getHeader("Via")).getBranch(); + cSequenz = ((CSeqHeader) requestEvent.getRequest().getHeader("Cseq")).getSeqNumber(); + proxyTag = ((FromHeader) requestEvent.getRequest().getHeader("From")).getTag(); + callID = ((CallIdHeader) requestEvent.getRequest().getHeader("CallID")); + //Standartabfolge sobald man angerufen wird + try { + //Trying Response erzeugen und abschicken + SIP100Trying tempTrying = new SIP100Trying(messageFactory, requestEvent, headerFactory); + sipProvider.sendResponse(tempTrying.getTryResponse()); + view.getTxtArea().append("Trying geschickt\n"); + lg.info("Trying ist raus"); + //Ringing Response erzeugen und abschicken noch Schleife mit "Anruf annehmen" + SIP180Ringing tempRinging = new SIP180Ringing(requestEvent, myTag, contactHeader, headerFactory, messageFactory); + Timer timer = new Timer(); + + timer.scheduleAtFixedRate(new TimerTask() { + int counter = 0; + + @Override + public void run() { + try { + if (anrufAngenommen != true && counter % 4 == 0) //Falls man nicht abnimmt, klingeln + Ringing schicken + { + sipProvider.sendResponse(tempRinging.getResponseRing()); + audioRinging.startRinging(); + } else if (anrufAngenommen == true) //bei annehmen, klingeln aufhören, OK mit SDP schicken + { + audioRinging.endRinging(); + audioRinging.endRinging(); + SIP200Ok respcall = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); + SIPSessionDescription sdp = new SIPSessionDescription(myName, myIPAddress, getMYRTPPORT(), requestEvent, anrufer); + respcall.addSDP(sdp.getSessionDescription(), myTag); + sipProvider.sendResponse(respcall.getResponse()); + view.getTxtArea().append("Telefonat beginnt\n"); + timer.cancel(); + } else if (anrufCancel == true) { + timer.cancel(); + } + counter++; + } catch (SipException ex) { + + } + } + }, 0, 1000); + } catch (SipException ex) { + lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); } - } - }, 0, 1000); - } - catch (SipException ex) - { - lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); - } + } else if ((Request.ACK).equals(requestEvent.getRequest().getMethod())) { - } - else if ((Request.ACK).equals(requestEvent.getRequest().getMethod())) - { - - } - else if ((Request.CANCEL).equals(requestEvent.getRequest().getMethod())) - { - view.getTxtArea().append("Anruf wurde gecancelt"); - try - { - //Cancel Request -> Response 200 Ok + Response 487 Request Terminated - //200 Ok - anrufCancel = true; - SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); - this.sipProvider.sendResponse(tempOk.getResponse()); - view.getTxtArea().append("Anrufender canceld Anfrage\n"); - lg.info("Erfolgreiches senden des 200 OkHeaders auf CancelAnfrage"); - //487 Request Terminated - } - catch (SipException ex) - { - Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); - } - } - else if ((Request.BYE).equals(requestEvent.getRequest().getMethod())) - { - try - { - SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); - this.sipProvider.sendResponse(tempOk.getResponse()); - } - catch (SipException ex) - { - Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); - } - } - } - - @Override - public void processResponse(ResponseEvent responseEvent) - { - if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED) - { - try - { - cSequenz += 1L; - branch += 10; - SIPUnauthReq req2 = new SIPUnauthReq(myName, proxyAddress, myTag, myIPAddress, branch, cSequenz, myPort, contactHeader, addressFactory, headerFactory, responseEvent, messageFactory); - sipProvider.sendRequest(req2.getUnauthReq()); - view.getTxtArea().append("Erfolgreich registriert\n"); - } - catch (SipException ex) - { - lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); - } - } - else if (responseEvent.getResponse().getStatusCode() == Response.OK) - { - lg.info("Erfolgreichen Response (200 OK) bekommen"); - } - else if (responseEvent.getResponse().getStatusCode() == Response.RINGING) - { - ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To"); - proxyTag = temp.getTag(); + } else if ((Request.CANCEL).equals(requestEvent.getRequest().getMethod())) { + System.out.println("Anruf cancel"); + view.getTxtArea().append("Anruf wurde gecancelt"); + try { + //Cancel Request -> Response 200 Ok + Response 487 Request Terminated + //200 Ok + anrufCancel = true; + SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); + sipProvider.sendResponse(tempOk.getResponse()); + view.getTxtArea().append("Anrufender canceld Anfrage\n"); + lg.info("Erfolgreiches senden des 200 OkHeaders auf CancelAnfrage"); + //487 Request Terminated + } catch (SipException ex) { + Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } else if ((Request.BYE).equals(requestEvent.getRequest().getMethod())) { + try { + SIP200Ok tempOk = new SIP200Ok(messageFactory, requestEvent, contactHeader, headerFactory); + this.sipProvider.sendResponse(tempOk.getResponse()); + } catch (SipException ex) { + Logger.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } } - } + @Override + public void processResponse(ResponseEvent responseEvent) { + if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED) { + try { + cSequenz += 1L; + branch += 10; + SIPUnauthReq req2 = new SIPUnauthReq(myName, proxyAddress, myTag, myIPAddress, branch, cSequenz, MYSIPPORT, contactHeader, addressFactory, headerFactory, responseEvent, messageFactory); + sipProvider.sendRequest(req2.getUnauthReq()); + view.getTxtArea().append("Erfolgreich registriert\n"); + } catch (SipException ex) { + lg.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } else if (responseEvent.getResponse().getStatusCode() == Response.OK) { + //Überprüfen ob Ok Header mit SDP ist + if ((((ContentTypeHeader) responseEvent.getResponse().getHeader("Content-Type")).getContentSubType()).equals("sdp")) { + lg.info("Erfolgreichen Response 200 OK mit SDP bekommen"); + getRTPParameters(responseEvent); + // SIPACK ack = new SIPACK(); + // sipProvider.sendResponse(rspns); + /* + System.out.println("Starte RTP Session"); + //String[] s = null; + SoundSenderDemo aDemo = null; +// try { +// aDemo = new SoundSenderDemo(true); +// } catch (UnknownHostException | InterruptedException ex) { +// Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); +// } + try { + aDemo.SendDemo(null); + } catch (UnknownHostException | InterruptedException ex) { + Logger.getLogger(CommandInvite.class.getName()).log(Level.SEVERE, null, ex); + } + System.out.println("Beende RTP Session"); + */ + } else { + lg.info("Erfolgreichen Response (200 OK) bekommen"); + } + } else if (responseEvent.getResponse().getStatusCode() == Response.RINGING) { + ToHeader temp = (ToHeader) responseEvent.getResponse().getHeader("To"); + proxyTag = temp.getTag(); + } - public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException - { - cSequenz++; - SIPBye tempBye = new SIPBye(calluser, proxyAddress, myName, myIPAddress, myTag, proxyTag, myPort, branch, callID, cSequenz, messageFactory, contactHeader, addressFactory, headerFactory); - sipProvider.sendRequest(tempBye.getByeRequest()); - lg.info("Erfolgreiches Senden des BYE Headers"); - } + } - public void resetCallParameter() - { - anrufAngenommen = false; - anrufer = false; - } + public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException { + cSequenz++; + SIPBye tempBye = new SIPBye(calluser, proxyAddress, myName, myIPAddress, myTag, proxyTag, MYSIPPORT, branch, callID, cSequenz, messageFactory, contactHeader, addressFactory, headerFactory); + sipProvider.sendRequest(tempBye.getByeRequest()); + lg.info("Erfolgreiches Senden des BYE Headers"); + } - public void anrufAnnehmen() - { - anrufAngenommen = true; - } + public void getRTPParameters(ResponseEvent responseEvent) { + int identifier = 0; + String[] reqbody = (responseEvent.getResponse()).toString().split("\\s|" + System.getProperty("line.seperator")); + for (String req : reqbody) { + if (identifier == 1) { + proxyRTPPort = Integer.valueOf(req); + identifier = 0; + } else if (identifier == 2) { + RTPCodec = req; + identifier = 0; + } + if (req.startsWith("m=audio")) { + identifier = 1; + } else if (req.startsWith("a=rtpmap:")) { + identifier = 2; + } + } + } - //Get Methoden falls man mal die Parameter braucht - public String getmyName() - { - return myName; - } + public void resetCallParameter() { + anrufAngenommen = false; + anrufer = false; + } - public Integer getMyPort() - { - return myPort; - } + public void anrufAnnehmen() { + anrufAngenommen = true; + } - public String getMyIPAdress() - { - return myIPAddress; - } + //Get Methoden falls man mal die Parameter braucht + public String getmyName() { + return myName; + } - // Herausfinden bei welchen Events die unteren Funktionen aufgerufen werden -> evtl brauchbar - @Override - public void processTimeout(TimeoutEvent timeoutEvent) - { - //view.getTxtArea().append("processTimeout\n"); - } + public Integer getMyPort() { + return MYSIPPORT; + } - @Override - public void processIOException(IOExceptionEvent exceptionEvent) - { - //view.getTxtArea().append("processIOException\n"); - } + public String getMyIPAdress() { + return myIPAddress; + } - @Override - public void processTransactionTerminated( - TransactionTerminatedEvent transactionTerminatedEvent) - { - //view.getTxtArea().append("processTransactionTerminated\n"); - } + // Herausfinden bei welchen Events die unteren Funktionen aufgerufen werden -> evtl brauchbar + @Override + public void processTimeout(TimeoutEvent timeoutEvent) { + //view.getTxtArea().append("processTimeout\n"); + } - @Override - public void processDialogTerminated( - DialogTerminatedEvent dialogTerminatedEvent) - { - //view.getTxtArea().append("processDialogTerminated\n"); - } + @Override + public void processIOException(IOExceptionEvent exceptionEvent) { + //view.getTxtArea().append("processIOException\n"); + } - @Override - public void processDialogTimeout(DialogTimeoutEvent timeoutEvent) - { - //view.getTxtArea().append("processDialogTerminated\n"); - } + @Override + public void processTransactionTerminated( + TransactionTerminatedEvent transactionTerminatedEvent) { + //view.getTxtArea().append("processTransactionTerminated\n"); + } - /** - * @param myPort the myPort to set - */ - public void setMyPort(int myPort) - { - this.myPort = myPort; - } + @Override + public void processDialogTerminated( + DialogTerminatedEvent dialogTerminatedEvent) { + //view.getTxtArea().append("processDialogTerminated\n"); + } - /** - * @return the myName - */ - public String getMyName() - { - return myName; - } + @Override + public void processDialogTimeout(DialogTimeoutEvent timeoutEvent) { + //view.getTxtArea().append("processDialogTerminated\n"); + } - /** - * @return the proxyTag - */ - public String getProxyTag() - { - return proxyTag; - } + /** + * @param myPort the MYSIPPORT to set + */ + /** + * @return the myName + */ + public String getMyName() { + return myName; + } - /** - * @param proxyTag the proxyTag to set - */ - public void setProxyTag(String proxyTag) - { - this.proxyTag = proxyTag; - } + /** + * @return the proxyTag + */ + public String getProxyTag() { + return proxyTag; + } - /** - * @return the myTag - */ - public String getMyTag() - { - return myTag; - } + /** + * @param proxyTag the proxyTag to set + */ + public void setProxyTag(String proxyTag) { + this.proxyTag = proxyTag; + } - /** - * @param myTag the myTag to set - */ - public void setMyTag(String myTag) - { - this.myTag = myTag; - } + /** + * @return the myTag + */ + public String getMyTag() { + return myTag; + } - /** - * @return the branch - */ - public String getBranch() - { - return branch; - } + /** + * @param myTag the myTag to set + */ + public void setMyTag(String myTag) { + this.myTag = myTag; + } + + /** + * @return the branch + */ + public String getBranch() { + return branch; + } + + /** + * @param proxyRTPPort the proxyRTPPort to set + */ + public void setProxyRTPPort(int proxyRTPPort) { + this.proxyRTPPort = proxyRTPPort; + } + + /** + * @param RTPCodec the RTPCodec to set + */ + public void setRTPCodec(String RTPCodec) { + this.RTPCodec = RTPCodec; + } + + /** + * @return the proxyRTPPort + */ + public int getProxyRTPPort() { + return proxyRTPPort; + } + + /** + * @return the RTPCodec + */ + public String getRTPCodec() { + return RTPCodec; + } + + /** + * @return the MYRTPPORT + */ + public static int getMYRTPPORT() { + return MYRTPPORT; + } + + /** + * @return the MYRTCPPORT + */ + public static int getMYRTCPPORT() { + return MYRTCPPORT; + } } diff --git a/src/model/SoundSenderDemo.java b/src/model/SoundSenderDemo.java index a546772..deafb6a 100644 --- a/src/model/SoundSenderDemo.java +++ b/src/model/SoundSenderDemo.java @@ -22,13 +22,15 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketException; import java.net.UnknownHostException; +import java.util.logging.Level; +import java.util.logging.Logger; import jlibrtp.*; /** * @author Arne Kepp */ public class SoundSenderDemo implements RTPAppIntf { - + SIPmodel model; public RTPSession rtpSession = null; static int pktCount = 0; static int dataCount = 0; @@ -41,32 +43,43 @@ public class SoundSenderDemo implements RTPAppIntf { enum Position { LEFT, RIGHT, NORMAL }; + + public SoundSenderDemo() {} public SoundSenderDemo(boolean isLocal) throws UnknownHostException, InterruptedException { + this.model = model; + DatagramSocket rtpSocket = null; DatagramSocket rtcpSocket = null; - -// for(int i=5000; i<=6000; i++) -// { -// try { -// rtpSocket = new DatagramSocket(i); -// rtpSocket.close(); -// } catch (Exception e) { -// System.out.println("RTPSession failed to obtain port"+i); -// } -// -// } - - InetAddress myIP = InetAddress.getByName("192.168.100.30"); - + //rtpSocket.close(); + //rtcpSocket.close(); // try { -// rtpSocket = new DatagramSocket(5004, myIP); -// rtcpSocket = new DatagramSocket(5005, myIP); -// } catch (SocketException e) { +// rtpSocket = new DatagramSocket(model.getProxyRTPPort()); +// } catch (SocketException ex) { +// Logger.getLogger(SoundSenderDemo.class.getName()).log(Level.SEVERE, null, ex); // System.out.println("RTPSession failed to obtain port"); // } +// try { +// rtcpSocket = new DatagramSocket(model.getProxyRTPPort()+1); +// } catch (SocketException ex) { +// Logger.getLogger(SoundSenderDemo.class.getName()).log(Level.SEVERE, null, ex); +// System.out.println("RTCPSession failed to obtain port"); +// } + + + InetAddress myIP = InetAddress.getByName("192.168.100.247"); + + try { + rtpSocket = new DatagramSocket(5004, myIP); + rtcpSocket = new DatagramSocket(5005, myIP); + } catch (SocketException e) { + System.out.println(e); + System.out.println("RTPSession failed to obtain port"); + rtpSocket.close(); + rtcpSocket.close(); + } - + /* try { rtpSocket = new DatagramSocket(null); InetSocketAddress myInetSocketAddress = new InetSocketAddress(5004); @@ -77,7 +90,7 @@ public class SoundSenderDemo implements RTPAppIntf { rtpSocket.close(); rtcpSocket.close(); } - + */ rtpSession = new RTPSession(rtpSocket, rtcpSocket); rtpSession.RTPSessionRegister(this, null, null); @@ -90,7 +103,7 @@ public class SoundSenderDemo implements RTPAppIntf { */ public void SendDemo(String[] args) throws UnknownHostException, InterruptedException { args = new String[4]; - args[1] = "192.168.100.249"; + args[1] = "192.168.100.11"; args[0] = "C:\\Users\\Tim\\Desktop\\VoIP PA\\project\\VoIPProjekt\\src\\SoundDateien\\RingingPhone.wav"; args[2] = "5004"; args[3] = "5005"; @@ -105,8 +118,9 @@ public class SoundSenderDemo implements RTPAppIntf { // args[2] = "5004"; // args[3] = "5005"; // } - SoundSenderDemo aDemo = new SoundSenderDemo(false); - Participant p = new Participant("192.168.100.249", Integer.parseInt(args[2]), Integer.parseInt(args[2]) + 1); + SoundSenderDemo aDemo; + aDemo = new SoundSenderDemo(true); + Participant p = new Participant("192.168.100.11", Integer.parseInt(args[2]), Integer.parseInt(args[2]) + 1); aDemo.rtpSession.addParticipant(p); aDemo.filename = args[0]; aDemo.run(); @@ -190,7 +204,7 @@ public class SoundSenderDemo implements RTPAppIntf { if (nBytesRead >= 0) { rtpSession.sendData(abData); //if(!this.local) { - auline.write(abData, 0, abData.length); + //auline.write(abData, 0, abData.length); //dataCount += abData.length; //if(pktCount % 10 == 0) {