Browse Source

SDP ergänzt, sinnvoll wär es jetzt geeignete Funktionen zu erstellen + RTP zu ergänzen

RTP
Normal 5 years ago
parent
commit
8fbb5a96c8
1 changed files with 124 additions and 76 deletions
  1. 124
    76
      src/model/VoIP.java

+ 124
- 76
src/model/VoIP.java View File

import java.util.*; import java.util.*;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.sdp.SdpException;
import javax.sdp.SdpFactory;
import javax.sdp.SessionDescription;
import javax.sip.DialogTerminatedEvent; import javax.sip.DialogTerminatedEvent;
import javax.sip.IOExceptionEvent; import javax.sip.IOExceptionEvent;
import javax.sip.InvalidArgumentException; import javax.sip.InvalidArgumentException;
AddressFactory addressFactory; // Used to create SIP URIs. AddressFactory addressFactory; // Used to create SIP URIs.
ListeningPoint listeningPoint; // SIP listening IP address/port. ListeningPoint listeningPoint; // SIP listening IP address/port.
Properties properties; // Other properties. Properties properties; // Other properties.
private int counter; private int counter;
private int myPort = 5060; private int myPort = 5060;
private String myName = "129"; private String myName = "129";
private String protocolTyp = "UDP"; private String protocolTyp = "UDP";
private String myIPAddress; private String myIPAddress;
private int branch = hashCode(); private int branch = hashCode();
Address contactAddress; Address contactAddress;
private ContactHeader contactHeader; private ContactHeader contactHeader;


public VoIP() //Konstruktor für eigene Daten public VoIP() //Konstruktor für eigene Daten
{ {
try try
{ {
//wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren //wird an sich erstmal nicht gebraucht aber später sinnvoll um eigene Daten zu initialisieren
this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp); this.listeningPoint = this.sipStack.createListeningPoint(this.myIPAddress, this.myPort, this.protocolTyp);
this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint); this.sipProvider = this.sipStack.createSipProvider(this.listeningPoint);
this.sipProvider.addSipListener(this); 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); this.contactHeader = this.headerFactory.createContactHeader(contactAddress);
} }
catch (Exception e) catch (Exception e)
System.out.println("Shit"); System.out.println("Shit");
System.exit(-1); System.exit(-1);
} }
} }

public int hashCode() public int hashCode()
{
int temp = tag*(new Random(100)).nextInt();
{
int temp = tag * (new Random(100)).nextInt();
return temp; 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-----------"); System.out.println("-----------SendRegister-----------");
Address addressto = this.addressFactory.createAddress("sip:192.168.100.11"); //evtl. mit Port: sip:192.168.100.11:5060 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 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 ToHeader to = this.headerFactory.createToHeader(addresstob, null); // Integer.toString(tag) address + tag
URI requestURI = addressto.getURI(); URI requestURI = addressto.getURI();
CallIdHeader callId = this.sipProvider.getNewCallId(); CallIdHeader callId = this.sipProvider.getNewCallId();
FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress
ArrayList via = new ArrayList(); //Via needs a List as input 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); via.add(viaheader);
CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "REGISTER"); CSeqHeader cSeq = this.headerFactory.createCSeqHeader(1L, "REGISTER");
MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70); MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
//Create Request Header //Create Request Header
System.out.println("----REQUEST HEADER----"); System.out.println("----REQUEST HEADER----");
Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards); Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
request.addHeader(contactHeader); request.addHeader(contactHeader);
request.addHeader(allow); request.addHeader(allow);
request.addHeader(expire); request.addHeader(expire);
System.out.println(request); System.out.println(request);
this.sipProvider.sendRequest(request); this.sipProvider.sendRequest(request);
} }


