Interconnettere OpenSIPS 1.11 e Asterisk 11 in realtime

Attenzione ! Questo articolo è stato scritto più di due anni fa. Ti prego quindi di considerare che le informazioni riportate potrebbero non essere aggiornate o non più valide.

Premetto che quanto di seguito funziona con i pacchetti disponibili sul repository ufficiale di Debian Jessie di OpenSIPS ed Asterisk: la struttura delle tabelle, le convenzioni, i nomi possono pertanto essere differenti dalle altre versioni disponibili su altre distribuzioni Linux.

Lo scenario descritto vede due server Linux con Debian Jessie 8.1 già in rete: VoIP Router (IP:10.0.0.1) e VoIP Mediabox (IP:10.0.0.2)

Procediamo con il server “VoIP Router”, che gestisce il routing delle segnalazioni SIP, la registrazione degli utenti, lo smistamento su eventuali trunk esterni.

Database MySQL

Come primo punto, è necessario predisporre e configurare un DBMS MySQL dove implementare le tabelle per opensips e per asterisk: può essere utilizzato anche uno dei due server, valutando attentamente lo spazio necessario per la tabella del CDR, che ha la tendenza a crescere piuttosto velocemente.

Dopo aver predisposto il DBMS MySQL implementando due database: ‘opensips’ e ‘asterisk’, con relativi utenti e permessi per l’accesso, possiamo iniziare ad installare il software necessario.

OpenSIPS

Dal terminale sul server VoIP Router installiamo OpenSIPS 1.11.5 con il comando:

sudo apt-get install opensips

ed installiamo anche altri pacchetti di supporto necessari:

sudo apt-get install opensips-carrierroute-module
sudo apt-get install opensips-dialplan-module
sudo apt-get install opensips-mysql-module
sudo apt-get install opensips-identity-module
sudo apt-get install opensips-presence-module

(probabilmente verrà richiesto di soddisfare alcune dipendenze con librerie esterne). Adesso dobbiamo popolare il database ‘opensips’ con le tabelle che trovate nella directory /usr/share/opensips/mysql, avendo cura di importare solo quelle richieste (in neretto – in realtà possiamo anche importarle tutte ma aumenta la confusione e lo spreco di spazio):

acc-create.sql cachedb_sql-create.sql dialplan-create.sql imc-create.sql registrant-create.sql standard-create.sql alias_db-create.sql call_center-create.sql dispatcher-create.sql load_balancer-create.sql registrar-create.sql uri_db-create.sql auth_db-create.sql carrierroute-create.sql domain-create.sql msilo-create.sql rls-create.sql userblacklist-create.sql avpops-create.sql closeddial-create.sql domainpolicy-create.sql pdt-create.sql rtpproxy-create.sql usrloc-create.sql b2b-create.sql cpl-create.sql drouting-create.sql permissions-create.sql siptrace-create.sql b2b_sca-create.sql dialog-create.sql group-create.sql presence-create.sql speeddial-create.sql
Per l’importazione potete usare il comodo strumento phpMyAdmin oppure, da terminale, l’utility di gestione del DBMS ‘mysql’.

Adesso possiamo passare alla configurazione di OpenSIPS, contenuta nel file opensips.cfg dentro la directory /etc/opensips. Il file di default può essere usato come base di partenza, avendo cura di aggiungere sia il caricamento del modulo MySQL che le relative impostazioni e credenziali:

#### MYSQL module
loadmodule "db_mysql.so"
db_default_url="mysql://[nome utente]:[password]@[host dbms]/opensips"

una volta concluso, ricordarsi di cambiare la variabile RUN_OPENSIPS= da ‘no’ a ‘yes’ dentro il file /etc/default/opensips.

Asterisk

Sul server dedicato ai servizi multimediali (caselle vocali, ivr, code di risposta….) tramite Asterisk, procediamo all’installazione del server con:

sudo apt-get install asterisk

e dei relativi pacchetti con i moduli e le voci:

sudo apt-get install asterisk-config asterisk-core-sounds-en asterisk-modules asterisk-mysql asterisk-voicemail

dopodichè popoliamo il relativo database ‘asterisk‘ sul nostro DBMS con le seguenti viste (da Realtime OpenSIPS – Asterisk Integration)

CREATE TABLE `meetme` (
`confno` varchar(80) NOT NULL default '0',
`username` varchar(64) NOT NULL default '',
`domain` varchar(128) NOT NULL default '',
`pin` varchar(20) default NULL,
`adminpin` varchar(20) default NULL,
`members` int(11) NOT NULL default '0',
PRIMARY KEY (`confno`)
) ENGINE=MyISAM

CREATE VIEW `asterisk`.`sipusers` AS select
`opensips`.`subscriber`.`username` AS `name`,
`opensips`.`subscriber`.`username` AS `username`,
_latin1'friend' AS `type`,
NULL AS `secret`,
`opensips`.`subscriber`.`domain` AS `host`,
concat(`opensips`.`subscriber`.`rpid`,_latin1' ',_latin1'<',`opensips`.`subscriber`.`username`,_latin1'>') AS `callerid`,
_latin1'default' AS `context`,
`opensips`.`subscriber`.`username` AS `mailbox`,
_latin1'force_rport,comedia' AS `nat`,
_latin1'no' AS `qualify`,
`opensips`.`subscriber`.`username` AS `fromuser`,
NULL AS `authuser`,
`opensips`.`subscriber`.`domain` AS `fromdomain`,
NULL AS `insecure`,
_latin1'no' AS `canreinvite`,
NULL AS `disallow`,
NULL AS `allow`,
NULL AS `restrictcid`,
`opensips`.`subscriber`.`domain` AS `defaultip`,
`opensips`.`subscriber`.`domain` AS `ipaddr`,
_latin1'5060' AS `port`,
NULL AS `regseconds`,
NULL AS `callbackextension`
from `opensips`.`subscriber`;

