2oo8 Développement d’une application CTI « QuickDial » Application Java QuickDial Création d’une application java de CTI appelée « QuickDial ». Cette application permet de lancer un appel sur les plateformes Asterisk et Cisco CallManager. Frédéric BURKHARD & Marc-Antoine HERRY IUT Colmar 2oo8 Développement d’une application CTI « QuickDial » 2oo8 SOMMAIRE SOMMAIRE .............................................................................................................................................. 2 INTRODUCTION ........................................................................................................................................... 3 TP1 : CREATION DES CLASSES « MODELES » ................................................................................................ 4 TP2 : CREATION DES CLASSES « VUES »..................................................................................................... 10 TP3 : CREATION DE LA CLASSE « CONTROLEUR » ........................................................................................ 19 TP4 : CLASSE CTI : ETABLISSEMENT D ’UN APPEL DEPUIS « ASTERISK-JAVA » .............................................. 21 CONCLUSION............................................................................................................................................ 24 Page 2 Développement d’une application CTI « QuickDial » 2oo8 INTRODUCTION Cette série de TP à pour but de créer une application Java de CTI appelé « QuickDial ». Cette application permet de lancer un appel sur les plateformes Asterisk et Cisco CallManager. Elle utilise respectivement les API Asterisk-Java et JTAPI. Tous les fichiers présentés dans ce compte-rendu comportent une méthode main qui permet de les exécuter. Cependant le programme final ne comporte qu’un seul fichier avec une méthode main qui est le Controleur. Pour mener à bien cette série de TP nous avons utilisé le logiciel de programmation NetBeans 6.0, ainsi qu’un serveur Asterisk et un SoftPhone XLite. Un PBX Cisco CallManager est également à notre disposition. Page 3 Développement d’une application CTI « QuickDial » 2oo8 TP1 : CREATION DES CLASSES « MODELES » Toutes les classes « modèles » dont il est question ci-dessous sont crées et testées avec la version standard Java2. Chaque classe dispose d’une méthode toString() permettant l’affichage du contenu des attributs et d’une méthode main() permettant de tester la classe. ModeleQuickDial - Numero : String - Status : String - AsteriskSelected : boolean -CiscoCallManagerSelected : boolean +ModeleQuickDial() +ModeleQuickDial(Status : String) +setNumero(String : Numero) +setStatus(Status : String) +setAsteriskSelected(State : boolean) +setCiscoCallManagerSelected(State : boolean) +getNumero() : String +getStatus() : String +getAsteriskSelected() : boolean +getCiscoCallManagerSelected() : boolean +toString() : String +main(args:String[]) package quickdial; /** * * @author FreDMouL */ public class ModeleQuickDial { private String Numero; private String Status; private boolean AsteriskSelected; private boolean CiscoCallManagerSelected; /** Creates a new instance of ModeleQuickDial */ public ModeleQuickDial() { Numero = ""; Status = ""; AsteriskSelected = false; CiscoCallManagerSelected = false; } // Valeur de base pour le Numero // Valeur de base pour le Status // Valeur de base pour le Status Asterisk // Valeur de base pour le Status Cisco public ModeleQuickDial(String Status) { this.Status=Status; } // définit le Status public void setNumero(String Numero) { this.Numero=Numero; } // définit le Numero Page 4 Développement d’une application CTI « QuickDial » 2oo8 public void setStatus(String Status) { this.Status=Status; } // définit le Status public void setAsteriskSelected(boolean State) { AsteriskSelected = State; } // définit le Status Asterisk public void setCiscoCallManagerSelected(boolean State) { CiscoCallManagerSelected=State; } // définit le Status Cisco public String getNumero() { return Numero; } // retourne le Numero public String getStatus() { return Status; // retourne le Status } public boolean getAsteriskSelected() { return AsteriskSelected; } sélectionné // définit si oui ou non Asterisk est public boolean getCiscoCallManagerSelected() { return CiscoCallManagerSelected; } // définit si oui ou non Cisco est sélectionné public String toString() { // permet d’afficher tous les paramètres return "Numero : "+Numero+"\n" +"Status : "+Status+"\n" +"Asterisk : "+AsteriskSelected+"\n" +"CiscoCallManager"+CiscoCallManagerSelected+"\n"; } public static void main(String[] args){ // permet d’exécuter le fichier ModeleQuickDial run = new ModeleQuickDial("..."); run.setNumero("1234"); System.out.println("Numéro : "+run.getNumero()); System.out.println("Status : "+run.getStatus()); System.out.println("Asterisk Selected : "+run.getAsteriskSelected()); System.out.println("Cisco Selected : "+run.getCiscoCallManagerSelected()); run.setAsteriskSelected(true); System.out.println("Asterisk Selected : "+run.getAsteriskSelected()); run.setStatus("...."); System.out.println("Status : "+run.getStatus()); System.out.println("tostring \n"+run.toString()); } } Page 5 Développement d’une application CTI « QuickDial » 2oo8 ModeleParametresGeneriques # Host : String # Username : String # Password : String +ModeleParametresGeneriques() + ModeleParametresGeneriques (Host : String, Username : String, Password : String) +setHost(Host : String) +setUsername(Username : String) +setPassword(Password : String) +getHost() : String +getUsername() : String +getPassword() : boolean +toString() : String +main(args:String[]) package quickdial; /** * * @author FreDMouL */ public class ModeleParametresGeneriques { protected String Host; protected String Username; protected String Password; public ModeleParametresGeneriques() { } public void ModeleParametresGeneriques(String Host, String Username, String Password) { this.Host=Host; this.Password=Password; this.Username=Username; } public void setHost(String Host) { this.Host=Host; } // définit l’@IP du serveur public void setUsername(String Username) { this.Username=Username; } // définit le Username public void setPassword(String Password) { this.Password=Password; } // définit le Password public String getHost() { return Host; } // retourne l’@IP du serveur Page 6 Développement d’une application CTI « QuickDial » 2oo8 public String getUsername() { return Username; } public String getPassword() { return Password; } // retourne le Username //retourne le Password public String toString() { // affiche tous les paramètres StringBuilder result = new StringBuilder(); String NEW_LINE = System.getProperty("line.separator"); result.append("Host : " +getHost() +NEW_LINE); result.append("Username : " +getUsername() +NEW_LINE); result.append("Password : " +getPassword() +NEW_LINE); return result.toString(); } public static void main(String[] args) { // permet d’exécuter le fichier ModeleParametresGeneriques runparam = new ModeleParametresGeneriques(); runparam.setHost("setHost"); runparam.setPassword("setPassword"); runparam.setUsername("setUsername"); System.out.println("\n\ntoString : \n" +runparam.toString()); System.out.println("runparam : \n" +runparam.getHost() +"\n" +runparam.getUsername() +"\n" +runparam.getPassword()); } } // affiche tous les paramètres ModeleParametresGeneriques Relation héritage ModeleParametresAsterisk - LocalPhone : String +ModeleParametresAsterisk() + ModeleParametresAsterisk (Host : String, Username : String, LocalPhone : String) +setLocalPhone(LocalPhone : String) +getLocalPhone() : String +toString() : String +main(args:String[]) Page 7 Développement d’une application CTI « QuickDial » 2oo8 package quickdial; /** * * @author FreDMouL */ public class ModeleParametresAsterisk extends ModeleParametresGeneriques{ private String LocalPhone; public ModeleParametresAsterisk() { } public ModeleParametresAsterisk(String Host, String Username, String Password, String LocalPhone) { this.Host=Host; // définit l’@IP du serveur this.Username=Username; // définit le Username this.Password=Password; // définit le Password this.LocalPhone=LocalPhone; } public void setLocalPhone(String LocalPhone) { this.LocalPhone=LocalPhone; } // définit le LocalPhone public String getLocalPhone() { return LocalPhone; } // retourne le LocalPhone public String toString() { // affiche tous les paramètres StringBuilder result = new StringBuilder(); String NEW_LINE = System.getProperty("line.separator"); result.append("setHost : " +getHost() +NEW_LINE); result.append("setUsername : " +getUsername() +NEW_LINE); result.append("setPassword : " +getPassword() +NEW_LINE); result.append("setLocalPhone : "+getLocalPhone() +NEW_LINE); return result.toString(); } public static void main(String[] args) { // permet d’exécuter le fichier ModeleParametresAsterisk runasterisk = new ModeleParametresAsterisk(); runasterisk.setHost("setHost_runasterisk"); runasterisk.setPassword("setPassword__runasterisk"); runasterisk.setUsername("setUsername_runasterisk"); runasterisk.setLocalPhone("setLocalPhone_runasterisk"); System.out.println("\n\n : \n" +runasterisk.toString()); System.out.println("runasterisk : \n" +runasterisk.getHost() +"\n" +runasterisk.getUsername() +"\n" +runasterisk.getPassword()+ "\n" +runasterisk.getLocalPhone()); } } // affiche tous les paramètres Page 8 Développement d’une application CTI « QuickDial » 2oo8 ModeleParametresGeneriques Relation héritage ModeleParametresCisco - LocalPhoneNumber : String +ModeleParametresCisco() + ModeleParametresCisco (Host : String, Username : String, LocalPhoneNumber : String) +setLocalPhoneNumber(LocalPhoneNumber : String) +getLocalPhoneNumber() : String +toString() : String +main(args:String[]) package quickdial; /** * * @author FreDMouL */ public class ModeleParametresCisco extends ModeleParametresGeneriques{ private String LocalPhoneNumber; public ModeleParametresCisco() { } public ModeleParametresCisco(String Host, String Username, String Password, String LocalPhoneNumber) { this.Host=Host; // définit l’@IP du serveur this.Username=Username; // définit le Username this.Password=Password; // définit le Password this.LocalPhoneNumber=LocalPhoneNumber; } public void setLocalPhoneNumber(String LocalPhone) { this.LocalPhoneNumber=LocalPhoneNumber; } // définit le LocalPhoneNumber public String getLocalPhoneNumber() { return LocalPhoneNumber; } // retourne le LocalPhoneNumber public String toString() { // affiche tous les paramètres StringBuilder result = new StringBuilder(); String NEW_LINE = System.getProperty("line.separator"); result.append("setHost : " +getHost() +NEW_LINE); result.append("setUsername : " +getUsername() +NEW_LINE); result.append("setPassword : " +getPassword() +NEW_LINE); result.append("setLocalPhone : "+getLocalPhoneNumber() +NEW_LINE); return result.toString(); } Page 9 Développement d’une application CTI « QuickDial » 2oo8 public static void main(String[] args) { // permet d’exécuter le fichier ModeleParametresCisco runcisco = new ModeleParametresCisco(); runcisco.setHost("setHost_runcisco"); runcisco.setPassword("setPassword__runcisco"); runcisco.setUsername("setUsername_runcisco"); runcisco.setLocalPhoneNumber("setLocalPhone_runcisco"); System.out.println("\n\n : \n" +runcisco.toString()); // affiche les valeurs des paramètres System.out.println("_runcisco : \n" +runcisco.getHost() +"\n" +runcisco.getUsername() +"\n" +runcisco.getPassword()+ "\n" +runcisco.getLocalPhoneNumber()); } } TP2 : CREATION DES CLASSES « VUES » Javax.swing.JFrame Relation héritage VueQuickDial - MonContainer : Container - monJPanel : JPanel - monJMenuBar : JMenuBar - monJMenuParametres : JMenuParametres - monJMenuAPropos : JMenuAPropos - monJCheckBoxMenuItemAsterisk : JCheckBoxMenuItem - monJCheckBoxMenuItemCisco : JCheckBoxMenuItem - monJTextFieldNumero : JTextField - monJButton : JButton - monJTextFieldStatus : JTextField -monControleur : Controleur - monModeleQuickDial : ModeleQuickDial + VueQuickDial(monControleur : Controleur, monModeleQuickDial : ModeleQuickDial) + main(args:String[]) + actionPerformed(e : ActionEvent) package quickdial; import java.awt.*; import java.awt.event.*; import java.io.IOException; import javax.swing.*; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.TimeoutException; /** * * @author FreDMouL Page 10 Développement d’une application CTI « QuickDial » 2oo8 */ public class VueQuickDial extends JFrame implements ActionListener { private Container MonContainer; private JPanel MonPanel; private JTextArea monJTextArea; private JMenuBar monJMenuBar; private JMenu monJMenuParametres; private JMenu monJMenuAPropos; private JCheckBoxMenuItem monJCheckBoxMenuItemAsterisk; private JCheckBoxMenuItem monJCheckBoxMenuItemCisco; private JTextField monJTextFieldNumero; private JButton monJButton; private JTextField monJTextField; private Controleur monControleur; private ModeleQuickDial monModeleQuickDial; public VueQuickDial(Controleur monContro, ModeleQuickDial monModeleQuickDial) { this.monControleur=monContro; setLayout(new BorderLayout()); // définit une grille découpé en cinq partie this.monModeleQuickDial=monModeleQuickDial; MonPanel = new JPanel(); // crée MonPanel add(MonPanel, BorderLayout.CENTER); // ajoute MonPanel au centre monJTextField = new JTextField(20); // crée monJTextField MonPanel.add(monJTextField); // ajoute monJTextField dans MonPanel monJButton = new JButton("Dial"); // crée le JButton Dial MonPanel.add(monJButton); // ajoute monJButton dans MonPanel monJTextFieldNumero = new JTextField("Entrez un numéro,puis cliquez Dial"); monJTextFieldNumero.setEditable(false); // le champ Numéro n’est plus éditable add(monJTextFieldNumero, BorderLayout.SOUTH); // ajoute le champ Numéro en bas monJMenuParametres = new JMenu("Parametres"); // crée le Menu Parametres monJCheckBoxMenuItemAsterisk = new JCheckBoxMenuItem("Asterisk"); // crée la case Asterisk monJCheckBoxMenuItemCisco = new JCheckBoxMenuItem("Cisco"); // crée la case Cisco monJMenuParametres.add(monJCheckBoxMenuItemAsterisk); // ajoute la case Asterisk dans le MenuParametres monJMenuParametres.add(monJCheckBoxMenuItemCisco); // ajoute la case Cisco dans le MenuParametres monJMenuAPropos = new JMenu("A Propos"); // crée et nomme le MenuAPropos monJMenuBar = new JMenuBar(); // crée une barre de Menu monJMenuBar.add(monJMenuParametres); // ajoute le MenuParametres dans le Menu monJMenuBar.add(monJMenuAPropos); // ajoute le MenuAPropos dans le Menu add(monJMenuBar, BorderLayout.NORTH); // ajoute la barre de Menu en haut monJTextArea = new JTextArea(" BURKHARD Frédéric & HERRY Marc-Antoine "); monJMenuAPropos.add(monJTextArea); // ajoute le TextArea dans le MenuAPropos pack(); monJButton.addActionListener(this); monJCheckBoxMenuItemAsterisk.addActionListener(this); monJCheckBoxMenuItemCisco.addActionListener(this); Page 11 Développement d’une application CTI « QuickDial » 2oo8 monJCheckBoxMenuItemAsterisk.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // gère le clic sur la case Asterisk monJCheckBoxMenuItemAsterisk.setState(true); // coche la case Asterisk monJCheckBoxMenuItemCisco.setState(false); // décoche la case Cisco monControleur.SelectionParametresAsterisk(); } // affiche la fenêtre des paramètres }); monJCheckBoxMenuItemCisco.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // gère le clic sur la case Cisco monJCheckBoxMenuItemAsterisk.setState(false); // décoche la case Asterisk monJCheckBoxMenuItemCisco.setState(true); // coche la case Cisco monControleur.SelectionParametresCisco(); } // affiche la fenêtre des paramètres }); monJButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getSource().equals(monJButton)) // gère le clic sur le bouton Dial { String texte = monJTextField.getText(); // récupération de la valeur du JTextField System.out.println("Le numéro composé est "+texte); // affichage de cette dernière try { monControleur.ComposeNumero(texte); // exécute l’appel du numéro contenu dans texte } catch (AuthenticationFailedException ex) { ex.printStackTrace(); } catch (TimeoutException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } } } }); public static void main(String[] args) { ModeleQuickDial monModeleQuickDial = new ModeleQuickDial(); VueQuickDial fen = new VueQuickDial(monModeleQuickDial); fen.setJMenuBar(new MenuVueQuickDial()); fen.setVisible(true); } // rend visible la fenêtre } } Page 12 Développement d’une application CTI « QuickDial » 2oo8 Javax.swing.JPanel Relation héritage LigneParametre - monJLabel : JLabel - monJTextField : JTextField + LigneParametre() + LigneParametre(Parametre : String, valeur : String) + setParametre(Parametre : String) + setValeur(Valeur : String) + get Parametre() : String + getValeur() : String + toString() : String + main(args : String[]) package quickdial; import java.awt.*; import javax.swing.*; /** * * @author FreDMouL */ public class LigneParametre extends JPanel{ private JLabel monJLabel; private JTextField monJTextField; public LigneParametre() { monJLabel = new JLabel(); monJTextField = new JTextField(); } // création de monJLabel // création de monJTextField public LigneParametre(String Parametre, String Valeur){ monJLabel = new JLabel(Parametre); // création de monJLabel et attribution d’une valeur monJTextField = new JTextField(Valeur); // création de monJTextField et attribution d’une valeur this.setLayout(new BorderLayout()); monJTextField = new JTextField(getValeur(),15); monJLabel = new JLabel(getParametre()); this.add(monJLabel); add(monJLabel, BorderLayout.WEST); // ajoute le JLabel dans le coté gauche Page 13 Développement d’une application CTI « QuickDial » 2oo8 this.add(monJTextField); add(monJTextField,BorderLayout.EAST); } // ajoute le JTextField dans le coté droit public void setParametre(String Parametre){ monJLabel.setText(Parametre); } // définit la valeur du JLabel public void setValeur(String Valeur) { monJTextField.setText(Valeur); } // définit la valeur du JTextField public String getParametre() { return monJLabel.getText(); } // retourne la valeur du JLabel public String getValeur() { return monJTextField.getText(); } // retourne la valeur contenu dans le JTextField public String toString() { // le toString est utilisé pour afficher les valeurs et donc vérifier leur bonne saisie StringBuilder result = new StringBuilder(); String NEW_LINE = System.getProperty("line.separator"); result.append("Parametre : " +getValeur() +NEW_LINE); result.append("Valeur : " +getParametre() +NEW_LINE); return result.toString(); } public static void main(String[] args){ LigneParametre toto; // création d’une nouvelle LigneParametre toto = new LigneParametre("Parametre", "Valeur"); JFrame run = new JFrame(); // création d’une JFrame run run.add(toto); // ajoute LigneParametre à la JFrame run run.setVisible(true); // rend la fenêtre visible run.pack(); } // ajuste à la taille nécessaire } Javax.swing.JDialog Relation héritage VueParametresAsterisk - LigneParametreHost : LigneParametre - LigneParametreUsername : LigneParametre - LigneParametrePassword : LigneParametre - LigneParametreLocalPhone : LigneParametre - monJButtonOK : JButton - monControleur : Controleur + VueParametresAsterisk(monControleur : Controleur, monModeleParametresAsterisk : ModeleParametresAsterisk) + setHost(Host : String) + setUsername(Username : String) + setPassword(Password : String) Page 14 Développement d’une application CTI « QuickDial » 2oo8 + setLocalPhone(LocalPhone : String) +getHost() : String +getUsername() : String + getPassword() : String + getLocalPhone() : String + main(args : String[]) package quickdial; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; /** * * @author FreDMouL */ public class VueParametresAsterisk extends JDialog{ private LigneParametre LigneParametreHost; private LigneParametre LigneParametreUsername; private LigneParametre LigneParametrePassword; private LigneParametre LigneParametreLocalPhone; private JButton monJButtonOK; private Controleur monControleur; // création des lignes pour les paramètres à rentrer, avec les noms des paramètres public VueParametresAsterisk(final Controleur monControleur, ModeleParametresAsterisk monModeleParametresAsterisk){ this.monControleur = monControleur; LigneParametreHost = new LigneParametre("Hôte : ", monModeleParametresAsterisk.getHost()); LigneParametreUsername = new LigneParametre("Utilisateur : ", monModeleParametresAsterisk.getUsername()); LigneParametrePassword = new LigneParametre("Mot de Passe : ", monModeleParametresAsterisk.getPassword()); LigneParametreLocalPhone = new LigneParametre("Poste controlé (tech/data) : ", monModeleParametresAsterisk.getLocalPhone()); monJButtonOK = new JButton("OK"); this.setLayout(new GridLayout(5,1)); // définit 5 lignes et 1 colonne this.setTitle("Paramètres Asterisk"); // définit un titre pour la fenêtre this.add(LigneParametreHost); //rajoute la ligne pour rentrer l’@IP du serveur this.add(LigneParametreUsername); // rajoute la ligne pour le Username this.add(LigneParametrePassword); // rajoute la ligne pour le Password this.add(LigneParametreLocalPhone); // rajoute la ligne pour le LocalPhone this.add(monJButtonOK); // ajoute le boutton OK de validation this.setVisible(false); // définit la fenêtre à non-visible de base, sinon elle s’affiche dès l’éxécution du programme this.pack(); Page 15 Développement d’une application CTI « QuickDial » 2oo8 monJButtonOK.addActionListener(new ActionListener() {// gère le clic sur le boutton OK public void actionPerformed(ActionEvent e) { // exécute la validation et affiche le succès une fois effectué monControleur.ValidationParametresAsterisk(); System.out.println("Validation des Paramètres Asterisk"); } }); } public void setHost(String Host){ LigneParametreHost.setValeur(Host); // définit l’@IP du serveur } public void setUsername(String Username){ // définit le Username LigneParametreUsername.setValeur(Username); } public void setPassword(String Password){ LigneParametrePassword.setValeur(Password); // définit le Password } public void setLocaPhone(String LocalPhone){ // définit le LocalPhone LigneParametreLocalPhone.setValeur(LocalPhone); } public String getHost(){ return LigneParametreHost.getValeur(); } // récupère l’@IP du serveur public String getUsername(){ return LigneParametreUsername.getValeur(); } // récupère le Username public String getPassword(){ return LigneParametrePassword.getValeur(); } // récupère le Password public String getLocalPhone(){ return LigneParametreLocalPhone.getValeur(); } // récupère LocalPhone public static void main(String[] args) { ModeleParametresAsterisk model = new ModeleParametresAsterisk("Host", "Username", "Password", "LocalPhone"); VueParametresAsterisk run = new VueParametresAsterisk(model); run.setVisible(true); // rend visible la fenêtre run.pack(); } // définit la taille de la fenêtre à une taille automatique, correspondant au strict nécessaire } Page 16 Développement d’une application CTI « QuickDial » 2oo8 Javax.swing.JDialog Relation héritage VueParametresCisco - LigneParametreHost : LigneParametre - LigneParametreUsername : LigneParametre - LigneParametrePassword : LigneParametre - LigneParametreLocalPhoneNumber : LigneParametre - monJButtonOK : JButton - monControleur : Controleur + VueParametresCisco(monControleur : Controleur, monModeleParametresCisco : ModeleParametresCisco) + setHost(Host : String) + setUsername(Username : String) + setPassword(Password : String) + setLocalPhoneNumber(LocalPhone : String) +getHost() : String +getUsername() : String + getPassword() : String + getLocalPhoneNumber() : String + main(args : String[]) package quickdial; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; /** * * @author FreDMouL */ public class VueParametresCisco extends JDialog{ private LigneParametre LigneParametreHost; private LigneParametre LigneParametreUsername; private LigneParametre LigneParametrePassword; private LigneParametre LigneParametreLocalPhoneNumber; private JButton monJButtonOK; private Controleur monControleur; public VueParametresCisco(final Controleur monControleur, ModeleParametresCisco monModeleParametresCisco){ // création des lignes pour les paramètres à rentrer, avec les noms des paramètres LigneParametreHost = new LigneParametre("Hôte : ", monModeleParametresCisco.getHost()); Page 17 Développement d’une application CTI « QuickDial » 2oo8 LigneParametreUsername = new LigneParametre("Utilisateur : ", monModeleParametresCisco.getUsername()); LigneParametrePassword = new LigneParametre("Mot de Passe : ", monModeleParametresCisco.getPassword()); LigneParametreLocalPhoneNumber = new LigneParametre("Numéro du poste : ", monModeleParametresCisco.getLocalPhoneNumber()); monJButtonOK = new JButton("OK"); this.setLayout(new GridLayout(5,1)); // définit 5 lignes et 1 colonne this.setTitle("Paramètres Cisco"); // définit un titre pour la fenêtre this.add(LigneParametreHost); //rajoute la ligne pour rentrer l’@IP du serveur this.add(LigneParametreUsername); // rajoute la ligne pour le Username this.add(LigneParametrePassword); // rajoute la ligne pour le Password this.add(LigneParametreLocalPhoneNumber); // rajoute la ligne pour le LocalPhoneNumber this.add(monJButtonOK); // ajoute le boutton OK de validation this.setVisible(false); // définit la fenêtre à non-visible de base, sinon elle s’affiche dès l’éxécution du programme this.pack(); monJButtonOK.addActionListener(new ActionListener() { // gère le clic sur le boutton OK public void actionPerformed(ActionEvent e) { // exécute la validation et affiche le succès une fois effectué monControleur.ValidationParametresCisco(); System.out.println("Validation des paramètres Cisco"); } }); } public void setHost(String Host){ LigneParametreHost.setValeur(Host); // définit l’@IP du serveur } public void setUsername(String Username){ // définit le Username LigneParametreUsername.setValeur(Username); } public void setPassword(String Password){ LigneParametrePassword.setValeur(Password); // définit le Password } public void setLocaPhone(String LocalPhoneNumber){ // définit le LocalPhoneNumber LigneParametreLocalPhoneNumber.setValeur(LocalPhoneNumber); } public String getHost(){ return LigneParametreHost.getValeur(); } // récupère l’@IP du serveur public String getUsername(){ return LigneParametreUsername.getValeur(); } // récupère le Username public String getPassword(){ return LigneParametrePassword.getValeur(); } // récupère le Password public String getLocalPhoneNumber(){ Page 18 Développement d’une application CTI « QuickDial » 2oo8 return LigneParametreLocalPhoneNumber.getValeur(); } // récupère LocalPhoneNumber public static void main(String[] args) { ModeleParametresCisco model = new ModeleParametresCisco("Host", "Username", "Password", "LocalPhoneNumber"); VueParametresCisco run = new VueParametresCisco(model); run.setVisible(true); // rend visible la fenêtre run.pack(); } // définit la taille de la fenêtre à une taille automatique, correspondant au strict nécessaire } TP3 : CREATION DE LA CLASSE « CONTROLEUR » Controleur - MonModeleQuickDial : ModeleQuickDial - maVueQuickDial : VueQuickDial - monModeleParametresAsterisk : ModeleParametresAsterisk - maVueParametresAsterisk : VueParametresAsterisk - monModeleParametresCisco : ModeleParametresCisco - maVueParametresCisco : VueParametresCisco + Controleur() + SelectionParametresAsterisk() + SelectionParametresCisco() + ValidationParametresAsterisk() + ValidationParametresCisco() +ComposeNumero(Number : String) + main(args : String[]) package quickdial; import java.io.IOException; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.TimeoutException; /** * * @author FreDMouL */ public class Controleur { private ModeleQuickDial monModeleQuickDial; private ModeleParametresAsterisk monModeleParametresAsterisk; private ModeleParametresCisco monModeleParametresCisco; private VueParametresAsterisk maVueParametresAsterisk; Page 19 Développement d’une application CTI « QuickDial » 2oo8 private VueParametresCisco maVueParametresCisco; private VueQuickDial maVueQuickDial; public Controleur() { monModeleQuickDial = new ModeleQuickDial(/*"Entrez un numéro, puis cliquez Dial..."*/); maVueQuickDial = new VueQuickDial(this, monModeleQuickDial); monModeleParametresAsterisk = new ModeleParametresAsterisk(); maVueParametresAsterisk = new VueParametresAsterisk(this, monModeleParametresAsterisk); monModeleParametresCisco = new ModeleParametresCisco(); maVueParametresCisco = new VueParametresCisco(this, monModeleParametresCisco); maVueQuickDial.setVisible(true); //on rend visible la fenêtre VueQuickDial maVueQuickDial.pack(); } public void SelectionParametresAsterisk(){ // si selection Asterisk cela fermera la fenêtre Cisco maVueParametresCisco.setVisible(false); maVueParametresAsterisk.setVisible(true); maVueParametresAsterisk.pack(); } public void SelectionParametresCisco(){ // si selection Cisco cela fermera la fenêtre Asterisk maVueParametresAsterisk.setVisible(false); maVueParametresCisco.setVisible(true); maVueParametresCisco.pack(); } public void ValidationParametresAsterisk(){ monModeleParametresAsterisk.setHost(maVueParametresAsterisk.getHost()); monModeleParametresAsterisk.setUsername(maVueParametresAsterisk.getUsername()); monModeleParametresAsterisk.setPassword(maVueParametresAsterisk.getPassword()); monModeleParametresAsterisk.setLocalPhone(maVueParametresAsterisk.getLocalPhone()); System.out.println("Hote : "+maVueParametresAsterisk.getHost()+" ; Username : "+maVueParametresAsterisk.getUsername()+" ; Password : "+maVueParametresAsterisk.getPassword()+" ; Numéro : "+maVueParametresAsterisk.getLocalPhone()); // affichage des valeurs des parameters Asterisk saisis maVueParametresAsterisk.setVisible(false); } public void ValidationParametresCisco(){ monModeleParametresCisco.setHost(maVueParametresCisco.getHost()); monModeleParametresCisco.setUsername(maVueParametresCisco.getUsername()); monModeleParametresCisco.setPassword(maVueParametresCisco.getPassword()); monModeleParametresCisco.setLocalPhoneNumber(maVueParametresCisco.getLocalPhoneNumber( )); System.out.println("Hote : "+maVueParametresCisco.getHost()+" ; Username : "+maVueParametresCisco.getUsername()+" ; Password : "+maVueParametresCisco.getPassword()+" ; Numéro : "+maVueParametresCisco.getLocalPhoneNumber()); // affichage des valeurs des parameters Cisco saisis maVueParametresCisco.setVisible(false); } Page 20 Développement d’une application CTI « QuickDial » 2oo8 public void ComposeNumero(String Number) throws IOException, AuthenticationFailedException, TimeoutException{ monModeleQuickDial.setNumero(Number); monModeleQuickDial.setStatus("Numérotation de "+Number+"..."); // on définit le status qui permet de savoir quel numéro est appelé AsteriskMakeCall monMakeAsterisk =new AsteriskMakeCall(monModeleParametresAsterisk,monModeleQuickDial); } public static void main(String[] args) { Controleur run = new Controleur(); } // exécute le controleur donc le programme } TP4 : CLASSE CTI : ETABLISSEMENT D’UN APPEL DEPUIS « ASTERISK-JAVA » package quickdial; import java.io.IOException ; import org.asteriskjava.manager.AuthenticationFailedException; import org.asteriskjava.manager.ManagerConnection; import org.asteriskjava.manager.ManagerConnectionFactory; import org.asteriskjava.manager.TimeoutException; import org.asteriskjava.manager.action.OriginateAction; import org.asteriskjava.manager.response.ManagerResponse; /** * * @author FreDMouL */ public class AsteriskMakeCall { private ManagerConnection managerConnection; public AsteriskMakeCall() { } public AsteriskMakeCall(ModeleParametresAsterisk monModeleParametresAsterisk, ModeleQuickDial monModeleQuickDial) throws IOException, AuthenticationFailedException, TimeoutException { System.out.println("entrée ds makecall"); String Host = monModeleParametresAsterisk.getHost(); // récuperation @IP serveur Asterisk String Username= monModeleParametresAsterisk.getUsername(); // récupération Username String Password = monModeleParametresAsterisk.getPassword(); // récupération Password String Channel = monModeleParametresAsterisk.getLocalPhone(); // récuperation LocalPhone String Numero = monModeleQuickDial.getNumero(); // récupération Numéro appelé ManagerConnectionFactory factory = new ManagerConnectionFactory(Host,Username,Password); this.managerConnection = factory.createManagerConnection(); Page 21 Développement d’une application CTI « QuickDial » 2oo8 OriginateAction originateAction; ManagerResponse originateResponse; originateAction = new OriginateAction(); originateAction.setChannel(Channel); //définit le channel utilisé originateAction.setContext("default"); originateAction.setExten(Numero); // définit le numéro appelé originateAction.setPriority(new Integer(1)); originateAction.setTimeout(new Integer(30000)); // définit le timeout à 30secondes managerConnection.login(); //gère la connexion et le login originateResponse = managerConnection.sendAction(originateAction, 30000); // envoie l’action originate et attends une réponse pendant 30 secondes maximum System.out.println(originateResponse.getResponse()); // affiche le succès ou l’échec } Nous avons donc enregistré un softPhone Xlite : Page 22 Développement d’une application CTI « QuickDial » 2oo8 Et nous avons pu passer un appel une fois les paramètres, dans notre application QuickDial, rentrés. On appel le 3, qui lancera un message de félicitations pour la bonne configuration du softphone. On voit bien sur la console Asterisk que le message de congratulations « demo-congrats » est joué. Page 23 Développement d’une application CTI « QuickDial » 2oo8 CONCLUSION Au cours de cette série de TP nous avons pu voir de quelle manière développer une petite application QuickDial de manière à ce qu’elle soit évolutive par la suite, et facilement modifiable. Nous avons pu au final passer un appel avec le PBX Asterisk et un softPhone Xlite enregistré dessus. Nous n’avons cependant pas eu le temps de concrétiser un appel avec le PBX Cisco CallManager. Il reste intéressant toutefois le fait que nous pouvons toujours compléter notre petit programme avec plus de fonctionnalités et d’affichage d’événements. Page 24