GuideNetworking.it

Approfondimenti, tutorial ed esperienze sulle reti informatiche

Asterisk seconda parte: preparazione del dialplan.

Asterisk seconda parte: preparazione del dialplan.

Abbiamo accennato nella prima parte di questo corso su Asterisk, che il cuore del nostro centralino telefonico si chiama dialplan ed è contenuto nel file extensions.conf.

Il dialplan di Asterisk è contenuto nel file extensions.conf.

Abbiamo anche accennato al fatto che tutte le chiamate che entrano ed escono da Asterisk vengono processate all’interno di questo file e viene deciso dal dialplan come e cosa fare con la chiamata. In poche parole all’interno del dialplan si definisce “il flusso” della chiamata.

Se ricordi abbiamo concluso la prima parte di questo corso con un esempio base di dialplan:

[from-internal]
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()

L’esempio qui sopra inizia con la riga:

[from-internal]

Questa stringa definisce un “contesto“. Tutto quello che c’è dopo questa parentesi quadra, fino alla prossima parentesi quadra (esclusa) definisce il contesto “from-internal“. Capiremo meglio più avanti ma iniziamo a prendere confidenza.

Il dialplan di Asterisk all’interno del file extensions.con è organizzato in sezioni indipendenti che si chiamano contesti.

Se ricordate sempre nella prima parte abbiamo anche definito un interno del nostro centralino nel file sip.conf:

[6001]
type=friend
context=from-internal
host=dynamic
secret=unsecurepassword
disallow=all
allow=ulaw

Concentriamoci sulla terza riga: context=from-internal

Questa riga vuol dire che “tutto quello che digitiamo sulla tastiera dell’interno 6001 (che stiamo definendo) deve essere processato all’interno del contesto from-internal“. In pratica abbiamo definito il contesto di funzionamento dell’interno 6001.

Se hai seguito fedelmente quello scritto nel primo capitolo di questo corso dovresti avere il softphone Zoiper configurato con l’interno 6001. Abbiamo già detto che se provi a digitare il numero 100 sulla tastiera di zoiper ascolteremo il messaggio hello-world.

Ma se proviamo a digitare qualsiasi altro numero il softphone Zoiper ci darà sempre errore:

no route to destination

Perchè?

Semplice perchè nel contesto “from-internal“, che è quello all’interno del quale dobbiamo processare tutte le chiamate dell’interno 6001, non esiste altri numeri oltre il 100. Dunque il centralino con il messaggio “no route to destination” ci dice che non trova nessuna “istruzione” che può eseguire quando inseriamo un numero diverso da 100.

Chiaro? E’ molto importante per me capire se quello che scrivo è utile, per questo ti invito a scrivere le tue impressioni.

Per capire meglio proviamo a fare una modifica al nostro dialplan. Modifichiamolo così:

[from-internal]
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()
exten => 200,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()

Ora proviamo a digitare 200 sulla tastiera del nostro zoiper. Cosa succede? Nulla!!! Perchè?

In realtà prima che tutto funzioni correttamente dobbiamo “aggiornare” la configurazione di Asterisk. Per farlo dobbiamo collegarci alla CLI (Command Line Interface – linea di comando) di Asterisk, possiamo farlo con il comando:

asterisk -rv

Nell’interfaccia CLI scriviamo:

dialplan reload

Questo comando “dice” ad Asterisk di “ricaricare” la configurazione. In questo modo il dialplan sarà aggiornato con quello che abbiamo scritto nel file. Proviamo a digitare ora 200 sul nostro telefono. Cosa succede? Ascoltiamo il suono “hallo-world”.

Con questo esempio penso sia chiaro cosa vuol dire che “tutto quello che digitiamo sulla tastiera dell’interno 6001 (che stiamo definendo) deve essere processato all’interno del contesto from-internal“. Se la sequenza di tasti composta sulla tastiera non è presente nel contesto specificato, il centralino non sa cosa fare e dunque ci restituisce l’errore “no route to destination”.

Nell’esempio appena visto ci sono due righe che iniziano con la parola exten. Si chiamano extensions:

exten => 100,1,Answer()

