Asterisk

De Justine's wiki
Aller à la navigation Aller à la recherche

D'après: https://www.youtube.com/watch?v=vqqEcDC972c&list=PL3GzJ6OC0xVjvz7me4YvPUumYKVkiZSfZ&index=5

Doc Asterisk : https://wiki.asterisk.org

Prérequis

Au préalable, il faut une machine virtuelle Debian 9 non seulement à jour :

sudo apt update && sudo apt full-upgrade

Mais également installer les outils de compilation du noyau et les en-têtes du noyau Linux :

apt-get install build-essential module-assistant
m-a prepare
apt-get install linux-headers-$(uname -r)

Pour rappel, les en-têtes de noyau Linux servent à définir les fonctions dans le code-source du noyau Linux : savoir de quelles entrées a besoin une fonction, et quelles sorties elle renvoie.

On aura aussi besoin de compiler des choses :

sudo apt install automake

Présentation d'Asterisk

Asterisk logo4.png

Asterisk est un IPBX basé sur Linux, le plus connu et le plus complet. Il est libre (open source) et gratuit dans ses versions "nues", mais propriétaire et payant dans ses versions prêtes à l'emploi. C'est le plus répandu, que ce soit en embarqué dans de l'équipement dédié ou en installation "logique pure" : il sert aux petits comme aux gros déploiements. Il a la fonction d'un PABX, soit un Autocommutateur Téléphonique Privé. Ce genre d'équipement consiste normalement en un ensemble important de cartes électroniques chères et complexes à utiliser (il faut un spécialiste pour ce travail). L'étoile dans le logo représente le fait qu'il couvre tous les besoins : il est multi-protocoles, multi-codecs... Il permet de développer sa propre solution.

Créé en 1999 par Mark Spencer pour sa fin d'études, il permet alors de prendre en charge des appels téléphoniques sans PABX. Spencer n'as alors pas 25 ans. Le logiciel est téléchargeable sous 3 formes :

  • Sa forme standard, basique : il est sous forme de fichiers (Asterisk Communications Framework)
  • Sous la forme d'une ISO bootable, qui transforme la machine en IPBX avec une interface graphique nommé FreePBX (AsteriskNOW Software PBX)
  • Sous forme prête-à-l'emploi avec même du matériel, qui n'est pas gratuite. C'est de l'Asterisk avec des choses en plus ( Switchbox).

Dans le cadre de ce TP, on utilisera la version Framework. Il existe en plusieurs versions; en effet, en plus du 32/64 bits, il doit pouvoir s'interfacer avec le monde extérieur (qu'il s'agisse de lignes opérateur, de matériel...) : on va donc utiliser la version avec DAHDI : Digium/Asterisk Hardware Device Interface. DAHDI permet d'exploiter les cartes matérielles conçues par Digium, la société de Mark Spencer. Libpri, quant à lui, est une libraire permettant de mettre en place les protocoles de liaison avec les lignes RNIS (non IP, donc), sensées disapraître d'ici 2020. Asterisk s'appuyant sur SIP, on va avoir besoin de PJSIP, qui permet d'utiliser SIP avec du NAT.

Installation

On commence par créer un dossier Asterisk, puis on télécharge dans celui-ci les fichiers nécessaires :

mkdir Asterisk

Puis on installe les fichiers nécessaires : pour avoir de l'évolutivité, on va passer par le code source d'Asterisk. On pourrait pazsser par Apt-get, mais ce ne serait pas aussi simple de modifier des éléments problématiques. On va passer par le serveur de téléchargements d'Asterisk : http://downloads.asterisk.org/pub/telephony/asterisk/

cd /usr/src
http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15-current.tar.gz #La 13 est LTS
sudo wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-2.11.1+2.11.1.tar.gz
sudo wget https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz 

On va décompresser nos fichiers :

sudo tar -zxvf libpri-current.tar.gz 
sudo tar -zxvf asterisk-15-current.tar.gz
sudo tar -zxvf dahdi-linux-complete-2.11.1+2.11.1.tar.gz

On a alors nos 3 dossiers avec nos codes sources, on va compiler.

DAHDI

Il peut manquer quelques dépendances :

sudo apt install libglib2.0-dev libusb-1.0

Il suffit ensuite de se rendre dans le dossier et de faire un make puis make install :

cd dahdi-linux-complete-2.11.1+2.11.1
sudo make #On voit l'ensemble des modules pour différents matériels au passage :)
sudo make install
sudo make config

libpri

On se rend dans le dossier libpri et on installe :

cd ..
cd libpri-1.6.0/
sudo make
sudo make install

PJSIP et Asterisk

On peut rester sur du SIP standard; mais PJSIP est intéressant. Pour l'installer :

cd asterisk-15.7.1/contrib/scripts/
sudo ./install_prereq install #En version paquet Debian
sudo ./install_prereq install-unpackaged #En version depuis les sources

Cette commande prend un peu de temps car certains dépendances sont installées. Une fois cela fait, on va installer Asterisk.

cd ../..
sudo ./configure

On doit voir le logo d'Asterisk en ASCII art à la fin. Si on est sur une version =< 13, il faut penser à rajouter --with-pjproject-bundle après le "./configure". Si on un problème survient lors du ./configure, avant de recommencer, il faut faire depuis le dossier d'Asterisk :

make distclear

Sélection des modules

On va choisir les modules que va utiliser Asterisk. Il faut s'assurer que la fenêtre de terminal fasse au moins 80 * 27. Ensuite:

sudo make menuselect

Dans la fenêtre, on peut choisir ce qui nous intéresse ou non : que ce soit des applications, des modules... on peut choisir ce que l'on veut en fonction de nos besoins, mais comme je pars du principe que l'on va rester sur une installation normale et que l'on a les ressources nécessaires, je ne vais pas enlever grand-chose. Il faut cependant faire attention aux "compiler flags", en fonction du matériel sur lequel on se trouve (dans le doute, ne pas toucher).

Il est également intéressant de jeter un oeil aux "Core Sound Packages", c'est-à-dire les sons que joueront par exemple les boîtes vocales. Je décoche donc les sons en anglais et je coche les sons en français : on a par exemple "CORE-SOUNDS-FR-GSM", et d'autres... L'extension à le fin désigne le codec des fichiers son. Dans le doute, on peut tous les installer; mais le codec utilisé par défaut en France est ALAW, et le codec américain est ULAW. Il est donc conseillé de prendre au moins :

  • CORE-SOUNDS-FR-ALAW
  • CORE-SOUNDS-FR-ULAW

Ensuite, dans la section musique, on garde le format WAV. On ne prend pas de fichiers son supplémentaires, à priori on en aura pas besoin.

Enfin, il suffit d'utiliser TAB jusqu'à aller sur "Save & exit" et appuyer sur Entrée.

Installation d'Asterisk (enfin !)

Le système a donc préparé sa config, on a plus qu'a être dans le dossier d'Asterisk et faire un:

sudo make && sudo make install

On a en pour au moins une dizaine de minutes. Il faut garder un oeil sur la fenêtre lors de l'installation en cas de messages d'erreur.

L'install terminée, on va faire un make sample pour installer les fichiers dans le dossier /etc/asterisk :

sudo make samples
sudo make config  #install les scripts de démarrage, dans init.d par exemple
sudo make install-logrotate  #Installe une gestion / archivage des logs

Il faut ensuite démarrer asterisk et s'assurer qu'il ouvre bien ses ports :

sudo systemctl start asterisk
sudo systemctl status asterisk
sudo netstat -anutp  #Asterisk a-t'il bien des ports ouverts à son nom?

On voit des ports pour tous les protocoles utilisés par Asterisk.

Asterisk tourne, il faut encore le configurer.

Prise en main et configuration

On va voir ici comment mettre en place une configuration permettant d'établir rapidement une communication entre plusieurs postes téléphoniques internes.

Quelques vérifications