CREATE VIEW `asterisk`.`vmusers` AS select
concat(`opensips`.`subscriber`.`username`,`opensips`.`subscriber`.`domain`) AS `uniqueid`,
`opensips`.`subscriber`.`username` AS `customer_id`,
_latin1'default' AS `context`,
`opensips`.`subscriber`.`username` AS `mailbox`,
`opensips`.`subscriber`.`vmail_password` AS `password`,
concat(`opensips`.`subscriber`.`first_name`,_latin1' ',`opensips`.`subscriber`.`last_name`) AS `fullname`,
`opensips`.`subscriber`.`email_address` AS `email`,
NULL AS `pager`,
`opensips`.`subscriber`.`datetime_created` AS `stamp`
from `opensips`.`subscriber`;

CREATE VIEW `asterisk`.`vmaliases` AS select
`opensips`.`dbaliases`.`alias_username` AS `alias`,
_latin1'default' AS `context`,
`opensips`.`dbaliases`.`username` AS `mailbox`
from `opensips`.`dbaliases`;

per avere la tabella con gli utenti (sipusers), gli alias di chiamata (vmaliases), le caselle vocali (vmusers) e le conferenze (meetme).

La descrizione delle tabelle per Asterisk RealTime potete trovarla su questa pagina del manuale: https://wiki.asterisk.org/wiki/display/AST/Realtime+Database+Configuration#RealtimeDatabaseConfiguration-Configurationinextconfig.conf

A questo punto è necessario configurare Asterisk per usare i dati contenuti nelle tabelle sul database. Nel file /etc/asterisk/res_config_mysql.conf è necessario impostare i parametri di connessione al database:

[general]
dbhost = [host]
dbname = asterisk
dbuser = [utente]
dbpass = [password]
dbport = 3306

e nel file /etc/asterisk/extconfig.conf indichiamo ad Asterisk dove deve prendere i dati (sintassi: file => driver,database[,table[,priority]]):

[settings]
sipusers => mysql,general,sipusers
sippeers => mysql,general,sipusers
voicemail => mysql,general,vmusers
meetme => mysql,general,meetme

A questo punto possiamo provare ad eseguire Asterisk (‘sudo /etc/init.d/asterisk start’) e connettersi alla consolle di amministrazione attraverso il comando ‘asterisk -r’. Per verificare la connessione al database si può usare il comando ‘realtime mysql status‘.

Configurare OpenSIPS per i servizi multimediali di Asterisk

La configurazione di OpenSIPS può sembrare abbastanza ostica e, sinceramente, lo è. Presuppone una conoscenza abbastanza approfondita del protocollo SIP e delle relative segnalazioni, nonché tutta una serie di procedure proprie del programma.

Per comodità, allego due configurazioni semplificate di quelle da me implementate, che potete scaricare qui: opensips.cfg e extensions.conf.

Da notare che quando desideriamo che la chiamata venga dirottata sul server Asterisk è necessario reimpostare i parametri della chiamata, come ad esempio per l’accesso alla casella vocale, usando il prefisso ‘VMR’:

prefix("VMR_");
rewritehostport("10.0.0.2:5060");

che nella configurazione di Asterisk (‘extensions.conf‘) sarà intercettato da:

[from-voip]
...
exten => _VMR_.,1,Noop("from-voip: ${CALLERID(num)} ${EXTEN}")
exten => _VMR_.,n,Set(DID=${EXTEN:4})
exten => _VMR_.,n,Answer()
exten => _VMR_.,n,Wait(1)
exten => _VMR_.,n,MailboxExists(${DID})
exten => _VMR_.,n,GotoIf($["${VMBOXEXISTSSTATUS}" = "SUCCESS"]?avail:unavail)
exten => _VMR_.,n(avail),Voicemail(${DID},u)
exten => _VMR_.,n,Hangup()
exten => _VMR_.,n(unavail),Playback(vm-theperson)
exten => _VMR_.,n,SayDigits(${DID});
exten => _VMR_.,n,Playback(vm-isunavail)
exten => _VMR_.,n,Hangup()

A questo punto le possibilità sono virtualmente infinite e dipendono dalla vostra fantasia e capacità di implementazione. Vi ricordo che il web è una ottima fonte di esempi, documentazione e troubleshooting, come ad esempio il sito Voip-info.org che contiene moltissima documentazione su Asterisk. Per OpenSIPS la documentazione è un po’ più carente e la trovate essenzialmente sul sito ufficiale del progetto: Opensips.org.

Michele Pinassi

Nato a Siena nel 1978, dopo aver conseguito il diploma in "Elettronica e Telecomunicazioni" e la laurea in "Storia, Tradizione e Innovazione", attualmente è Responsabile del Sistema telefonico di Ateneo presso l'Università degli Studi di Siena. Utilizza quasi esclusivamente software libero. Dal 2006 si occupa di politica locale e da giugno 2013 è Consigliere Comunale capogruppo Siena 5 Stelle.

Potrebbero interessarti anche...

Una risposta

  1. 17/10/2016

    […] that “voip-trunk” must be defined in sip.conf as, obviously, the sip trunk that interconnects OpenSIPS with Asterisk. Also in extensions.conf, i need to define all my IVR as an introductory system for all my queues […]

Rispondi

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: