Lancement d'Asterisk

Pour lancer Asterisk, il faut d'abord se loguer en root :

root@asterisk:~# sudo -s root

Lancer Asterisk :

root@asterisk:~# /etc/init.d/asterisk start

Lancer la CLI (Command-Line Interface) :

root@asterisk:~# asterisk -vvvvvvvvvr


Les commandes de la CLI

Le nombre de commandes est important. Voici celles que nous avons le plus utilisées :

Vous pouvez accéder à toutes les commandes ici.


Les fichiers de configuration

Les fichiers de configuration d'Asterisk se trouvent dans /etc/asterisk/ et portent l'extension .conf.


Configuration de base d'Asterisk

Pour mieux comprendre le fonctionnement d'Asterisk, on se basera sur des modèles simplifiés d'extensions.conf et sip.conf. Il est conseillé de faire une copie des fichiers d'origine et de les renommer en extensions.conf.ORIG et sip.conf.ORIG afin de pouvoir revenir aux configurations par défaut en cas de problème.

Pour modifier les fichiers de configuration, il faut utiliser un éditeur de texte, de préférence gedit.

root@asterisk:~# gedit /etc/asterisk/extensions.conf &

Pour ajouter des abonnés, il faut d'abord modifier le fichier extensions.conf.

; extensions.conf
;
;
[general]
static=yes
writeprotect=no
autofallthrough=yes
clearglobalvars=no
priorityjumping=yes 			; autorise le saut d'appel n+101
;
[globals]
; On ajoute des variables pour une meilleure visibilité
Loulou = SIP/2201			; Téléphone 1
Totoche = SIP/2202			; Téléphone 2
gigi = SIP/2203				; Softphone Xlite PC XP
;
[from-sip] 				; Ajout du contexte from-sip
exten => 2201,1,Answer()		; On répond
exten => 2201,n,Wait,1			; Pause d'une seconde
exten => 2201,n,DIAL(${Loulou},8,rTt)   ; 8 sonneries
				        ; r : génère une tonalité pour l'appelant
				        ;    (par exemple : ligne occupée)
				    ; T : autoriser l’appelant à transférer l’appel
				    ; t : autoriser l'appelé à transférer l'appel
exten => 2201,n,VoiceMail(u2201)	; Lancement de la messagerie de Loulou
exten => 2201,n,Hangup()		; On raccroche
;
;etc

; sip.conf
;
[general]
; ...
[2201]			; Ajout du numéro de tel de l'abonné Loulou
type=friend
language = fr		; Langage par défaut (de tous les utilisateurs)
context=from-sip 	; Comment traiter un appel venant de ce poste
			; (contexte défini dans extensions.conf)
callerid=Loulou <2201> 	; Identifiant de l'appelant complet
host=dynamic 		; Nous avons une adresse IP statique mais privée
secret = 2201 		; Mot de passe
nat=no 			; Pas de NAT entre le tél. et son serveur d’enregistrement
;canreinvite=yes 	; autorise le flux RTP
dtmf=rcf2833 ;
mailbox=2201@default 	; mailbox 1234 in voicemail context "default"
disallow=all		; On interdit tous les types de codec avant de les autoriser
allow=ulaw		; Note: In user sections the order of codecs
allow=alaw
;
; faire de même pour les autres abonnés

Il faut alors qu'Asterisk prenne en compte les changements et relise les fichiers de configuration.

asterisk*CLI> reload


Configuration de base des téléphones SIP

Nous pouvons maintenant mettre sous tension les téléphones. Il faut d'abord faire un reset constructeur en renseignant leur adresse mac, marquée dessous. Nous allons utiliser des adresses IP statiques que nous rentrerons manuellement, en prenant soin de désactiver la fonction DHCP.

Après un reboot, ils doivent être accessibles par leur adresse IP via le navigateur des PC du réseau.

Page d'identification du téléphone

Page d'identification du téléphone



Configurations de base

Configurations de base (Basic settings)



Nous choisissons d'utiliser le serveur de temps (NTP) de l'UJF.

