CALL2BOOK

Jump to: navigation, search

Logo_telecom_bretagne.jpg
Logo_of.jpg






Stage effectué chez OpenFlyers du 29 juin au 28 août 2009



Développement d'un centre de réception d'appels téléphoniques :
différenciation des services et identification des appelants




Rapport de stage     version publique




Auteur :   Lan XU, élève à l'école Télécom Bretagne
Maître de stage :   Christophe LARATTE, Gérant d'OpenFlyers









Résumé

La société OpenFlyers souhaite mettre en place un centre de réception des appels téléphoniques pour donner aux pilotes la possibilité de réserver des avions dans les aéroclubs par téléphone. Mon stage consiste à développer une application, nommée plus tard "Call2Book", qui peut différencier les services et identifier les appelants pour ce centre d'appel.

Après avoir déterminé les fonctionnalités principales de l'application, une partie du stage a été consacrée à la configuration d'Asterisk[1] (un PBX[2] logiciel). l'autre grande partie du stage a été consacrée à l'écriture du code en langage C++ pour l'application "Call2Book", avec l'utilisation de la version Open Source[3] de la librairie[4] Qt[5]. J'ai aussi effectué de nombreux tests tout au long du développement afin de vérifier que l'application respectait bien le cahier des charges.

Au bout des deux mois de stage, presque toutes les fonctionnalités principales de l'application "Call2Book" ont été implémentées. Le centre de réception devrait être bientôt fonctionnel après l'intégration d'un planning de réservation dans l'application par d'autres développeurs.

Introduction

Contexte

Située à Blanquefort dans le département de la Gironde, OpenFlyers est une société spécialisée dans le développement des services dédiés à la gestion des structures aéronautiques. Les développeurs informatiques de la société, qui sont eux-mêmes des pilotes pour la plupart, ont mis au point le logiciel "OpenFlyers" qui permet aux structures aéronautiques de gérer les vols, la maintenance, les comptes de leurs pilotes, etc. Ce logiciel permet aussi aux pilotes de réserver des avions dans les structures aéronautiques sur Internet.

En 2009, afin d'améliorer ses services, la société OpenFlyers a lancé le projet de la création d'un centre de réception des appels téléphonique au service des pilotes d'aéroclubs qui souhaitent réserver des avions par téléphone. OpenFlyers dispose déjà d'une ligne directe (0556...), son futur centre d'appel disposera aussi d'une ligne surtaxée (0892...) qui sera redirigée vers la ligne directe. Les pilotes pourront appeler la ligne directe pour demander des informations et la ligne surtaxée pour réserver des avions.

J'ai eu l'opportunité de participer au développement du centre d'appel au travers de mon stage d'été. Je présente ici les démarches principales et le produit final de mon stage.

Cahier des charges

L'objectif de mon stage est de développer une application pour différencier les services et pour identifier les pilotes s'ils appellent le service de réservation, en respectant le cahier des charges que Monsieur Thierry GARGAUD a établi. Grâce à cette application, lorsqu'un pilote appelle "0892...", l'opératrice du centre de réception pourra accéder rapidement à l'espace de réservation de l'aéroclub du pilote en question, ce qui permet de fournir un service de réservation rapide et dédié au pilote.

A partir du cahier des charges, j'ai établi la liste des principales fonctionnalités à implémenter :

  • récupérer les numéros de l'appelant et de l'appelé ;
  • différencier les services à fournir en fonction du numéro appelé ;
  • rechercher les pilotes et les aéroclubs qui ont le numéro de l'appelant dans une base de données propre à l'application ;
  • fournir une interface graphique composée de plusieurs pages ;
  • rediriger vers la page graphique spécifique de l'application en fonction des informations trouvées dans la base de données ;
  • fournir à l'opératrice l'outil de recherche de pilotes ;
  • permettre à l'opératrice de vérifier l'identité de l'appelant et d'aller dans l'espace de réservation de l'aéroclub concerné ;
  • permettre à l'opératrice de répondre à l'appel entrant.

L'application est à écrire en C++ en utilisant la librairie Open Source Qt4.5 et à l'aide du logiciel Qt Creator.

Développement

