diff --git a/src/SoundDateien/About24.gif b/src/SoundDateien/About24.gif new file mode 100644 index 0000000..9e11689 Binary files /dev/null and b/src/SoundDateien/About24.gif differ diff --git a/src/SoundDateien/RingingPhone.wav b/src/SoundDateien/RingingPhone.wav new file mode 100644 index 0000000..5b81d99 Binary files /dev/null and b/src/SoundDateien/RingingPhone.wav differ diff --git a/src/model/AudioRinging.java b/src/model/AudioRinging.java new file mode 100644 index 0000000..4f354cc --- /dev/null +++ b/src/model/AudioRinging.java @@ -0,0 +1,67 @@ +/* + * 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.io.File; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; +import javax.sound.sampled.DataLine; +import logger.OhmLogger; + +/** + * https://docs.oracle.com/javase/tutorial/sound/playing.html + * + * @author Jan + */ +public class AudioRinging +{ + private AudioInputStream stream; + private AudioFormat format; + private DataLine.Info info; + private Clip clip; + private File audioFile; + + private static final Logger lgAudioRing = OhmLogger.getLogger(); + + public AudioRinging() + { + //Normalerweise so da Betriebssystemunabhängig aber ka wo der Fehler ist + //String file = (File.separator+"phone"+File.separator+"SoundDateien"+ File.separator+"RingingPhone.wav"); + audioFile = new File(getClass().getResource("/SoundDateien/RingingPhone.wav").getFile()); + try + { + format = AudioSystem.getAudioInputStream(audioFile).getFormat(); + info = new DataLine.Info(Clip.class, format); + } + catch (Exception ex) + { + lgAudioRing.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } + public void startRinging() + { + try + { + stream = AudioSystem.getAudioInputStream(audioFile);; + clip = (Clip) AudioSystem.getLine(info); + clip.open(stream); + clip.start(); + } + catch (Exception ex) + { + lgAudioRing.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } + public void endRinging() + { + clip.stop(); + clip.close(); + } +} diff --git a/src/model/Audioausgabe.java b/src/model/Audioausgabe.java deleted file mode 100644 index 492f952..0000000 --- a/src/model/Audioausgabe.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.DataLine; -import javax.sound.sampled.SourceDataLine; -import javax.sound.sampled.TargetDataLine; - -/** - * - * @author Jan - */ -public class Audioausgabe implements Runnable -{ - AudioFormat format; - AudioInputStream audioInput; - SourceDataLine sourceData; - private ExecutorService audioausgabe; - ByteArrayOutputStream output; - - public Audioausgabe() - { - audioausgabe = Executors.newSingleThreadExecutor(); - float sampleRate = 48000; - int sampleSizeInBits = 16; - int channels = 1; - boolean signed = true; - boolean bigEndian = true; - try - { - format = new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian); - DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); - } - catch (Exception e) - { - System.out.println("Fehler bei dem Audioformat des Mikrophones"); - Logger.getLogger(Audioausgabe.class.getName()).log(Level.SEVERE, null, e); - } - } - public void playAudio() - { - try - { - byte audioData[] = output.toByteArray(); - InputStream byteArrayInputStream = new ByteArrayInputStream( - audioData); - audioInput = new AudioInputStream(byteArrayInputStream, format, audioData.length / format.getFrameSize()); - DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, format); - sourceData = (SourceDataLine) AudioSystem.getLine(dataLineInfo); - sourceData.open(format); - sourceData.start(); - int cnt = 0; - byte tempBuffer[] = new byte[1000000]; - try - { - while ((cnt = audioInput.read(tempBuffer, 0, tempBuffer.length)) != -1) - { - if (cnt > 0) - { - sourceData.write(tempBuffer, 0, cnt); - } - } - } - catch (IOException e) - { - e.printStackTrace(); - } - sourceData.drain(); - sourceData.close(); - } - catch (Exception e) - { - - } - } - - @Override - public void run() - { - } -} diff --git a/src/model/SIPBye.java b/src/model/SIPBye.java new file mode 100644 index 0000000..c5678f0 --- /dev/null +++ b/src/model/SIPBye.java @@ -0,0 +1,79 @@ +/* + * 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.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sip.address.Address; +import javax.sip.address.AddressFactory; +import javax.sip.address.URI; +import javax.sip.header.AllowHeader; +import javax.sip.header.CSeqHeader; +import javax.sip.header.CallIdHeader; +import javax.sip.header.ContactHeader; +import javax.sip.header.ExpiresHeader; +import javax.sip.header.FromHeader; +import javax.sip.header.HeaderFactory; +import javax.sip.header.MaxForwardsHeader; +import javax.sip.header.ToHeader; +import javax.sip.header.ViaHeader; +import javax.sip.message.MessageFactory; +import javax.sip.message.Request; +import logger.OhmLogger; + +/** + * + * @author Jan + */ +public class SIPBye +{ + private Request byeRequest; + private static final Logger lgBye= OhmLogger.getLogger(); + //Wichtig Unterscheidung Wer das Gespräch begonnen hat -> Unterschiedliche Header!!! + public SIPBye(String calluser, String proxyAddress, String myName, String myIPAddress, + String myTag,String proxyTag, Integer myPort, String branch, CallIdHeader callID , + Long cSequenz, MessageFactory messageFactory, ContactHeader contactHeader, + AddressFactory addressFactory, HeaderFactory headerFactory ) + { + try + { + Address addressLine = addressFactory.createAddress("sip:" + calluser + "@" + proxyAddress); + URI requestURI = addressLine.getURI(); + + Address addressfrom = addressFactory.createAddress("sip:" + myName + "@" + myIPAddress); + FromHeader from = headerFactory.createFromHeader(addressfrom, myTag); + + Address addressTo = addressFactory.createAddress("sip:" + myName + "@" + proxyAddress); + ToHeader to = headerFactory.createToHeader(addressTo, proxyTag); // Ergänzung TAG!! + + ArrayList via = new ArrayList(); //Via needs a List as input + ViaHeader viaheader = headerFactory.createViaHeader(myIPAddress, myPort, "UDP", branch); + via.add(viaheader); + CSeqHeader cSeq = headerFactory.createCSeqHeader(cSequenz, "BYE"); + MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); + AllowHeader allow = headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); + ExpiresHeader expire = headerFactory.createExpiresHeader(3600); //int value + byeRequest = messageFactory.createRequest(requestURI, "BYE", callID, cSeq, from, to, via, maxForwards); + byeRequest.addHeader(contactHeader); + byeRequest.addHeader(allow); + byeRequest.addHeader(expire); + } + catch (Exception ex) + { + lgBye.getLogger(SIPmodel.class.getName()).log(Level.SEVERE, null, ex); + } + } + + /** + * @return the byeRequest + */ + public Request getByeRequest() + { + return byeRequest; + } +} diff --git a/src/model/SIPmodel.java b/src/model/SIPmodel.java index ea80102..efc3aa7 100644 --- a/src/model/SIPmodel.java +++ b/src/model/SIPmodel.java @@ -53,6 +53,8 @@ public class SIPmodel implements SipListenerExt public ListeningPoint listeningPoint; // SIP listening IP address/port. public Properties properties; // Other properties. + private AudioRinging audioRinging; + private int myPort = 5060; private String myName = "129"; public String protocolTyp = "UDP"; @@ -85,7 +87,8 @@ public class SIPmodel implements SipListenerExt 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 @@ -128,7 +131,7 @@ public class SIPmodel implements SipListenerExt { proxyAddress = serverIP + ":" + serverPort; SIPRegister register = new SIPRegister(proxyAddress, myTag, myIPAddress, myPort, branch, addressFactory, headerFactory, messageFactory, contactHeader, sipProvider.getNewCallId()); - this.sipProvider.sendRequest(register.getRequest()); + sipProvider.sendRequest(register.getRequest()); lg.info("Erfolgreiches Senden der Registrierung"); } @@ -137,10 +140,10 @@ public class SIPmodel implements SipListenerExt { //ServerPort wird nicht verwendet? resetCallParameter(); anrufer = true; - callID = this.sipProvider.getNewCallId(); + 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); - this.sipProvider.sendRequest(sipinvite.getInviterequest()); + sipProvider.sendRequest(sipinvite.getInviterequest()); lg.info("Erfolgreiches Senden der Invitation"); } @@ -192,12 +195,14 @@ public class SIPmodel implements SipListenerExt { try { - if (anrufAngenommen != true) + if (anrufAngenommen != true) //Falls man nicht abnimmt, klingeln + Ringing schicken { sipProvider.sendResponse(tempRinging.getResponseRing()); + audioRinging.startRinging(); } - else if(anrufAngenommen==true) + 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); @@ -288,29 +293,9 @@ public class SIPmodel implements SipListenerExt public void byecall(String calluser) throws ParseException, InvalidArgumentException, SipException { - Address addressLine = this.addressFactory.createAddress("sip:" + calluser + "@" + proxyAddress); - URI requestURI = addressLine.getURI(); - - Address addressfrom = this.addressFactory.createAddress("sip:" + myName + "@" + myIPAddress); - FromHeader from = this.headerFactory.createFromHeader(addressfrom, String.valueOf(this.myTag)); - - Address addressTo = this.addressFactory.createAddress("sip:" + myName + "@" + proxyAddress); - ToHeader to = this.headerFactory.createToHeader(addressTo, proxyTag); // Ergänzung TAG!! - - 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); - cSequenz++; - CSeqHeader cSeq = this.headerFactory.createCSeqHeader(cSequenz, "BYE"); - 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, "BYE", callID, cSeq, from, to, via, maxForwards); - request.addHeader(contactHeader); - request.addHeader(allow); - request.addHeader(expire); - this.sipProvider.sendRequest(request); + 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"); }