VoIP e Asterisk/Il dialplan
Il Dialplan è il cuore del sistema Asterisk, definisce come vengono gestite le chiamate in ingresso e in uscita dal sistema. Questa gestione è molto potente, nel dialplan è possibile associare a ogni chiamata una serie di istruzioni da eseguire, in modo simile a un linguaggio di scripting.
Questo dialplan è contenuto nel file extensions.conf ed è suddiviso principalmente in quattro parti: contesti, estensioni, priorità e applicazioni. È possibile fare anche dei richiami tra i contesti tramite dei comandi particolari.
Contesti
[modifica | modifica sorgente]I contesti, definiti nel file extensions.conf come [nomecontesto]
, sono un modo di suddividere i vari insiemi di istruzioni-comportamenti in Asterisk. Asterisk sceglie il contesto in base alla configurazione dei vari utenti o linee tradizionali, ogni chiamata da una particolare utenza verrà gestita dalle istruzioni del relativo contesto.
Estensioni
[modifica | modifica sorgente]Le estensioni non sono nient'altro che le azioni da eseguire in risposta alla chiamata ad un determinato numero composto.
Per la loro definizione si utilizza la keyword “exten”:
exten => destinazione,priorità,application(args)
A ogni destinazione possibile (o estensione) vengono associate una o più azioni, definite dalle application e dai parametri passati. La priorità serve per stabilire un ordine di esecuzione delle application, anche perché più application possono essere associate a una destinazione.
La destinazione può essere un pattern fisso o un pattern su cui fanno il match una serie di numeri, nel secondo caso è necessario far precedere il numero da un underscore (_).
Gli operatori più utili sono “X” che indica un numero da 0 a 9, e “.” che indica 0 o più numeri da 0 a 9.
Esempio:
_3X : da 30 a 39 _12X. : tutti i numeri che iniziano per 12 più almeno un altro numero (124,120,125777499,no 12!!)
La destinazione farà il match con l'estensione con il pattern meno generale possibile.
Qua di seguito vi è un file di configurazione di test:
[prova] ; nome del context ; associamo alle destinazioni 100 e 200 gli utenti SIP 100 e 101 exten=>100,1,Dial(SIP/100) exten=>200,1,Dial(SIP/101) exten=>200,2,Dial(SIP/100) ; esegue questa istruzione solamente nel caso il primo Dial fallisca
La parte principale di ogni estensione è l'applicazione cioè ciò che deve venire eseguito quando un numero viene digitato. Le applicazioni vengono elencate dando alla CLI il comando “show applications”, mentre una descrizione di ogni applicazione viene ritornata col comando “show application <nome applicazione>”, le più importanti sono elencate nel prossimo paragrafo.
Ecco il risultato del comando “show applications”:
Il comando “show application applicazione” invece funziona così:
Applicazioni comuni
[modifica | modifica sorgente]Dial(Technology/Resource[&Tecnology2/Resource2]...[|timeout][|options][|URL])
Chiama la/e risorsa/e specificata/e, in caso di mancata risposta dopo <timeout> secondi prosegue l'esecuzione alla priorità successiva. Nel caso di occupato invece prosegue alla priorità corrente+101. La tupla Technology/Resource serve per identificare univocamente una destinazione verso cui dirottare la chiamata. Technology indica il protocollo da utilizzare, può essere ad esempio, SIP, IAX, Zap, e Resource invece indica l'username nel caso del SIP e IAX mentre per le linee Zap (linee telefoniche tradizionali) indica il numero della linea.
Goto([context|][extension|]priority)
Salta alla priorità specificata (specificando extension e context se differenti dal corrente)
GotoIf(condition|n|m)
Salta alla priorità n o m al verificarsi o meno della condizione NB: si può omettere una delle due label ma non entrambe
Playback(filename[|option])
Riproduce il file specificato.
Le opzioni possibili sono:
skip: riproduce il file solo se la chiamata ha ricevuto risposta
noanswer: riproduce il file prima della risposta
Record(filename:format[|silence][|maxduration][|option])
Registra nel file specificato nel dato formato. Silence rappresenta il tempo di silenzio dopo il quale la registrazione termina, maxduration è la massima durata della registrazione, le opzioni sono:
skip: se non c'è stata risposta non parte la registrazione
noanswer: la registrazione parte anche se non c'è stata risposta
Set(name1=value1|name2=value2|..[|options])
Imposta la/e variabile/i name* al/i valore/i value.
L'unica opzione possibile è:
g: imposta la variabile globalmente anziché per la comunicazione corrente
Altri comandi a livello di contesto
[modifica | modifica sorgente]include
[modifica | modifica sorgente]Include nel contesto corrente tutte le direttive di un altro contesto.
è possibile specificare anche una inclusione condizionale, in base all'orario corrente. Così è possibile, ad esempio, includere in base all'ora un contesto per l'attività di giorno e un altro per la notte.
Esempio: Include il context lavoro tra Lunedi e Venerdi, dalle 8 am alle 5 pm.
include => lavoro|Mon-Fri|8am-5pm|*|*
Se non è specificata un range di tempo il context viene sempre incluso.
switch
[modifica | modifica sorgente]Costrutto utilizzato per specificare una locazione diversa delle regole del contesto, possono trovarsi ad esempio in un database, il cui accesso avviene tramite l'architettura RealTime, oppure su un altro server Asterisk connesso via IAX.
switch => Realtime/context@family/options
ignorepat
[modifica | modifica sorgente]Asterisk manterrà il tono di libero anche dopo che il dispositivo ha premuto il pattern specificato.
Esempio:
ignorepat => 9
Variabili e condizioni espresse nelle extension
[modifica | modifica sorgente]Oltre a un numero elevato di application, Asterisk mette a disposizione, come un linguaggio di programmazione, costrutti per dichiarare e utilizzare variabili.
La dichiarazione avviene tramite la application Set già menzionata prima, per il loro utilizzo si usa la sintassi ${VARIABILE}.
Molte variabili sono predefinite da Asterisk e contengono valori utili, sulla base di quali è possibile personalizzare i comportamenti di Asterisk.
Eccone alcune, le più importanti:
${ANSWEREDTIME}: Tempo di risposta ${CALLERID}: Caller ID del chiamante (nome e numero) ${CALLERIDNAME}: Caller ID (solo nome) ${CALLERIDNUM}: Caller ID (solo numero) ${DATETIME}: Data corrente nel formato: DDMMYYYY-HH:MM:SS ${EXTEN}: Extension corrente ${UNIQUEID}: Unique ID della chiamata corrente
Per la loro valutazione sono disponibili molti operatori condizionali, utilizzabili nell'application GotoIf.
Estensione speciale s
[modifica | modifica sorgente]Come estensione speciale è da considerare l'estensione che ha come destinazione la stringa “s”: viene utilizzata in ingresso dalle linee esterne, ad esempio, dalle linee telefoniche tradizionali.
Ecco un esempio un po' articolato, con l'utilizzo di questa estensione:
[globals] ; definiamo un po' di variabili globali RECEPTIONIST=Zap/1 JOHN=SIP/1001 MARY=SIP/1002 LOCALTRUNK=Zap/2 [incoming] ; il sistema risponde è manda in playback il file current-movies ; l'utente ascolta il messaggio e può premere 1,2 o 0, altrimenti ; il sistema chiuderà la telefonata (hangup) ; 1-> il sistema esegue movie1, poi torna al menu iniziale ; 2-> il sistema esegue movie2, poi torna al menu iniziale ; 0-> il sistema devia la telefonata a ${RECEPTIONIST} ; cioè sulla linea Zap/1, sulla quale vi è un telefono analogico exten => s,1,Answer() exten => s,2,Background(current-movies) exten => s,3,Hangup() exten => 1,1,Playback(movie1) exten => 1,2,Goto(incoming,s,1) exten => 2,1,Playback(movie2) exten => 2,2,Goto(incoming,s,1) exten => 0,1,Dial(${RECEPTIONIST}) [internal] ; Per i telefoni interni al sistema ; 1XXX->chiama l'interno XXX exten => _1XXX,1,Dial(SIP/${EXTEN:1}) ; include le regole per le chiamate in uscita sulla linea tradiz. include => outgoing [outgoing] ignorepat => 9 ; piazza le chiamate che hanno il pattern 9NXX... sulla linea Zap exten => _9NXXNXXXXXX,1,Dial(${LOCALTRUNK}/${EXTEN:1}) exten => _9NXXNXXXXXX,2,Playback(invalid) exten => _9NXXNXXXXXX,3,Hangup