La société OpenFlyers a choisi d'utiliser Asterisk, logiciel qui peut transformer un simple ordinateur en un PBX IP[6]. Asterisk a d'ailleurs l'avantage d'être un logiciel libre, ce qui permet de réduire les coûts dans la mise en oeuvre d'un centre téléphonique.

J'ai donc commencé le développement à partir des ressources suivantes déjà en place :

  • un ordinateur équipé du système d'exploitation Debian, du logiciel Asterisk et d'une carte B410P[7] ;
  • une ligne Numéris[8] reliée à la carte B410P.

Le développement lui-même est constitué de deux grandes parties :

  • la récupération des numéros de téléphone de l'appelant et de l'appelé ;
  • la différentiation des services et l'identification des appelants.

Le produit final est l'application Open Source "Call2Book".

Configuration du matériel et d'Asterisk

L'utilisation d'Asterisk a permis la récupération des numéros de l'appelant et de l'appelé. La réalisation concrète de cette récupération repose sur la configuration du matériel et d'Asterisk.

J'ai d'abord configuré le driver mISDN[9] pour qu'il puisse piloter la carte B410P. Ensuite j'ai configuré l'interface entre la carte B410P et Asterisk, ce dernier peut alors commander le driver mISDN et communiquer avec la ligne Numéris. J'ai enfin configuré le plan de numérotation[10] d'Asterisk pour traiter les appels entrants et sortants.

Afin de vérifier la configuration, j'ai installé le softphone[11] X-Lite[12] et testé les appels entrants et sortants. Quand j'appelle le numéro de la ligne Numéris à partir d'un téléphone fixe ou d'un téléphone portable, le softphone reçoit bien ces appels. Et quand j'utilise le softphone pour appeler d'autres numéros, ces appels passent par la ligne Numéris et aboutissent à la destination.

Pour réaliser la récupération des numéros de l'appelant et de l'appelé, je laisse le logiciel Asterisk écrire ces numéros dans les fichiers de log[13]. L'application "Call2Book" lit ces fichiers de log pour connaître les numéros de téléphone. Ce fonctionnement sera détaillé dans l'Interaction Asterisk - Call2Book.

Application Call2Book

L'application "Call2Book" réalise la différentiation des services en fonction du numéro appelé et l'identification des pilotes en fonction du numéro appelant.

Voici un schéma qui décrit l'architecture de "Call2Book" :

Architecture générale de l'application "Call2Book"

La classe[14] "MainWidget" est le noyau de l'application, les fonctions pour interagir avec d'autres classes et des processus extérieurs sont écrites dans cette classe.

Interaction Asterisk - Call2Book

Pour détecter les appels entrants, j'ai choisi de faire fonctionner l'application "Call2Book" comme serveur local, et j'ai écrit un petit programme "AsteriskClient" qui joue le rôle du client local. J'ai aussi ajouté dans le plan de numérotation d'Asterisk l'instruction qui commande le lancement du programme "AsteriskClient".

Le schéma ci-dessous illustre le mécanisme d'interaction entre Asterisk et "Call2Book" :

Interaction Asterisk - Call2Book

"Call2Book" écoute les connexions du client local tant qu'elle est démarrée. Lorsqu'un appel arrive, après avoir écrit les numéros de l'appelant et de l'appelé dans les fichiers de log, Asterisk lance "AsteriskClient" pour se connecter sur le serveur "Call2Book". "Call2Book" détecte alors la connexion et va récupérer les numéros dans les fichiers de log.

Si le numéro de l'appelé récupéré est le numéro de la ligne directe, une page d'informations s'affiche sur l'écran. Si ce numéro est celui de la ligne surtaxée, l'application "Call2Book" démarre le processus d'identification du pilote.


Pour développer la fonctionnalité de conversation téléphonique, j'ai commencé par étudier les softphones Open Source. Ces softphones utilisent principalement deux librairies pour s'interfacer avec Asterisk : la librairie sip[15] qui gère le protocole SIP et la librairie iax[16] (par exemple la librairie "iaxclient") qui gère le protocole IAX2. Cependant, je n'ai pas eu le temps de poursuivre le développement de cette partie.

Interaction Call2Book - base de données

Une base de données qui stocke des informations sur plus de deux cents aéroclubs et leurs pilotes est spécialement créée pour l'application "Call2Book". Une fois le numéro de l'appelant récupéré, "Call2Book" lance des requêtes dans cette base de données pour trouver les pilotes et les clubs qui possèdent ce numéro.