Dans le dossier /etc/asterisk, chaque fichier .conf a un rôle à jouer (on a pas UN fichier global, asterisk.conf est un des moins importants). Pour déclarer 3 téléphones en local par exemple, on va utiliser le protocole SIP (le plus courant) et pour cela passer par sip.conf. On va utiliser plusieurs fichiers :

  • sip.conf, pour déclarer nos téléphones.
  • extensions.conf : une fois nos téléphones dans sip.conf, ce fichier, qui est le plan de numérotation, va nous servir à déclarer ce qu'il se passe quand on compose un numéro, quel numéro composer, etc... Il est aussi appellé "dialplan".

On va d'ores et déjà renommer les fichiers pour en faire des backups:

mv sip.conf sip.conf.origin
mv extensions.conf extensions.conf.origin

Le but étant de partir de fichiers vierges pour ne pas trop s'embrouiller, en tant que débutante. Ces fichiers de base contiennent trop d'infos, il servent de vitrine de démonstration des capacités d'Asterisk. On va ensuite recréer des fichiers:

sudo systemctl restart asterisk #Il doit redémarrer correctement
sudo netstat -antpu #on doit avoir le port 5060 si sip.conf est rempli, ici il est encore vide donc on ne l'as pas, c'est normal

Ensuite on modifie sip.conf :

;/etc/asterisk/sip.conf

[general]
;Ce qui est ici s'applique à tout le monde

;Concerne les fichiers son, correspond au dossiers sons fr
language=fr

;alaw correspond à "a law" : loi logarithmique a qui code les sons (on a après ulaw pour la loi u)
allow=alaw
allow=ulaw

;déclaration de l'environnement de travail, i.e le contexte de mon environnement de travail, ici je n'en ai qu'un seul
;on pourrait en avoir un par service de l'entreprise par exemple
context=labo

[301]
;301, c'est juste le nom de mon téléphone, en l'occurence son numéro de téléphone
;Tout ce qui est dans ce bloc s'applique à ce téléphone en particulier

;C'est un équipement "amical", qui peut envoyer et recevoir des appels. On a plusieurs type, certains ne peuvent pas emettre par ex.
type=friend

;Un mot de passe
secret=Prevert77

;Ici, je ne connais pas l'IP; je pourrais l'indiquer si je la connaissait
host=dynamic

;Le callerid est l'identifiant de l'appelant qui s'affiche sur l'écran d'un téléphone que j'appelle
callerid = "Bob" <301>

[302]

[303]

J'enregistre et je quitte.

Je passe au plan de numérotation :

;/etc/asterisk/extension.conf

[general]

[labo]
;On retrouve le contexte déclaré plus tôt

;Une extension correspond à un équipement qui a un numéro : un téléphone, une salle de conférence...
; = une terminaison d'appel associée à un numéro. On va donc écrire ici ce que va faire le serveur en fonction de
;ce qu'il va recevoir comme ordres : un numéro de téléphone par exemple.

exten => 301,1,Answer
exten => 301,2,Dial(SIP/301)
exten => 301,3,Hangup

;Ici, plusieurs choses : il s'agit des opérations que va faire notre serveur en recevant quelqu'un qui compose le 301. Dans l'ordre:
;301,1,Answer : On numérote le 301, premièrement tu réponds (Answer)
;301,2,Dial(SIP/301) : Deuxièmement, tu compose le numéro correspondant à 301 dans la déclaration SIP. ;Ici, les correspondants discutent.
;301,3,Hangup : Troisièmement, tu raccroches.

J'enregistre, je quitte, et je redémarre le service asterisk. Je dois avoir le port 5060 d'ouvert.

La prochaine étape sera d'avoir deux téléphones : un pour 301, un pour 302. On va rajouter un téléphone:

;/etc/asterisk/sip.conf

[general]
;Ce qui est ici s'applique à tout le monde

;Concerne les fichiers son, correspond au dossiers sons fr
language=fr

;alaw correspond à "a law" : loi logarithmique a qui code les sons (on a après ulaw pour la loi u)
allow=alaw
allow=ulaw

;déclaration de l'environnement de travail, i.e le contexte de mon environnement de travail, ici je n'en ai qu'un seul
;on pourrait en avoir un par service de l'entreprise par exemple
context=labo

[301]
;301, c'est juste le nom de mon téléphone, en l'occurence son numéro de téléphone
;Tout ce qui est dans ce bloc s'applique à ce téléphone en particulier

