Home

Introduction

L'objet de ces quelques lignes est de décrire les travaux de développement réalisés à l'INRIA Rocquencourt dans le cadre du projet de déploiement de la téléphonie sur IP sur notre site.

L'équipement central du système de téléphonie sur IP de l'INRIA Rocquencourt est le Call Manager. Sa fonction correspond à celle d'un PABX dans un système de téléphonie numérique d'entreprise, il est notamment chargé d'assurer l'acheminement des appels et de répertorier les abonnés du site. Call Manager est un logiciel installé sur un PC (OS Windows 2000), il est muni de plusieurs interfaces de signalisation téléphonique (H323, SCCP, MGCP, Q931), d'un annuaire LDAP (Lightweight Directory Access Protocol) et d'une interface JTAPI (Java Telephony Application Programming Interface).

Les postes téléphoniques IP Cisco s'installent sur le réseau informatique (Ethernet/IP) du site. chaque poste téléphonique dispose d'un navigateur HTTP/XML ainsi que d'un serveur HTTP (en se connectant directement sur le serveur HTTP d'un poste IP via un navigateur quelconque, on obtient des pages HTML décrivant la configuration du poste).

Les travaux de développement réalisés à l'INRIA Rocquencourt s'appuient sur le navigateur HTTP/XML et sur le serveur HTTP des postes téléphoniques IP ainsi que sur l'interface JTAPI du Call Manager. Les programmes ont tous été développés en Java (JDK 1.3.1).

L'interface JTAPI

