From 326129e34e0905f0bd1dd1bedd8ee15831447b07 Mon Sep 17 00:00:00 2001 From: Normal Date: Fri, 17 May 2019 16:47:30 +0200 Subject: [PATCH] Test --- src/controller/CommandController.java | 58 +++++++ src/gui/Hauptfenster.form | 74 ++++++++ src/gui/Hauptfenster.java | 165 ++++++++++++++++++ src/model/VoIP.java | 232 ++++++++++++++++++++++++++ src/phone/Start.java | 39 +++++ 5 files changed, 568 insertions(+) create mode 100644 src/controller/CommandController.java create mode 100644 src/gui/Hauptfenster.form create mode 100644 src/gui/Hauptfenster.java create mode 100644 src/model/VoIP.java create mode 100644 src/phone/Start.java diff --git a/src/controller/CommandController.java b/src/controller/CommandController.java new file mode 100644 index 0000000..6d4d2d8 --- /dev/null +++ b/src/controller/CommandController.java @@ -0,0 +1,58 @@ +/* + * 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 controller; + +import gui.Hauptfenster; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.ParseException; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.sip.InvalidArgumentException; +import javax.sip.SipException; +import model.VoIP; + +/** + * + * @author Normal + */ +public class CommandController implements ActionListener +{ + private VoIP model; + private Hauptfenster view; + public CommandController(VoIP model, Hauptfenster view) + { + this.model = model; + this.view = view; + + } + public void registerEvents() + { + view.getBtn1().addActionListener(this); + } + + @Override + public void actionPerformed(ActionEvent e) + { + try + { + model.sendRegister("123123", 1); + } + catch (ParseException ex) + { + Logger.getLogger(CommandController.class.getName()).log(Level.SEVERE, null, ex); + } + catch (InvalidArgumentException ex) + { + Logger.getLogger(CommandController.class.getName()).log(Level.SEVERE, null, ex); + } + catch (SipException ex) + { + Logger.getLogger(CommandController.class.getName()).log(Level.SEVERE, null, ex); + } + } +} diff --git a/src/gui/Hauptfenster.form b/src/gui/Hauptfenster.form new file mode 100644 index 0000000..5ecd561 --- /dev/null +++ b/src/gui/Hauptfenster.form @@ -0,0 +1,74 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/gui/Hauptfenster.java b/src/gui/Hauptfenster.java new file mode 100644 index 0000000..a7782e2 --- /dev/null +++ b/src/gui/Hauptfenster.java @@ -0,0 +1,165 @@ +/* + * 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 gui; + +/** + * + * @author Normal + */ +public class Hauptfenster extends javax.swing.JFrame +{ + /** + * @return the btn1 + */ + public javax.swing.JButton getBtn1() + { + return btn1; + } + + /** + * @return the btn2 + */ + public javax.swing.JButton getBtn2() + { + return btn2; + } + + /** + * @return the textField + */ + public javax.swing.JTextField getTextField() + { + return textField; + } + + /** + * @param textField the textField to set + */ + public void setTextField(javax.swing.JTextField textField) + { + this.textField = textField; + } + + /** + * @return the txtArea + */ + public javax.swing.JTextArea getTxtArea() + { + return txtArea; + } + + /** + * @param txtArea the txtArea to set + */ + public void setTxtArea(javax.swing.JTextArea txtArea) + { + this.txtArea = txtArea; + } + + /** + * Creates new form Hauptfenster + */ + public Hauptfenster() + { + initComponents(); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() + { + + jScrollPane1 = new javax.swing.JScrollPane(); + txtArea = new javax.swing.JTextArea(); + textField = new javax.swing.JTextField(); + jPanel1 = new javax.swing.JPanel(); + btn1 = new javax.swing.JButton(); + btn2 = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + + txtArea.setColumns(20); + txtArea.setRows(5); + jScrollPane1.setViewportView(txtArea); + + getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER); + getContentPane().add(textField, java.awt.BorderLayout.PAGE_START); + + btn1.setText("btn1"); + jPanel1.add(btn1); + + btn2.setText("btn2"); + jPanel1.add(btn2); + + getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END); + + pack(); + setLocationRelativeTo(null); + }// //GEN-END:initComponents + + /** + * @param args the command line arguments + */ + public static void main(String args[]) + { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try + { + for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) + { + if ("Nimbus".equals(info.getName())) + { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } + catch (ClassNotFoundException ex) + { + java.util.logging.Logger.getLogger(Hauptfenster.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + catch (InstantiationException ex) + { + java.util.logging.Logger.getLogger(Hauptfenster.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + catch (IllegalAccessException ex) + { + java.util.logging.Logger.getLogger(Hauptfenster.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + catch (javax.swing.UnsupportedLookAndFeelException ex) + { + java.util.logging.Logger.getLogger(Hauptfenster.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(new Runnable() + { + public void run() + { + new Hauptfenster().setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton btn1; + private javax.swing.JButton btn2; + private javax.swing.JPanel jPanel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTextField textField; + private javax.swing.JTextArea txtArea; + // End of variables declaration//GEN-END:variables +} diff --git a/src/model/VoIP.java b/src/model/VoIP.java new file mode 100644 index 0000000..309e868 --- /dev/null +++ b/src/model/VoIP.java @@ -0,0 +1,232 @@ +/* + * 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.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.*; + +/** + * + * @author Normal + */ +public class VoIP implements SipListenerExt +{ + 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() + { + + try + { + //wird an sich erstmal nicht gebraucht aber später sinnvoll um in die unteren Daten zu ergänzen + 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 + { + 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)); + 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 + //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 + public void processDialogTimeout(DialogTimeoutEvent timeoutEvent) + { + } + + @Override + public void processRequest(RequestEvent requestEvent) + { + System.out.println("RequestEvent " + requestEvent.getServerTransaction().getDialog()); + } + + @Override + public void processResponse(ResponseEvent responseEvent) + { + System.out.println("---Response---"); + System.out.println(responseEvent.getResponse()); + + if (responseEvent.getResponse().getStatusCode() == Response.UNAUTHORIZED && counter ==0) + { + + counter++; + + 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()); + //System.out.println("Test"); + //auth.setQop(abc.getQop()); + System.out.println("Test"); + //auth.setOpaque(abc.getOpaque()); + auth.setUsername(myName); + System.out.println("-----auth------"); + System.out.println(auth); + + + 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); + System.out.println(request); + this.sipProvider.sendRequest(request); + } + catch (ParseException | SipException |InvalidArgumentException ex) { + Logger.getLogger(VoIP.class.getName()).log(Level.SEVERE, null, ex); + } + + } + else if (responseEvent.getResponse().getStatusCode() == Response.OK) + { + System.out.println("responseEvent.getResponse()" + responseEvent.getResponse()); + + } + + } + + @Override + public void processTimeout(TimeoutEvent timeoutEvent) + { + } + + @Override + public void processIOException(IOExceptionEvent exceptionEvent) + { + } + + @Override + public void processTransactionTerminated( + TransactionTerminatedEvent transactionTerminatedEvent) + { + } + + @Override + public void processDialogTerminated( + DialogTerminatedEvent dialogTerminatedEvent) + { + } +} diff --git a/src/phone/Start.java b/src/phone/Start.java new file mode 100644 index 0000000..4893c00 --- /dev/null +++ b/src/phone/Start.java @@ -0,0 +1,39 @@ +/* + * 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 phone; + +import controller.CommandController; +import gui.Hauptfenster; +import java.text.ParseException; +import model.VoIP; +/** + * Builder Class + * @author Normal + */ +public class Start +{ + public Start() throws ParseException + { + Hauptfenster view = new Hauptfenster(); + VoIP model = new VoIP(); + + CommandController controller = new CommandController(model, view); + controller.registerEvents(); + //view.setExtendedState(Frame.MAXIMIZED_BOTH); + view.setTitle("TestOberfläche VoIP Phone"); + view.setVisible(true); + + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws ParseException + { + new Start(); + } +}