;C'est un équipement "amical", qui peut envoyer et recevoir des appels. On a plusieurs type, certains ne peuvent pas emettre par ex.
type=friend

;Un mot de passe
secret=Prevert77

;Ici, je ne connais pas l'IP; je pourrais l'indiquer si je la connaissait
host=dynamic

;Le callerid est l'identifiant de l'appelant qui s'affiche sur l'écran d'un téléphone que j'appelle
callerid = "Bob" <301>

[302]
type=friend
secret=Prevert77
host=dynamic
callerid = "Alice" <302>

[303]

; je pourrais rajouter des téléphones...

On va pouvoir passer aux tests.

Tests

Mise en place de softphones

Je vais utiliser des softphones (au moins 2 sur une même machine): peu importe sur quelle machine, tant que j'ai une machine qui peut communiquer avec mon serveur Asterisk. Le mieux est une VM Windows, parce que les softphones sur Linux ne semblent pas courir les rues ! Sur Windows, on peut prendre :

  • XLite
  • 3cx (Un peu galère, il ne faut pas le confondre avec l'IPBX 3cx).

On aura besoin :

  • De l'IP du serveur Asterisk (Et on doit le pinguer...)
  • Du nom du poste
  • Du mot de passe.

Avant de configurer mes téléphones, je peux accéder à une console Asterisk pour avoir du détail :

asterisk -rcvvvv #rc pour connexion à distance, vvvv pour le niveau de verbosité

Je le laisse comme ça pour le moment, et je pars configurer mes téléphones:

3cx:

  • Account name : test
  • Caller id : Bob
  • Extension : 301
  • ID : 301
  • Password : Prevert77
  • I am in the office : @IP du serveur Asterisk.
  • OK.

Premier test

Une fois fait, ma console Asterisk doit m'envoyer une notification :

[Jan  1 19:20:38] NOTICE[14973]: chan_sip.c:28523 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 301

Et mon 3cx passe en "On hook", qui veut dire qu'il est connecté. Le "without mailbox" signifie qu'on a pas de boîte vocale.

Je peux configurer mon XLite :

  • Je vais dans "Account"...
  • Account name : Alice
  • User ID : 302
  • Domain : @ip du serveur, puiisque je n'ai pas de serveur DNS ici (En fait il veut un domain name, mais cet idiot ne marque que "domain"!
  • PAssword : Prevert77
  • Display name : Alice

Ok. La console Asterisk envoie une autre notification. Je peux voir mes deux téléphones (il faut une grande fenêtre) :

asterisk*CLI> sip show peers
Name/username             Host                                    Dyn Forcerport Comedia    ACL Port     Status      Description                      
301/301                   192.168.1.27                             D  Auto (No)  No             65468    Unmonitored                                  
302/302                   192.168.1.27                             D  Auto (No)  No             56216    Unmonitored                                  
2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 2 online, 0 offline]

Je peux ensuite essayer de composer le 301 sur xlite, pour voir si l'autre sonne. Dans l'autre sens, ça ne marche pas : c'est normal, notre fichier extensions.conf ne prévoit pas cette possibilité ! On peut voir que la console Asterisk renvoie des informations quand mon appel passe : je peux voir mon appel qui passe. Je peux aussi voir en essayant d'appeller 302 qu'il rejette l'appel parce qu'il ne connait pas le contexte.

Deuxième test

Je vais faire un dernier test en modifiant le fichier sip.conf pour ajouter un troisième téléphone:

;À rajouter

[303]
type=peer
secret=Prevert77
host=dynamic
callerid = "Justine" <303>

Un "peer" peut émettre et recevoir des appels lui aussi.

On enregistre et on quitte, puis dans extensions.conf:

;À rajouter
exten => 303,1,Answer
exten => 303,2,Dial(SIP/303)
exten => 303,3,Hangup

Je redémarre ensuite Asterisk.

Je prends ensuite un 3e softphone (Zoiper, par exemple...) que je vais configurer en 303 pour essayer. Ça marche : un peer peut lui aussi appeller et recevoir des appels. On pourrait cependant avoir un poste qui ne peut qu'émettre : un portier SIP par exemple, qui lorsqu'il reçoit un appel d'un numéro connu ouvre une porte, par exemple.