@Override @Override
@Override @Override
public void processRequest(RequestEvent requestEvent) 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"); System.out.println("200 OK zu Server");
try 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 //Kontakt Header
response.addHeader(contactHeader); response.addHeader(contactHeader);
//Accept Header für application/sdp //Accept Header für application/sdp
AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
AllowEventsHeader allowevents = this.headerFactory.createAllowEventsHeader("talk,hold,refer,call-info"); 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(allow);
response.addHeader(allowevents); response.addHeader(allowevents);
this.sipProvider.sendResponse(response); this.sipProvider.sendResponse(response);
Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); 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("Hab invitation bekommen");
System.out.println("Gleich antworte ich"); System.out.println("Gleich antworte ich");
try 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 SupportedHeader supp = this.headerFactory.createSupportedHeader("replace,path,timer"); //nachschauen
AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
responsetry.addHeader(supp); responsetry.addHeader(supp);
responsetry.addHeader(allow); responsetry.addHeader(allow);
this.sipProvider.sendResponse(responsetry); this.sipProvider.sendResponse(responsetry);
System.out.println("Trying ist raus"); 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(temptoring);
responsering.addHeader((CSeqHeader)requestEvent.getRequest().getHeader("Cseq"));
responsering.addHeader((CSeqHeader) requestEvent.getRequest().getHeader("Cseq"));
responsering.addHeader(contactHeader); responsering.addHeader(contactHeader);
responsering.addHeader(supp); responsering.addHeader(supp);
responsering.addHeader(allow); responsering.addHeader(allow);
AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold");// für was gebraucht AllowEventsHeader allowevent = this.headerFactory.createAllowEventsHeader("talk,hold");// für was gebraucht
responsering.addHeader(allowevent); responsering.addHeader(allowevent);
this.sipProvider.sendResponse(responsering); this.sipProvider.sendResponse(responsering);
System.out.println("Response ist raus"); System.out.println("Response ist raus");

System.out.println("Erstelle 200 Ok + SDP Header(contentHeader)");
//Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP) //Jetzt kommt 200 Ok SIP Header + SDP (SIP/SDP)
//Sdp Header erstellen nächster Schritt //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"); 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); Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex);
} }

} }
else if ((Request.ACK).equals(requestEvent.getRequest().getMethod())) else if ((Request.ACK).equals(requestEvent.getRequest().getMethod()))
{ {
} }

} }


@Override @Override
public void processResponse(ResponseEvent responseEvent)
public void processResponse(ResponseEvent responseEvent)
{ {
System.out.println("---Response---"); System.out.println("---Response---");
//System.out.println(responseEvent.getResponse()); //System.out.println(responseEvent.getResponse());
if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED)

if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED)
{

try
{ {
try {
Address addresstob = this.addressFactory.createAddress("sip:129@192.168.100.11"); //"sip:Jan@192.168.100.11" 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 temp = (ToHeader) responseEvent.getResponse().getHeader("To");


ToHeader to = this.headerFactory.createToHeader(addresstob, temp.getTag()); // Integer.toString(tag) address + tag ToHeader to = this.headerFactory.createToHeader(addresstob, temp.getTag()); // Integer.toString(tag) address + tag
URI requestURI = addresstob.getURI(); URI requestURI = addresstob.getURI();
//CallIdHeader tempcall = (CallIdHeader)responseEvent.getResponse().getHeader("Call-ID"); //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 FromHeader from = this.headerFactory.createFromHeader(addresstob, String.valueOf(this.tag)); //this.contactAddress
//set Authorization header evtl. user Name benutzen den es gibt //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 AuthorizationHeader auth = this.headerFactory.createAuthorizationHeader("Digest");//was kommt in den string
auth.setRealm(abc.getRealm()); auth.setRealm(abc.getRealm());
auth.setNonce(abc.getNonce()); 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.setURI(addresstest.getURI());
auth.setUsername(myName); auth.setUsername(myName);


ArrayList via = new ArrayList(); //Via needs a List as input 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); via.add(viaheader);
CSeqHeader cSeq = this.headerFactory.createCSeqHeader(2L, "REGISTER"); CSeqHeader cSeq = this.headerFactory.createCSeqHeader(2L, "REGISTER");
MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70); MaxForwardsHeader maxForwards = this.headerFactory.createMaxForwardsHeader(70);
AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE"); AllowHeader allow = this.headerFactory.createAllowHeader("NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS,MESSAGE");
ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value ExpiresHeader expire = this.headerFactory.createExpiresHeader(3600); //int value
//Zusätzliche Register Header nach Unauthorzied //Zusätzliche Register Header nach Unauthorzied
//Create Request Header //Create Request Header
System.out.println("----REQUEST HEADER2----"); System.out.println("----REQUEST HEADER2----");
Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards); Request request = this.messageFactory.createRequest(requestURI, "REGISTER", callId, cSeq, from, to, via, maxForwards);
//System.out.println(request); //System.out.println(request);
this.sipProvider.sendRequest(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); Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex);
} }
} }
else if (responseEvent.getResponse().getStatusCode() == Response.OK) else if (responseEvent.getResponse().getStatusCode() == Response.OK)
{ {

Loading…
Cancel
Save