Configuration du NTP

Configuration du NTP (Advanced settings)



Ajout d'un utilisateur sur le téléphone

Ajout d'un utilisateur sur le téléphone (account)



Il faut maintenant enregistrer les modifications (update) et redémarrer le téléphone (reboot) pour qu'elles soient prises en compte.

Sauver la configuration et redémarrer le téléphone

Sauver la configuration et redémarrer le téléphone



Configuration du Softphone Xlite

On ajoute le compte utilisateur gigi de numéro de poste 2203 en reprenant les manipulations précédentes des fichiers extensions.conf et sip.conf. Nous allons utiliser le Softphone Xlite. Il doit être configuré comme ceci :

Configuration du softphone

Configuration du softphone



Destinataire occupé

L'application DIAL permet de lancer une autre application si la ligne est occupée. Dans ce cas, elle renvoie à la ligne n+101. Pour autoriser cela, il faut éditer extensions.conf.

; extensions.conf
;
[general]
priorityjumping=yes 	; autorise le renvoi à la ligne n+101 si occupé

Si la ligne est occupée, on veut que l'appelant soit informé par la lecture d'un fichier audio. On ajoute alors la ligne adéquate dans extensions.conf.

; extensions.conf
;
exten => 2201,1,Answer()
exten => 2201,n,Wait,1
exten => 2201,n,DIAL(${Loulou},8,rTt)   ; Après 8 sonneries, on va à la ligne 104
exten => 2201,n,Hangup()
exten => 2201,104,PlayBack(tt-allbusy)

Gestion de la messagerie

Par défaut Asterisk ne contient que des fichiers audios en anglais. Pour obtenir ceux en français, il faut lancer Synaptic et lancer une recherche avec le mot asterisk. On installe ensuite les paquets en français.

Il faut maintenant indiquer à Asterisk d'utiliser les fichiers audios en français plutôt que ceux en anglais. On modifie alors le fichier sip.conf.

; sip.conf
;
[general]
language=fr 		; définit le français comme langue par défaut

On veut que la messagerie d'un utilisateur se déclenche au bout de n sonneries. On adapte le fichier extensions.conf.

; extensions.conf
;
exten => 2201,n,DIAL(${Loulou},8,rTt)   ; 8 sonneries
exten => 2201,n,VoiceMail(u2201)	; Lancement de la messagerie de Loulou

On indique quelle est la messagerie d'un utilisateur dans sip.conf.

; sip.conf
;
[2201]
mailbox=2201@default	; Loulou a la messagerie 2201 dans le contexte
			; default de voicemail.conf

On ajoute la mailbox de l’utilisateur dans le contexte default de voicemail.conf

; voicemail.conf
;
[default]
2201 => 2201,Loulou,,,tz=paris24

Après un reload et un test, on entend un message en français nous indiquant de laisser un message.


Ecouter ses messages

Pour consulter ses messages, on utilise l'application VoiceMailMain() dans extensions.conf. Pour y accéder, il faut composer un numéro. Ici, le code 888 demande le numéro de boîte vocale et le mot de passe :

; extensions.conf
;
[from-sip]
; Accès à la messagerie : numéro de messagerie + MDP
exten => 888,1,Answer()
exten => 888,n,VoiceMailMain() ; aucun paramètre
exten => 888,n,Hangup()

Le code 555 demande seulement le mot de passe car on lie l’appel depuis un téléphone à la boîte vocale ayant le même numéro:

; Accès à la messagerie : MDP
exten => 555,1,Answer()
exten => 555,n,VoiceMailMain(${CALLERIDNUM}) ; appel lié
exten => 555,n,Hangup()

Le code 555 permet de consulter sa messagerie depuis un autre poste.


Messagerie unifiée

On souhaite qu'un utilisateur ayant reçu un message soit notifié par email. On installe donc un serveur de messagerie sur le pc Asterisk. A l'aide de Synaptic, installer les paquets suivant :

Attention à bien répondre « Site Internet » à la question sur Postfix.