Par la suite, on pourrait configurer plein de choses dans extensions.conf, comme des heures d'ouverture/fermeture et autres; le fichier sip.conf servira lui à configurer des trunks vers des opérateurs de collecte, auprès de qui on serait abonné pour connecter notre système au monde extérieur.

Résumé de l'utilisation de la console Asterisk pour vérifications

  • Accéder à la console :
asterisk -rcvvvv (rc : à distance, vvvv : niveau de verbosité)
  • Voir tous mes pairs :
show peers
  • Voir des détails sur un pair, ici 301:
show peer 301

Ici, le DTMFmode : rfc2833 correspond à la rfc 2833 qui précise le mode de fonctionnement quand les touches du téléphone sont appuyées (le son produit est normalisé). Ce son, une superposition de deux fréquences, peut poser des problèmes si on ne suit pas cette norme (qui est la plus standard). En effet, les téléphones communiquent les touches appuyées par ces sons.

Créer un IVR (Interactive Voice Response)

Les IVR, aussi appellés auto-attendents, sont les robots que l'on connaît : appuyez sur telle touche pour arriver à tel menu. Pour cela, Asterisk doit reconnaître les tonalités DTMF émises par le téléphone de l'appellant. On va utiliser pour cela le fichier extensions, qui contiendra différentes applications :

  • Background() joue un son et écoute un DTMF en réponse; Asterisk essaie ensuite de trouver l'extension dans extensions.conf qui correspond à cette touche. Background prend en paramètre le nom du son qui est joué (prompt), mais il ne faut pas mettre l'extension du son en question.
    • Si l'on a plusieurs extensions, on peut les concaténer pour les lire à la suite , par exemple:
      • exten => 666,1,<code class="javascript plain">Background(prompt1&prompt2&prompt3)</code>


  • WaitExten() : le problème de Background() est qu'il n'attend pas après avoir lu ses prompts. On utilise pour cela WaitExten(), qui est généralement appellé directement après. Il prend en argument le nombre de secondes à attendre.

Exemple :

[auto_attendant]
exten => start,1,Verbose(2,Incoming call from ${CALLERID(all)})
   same => n,Playback(silence/1)
   same => n,Background(prompt1&prompt2&prompt3)
   same => n,WaitExten(10)
   same => n,Goto(timeout-handler,1)
 
exten => timeout-handler,1)
   same => n,Dial(${GLOBAL(OPERATOR)},30)
   same => n,Voicemail(operator@default,${IF($[${DIALSTATUS} = BUSY]?b:u)})
   same => n,Hangup()

Lire du texte avec Espeak

Espeak permet de faire du text-to-speech, de la synthèse vocale. Il faut d'abord l'installer:

sudo apt install espeak asterisk-espeak

La commande de base est:

Espeak(texte[,intkeys,langue])

  • intkeys peut prendre deux valeurs : soit any, soit une touche du téléphone.
  • langue correspond à fr, en, ...

Suite à quoi il est assez simple à utiliser, directement dans le dialplan :

;eSpeak Demo
 
exten => 1234,1,Answer()
 
;;Play message using default language as set in espeak.conf
 
exten => 1234,n,Espeak("This is a simple espeak test in english.",any)
 
;;Play message in Spanish
 
exten => 1234,n,Espeak("Esta es una simple prueba espeak en español.",any,es)
 
;;Play message in Greek
 
exten => 1234,n,Espeak("Αυτό είναι ένα απλό τέστ του espeak στα ελληνικά.",any,el)
 
;;Read a text file from disk (relative to the channel language)
 
;;and play it with espeak using the asterisk channel language.
 
exten => 1234,n,ReadFile(MYTEXT=/path/${LANGUAGE}/myfile,200)
 
exten => 1234,n,Espeak("${MYTEXY}",any,${LANGUAGE})
 
exten => 1234,n,Hangup()

Sauf que... Asterisk ne démarre plus ! Il doit pas être compatible avec ma version d'Asterisk. :(