Magazine Opinioni

Interconnettere OpenSIPS 1.11 e Asterisk 11 in realtime

Creato il 04 settembre 2015 da Michelepinassi @michele_pinassi
Interconnettere OpenSIPS 1.11 e Asterisk 11 in realtime

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 installopensips-carrierroute-module sudo apt-get installopensips-dialplan-module sudo apt-get install opensips-mysql-module sudo apt-get installopensips-identity-module sudo apt-get installopensips-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

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 (s ipusers), gli alias di chiamata ( vmaliases), le caselle vocali ( vmusers) e le conferenze ( meetme).

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:

[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.


Ritornare alla prima pagina di Logo Paperblog