Il faut ensuite créer les comptes utilisateurs Unix totoche et gigi

; voicemail.conf
;
[general]
format = wav 		; Le format des pièces jointes est wav
attach = yes 		; L'email contient le message vocal en pièce jointe

Compléter les lignes mailbox avec l’adresse mail :

; voicemail.conf
;
[default]	
2201 => 2201,Loulou,loulou@localhost,,tz=paris24

On souhaite faire en sorte que les mails arrivent dans le home directory de l'utilisateur. On doit pour cela passer Postfix au format Maildir en éditant son fichier de configuration (/etc/postfix/main.cf) :

; /etc/postfix/main.cf
;	
home_mailbox = Maildir/ 	; Ligne à ajouter

Il suffit de relancer Postfix pour prendre en compte les changements :

root@asterisk:~# /etc/init.d/postfix reload

Nous allons utiliser IMAP grâce à courier-imap (déjà en marche). Il faut relier l'authentification IMAP avec les comptes UNIX :

root@asterisk:~# /etc/init.d/courier-authdaemon start

Il ne reste plus qu'à ajouter les comptes dans Thunderbird et nous obtenons alors ceci :

Messagerie unifiée

Messagerie unifiée


Liaison inter Asterisk

Pour réaliser une liaison entre 2 serveurs Asterisk, nous allons utiliser un protocole propre à Asterisk :
IAX (Inter Asterisk eXchange). IAX permet le cryptage et l'utilisation d'un seul port (utile pour NAT et Firewall).

Nous avons dans notre cas réalisé une liaison sans cryptage. Nous avons pour cela fait le test avec un autre binôme. Nous avons dû éditer notre fichier iax.conf :

; iax.conf
;
[general]
language=fr
bandwidth=low 	; On peut laisser le paramètre à 'low'

Les deux binômes sont BX et BY. Nous sommes le binôme Y, soit la colonne de droite sur le modèle suivant :

[binomeY] 							[binomeX]
type=friend 							type=friend
host=@IP_binomeY 						host=@IP_binomeX
auth=plaintext 							auth=plaintext
username=binomeX 						username=binomeY
secret=toto 							secret=toto
context=iax 							context=iax
permit=0.0.0.0/0.0.0.0 						permit=0.0.0.0/0.0.0.0
trunk=yes 							trunk=yes

Après modification, on obtient :

; iax.conf
;
; On ajoute à la fin
;
[binome18]
type=friend
host=10.33.18.253
auth=plaintext
username=binome22
secret=toto
context=iax
permit=0.0.0.0/0.0.0.0
trunk=yes

On vérifie que dans le fichier extensions.conf la ligne suivante est bien commentée :

; iax.conf
;
;TRUNK=IAX2/user:pass@provider  --  doit être commentée

On ajoute une extension pour les appels sortants vers l'autre binôme (Loulou) :

; extensions.conf
;
[from-sip]
exten => _9101,1,DIAL(IAX2/binome18/${EXTEN:1})	
; 101 numéro local de Loulou de l'autre binôme (18)

On ajoute une extension pour les appels entrants depuis l'autre binôme dans un nouveau contexte, les appels venant de la liaison IAX seront ainsi interprétés et traités de la même façon que les appels locaux :

; extensions.conf
;
[iax]
include => from-sip

Après un reload dans la CLI, il est possible d'appeler les utilisateurs de part et d'autre de la liaison. Voici quelques commandes permettant d'obtenir des informations sur la liaison :


Manipulation avec Wireshark

On installe Wireshark sur la machine Asterisk.

On lance alors une capture puis on se fait appeler par l'autre binôme. On voit alors apparaître dans les premières trames les valeurs des variables "username" et "secret". Nous constatons déjà que le cryptage devient nécessaire. Nous allons voir maintenant qu'il est possible d'écouter les conversations !