Le principe du fonctionnement est traduit par le schéma suivant :

Interaction Call2Book - base de données

Classes Pilot et Club

Un objet de la classe "Pilot" peut stocker les données concernant un pilote : les numéros d'identification du pilote et de son aéroclub, son login, son nom, sa date de naissance, son adresse, ses numéros de téléphone, etc. De même, un objet de la classe "Club" peut stocker les informations sur un aéroclub.

Lorsque l'application "Call2Book" trouve un pilote (respectivement un aéroclub) qui a le même numéro que le numéro appelant dans la base de données, elle crée un objet de la classe "Pilot" (respectivement de la classe "Club") et enregistre les données relative au pilote (respectivement à l'aéroclub) dans cet objet.

Formes

En fonctions des événements (par exemple, un pilote appelle la ligne directe, l'opératrice clique sur le bouton "Recherche Pilote Global"...), des données fournies par les fichiers de log et des données stockées dans les objets des classes "Pilot" et "Club", l'application "Call2Book" modifie l'aspect graphique de ses pages et affiche la page appropriée.

Classe WebBrowser

Cette classe fournit un navigateur Web simplifié. Lorsque l'identité du pilote appelant est vérifiée par l'opératrice, "Call2Book" lance ce navigateur qui charge le site Web de réservation de l'aéroclub du pilote.

Conclusion

Bilan

Après deux mois de travail, presque toutes les fonctionnalités de l'application sont implémentées, sauf la fonctionnalité "permettre à l'opératrice de répondre à l'appel entrant" faute de temps. L'opératrice pourra néanmoins réaliser la conversation téléphonique en utilisant un softphone comme X-Lite.

La série de captures d'écran ci-dessous montre le produit final.

  • Voici la page d'accueil de l'application "Call2Book", l'opératrice revient sur cette page chaque fois qu'elle a terminé le traitement d'un appel :

Img1.png


  • Lorsqu'un pilote appelle la ligne directe pour demander des informations sur OpenFlyers, une petite fenêtre s'ouvre pour prévenir de l'appel entrant et la page d'informations s'affiche :

Img2.png


  • Lorsqu'un pilote appelle le service de réservation, la page d'attente apparaît pendant que "Call2Book" extrait des informations de la base des données :

Img7.png

Remarque : pour l'instant, "Call2Book" n'a pas la fonctionnalité de conférence téléphonique[17], l'opératrice ne traite qu'un seul appel à la fois, le deuxième appel entrant avant la fin du premier appel sera mis en attente. Par conséquent, "Call2Book" ne redirige vers la page d'informations ou la page d'attente que si la page d'accueil est visible.

  • Si le numéro appelant correspond à un unique pilote de la base de données, la page d'authentification du pilote s'affiche, l'opératrice peut alors contrôler l'identité de l'appelant en lui posant des questions :
Img4.png


  • Une fois l'appelant authentifié, l'opératrice peut cliquer sur le bouton "Identification OK" pour accéder à l'espace de réservations des avions via le navigateur Web :

Img6.png


  • S'il existe plusieurs pilotes et/ou clubs qui ont le même numéro que le numéro appelant, "Call2Book" affichent toutes ces possibilités dans la page montrée ci-dessous. L'opératrice peut double-cliquer sur une possibilité pour accéder à la page d'authentification du pilote ou à la page de recherche de pilotes du même aéroclub (les possibilités affichées peuvent d'ailleurs être triées par nom, prénom, login...).

Img3.png


  • Si le numéro appelant ne correspond à aucune ligne de la base de données ou si l'opératrice commande la recherche de pilotes, la page suivante apparaît. L'opératrice peut chercher un pilote par le nom, le code OACI[18] et le lieu géographique de l'aéroclub. Lors d'une recherche par département, seuls les villes, les clubs et les pilotes de ce département s'affichent ; lors d'une recherche par ville, seuls les clubs et les pilotes de cette ville s'affichent. L'opératrice peut ensuite aller à la page d'authentification en double-cliquant sur une entrée de la "Liste des pilotes" (les entrées de la "Liste des pilotes" peuvent être triées par nom, prénom et login).

Img5.png

Note : les données apparues sur les captures d'écran ci-dessus sont utilisées pour tester l'application "Call2Book" et ne sont pas véridiques.

