TP2 : INTERCONNEXION ENTRE DEUX ASTERISK ET ENTRE KAMAILIO-ASTERISK
Mise en place d'un serveur Asterisk avec une connexion ODBC vers MySQL pour la gestion des comptes utilisateurs
1- Architecture
N.B : Nous avons utilisé ubuntu 14.04 LTS
2- Installation des prerequis ODBC et MYSQL:
#apt-get install mysql-server libmysqlclient-dev unixodbc-dev libmyodbc
3- Installation des prerequis Asterisk:
#apt-get install mysql-server make libmysqlclient-dev unixodbc-dev libmyodbc g++ bison libcurl3 libcurl3-gnutls libcurl4-openssl-dev libssl-dev uuid-dev ncurses-base ncurses-term libncurses5-dev libjansson-dev libxml2-dev sqlite3 libsqlite3-dev libspandsp-dev libsrtp0-dev libopus-dev libopusfile-dev libopus-dev libvpx-dev opus-tools libmp3lame-dev libmpg123-dev mpg123 libmpg123-0 libedit-dev libjansson-dev libjansson4
4- Installation d'Asterisk :
Télécharger asterisk
#wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
#tar -xvzf asterisk-16-current.tar.gz -C /usr/local/
#cd /usr/local/asterisk-16.24.0/
# ./configure --with-jansson-bundled
#make menuselect
#make
#make install
#make samples
On télécharge le fichier asterisk.sql
Ensuite on éxécute les scripts :
#mysql -u root -p < asterisk.sql
> GRANT ALL privileges ON asterisk.* TO asterisk@localhost IDENTIFIED BY 'passer';
> flush privileges;
>exit;
>use asterisk;
INSERT INTO sipusers (name, defaultuser, host, sippasswd, fromuser, fromdomain, mailbox) VALUES ('100', '100', 'dynamic', '100', '100', '192.168.1.10', '100');
INSERT INTO sipusers (name, defaultuser, host, sippasswd, fromuser, fromdomain, mailbox) VALUES ('101', '101', 'dynamic', '101', '101', '192.168.1.10', '101');
INSERT INTO sipusers (name, defaultuser, host, sippasswd, fromuser, fromdomain, mailbox) VALUES ('102', '102', 'dynamic', '102', '102', '192.168.1.10', '102');
INSERT INTO sipregs(name) VALUES('100');
INSERT INTO sipregs(name) VALUES('101');
INSERT INTO sipregs(name) VALUES('102');
INSERT INTO voicemail(context, mailbox, password) VALUES ('default', '100', '1234');
INSERT INTO voicemail(context, mailbox, password) VALUES ('default', '101', '1234');
INSERT INTO voicemail(context, mailbox, password) VALUES ('default', '102', '1234');
On édite les fichiers :
#vim /etc/odbc.ini
[MySQL-asterisk]
Description = MySQL Asterisk database
Trace = Off
TraceFile = stderr
Driver = MySQL
SERVER = localhost
USER = asterisk
PASSWORD = passer
PORT = 3306
DATABASE = asterisk
#vim /etc/odbcinst.ini
[Default]
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1
;UsageCount = 2
#vim /etc/asterisk/res_odbc.conf
[asterisk]
enabled => yes
dsn => MYSQL-asterisk;
username => asterisk
password => passer
pre-connect => yes
#vim /etc/asterisk/extconfig.conf
[settings]
sipusers => odbc,asterisk,sipusers
sippeers => odbc,asterisk,sipusers
sipregs => odbc,asterisk,sipregs
voicemail => odbc,asterisk,voicemail
#vim /etc/asterisk/sip.conf
udpbindaddr=0.0.0.0:5080
rtcachefriends=yes
#vim /etc/asterisk/extensions.conf
[public]
exten => _1XX,1,Dial(SIP/${EXTEN},20,tr)
exten => _1XX,n,Voicemail(${EXTEN},u)
exten => _1XX,n,Hangup
exten => _1XX, 101, Voicemail (${EXTEN},b)
exten => _1XX, 102, Hangup
On redémarre asterisk et on utilise les comptes 101 et 103 qu'on configure en précisant le port 5080 Sur les softphones et les appels devraient passer entre les utilisateurs 101 et 103.
N.B: Vous pouvez utiliser le port 5060 si c'est pas utilisé par une autre application.
Interconnexion entre deux Asterisk partageant la même base de données MySQL des utilisateurs
Principe de fonctionnement
Nous disposons de deux serveurs asterisk sous ubuntu 14.0.1, nous allons donc faire une interconnexion entre les deux asterisk partageant la même base de données des utilisateurs.
Un utilisateur qui se connecte sur un des asterisk est reconnu par l'autre asterisk et donc si un utilisateur se connecte sur asterisk1 et un autre sur asterisk2, alors ils peuvent s'appeler et s'envoyer des messages. Ceci est un avantage sur les étapes à venir si nous voulons interconnecter deux asterisk avec Kamailio qui partage tous en même temps la base de données asterisk, les utilisateurs d'asterisk n'auront pas à s'enregistrer sur les deux asterisk, il suffit juste de s'enregistrer sur un astersik et alors un utilisateur qui est enregistré sur la base de données kamailio pourra appeler les utilisateurs qui sont dans la base de données asterisk.
Nous allons passer au partage de la base de données entre asterisk1 et asterisk2.
- Partage de la base de données commune asterisk.
La base de données se trouve dans la machine qui contient asterisk1 à l'adresse 192.168.1.12. D'abord faire une copie de la table sipregs de la base de données asterisk.
#mysql -u root -p
> use asterisk;
>create table sipregs_asterisk1 like sipregs;
>create table sipregs_asterisk2 like sipregs;
>exit
Il faut donner tous les droits aux tables sipregs_asterisk1 et sipregs_asterisk2
Créer une Vue entre les deux tables :
CREATE VIEW sipregs_all AS select * from sipregs_asterisk1 union select * from sipregs_asterisk2;
Ensuite inséré des utilisateurs dans les tables :
INSERT INTO sipregs_asterisk1 (name) VALUES ('101');
INSERT INTO sipregs_asterisk1 (name) VALUES ('102');
INSERT INTO sipregs_asterisk2 (name) VALUES ('101');
INSERT INTO sipregs_asterisk2 (name) VALUES ('102');
Il faut aussi éditer le fichier func_odbc.conf et ajouter :
[checkregserver]
dsn=MYSQL-asterisk
readsql=SELECT regserver FROM sipregs_all WHERE fullcontact like 'sip:${ARG1}%'order by regseconds DESC limit 1
- Dans Asterisk1
Dans asterisk.conf ajouter la ligne :
systemname = asterisk1
Dans asterisk1 nous allons d'abord éditer le fichier /etc/asterisk/sip.conf et ajouter les lignes suivantes:
tcpenable=no
tcpbindaddr=0.0.0.0:5080 //port d'écoute d'asterisk1 car on n'avait un kamailio qui écoute sur 5060
rtcachefriends=yes
rtsavesysname=yes
Il faut aussi ajouter un compte pour asterisk
Ensuite on édite le fichier /etc/asterisk/extensions.conf
Pour définir le plan de numérotation.
- Dans Asterisk2
Dans asterisk.conf ajouter la ligne :
Dans asterisk1 nous allons d'abord éditer le fichier /etc/asterisk/sip.conf et ajouter les lignessuivantes:
rtcachefriends=yes rtsavesysname=yes
Il faut aussi ajouter un compte pour asterisk1.
Ensuite on édite le fichier /etc/asterisk/extensions.conf
- Problème rencontré
Nous avons rencontré le problème de connexion à la base de données avec ODBC avec la requête spécifiée dans func_odbc.conf.
- Solution
Nous avons mise en place un script php dans lequel nous avons fait appel à la requête qui nous permet de récupérer le regserver. Ensuite on utilise CURL dans les fichiers extensions.conf des deux asterisk pour accéder à la base de données. regserver.php dans /var/www/html/ de Asterisk1
- Test des appels
*utilisateur 103 se connecte sur asterisk1
*utilisateur 101 se connecte sur asterisk2
* 103 appels 102
- coté asterisk1
- Coté asterisk2
L’appel entre user 103 et user 101 passe.