On sélectionne alors une ligne au hasard, puis "Statistics", "RTP", "Show All Streams". On sélectionne les deux flux (nommés "Forward" et "Inverse"), puis "Analyze". Il n'y a plus qu'à Sauvegarder avec "Save payload" au format ".au". Cela va nous permettre de l'exploiter avec le logiciel Audacity.

On installe ensuite Audacity sur le poste XP et on ouvre le fichier .au.

Lecture du .au avec Audacity

Lecture du .au avec Audacity


Enregistrer des messages simplement

Asterisk propose d'enregistrer facilement des messages vocaux par le biais d'un téléphone.

; extensions.conf
;
[from-sip]
;Enregistre un message au format .gsm dans /tmp/
;
exten => 662202,1,Answer()
exten => 662202,2,Wait(1)
exten => 662202,3,Record(/tmp/file_${EXTEN:2}:gsm) ; Le nom du fichier sera 2202.gsm,
exten => 662202,4,Wait(2) 		     ; les 2 premiers chiffres sont supprimés
exten => 662202,5,PlayBack(/tmp/file_${EXTEN:2}) ; Lit le message après enregistrement
exten => 662202,6,Wait(1)
exten => 662202,7,Hangup()


IVR

Au lieu de changer le contexte d'un téléphone en [default], on préfère utiliser l'application Goto dans le contexte [from-sip] pour renvoyer vers [default]. Ainsi tous les téléphones peuvent joindre les numéros IVR et continuer à joindre les numéros from-sip. On obtient la configuration suivante :

; extensions.conf
;
[from-sip]
;
exten => 2200,1,Answer
exten => 2200,2,Wait(1)
exten => 2200,3,Goto(default,2200,1)	; Redirection vers le contexte default, 
					; num 2200, ligne 1
[default]
exten => 2200,1,Answer
exten => 2200,2,Wait(1)
exten => 2200,3,Background(merci) ; "Merci de votre appel. Pour le service "Ventes", 
			; faîtes le 1,pour joindre le support technique, faîtes le 2"
exten => 2200,n,WaitExten 	; attend la saisie d'un numéro
exten => 1,1,Goto(submenu,s,1)	; Redirection vers le contexte submenu, num s, ligne 1
				; si la touche saisie est 1
exten => 2,1,Hangup 		; raccroche si la touche saisie est 2
;
[submenu]
exten => s,1,Ringing 		; Laissons alors sonner 2 secondes.
exten => s,n,Wait,2
exten => s,n,Background(submenuventes) ; "Vous êtes au service des ventes. 
		; Pour joindre Loulou, faîtes le 1, pour joindre Totoche, faîtes le 2."
exten => s,n,WaitExten 			; attend la saisie d'un numéro
exten => 1,1,Goto(from-sip,2201,1)	; Redirection vers le contexte from-sip, 
					; num 2201, ligne 1
exten => 2,1,Goto(from-sip,2202,1)	; Redirection vers le contexte from-sip, 
					; num 2202, ligne 1


Messages variables, en fonction des heures ouvrées

Dans cet exemple Loulou prend les appels sur le 2210 les heures ouvrées, et Totoche les heures non ouvrées et le week-end :

; extensions.conf
;
[from-sip]
;
exten => 2210,1,Answer
exten => 2210,2,Wait(1)
exten => 2210,3,Goto(default,2210,1); Redirection vers le contexte default
					; num 2200, ligne 1
[default]
exten => 2210,1,Answer
exten => 2210,n,Set(HEURE=${IFTIME(08:29-17:59,mon-fri,*,*?OUVERT:FERME)})
;
; si l'heure est comprise entre 08:29 et 17:59, 
; et que le jour est compris entre lundi et vendredi la variable HEURE = OUVERT
; sinon HEURE = FERME
;
exten => 2210,n,Background(merci1) ;"Merci de votre appel.Nous contactons un technicien"
exten => 2210,n,GotoIf($[${HEURE}=OUVERT]?semaine:week)
;
; Si HEURE = OUVERT on va à la ligne n(semaine)
; Sinon on va à la ligne n(week)
;
exten => 2210,n(semaine),Goto(from-sip,2201,1) 	; redirection vers Loulou
exten => 2210,n(week),Goto(from-sip,2202,1) 	; redirection vers Totoche


