Penso che sia giunto il momento di mettere mano al file di configurazione extension.conf dove si costruisce il dialplan di Asterisk. Come sempre analizzeremo i vari parametri presenti e cercheremo di capire come funziona il tutto. Cominciamo:
nano /etc/asterisk/extensions.conf
[general] parte generale del dialplan
statis=yes
writeprotect=no ; se static è settato a yes e writeprotect a no tutte le modifiche fatte dalla console di asterisk, potremo salvarle con il comando dialplan save
autofallthrough=yes ; se un’estensione esce per qualche motivo dalla serie di comandi che le appartengono, verrà terminata da asterisk, se impostato a no, asterisk aspetterá che venga chiamata un’altra estensione.
extenpatternmatchnew=yes ; usa un nuovo algoritmo (in teoria molto più veloce) per processare il dialplan. Consigliato per grandi volumi di chiamate e per contesti che contengono più di 50 estensioni ognuno.
priorityjumping=yes ; Alcune applicazioni e funzioni di asterisk in particolare condizioni o nel caso si presentino determinati eventi possono saltare dalla priorità in cui si trovano (vedremo fra poco che cosa significa priorità) alla priorità n+101. Può essere molto utile impostare questo parametro a yes per poter usare questa funzionalità
clearglobalvars=no ; se impostato a no le variabili globali che configuriamo verranno cancellate e riassegnate ogni volta che ricaricheremo il dialplan. Meglio lasciarlo a no
Fatto questo inizia il secondo blocco con le variabili locali:
[globals]
luigi=SIP/1000
marco=SIP/1001
come vedete abbiamo assegnato al nome di due nostri amici l’interno con cui sono registrati. Questo ci permetterà nel dialplan di scrivere direttamente i loro nomi invece di indicare la tecnologia (SIP) e il numero di interno per chiamarli. Nel caso di interni con più di quattro cifre o semplicità di memorizzazione può essere utile usare questo tipo di variabili globali.
Finita questa seconda parte possiamo iniziare con la costruzione del dialplan vero e proprio. In Asterisk il dialplan è composto da contesti, estensioni e prioritá. Cominciamo a vedere come funzionano:
[locale] ; nome del contesto
exten => 100,1, Answer()
exten => 100,2, Playback(demo-echotest)
exten => 100,3, Echo
exten => 100,4, Playback(demo-echodone)
exten => 100,5, Hangup
Abbiamo scritto le nostre prime linee di dialplan. Abbiamo definito un contesto (locale) e poi abbiamo inserito dentro questo contesto una serie di istruzioni. Come potete vedere ogni linea ha un numero di estensione e una priorità. Il numero di estensione è 100 e la priorità aumenta di uno in uno e definisce l’ordine con cui le istruzioni presenti vanno processate (prima la linea con il numero 1, poi quella con il numero 2, ecc.). Come lo uso? Da un telefono registrato a Asterisk (con accesso al contesto locale) chiamo il numero 100 e avverranno le seguenti cose:
la chiamata sarà risposta (Aswer), si ascolterà un messaggio in inglese che ci spiegherà a cosa serve il test dell’eco e poi potremo parlare ricevendo la nostra voce di ritorno. Quando abbiamo finito possiamo premere il tasto cancelletto (#). A questo punto ascolteremo una voce che ci dirà che il test dell’eco è stato completato e la chiamata verrá terminata (Hangup). Le voci (i prompts) sono presenti nella cartella /var/lib/asterisk/sounds e le ascolteremo nella lingua configurata per ogni singolo interno sempre e quando le abbiamo installate.
I vari comandi presenti (answer, playback,echo,hangup) vengono divisi in asterisk in due grandi gruppi:
Come facciamo a sapere quali e quante sono?
Dalla console di Asterisk possiamo scrivere questi due comandi:
asterisk –rvvvvvvvvvvvv
CLI> core show applications
apparirà una lista delle applicazioni utilizzabili
CLI> core show functions
apparirà una lista delle funzioni presenti
Se vogliamo vedere la sintassi di una particolare applicazione scriviamo:
CLI> core show application answer
riceveremo:
-= Info about application 'Answer' =-
[Synopsis]
Answer a channel if ringing
[Description]
Answer([delay]): If the call has not been answered, this application will
answer it. Otherwise, it has no effect on the call. If a delay is specified,
Asterisk will wait this number of milliseconds before returning to
the dialplan after answering the call.
Continuiamo con il nostro dialplan:
Sempre nel nostro contesto locale scriviamo:
exten => 97,1,Answer(2)
exten => 97,n,VoiceMail
exten => 97,n,Hangup()
Con queste tre linee entriamo nel menu della segreteria telefonica. Possiamo fare più cose: inviare un messaggio ad un altro interno o inserire il numero del nostro interno e la password associata per vedere se abbiamo dei nuovi messaggi.
Come potete vedere nella seconda e terza linea invece di indicare rispettivamente il numero due e il numero tre come priorità, è presente la lettera n. Questo ci permette di non numerare sequenzialmente le linee in quanto n significa next cioè il numero successivo a quello presente nella linea che lo precede. Questo tipo di soluzione è molto comoda nel caso dobbiamo inserire una nuova linea tra quelle presenti. Invece di dover rinumerare tutte le linee basta che indichiamo la prima e poi usiamo la lettera n.
Continuiamo.
Adesso vogliamo creare un contesto per le chiamate a fissi italiani.
[fisso]
exten => _00390.,1,Dial(SIP/provider1/${EXTEN},45)
exten => _00390.,n,Hangup
Con la prima linea indichiamo a Asterisk che per tutti i numeri che iniziano per 00390 e sono seguiti per qualsiasi numero di cifre (il punto) chiamiamo il numero (applicazione Dial, attraverso il nostro provider VoIP chiamato provider1. La variabile ${EXTEN} contiene il numero che abbiamo chiamato e 45 sono i secondi che durerà il tentativo di chiamata. Se dopo 45 secondi nessuno risponde, la chiamata verrà terminata (hangup).
Possiamo fare la stessa cosa per i cellulari:
[cellulare]
exten => _00393.,1,Dial(SIP/provider2/${EXTEN},45)
exten => _00393.,n,Hangup
In questo caso abbiamo cambiato il numero 00390 con 00393 (visto che tutti i numeri di cellulare iniziano per 3) e il nostro provider (provider2)
Adesso possiamo definire chi ha accesso a che cosa.
Se vi ricordate quando abbiamo configurato il sip.conf per ogni singolo interno abbiamo definito un contesto.
Riprendiamo l’esempio con due interni:
[1000]
accountcode=1000
language=it
type=friendsecret=password
mailbox=1000@default
host=dynamic
dtmfmode=rfc2833
dial=SIP/1000
context=gruppoa
canreinvite=no
nat=yes
callerid=Interno <1000>
disallow=all
allow=gsm
allow=ulaw
[1001]
accountcode=1001
language=it
type=friendsecret=password
mailbox=1001@default
host=dynamic
dtmfmode=rfc2833
dial=SIP/1001
context=gruppob
canreinvite=no
nat=yes
callerid=Interno <1001>
disallow=all
allow=gsm
allow=ulaw
Come potete vedere l’interno 1000 appartiene al contesto gruppoa e l’interno 1001 al contesto gruppob
Adesso con una serie di comandi (sempre da inserire nell’extensions.conf) possiamo definire a cosa hanno accesso i due interni
Scriviamo:
[gruppoa]
include => locale
[gruppob]
include => locale
include => fisso
include => cellulare
Con queste definiamo che il gruppoa (cioè l’interno 1001 ha accesso solamente al contesto locale (quello del test eco e della segreteria telefonica) mentre il gruppob ha accesso ai contesti locale, fisso e cellulare quindi potrà fare il test del eco, entrare nella segreteria telefonica e, in più, effettuare chiamate a fissi e cellulare nazionali.
Riprendendo tutte le linee scritte il nostro dialplan sarà:
[general
static=yes
writeprotect=no
autofallthrough=yes
extenpatternmatchnew=yes
priorityjumping=yes
clearglobalvars=no
[globals]
luigi=SIP/1000
marco=SIP/1001
[locale]
exten => 100,1, Answer()
exten => 100,2, Playback(demo-echotest)
exten => 100,3, Echo
exten => 100,4, Playback(demo-echodone)
exten => 100,5, Hangup
exten => 97,1,Answer(2)
exten => 97,n,VoiceMail
exten => 97,n,Hangup()
[fisso]
exten => _00390.,1,Dial(SIP/provider1/${EXTEN},45)
exten => _00390.,n,Hangup
[cellulare]
exten => _00393.,1,Dial(SIP/provider2/${EXTEN},45)
exten => _00393.,n,Hangup
[gruppoa]
include => locale
[gruppob]
include => local
include => fisso
include => cellulare
Nel prossimo articolo vedremo come usare le macro nel dialplan.
Commenti recenti
4 settimane 5 giorni fa
10 settimane 1 giorno fa
14 settimane 21 ore fa
14 settimane 6 giorni fa
15 settimane 4 giorni fa
15 settimane 5 giorni fa
15 settimane 5 giorni fa
15 settimane 6 giorni fa
16 settimane 1 giorno fa
16 settimane 1 giorno fa