Perspectives

Les fonctionnalités existantes de "Call2Book" peuvent être améliorées :

  • il conviendrait de supprimer l'écriture des fichiers de log (les numéros appelant et appelé pourraient être passés en paramètres au lancement du programme "AsteriskClient") ;
  • il serait même préférable d'établir une interaction directe entre "Asterisk" et "Call2Book", sans passer par "AsteriskClient".

L'application "Call2Book" peut encore être améliorée en réalisant la fonctionnalité de conversation téléphonique que je n'ai pas pu implémenter et en rajoutant d'autres fonctionnalités avancées : j'ai ajouté des services vocaux via le plan de numérotation d'Asterisk, mais le fonctionnement de ces services n'est pas encore testé ; l'ajout de la fonctionnalité de conférence téléphonique peut aussi s'avérer intéressant...

Par ailleurs, d'autres développeurs rendront "Call2Book" entièrement autonome en intégrant la partie de réservation des avions dans l'application elle-même, l'utilisation du navigateur Web pour aller dans un espace de réservation extérieur ne sera alors plus nécessaire.

Ces approches amélioreront le fonctionnement du futur centre de réception des appels téléphoniques d'OpenFlyers, les pilotes pourront alors bénéficier des nouveaux services avec rapidité et qualité dans la réservation des avions.

