the last commit enfin on espere!!!
[rapport_i2l.git] / Telephonie.tex
blobcc39506c40defd1e2b91b251745026feaa768361
1 \chapter{T\'el\'ephonie}
2 Afin de fournir aux centres d'appels une solution moins on\'ereuse que celles existantes, nous avons utilis\'e deux outils libres qui sont maintenant tr\`es \'evolu\'es dans leur domaine : le serveur t\'el\'ephonique Asterisk et le logiciel de gestion de campagne Vicidial.
3 Dans un premier temps, nous allons pr\'esenter ces outils puis pr\'esenter comment nous les avons utilis\'es.
4 \section{Pr\'esentation des outils}
5 \subsection{Asterisk}
6 Asterisk est un logiciel libre qui transforme un ordinateur en un commutateur t\'el\'ephonique priv\'e ou PABX \footnote{Un Private Automatic Branch eXchange (plus g\'en\'eralement appel\'e PABX et parfois PBX) est un commutateur t\'el\'ephonique priv\'e.}. Asterisk est publi\'e sous licence GPL.
7 Asterisk permet, entre autres, la messagerie vocale, la conf\'erence, les serveurs vocaux, la distribution des appels. Il impl\'emente les protocoles H.323 et SIP, ainsi qu'un protocole sp\'ecifique nomm\'e IAX (Inter-Asterisk eXchange). Ce protocole IAX permet la communication entre deux serveurs Asterisk ainsi qu'entre client et serveur Asterisk. Asterisk peut \'egalement jouer le r\^ole de registrar et passerelle avec les r\'eseaux publics (RTC, GSM, etc.).
9 \begin{figure}[!ht]
10 \begin{center}
11 \includegraphics[height=80mm]{asterisk.png}
12 \caption{Exemple d'architecture utilisant Asterisk}
13 \end{center}
14 \end{figure}
16 Asterisk est extensible par des scripts ou des modules en Perl, en C, en Python, en PHP...
17 \subsubsection{Historique}
18 Asterisk est n\'e en 1999, cr\'e\'e par un \'etudiant de l'universit\'e d'Auburn (USA - Alabama). A la recherche d'un commutateur t\'el\'ephonique priv\'e pour cr\'eer un centre de support technique sur Linux, il est dissuad\'e par les tarifs trop \'el\'ev\'es des solutions existantes, et d\'ecide de se cr\'eer son propre routeur d'appels sous Linux, le PBX Asterisk. Quelques temps apr\`es, il cr\'ee la soci\'et\'e Digium, fournisseur de cartes FXO et FXS\footnote{Ces cartes permettent d'utiliser des t\'el\'ephones analogiques.} compatibles avec Asterisk.
20 \subsubsection{Fonctionnalit\'es}
21 Asterisk comprend un nombre tr\`es \'elev\'e de fonctions permettant l'int\'egration compl\`ete pour r\'epondre \`a la majorit\'e des besoins en t\'el\'ephonie. Il permet de remplacer totalement, par le biais de cartes FXO/FXS, un PABX propri\'etaire, et d'y adjoindre des fonctionnalit\'es de VoIP pour le transformer en PBX IP. Il permet \'egalement de fonctionner totalement en VoIP, par le biais de t\'el\'ephones SIP ou IAX du march\'e. Enfin, des fonctionnalit\'es de routage d'appels, menu vocal et boites vocales -- entres autres -- le placent au niveau des PBX les plus complexes.
23 Des modules tiers permettent de visualiser ou param\'etrer le PBX via une interrface Flash ou via un client l\'eger. Enfin, notez qu'une distribution particul\`ere d'Asterisk, *@home, est d\'edi\'ee au PBX l\'eger sur un r\'eseau domestique.
25 \subsection{Vicidial}
26 \subsubsection{Pr\'esentation}
27 Vicidial est un ensemble de programmes d\'esign\'es pour inter-r\'eagir avec le PBX Open-Source Asterisk afin d'avoir une suite compl\`ete pour les appels entrants/sortants des centres d'appels.
29 L'interface des agents\footnote{Personnes charg\'ees de passer des appels ou de les recevoir.} est un ensemble interactif de pages web utilisable \`a travers un navigateur Web afin de fournir des fonctionnalit\'es et des informations en temps r\'eel sans aucune autre application qu'un navigateur web.
31 L'interface des managers est \'egalement bas\'ee sur des pages web et offre la possibilit\'e de voir plusieurs informations en temps r\'eel et rapports ainsi que des param\`etres et options d\'etaill\'es sur les campagnes d'appels et agents.
32 %Vicidial peut fonctionner comme ACD pour les appels entrants ou ....
34 Il y a actuellement plus de 200 installations de Vicidial en production dans plus de 30 pays dont certaines avec plus de 300 agents et sur plusieurs sites.
36 \subsubsection{Fonctionnalit\'es principales}
37 Ci-dessous une liste des fonctionnalit\'es les plus importantes de Vicidial :
38 \begin{itemize}
39 \renewcommand{\labelitemi}{$\bullet$}
40 \item gestion des appels entrants, sortants et mixtes
41 \item interfaces web agent et administration
42 \item possibilit\'e d'avoir des agents distants
43 \item enregistreur d'appels int\'egr\'es
44 \item possibilit\'e d'appels \`a trois depuis l'interface agent
45 \item rappels programm\'es : agent seulement ou n'importe qui
46 \item possibilit\'e d'utiliser les lignes standard Telco et les trunks VOIP
47 \item sous licence open-source GPL, sans aucun co\^ut de licence logicielle
48 \end{itemize}
50 \section{Un peu de pratique}
51 Le but de notre stage \'etait de cr\'eer une solution pour les centres d'appels permettant de r\'eduire les co\^uts, tant au niveau des licences que des communications. Pour cela, nous avons utilis\'e les logiciels libres Asterisk et Vicidial pr\'esent\'es pr\'ec\'edemment. Nous allons maintenant expliquer leur fonctionnement et leur utilisation.
53 \subsection{Les t\'el\'ephones et le protocole SIP}
54 Les t\'el\'ephones utilis\'es sont des t\'el\'ephones IP. Pour communiquer avec le serveur Asterisk, ils utilisent le protocole SIP.
56 Le protocole SIP (Session Initiation Protocol) est un protocole normalis\'e et standardis\'e par l'IETF qui a \'et\'e con\c{c}u pour \'etablir, modifier et terminer des sessions multim\'edias. Il se charge de l'authentification et de la localisation des multiples participants. Il se charge \'egalement de la n\'egociation sur les types de m\'edia (codecs) utilisables par les diff\'erents participants en encapsulant des messages SDP (Session Description Protocol). SIP ne transporte pas les donn\'ees \'echang\'ees durant la session comme la voix ou la vid\'eo. SIP \'etant ind\'ependant de la transmission des donn\'ees, tout type de donn\'ees et de protocoles peut \^etre utilis\'e pour cet \'echange. Le protocole SIP remplace progressivement le protocole H323.
58 SIP est le standard ouvert de VoIP (Voice Over IP, voix sur IP) interop\'erable le plus \'etendu et vise \`a devenir LE standard des t\'el\'ecommunications multim\'edia (son, image, etc.).
59 SIP n'est donc pas seulement destin\'e \`a la VoIP mais pour de nombreuses autres applications telles que la visiophonie, la messagerie instantan\'ee, la r\'ealit\'e virtuelle ou m\^eme les jeux vid\'eo.
61 \subsubsection{Contexte}
62 \`A l'heure de la r\'evolution de l'information par l'utilisation d'internet, on assiste \`a la convergence de la t\'el\'ephonie et de l'informatique (CTI).
64 Les RTC et RNIS (ISDN, ``Num\'eris'' \'etant le nom commercial donn\'e par France T\'el\'ecom, alors op\'erateur d'\'etat) et par extension, les t\'el\'ephones de premi\`ere et seconde g\'en\'eration (satellitaires et GSM) ont fait leur temps en tant que r\'eseaux supportant la voix uniquement, avec des bandes passantes et d\'ebits tr\`es faibles.
66 H323 a \'et\'e un protocole pionnier de la t\'el\'ephonie sur IP, \'emanant des instances du monde des t\'el\'ecommunications (UIT ou ITU). SIP, de conception un peu plus r\'ecente, vient du monde de l'Internet (IETF) et s'int\`egre sans doute un peu mieux sur les r\'eseaux IP.
68 Les \'editeurs, fournisseurs de services et op\'erateurs mettant du temps \`a offrir logiciels et services autour de H323 et SIP, la firme Skype a fait son trou avec plusieurs millions d'utilisateurs en proposant le logiciel client, le service et la passerelle vers les r\'eseaux publics entrants et sortants.
70 Actuellement, pour combler les faiblesses en terme de pr\'esence et de r\'eseaux (NAT) du protocole SIP, des \'editeurs et fournisseurs de service planchent sur l'int\'egration de SIP avec Jabber, protocole fiable, standard, ouvert et \'eprouv\'e de pr\'esence et de messagerie instantan\'ee.
72 \subsubsection{Fonctionnement}
73 \subparagraph{Les bases}
74 ~\par
75 SIP partage de nombreuses similitudes avec le protocole HTTP comme le codage en ASCII et les codes de r\'eponse.
77 Le client envoie des requ\^etes au serveur, qui lui renvoie une r\'eponse. Les m\'ethodes de base sont :
78 \begin{itemize}
79 \item INVITE : permet \`a un client de demander une nouvelle session
80 \item ACK : confirme l'\'etablissement de la session
81 \item CANCEL : annule un INVITE en suspens
82 \item BYE : termine une session en cours
83 \end{itemize}
84 Les codes de r\'eponse sont similaires \`a HTTP.
85 \begin{itemize}
86 \item 100 Trying
87 \item 200 OK
88 \item 404 Not Found
89 \end{itemize}
92 Les codes sup\'erieurs ou \'egaux \`a x80 sont sp\'ecifiques \`a SIP.
93 \begin{itemize}
94 \item 180 Ringing
95 \item 486 Busy
96 \item etc.
97 \end{itemize}
99 En revanche, SIP diff\`ere de HTTP du fait qu'un agent SIP (User Agent, UA) joue habituellement \`a la fois les r\^oles de client et de serveur. C'est-\`a-dire qu'il peut aussi bien envoyer des requ\^etes, que r\'epondre \`a celles qu'il re\c{c}oit.
101 En pratique, la mise en place de SIP repose sur trois \'el\'ements : User Agent, registrar et proxy.
103 \subparagraph{User Agent}
104 ~\par
105 Les \textbf{User Agents} d\'esignent les agents que l'on retrouve dans les t\'el\'ephones SIP, les softphones (logiciels de t\'el\'ephonie sur IP) des ordinateurs et PDA ou les passerelles SIP. En th\'eorie, on peut \'etablir des sessions directement entre deux \textbf{User Agents}, deux t\'el\'ephones par exemple. Mais cela n\'ecessite de conna\^itre l'adresse IP du destinataire. Cela n'est pas l'id\'eal car une adresse IP peut ne pas \^etre publique (derri\`ere un NAT) ou changer et elle est bien plus compliqu\'ee \`a retenir qu'une URI. Les \textbf{User Agents} peuvent donc s'enregistrer aupr\`es de \textbf{Registrars} pour signaler leur emplacement courant, c'est-\`a-dire leur adresse IP.
107 \subparagraph{Registar}
108 ~\par
109 Le \textbf{Registrar} est un serveur qui g\`ere les requ\^etes REGISTER envoy\'ees par les \textbf{Users Agents} pour signaler leur emplacement courant. Ces requ\^etes contiennent donc une adresse IP, associ\'ee \`a une URI, qui seront stock\'ees dans une base de donn\'ees.
111 Les URI SIP sont tr\`es similaires dans leur forme \`a des adresses email : sip:utilisateur@domaine.com
113 G\'en\'eralement, des m\'ecanismes d'authentification permettent d'\'eviter que quiconque puisse s'enregistrer avec n'importe quelle URI.
114 \begin{figure}[!ht]
115 \begin{center}
116 \includegraphics[scale=0.6]{sip_registrar.png}
117 \caption{Enregistrement d'un utilisateur}
118 \end{center}
119 \end{figure}
120 \subparagraph{En pratique}
121 ~\par
122 Afin de communiquer il faut utiliser deux t\'el\'ephones SIP (ou analogiques en utilisant un adaptateur), un serveur Asterisk et un fournisseur de t\'el\'ephonie utilisant le protocole SIP (Free dans notre exemple).\\
123 Premi\`erement, il faut enregistrer les t\'el\'ephones aupr\`es du serveur Asterisk. Pour cela, il faut configurer 2 comptes sur le serveur Asterisk; comptes qu'utiliseront les t\'el\'ephones.\\
124 Dans ce cas, le serveur Asterisk joue le r\^ole de \textbf{registar} et les t\'el\'ephones, le r\^ole de \textbf{user agent}.\\
125 A partir de ce moment, il est possible de communiquer avec les t\'el\'ephones en utilisant les contextes et les extensions que nous verrons par la suite.
127 Afin de pouvoir communiquer avec des personnes externes, il faut utiliser le fournisseur t\'el\'ephonique. Mais cette fois-ci, c'est le serveur Asterisk qui jouera le r\^ole de \textbf{user agent} en s'enregistrant aupr\`es du fournisseur (le registar) en utilisant la configuration ad\'equate.
129 \subsection{Configuration de Asterisk}
130 Dans un premier temps, nous avons configur\'e Asterisk pour pouvoir s'enregistrer aupr\`es des fournisseur SIP utilis\'es et pour pouvoir enregistrer les t\'el\'ephones. Cela se fait dans le fichier \textit{/etc/asterisk/sip.conf}, que nous avons d\'ecoup\'e en plusieurs fichiers inclus (un par fournisseur + un pour les t\'el\'ephones) pour plus de clart\'e.
132 \subparagraph{Enregistrement des t\'el\'ephones}
133 ~\par
134 Pour chaque t\'el\'ephone, il faut cr\'eer un ``compte'' qui contient un certain nombre d'informations dont son nom, son type, son login, son mot de passe, les codec qu'il sait utiliser\dots
135 Voici un exemple de configuration pour un t\'el\'ephone :
136 \lstset{language=csh}
137 \lstset{basicstyle=\small,commentstyle=\textit}
138 \begin{lstlisting}
139 [snom_5000]
140 login = 5000
141 username = 5000
142 secret = 1234
143 dtmfmode = RFC2833
144 CallerID = Cap Micro <5000>
145 context = context-capmicro
146 type = peer
147 nat=yes
148 canreinvite=no
149 mailbox=5000
150 disallow=all
151 allow=ulaw
152 allow=alaw
153 allow=gsm
154 \end{lstlisting}
155 Dans cet exemple \textit{snom\_5000} est le nom du t\'el\'ephone, \textit{login}, \textit{username} et \textit{secret} permettent d'authentifier le t\'el\'ephone. \textit{CallerID} est le nom du prori\`etaire suivi du nom entre crochets ($<>$). \textit{nat} et \textit{canreinvite} indiquent que le t\'el\'ephone se trouve derri\`ere un nat et ne peut donc pas \^etre joint directement. Ensuite vient la liste des codecs support\'es.D'abord, on interdit tous les codecs (\textit{disallow=all}), puis on autorise les codecs support\'es un par un (\textit{allow=gsm} par exemple). \textit{context} permet de d\'efinir \`a quel contexte appartient le t\'el\'ephone, nous verrons par la suite comment fonctionnent les contextes.\\
156 Il existe de nombreuses autres options \`a mettre en fonction de la configuration voulue.
158 \subparagraph{Enregistrement aupr\`es des fournisseur SIP}
159 ~\par
160 La configuration de Asterisk pour un fournisseur SIP d\'epend du fournisseur. Mais g\'en\'eralement, il faut au minimum le \textit{username}, le \textit{secret}(mot de passe), le \textit{host}, le \textit{proxy} et son \textit{port}.
162 \lstset{language=csh}
163 \lstset{basicstyle=\small,commentstyle=\textit}
164 \begin{lstlisting}
165 [wengo-capmicro]
166 type=peer
167 qualify=5000
168 fromdomain=voip.wengo.fr
169 fromuser=capmicrolille
170 username=capmicrolille
171 secret=xxxxxxxxxxxxxx
172 host=voip.wengo.fr
173 realm=voip.wengo.fr
174 outboundproxy=213.91.9.206
175 outboundproxyport=5060
176 disallow=all
177 allow=ulaw
178 allow=alaw
179 allow=gsm
180 ;allow=g729
181 dtmfmode=RFC2833
182 ;dtmfmode=auto
183 insecure=very
184 callerid="Capmicrolille"
185 nat=yes
186 canreinvite=no
187 \end{lstlisting}
188 Ces informations sont donn\'ees par le fournisseur directement.
190 \subparagraph{Les contextes}
191 ~\par
192 Pour d\'efinir des r\`egles d'actions \`a effectuer lors des appels (entrants ou sortants), il faut utiliser les contextes. Chaque t\'el\'ephone appartient \`a un contexte (un t\'el\'ephone a un seul contexte mais un contexte peut contenir plusieurs t\'el\'ephones). Pour les appels entrants, ce sont les fournisseurs SIP qui appartiennent \`a un contexte.\\
193 \`A l'int\'erieur de ces contextes, les r\`egles sont d\'efinies \`a l'aide d'extensions.
195 ~\par
196 \subparagraph{Les ``extensions''}
197 ~\par
198 Les extensions permettent de d\'efinir les actions \`a effectuer en fonction du num\'ero de l'appel\'e, de l'appelant, de la r\'eponse ou non de l'appel\'e, etc\dots
200 Voici un exemple simple de context contenant plusieurs r\`egles :
201 \lstset{language=csh}
202 \lstset{basicstyle=\small,commentstyle=\textit}
203 \begin{lstlisting}
204 [to-free]
205 ; ceci est un commentaire
206 exten => _0.,1,Dial(sip/freephonie_outbound/${EXTEN},30,otT)
207 exten => _0.,2,Hangup()
209 exten => _+33.,1,Dial(sip/freephonie_outbound/0${EXTEN:3:},30,otT)
210 exten => _+33.,2,Hangup()
211 \end{lstlisting}
212 Ici le contexte s'appelle \textit{\textbf{``to-free''}}.\\
213 Il contient 2 r\`egles. La premi\`ere indique que si le num\'ero commence par 0, alors on commence par appeler la commande ``Dial'', puis on raccroche (hangup). La seconde r\`egle concerne les num\'eros commen\c{c}ant par \textbf{\textit{``+33''}}.
214 La commande \textbf{\textit{Dial}} prend 3 param\`etres, le premier est le num\'ero \`a appeler. Ce num\'ero est form\'e du protocole \`a utiliser (ici SIP), du nom du compte (freephonie\_outbound) et du num\'ero (\$\{EXTEN\}, \$\{EXTEN:3\} le num\'ero tap\'e sans les 3 premiers caract\`eres). Le second param\`etre est le nombre de secondes pendant lesquelles l'appel doit se faire avant de passer \`a la suite si l'appel\'e ne d\'ecroche pas. Le troisi\`eme param\`etre est un ensemble d'options.
217 \subsection{Mise en place de Vicidial}
218 \subparagraph{Installation de Vicidial}
219 ~\par
220 Dans un premier temps, nous avons install\'e Vicidial \`a partir des sources en suivant la scratch install. Afin de fonctionner correctement, Vicidial n\'ecessite de nombreux scripts Perl \`a installer, de m\^eme que zaptel.
221 \subparagraph{Le timer Zaptel}
222 ~\par
223 Zaptel est un driver de cartes FXO cr\'e\'e pâr la soci\'et\'e Digium contenant un timer n\'ecessaire pour pouvoir t\'el\'ephoner en utilsant Vicidial. N'ayant pas de cartes FXO nous avons utilis\'e une carte virtuelle \textit{ztdummy} toujours d\'evelopp\'ee par la soci\'et\'e Digium.
224 \subparagraph{Dialogue avec Asterisk}
225 ~\par
226 Pour dialoguer avec Asterisk, Vicidial n\'ecessite une base de donn\'ees avec de nombreuses tables. De plus, il faut cr\'eer plusieurs conf\'erences au sein de Asterisk. Ces conf\'erences seront ensuite utilis\'ees par Vicidial pour mettre en relation l'utilisateur et le client. En effet, apr\`es l'authentification d'un utilisateur dans Vicidial, le t\'el\'ephone de celui-ci est entr\'e dans une conf\'erence. Par la suite, \`a chaque appel lanc\'e par l'utilisateur, le client appel\'e rejoint la conf\'erence et les deux acteurs peuvent ainsi dialoguer. D'autres personnes peuvent \'egalement rejoindre la conf\'erence (manager \dots).
228 Vicidial a \'egalement besoin que plusieurs scripts soient ex\'ecut\'es r\'eguli\`erement, pour cela il faut utiliser cron.
229 %citation
230 %\cite{Motclef1}.
231 %note de pied de page
232 %titit \footnote{Par exemple, on peut faire un pied de page}
233 \clearpage