Conversation vidéo

Pour pouvoir profiter de la vidéo, il faut utiliser des téléphones compatibles. Nous avons à notre disposition deux téléphones vidéo Grandstream GVX3000.

Pour activer la négociation d'une communication vidéo entre deux téléphones, on doit ajouter dans sip.conf la ligne suivante :

; sip.conf
;
[general]
videosupport=yes ; 

Il faut ajouter deux nouveaux utilisateurs (video1 : 2204 et video2 : 2205). Nous devons aussi indiquer quel codec sera utilisé pour chaque videophone. Nous utilisons ici le codec h263 car notre version d'Asterisk est ancienne (1.2.x). Pour les versions plus récentes (1.4.x) on utilise le codec h264 :

; sip.conf
;
[2204]
; ...
disallow=all 	; On interdit tous les types de codec avant de les autoriser
allow=ulaw 
allow=alaw
allow=h263
;
[2205]
; ...
disallow=all 	; On interdit tous les types de codec avant de les autoriser
allow=ulaw
allow=alaw
allow=h263

Il ne reste plus qu'à faire un reset constructeur des deux téléphones, configurer leur adresse ip respective et les utilisateurs (vu précédemment).

Après un reload, la vidéo fonctionne !



Liaison avec les bases de données

Pour rendre possible la liaison d'Asterisk avec une base de donnée, il faut installer les paquets suivants grâce à Synaptic :

Sur le site http://www.asterisk.org/downloads , choisir "Older releases of Asterisk can be found here"

Anciennes version d'Asterisk

Anciennes version d'Asterisk


Téléchargeons ensuite asterisk-addons-1.2.7.tar.gz sous /tmp par exemple.

asterisk-addons-1.2.7.tar.gz

asterisk-addons-1.2.7.tar.gz

On décompresse les fichiers sous /usr/share/ puis on va dans le répertoire créé : /usr/share/asteriskaddons-1.2.7 :

root@asterisk:~# cd /usr/share/
root@asterisk:/usr/share# tar xvzf /tmp/asterisk-addons-1.2.7.tar.gz
root@asterisk:/usr/share# cd asterisk-addons-1.2.7/

Ensuite on compile sans oublier d'installer les librairies :

root@asterisk:~# apt-get install build-essential
root@asterisk:/usr/share/asterisk-addons-1.2.7# make
root@asterisk:/usr/share/asterisk-addons-1.2.7# make install

Les modules compilés sont maintenant présents dans /usr/lib/asterisk/modules.

Nous allons à présent créer une configuration CDR (Call Details Record) qui utilisera notre future base de données. Cela nous permettrait de facturer les abonnés et de faire des statistiques. Editons pour cela le fichier /usr/share/asterisk-addons-1.2.7/configs/cdr_mysql.conf.sample.

; cdr_mysql.conf.sample --> SAUVER SOUS /etc/asterisk/cdr_mysql.conf
;
[global]
hostname=127.0.0.1 	; adresse du serveur mysql
dbname=asterisk 	; nom de la base de données
table=cdr 		; nom de la table
sock=/tmp/mysql.sock 
user=user 		; nom d'utilisateur pour se connecter à la base
password=toto 		; mot de passe

On peut maintenant lancer mysql :

root@asterisk:~# /etc/init.d/mysql start
Starting MySQL database server: mysqld...already running.
 * Root password is blank.  To change it use:
 * /etc/init.d/mysql reset-password

On nous indique alors comment changer le mot de passe de l'utilisateur root de mysql, ce que nous allons faire. Le mot de passe sera totomysql.

root@asterisk:~# /etc/init.d/mysql reset-password
New MySQL root password:
Verify:
Setting new MySQL root password

On se connecte à la base en root:

root@asterisk:~# mysql -u root -p

On crée la base nommée "asterisk" :

mysql> create database asterisk ;
Query OK, 1 row affected (0.00 sec)