Glossaire

  1. Asterisk : logiciel libre pour les systèmes UNIX, permettant de mettre en place un PBX IP. Ce logiciel est crée en 1999 par Mark Spencer, fondateur de la société Digium. Actuellement, il existe aussi une version d'Asterisk pour le système Windows.

  2. PBX ou PABX : Private Automatic Branch eXchange, autocommutateur téléphonique privé, servant principalement à relier les postes téléphoniques d'un établissement (lignes internes) avec le réseau téléphonique public (lignes externes).

  3. Open Source : désignant les logiciels dont la licence respecte des critères établis par l'organisation Open Source Initiative, c'est-à-dire la possibilité de libre redistribution, d'accès au code source et de travaux dérivés.

  4. Librairie ou Bibliothèque (en infomatique) : ensemble de fonctions regroupées et mises à disposition afin d'être utilisées dans le développement des programmes sans avoir à les réécrire.

  5. Qt : bibliothèque logicielle développée à l'origine par les fondateurs de l'entreprise d'informatique norvégienne "Trolltech" (rachetée en 2008 par Nokia et appelée aujourd'hui "Qt Development Frameworks"). Elle est multi-plateforme (pouvant être utilisée sur les systèmes d'exploitation UNIX, Windows et Mac OS X), utilise le principe des "signaux et slots", offre des composants d'interface graphique ("widgets"), d'accès aux données, de connexions réseaux, de gestion des fils d'exécution, d'analyse XML, etc.

  6. PBX IP ou PABX IP ou IPBX : PBX équipé de la fonctionnalité VoIP (Voice over IP, voix sur réseau IP) assurant l'acheminement de toute communication ou d'une partie des communications en utilisant le protocole internet (IP).

  7. Carte B410P : carte PCI (Peripheral Component Interconnect) fabriquée par la société Digium pour fonctionner avec Asterisk. Cette carte a quatre ports de connexion, elle peut être reliée à une ligne RNIS (Réseau numérique à intégration de services), ou à un téléphone, ou encoure à un autre PBX.

  8. Numéris : nom commercial du réseau RNIS (réseau numérique à intégration de services) de France Télécom.

  9. Driver mISDN : pilote (programme) permettant au système d'exploitation de reconnaître la carte B410P et de l'utiliser.

  10. Plan de numérotation (Asterisk) : plan contrôlant le traitement et le routage des appels entrants et sortants.

  11. Softphone : logiciel utilisé pour faire de la téléphonie sur IP depuis un ordinateur.

  12. X-Lite : softphone propriétaire gratuit de l'entreprise canadienne "CounterPath", basé sur le protocole SIP, multi-plateforme pour Mac OS X, Windows et UNIX.

  13. Log (en informatique) : historique d'événements et par extension le fichier contenant cet historique.

  14. Classe (en informatique) : entité utilisée en programmation orientée objet pour déclarer des propriétés communes à un ensemble d'objets.

  15. SIP : Session Initiation Protocol, protocole de gestion des sessions d'appels, normalisé et standardisé par l'IETF (Internet Engineering Task Force), permettant notamment d'établir des communications de téléphonie sur IP.

  16. IAX : Inter-Asterisk eXchange, protocole de voix sur IP originellement créé pour fonctionner avec Asterisk. Ce protocole permet la communication entre client et serveur ainsi qu'entre serveurs. Le nom IAX est souvent utilisé pour parler de la version 2 du protocole IAX2, la première version est pratiquement abandonnée.

  17. Conférence téléphonique : communication téléphonique organisée entre plus de deux correspondants.

  18. Code OACI : unique code attribué par l'Organisation de l'aviation civile internationale (OACI) à un aérodrome, une région aérienne, une compagnie aérienne, un type d'aéronef ou une immatriculation d'aéronef.

Bibliographie

Sébastien Déon, VoIP et ToIP, Asterisk : la téléphonie sur IP (conception, installation, configuration, déploiement...), Editions ENI, 2007.


Jim Van Meggelen, Jared Smith, Leif Madsen, Asterisk™ : The Future of Telephony, O’Reilly Media,Inc., 2005.


Asterisk - voip-info.org, http://www.voip-info.org/wiki/view/Asterisk.


AsterisKGuru.com, Tutorials [en ligne].
Disponible sur http://www.asteriskguru.com/tutorials/.


Digium,Inc., B410P User Manual [en ligne], 2006.
Disponible sur http://www.modulo.ro/Modulo/docs/B410P-user-manual.pdf (consulté le 1er juillet 2009).


CounterPath Corporation, http://www.counterpath.com/x-lite.html&active=4 (consulté le 1er juillet 2009).


Nokia Corporation and/or its subsidiary(-ies), Qt Assistant (Assistant de la version OpenSource de la librairie Qt 4), 2009.


Nokia Corporation and/or its subsidiary(-ies), Qt Online Reference Documentation [en ligne], 2008.
Disponible sur http://doc.trolltech.com/.


Wikipedia, http://fr.wikipedia.org/wiki/Accueil.


Forum Comment ça marche, http://www.commentcamarche.net/forum/.


IAXClient, http://sourceforge.net/projects/iaxclient/develop.


IAXComm, http://iaxclient.svn.sourceforge.net/viewvc/iaxclient/trunk/simpleclient/.


Andre Azevedo, Using the Asterisk IAXClient library in C#, 2006 [en ligne].
Disponible sur http://www.codeproject.com/KB/IP/AsteriskIAXClientWrapper.aspx (consulté le 22 août 2009).


Ekiga, http://www.ekiga.org/.


SFLPhone, http://www.sflphone.org/.

Annexes

Configuration des canaux SIP (pour utiliser le softphone X-Lite) : /etc/asterisk/sip.conf

[general]
context=incoming
indport=5060
srvlookup=yes
disallow=all
allow=alaw

[1000]
type=friend
secret=1234
host=dynamic
nat=yes
anreinvite=no
context=...choisir un contexte du plan de numérotation

Interaction Call2Book - base de données

Programme "Call2Book"
Fichier mainwidget.cpp

 
MainWidget::MainWidget(QWidget *parent) :
        QWidget(parent), m_ui(new Ui::MainWidget)
{    
    /* open the database */
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("C2BDababase");      // can be modified
}
MainWidget::~MainWidget()
{
    db.close();
    delete m_ui;
}
 
/* get data from the database according to the calling phone number */
void MainWidget::search(){
    if (createConnection(db)) {
 
        /* query the two tables and stock the data in different QStringList */
        QSqlQuery queryAuthentication("select * from authentication "
"where home_phone='"+printedCallingNumber+"' or work_phone='"+printedCallingNumber+"' or cell_phone='"+printedCallingNumber+"' "
"order by last_name");
        while (queryAuthentication.next()){
            Pilot *pilot;
            pilot = new Pilot(queryAuthentication);
            listAuthentication.append(pilot);
        }
        QSqlQuery queryClub("select * from club "
"where phone='"+callingNumber+"' or contact_phone='"+callingNumber+"' or contact_mobile='"+callingNumber+"'");
        while (queryClub.next()){
            Club *club;
            club = new Club(queryClub);
            listClub.append(club);
        }
     }
}