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