On donne tous les droits à l'utilisateur nommé "user" sur toutes les tables de cette base :

mysql> grant all privileges on asterisk.* to user@localhost identified by 'toto'; 
Query OK, 0 rows affected (0.01 sec)

On efface les anciens privilèges :

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

On se déconnecte puis reconnecte en User :

mysql> quit
root@asterisk:~# mysql -u user -p		// avec le mot de passe toto

On peut voir les bases de données (sur lesquelles user a les autorisations) :

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| asterisk           |		// La database à bien été créée
+--------------------+
2 rows in set (0.00 sec)

On sélectionne la base de données qui nous intéresse : asterisk :

mysql> use asterisk;
Database changed

Nous pouvons maintenant créer la table cdr :

CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`userfield` varchar(255) NOT NULL default ''
);
ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default '';
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

On peut voir les tables de la base de données asterisk :

mysql> show tables;
+--------------------+
| Tables_in_asterisk |
+--------------------+
| cdr                |		// La table à bien été créée
+--------------------+
1 row in set (0.00 sec)

Il suffit de relancer Asterisk avec un reload et de vérifier que le module a bien été chargé avec la commande show modules like mysql.

Après quelques appels, la table se complète. On peut la visualiser avec une requête select :

Contenu de la table CDR

Contenu de la table CDR


Liaison Apache2/PHP/MySQL

Pour améliorer l'utilisation des données nous allons rendre la base de données accessible depuis une interface web.

Nous allons installer différents logiciels, les uns après les autres avec Synaptic. Dans le menu « Configuration », « Préferences », cocher «Toujours préférer la version la plus élevée ».

Préférences Synaptic

Préférences Synaptic

Pour installer on utilise le bouton « Rechercher ». Ensuite on sélectionne le paquet pour l'installation (clic droit) et l'installer («Appliquer»).

On peut vérifier le bon fonctionnement en éditant une page index.php contenant une ligne
<?php phpinfo(); ?>. Si on se rend à l'adresse localhost, on obtient :

http://localhost/index.php

http://localhost/index.php

Téléchargeons asterisk-stat-v2_0_1.tar.gz dans /tmp depuis le FTP ftp://ftp.gtrgrenoble.fr/.

On décompresse les fichiers sous /var/www/ :

root@asterisk:~# cd /usr/share/
root@asterisk:/usr/share# tar xvzf /tmp/asterisk-addons-1.2.7.tar.gz

<!-- /var/www/asterisk-stat-v2/lib/defines.php -->	
<?php
// ...
define ("HOST", "127.0.0.1");
define ("PORT", "5432");
define ("USER", "user");
define ("PASS", "toto");
define ("DBNAME", "asterisk");
define ("DB_TYPE", "mysql"); // mysql or postgres
// ...
include ("/var/www/asterisk-stat-v2/lib/DB-modules/phplib_".DB_TYPE.".php") 
// emplacement du fichier phplib_mysql.php
//...
?>

Le site est maintenant opérationnel, nous pouvons le consulter à l'adresse suivante :

http://127.0.0.1/asterisk-stat-v2/cdr.php


Site php cdr

site php cdr



Musique d'attente

Nous devons d'abord installer un lecteur MP3 pour Unix avec Synaptic, "mpg123".

Modifions à présent le fichier musiconhold.conf :

; musiconhold.conf
;
[default]
mode=quietmp3 				; pour Asterisk 1.2.X - pour MP3s
directory=/usr/share/asterisk/mohmp3 	; Répertoire contenant les fichiers ausio 
					; (nous mettons notre propre MP3 dedans)
application=/usr/bin/mpg123		; Application permettant de lire les MP3s

On peut tester la configuration actuelle en ajoutant une extension dans le fichier extensions.conf :

; extensions.conf
;
exten => 6000,1,Answer 
exten => 6000,2,MusicOnHold()

Il faut quitter puis relancer Asterisk pour que les modifications soient prises en compte.

La musique d'attente fonctionne !