Cisco propose une implémentation (incomplète, tous les paquetages JAVA de la spécification JTAPI n'étant pas implémentés) de l'interface applicative décrite par Sun Microsystems pour la téléphonie : SUN JTAPI. Pour nous familiariser avec cette interface, nous avons réalisé une application de supervision des appels téléphoniques depuis et vers les postes téléphoniques IP du site.

La première chose à faire est de se "connecter" à l'interface JTAPI du Call Manager. Pour ce faire, il faut créer un objet JtapiPeer à l'aide de la méthode statique getJtapiPeer de l'objet JtapiPeerFactory :

JtapiPeer peer = JtapiPeerFactory.getJtapiPeer(null);
//le paramètre null sélectionne l'objet JtapiPeer par défaut: celui implémenté par Cisco

Cet objet va nous permettre de nous connecter au Call Manager en fournissant l'adresse IP du Call Manager et en nous authentifiant en tant qu'utilisateur disposant des privilèges de contrôle des postes IP à superviser :

Provider provider = peer.getProvider("192.168.1.1, login=login;passwd=passwd");

Note : il est indispensable que l'administrateur Call Manager fournisse à l'utilisateur considéré le contrôle de tous les postes IP à superviser (cf infos utilisateur dans l'interface d'administration du Call Manager), et qu'il lui active l'utilisation d'application CTI.

A partir de maintenant, nombre d'événements JTAPI pourront être traités par notre application suivant qu'on développera le code nécessaire. Nous décrivons ci-dessous les interfaces implémentées dans notre application :

INTERFACE
METHODE IMPLEMENTEE
CallControlCallObserver
callChangedEvent
CiscoProviderObserver
providerChangedEvent

Ainsi, suivant l'implémentation de la méthode callChangedEvent, il est possible de définir les comportements que l'application devra observer losqu'un téléphone IP sonne, lorsqu'il est en communication, lors d'un transfert de communication... C'est en exploitant ces événements que nous avons contruit une application de supervision des appels, qui présentait dans une fenêtre l'état des postes IP (ALERTING, CALL_IN_PROGRESS, DIALING_NUMBER, IN_CALL, ON_HOOK...).

Le schéma ci-dessous résume le mécanisme décrit plus haut.

Postes IP Cisco : navigateur XML et serveur HTTP

Les postes téléphoniques IP Cisco disposent d'un navigateur HTTP/XML capable d'interpréter un ensemble de balises définies par Cisco. Les objets XML reconnaissables par le navigateur accompagnant les postes IP Cisco comprennent le texte, les images (4 niveaux de gris), des objets de saisie de texte, des objets annuaire...

Le serveur HTTP permet l'affichage de statistiques de connexions du poste, il dispose d'un moteur CGI permettant à une application externe de diriger le navigateur HTTP/XML du poste vers une URL particulière. Cette fonction est utile pour afficher des objets XML sur l'écran du navigateur à l'initiative d'une application tierce.

Dans l'exemple décrit ci-dessous, une application résidant sur la machine 192.168.1.1 va "stimuler" serveur HTTP du poste IP Cisco (par le biais d'une méthode HTTP POST et d'un objet XML <CiscoIPPhoneExecute>) pour afficher sur ce dernier une page XML du serveur HTTP de la machine 192.168.1.2.

Ci-dessous une partie du code utile pour adresser une requête de type POST au serveur HTTP du poste :
requête HTTP - Java

Quelques détails sur l'objet XML <CiscoIPPhoneExecute>:
CiscoIPPhoneExecute

Ce document décrit en détail le cadre d'exploitation du langage XML à l'aide des postes IP Cisco :
CiscoIpPhoneServicesApplicationDevelopmentNotes

XML + LDAP : intégration de l'annuaire INRIA

CallManager est muni d'un annuaire LDAP interne lui permettant notamment de répertorier les utilisateurs des postes IP du site. Cet annuaire est accessible depuis chaque poste IP équipé d'un navigateur XML /HTTP (ie 7940 ou 7960) via la touche 'directories' d'un poste IP :

1 Appels en absence
2 Appels reçus
3 Appels composés
4 Annuaire d'entreprise

Notre objectif fut de modifer la 4eme entrée de ce menu, et de la faire pointer vers l'annuaire LDAP de l'INRIA (via un moteur de servlets Java) plutôt que vers l'annuaire interne du CallManager. En effet, l'ensemble du personnel de l'INRIA est répertorié dans un annuaire OpenLDAP, et seuls les annuaires Netscape Directory et Active Directory sont actuellement recommandés par Cisco pour être intégrés dans le CallManager. Nous n'avons donc pas procédé à l'intégration directe de l'annuaire OpenLDAP dans le CallManager, et avons préféré procéder par redirection de certaines URLs dirigés vers les services LDAP du CallManager.

Pour commencer, il faut modifier le paramètre indiquant 'URL Directories':

Dans cette configuration, on suppose que le CallManager a pour adresse 192.168.1.1 et que la machine qui abritera nos servlets a pour adresse 192.168.1.3.

Le servlet s'exécutant à l'adresse http://192.168.1.3/ourDirectory sert simplement à rediriger le poste IP qui accèderait à cette URL vers un autre servlet qui exécutera réellement le travail de recherche dans l'annuaire LDAP de l'INRIA. On peut trouver ici le code associé à ce premier servlet : accueilRechercheLDAP

A partir de maintenant, la liste accessible par la touche 'directories' d'un poste IP est :

1 Appels en absence
2 Appels reçus
3 Appels composés
4 Annuaire INRIA

Le dernier élément de cette liste pointe vers l'URL http://192.168.1.3/directorySearchTool , et un nouveau servlet offre une interface de recherche dans l'annuaire LDAP de l'INRIA. Le code de ce servlet s'appuie sur des objets XML <CiscoIPPhoneMenu>et <CiscoIPPhoneInput>.

JTAPI + XML + LDAP : consultation dynamique d'un annuaire par un poste IP Cisco

Les techniques exposées plus haut nous ont permis de développer une application utile dans un environnement mixte composé d'un système de téléphonie érique classique et du système de téléphonie sur IP Cisco. Le but de cette application est de superviser chacun des postes IP, et d'afficher le nom de l'appelant en consultant l'annuaire personnel de l'utilisateur du poste appelé ainsi que l'annuaire LDAP de l'INRIA.

Outre le Call Manager, cinq éléments viennent constituer le système mis en place :
- une application de supervision JTAPI (basée sur le modèle décrit plus haut)
- un annuaire LDAP recensant l'ensemble du personnel de l'INRIA
- un annuaire LDAP (sur le Call Manager) hébergeant les annuaires personnels des utilisateurs des postes IP Cisco
- un servlet Java répondant aux requêtes HTTP des postes IP
- le navigateur XML / HTTP des postes IP Cisco

Lors d'une tentative de connexion sur un poste IP supervisé par un poste externe, le Call Manager avertit l'application de supervision résidant sur la machine 192.168.1.1. Parmi les nombreux paramètres passés à cette application, le numéro de l'appelant va servir d'attribut de recherche dans l'annuaire LDAP regroupant les entrées de l'annuaire personnel (s'il existe) de l'utilisateur appelé puis dans l'annuaire LDAP de l'INRIA. Le résultat des ces recherches sera affiché sur l'écran du poste appelé.

Le schéma ci-dessous décrit les événements se produisant dans le cas de la consultation de l'annuaire LDAP de l'INRIA (pas de consultation de l'annuaire personnel de l'utilisateur du poste).

à l'étape numéro 4, la chaîne de caractères correspondant à l'URL vers laquelle on désire rediriger le poste est :
String firstParameter = new String("4321");
String secondParameter = new String ("1234");
String query = "XML=" + URLEncoder.encode("<CiscoIPPhoneExecute>\n<ExecuteItem URL=\"http://192.168.1.2/javaServlet?" + firstParameter + "&amp;" + secondParameter "\" />\n</CiscoIPPhoneExecute>");


auteur : Philippe Sultan ------- date de mise à jour : 17 juillet, 2003