exten => 200,1,Answer()

All’interno di ogni contesto (le sezioni del dialplan) possiamo definire una o più extensions.

Le extensions non sono altro che una serie di azioni che Asterisk eseguirà in sequenza quando il numero relativo alla stessa extensions viene digitato sulla tastiera del telefono.

La sintassi precisa per scrivere una extensions all’interno di un contesto è:

exten => number,priority,application([parameter[,parameter2…]])

Dove:

number: è il numero dell’extensions.

priority: è la priorità. Tutte le azioni all’interno della stessa

appplication: è  l’applicazione che sarà eseguita.

Per capire meglio riscriviamo l’esempio iniziale con una sintassi più formale e meno semplificata:

[from-internal]
exten => 100,1,Answer()
exten => 100,2,Wait(1)
exten => 100,3,Playback(hello-world)
exten => 100,4,Hangup()

All’interno della stessa extensions, la priority definisce in quale sequenza devono essere eseguite le azioni.

Le azioni con i numeri più bassi verranno eseguiti prima.

Scrivere le priorità in maniera corretta è fondamentale, se “saltiamo” una priorità (esempio dopo la 2 scriviamo la 4), la chiamata si bloccherebbe. Per questo motivo, per semplificare, è stata inserita la priorità n che sta per next. La priorità next non fa altro che aggiungere uno alla priorità precedente. Dunque il contesto potremmo riscriverlo così:

[from-internal]
exten => 100,1,Answer()
exten => 100,n,Wait(1)
exten => 100,n,Playback(hello-world)
exten => 100,n,Hangup()

Nota che la priorità 1 deve sempre essere specificata. Infine, nelle versioni più recenti di asterisk è stata aggiunta la possibilità di usare la stringa “same” utilizzato per indicare che il numero di extensions è sempre lo stesso. Per semplicità di scrittura il contesto qui sopra può essere scritto come indicato all’inizio:

[from-internal]
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()

A questo punto la forma con cui scrivere il contesto dovrebbe essere abbastanza chiara.

Inclusione di contesti in altri contesti del dialplan

Supponiamo di aver definito il nostro contesto come specificato sopra:

[from-internal]
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()

Ed aver definito due interni (invece che uno) telefonici nel file sip.conf:

[6001]
type=friend
context=from-internal
host=dynamic
secret=unsecurepassword
disallow=all
allow=ulaw

[6002]
type=friend
context=from-internal
host=dynamic
secret=securepassword
disallow=all
allow=ulaw

Questi due interni potranno entrambi digitare il numero 100 per ascoltare il messaggio hello-world. Ma ora vogliamo anche che sia possibile chiamare da un interno verso l’altro. Definiamo dunque un nuovo contesto

[users]
exten => 6001,1,Dial(SIP/6001,20)
exten => 6002,1,Dial(SIP/6002,20)

Approfondiremo più avanti il significato dettagliato di queste linee per ora ci basti sapere che l’applicazione Dial ci permette di chiamare l’interno che specifichiamo nei parametri. Dunque ora se sul nostro telefono digitiamo il numero 6001 verrà chiamato l’interno 6001 mentre se digitiamo il numero 6002 verrà chiamato l’interno 6002.

NO!

Perchè? Ricordati che abbiamo detto: “tutto quello che digitiamo sulla tastiera dell’interno 6001 (che stiamo definendo) deve essere processato all’interno del contesto from-internal” e la stessa cosa vale per l’interno 6002 perchè abbiamo specificato lo stesso contesto. E allora?

E allora dobbiamo fare in modo che “tutto quello specificato all’interno del contesto users rientri all’interno del contesto from-internal”. Per far questo usiamo l’istruzione include:

[from-internal]
include=>users
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()

Con questa aggiunta, molto semplicemente, il contesto from-internal include anche il contesto users.

Abbiamo raggiunto la nostra finalità.

Per ora con il dialplan ci fermiamo qui.

Nella prossima lezione approfondiremo il contenuto del file sip.conf.

Ti chiedo di lasciare un tuo parere per migliorare sempre più questo lavoro. Vuoi che continuo a scrivere questo corso? Fammelo sapere.