Home > Articolo Tecnico, Voip > Asterisk – Un Dialplan interattivo (IVR) [quinta parte]

Asterisk – Un Dialplan interattivo (IVR) [quinta parte]

February 15th, 2009 Leave a comment Go to comments

Un IVR non è nient’altro che un risponditore automatico che agisce in base ai toni DTMF che riceve in ingresso

L’applicazione del Dialplan che svolge questo ruolo è Background() (simile all’applicazione Palyback con la differenza che si interrompe quando riceve i DTMF). Vediamo un esempio:

[incoming]

exten => 123,1,Answer()

exten => 123,2,Background(menu)

exten => 1,1,Playback(digits/1)

exten => 2,1,Playback(digits/2)

Dopo la risposta se il chiamante premerà 2 sentirà il Palyback di 2…Alla pressione di un tasto Asterisk aspetta un paio di secondi per essere sicuro dell’azione da eseguire (1 e 123 iniziano con lo stesso numero…)

I Timeout della funzione Background()

Response Timout : tempo di attesa prima che venga inserita la prima cifra (default=10 sec)

Digit Timeout: tempo di attesa tra una cifra e l’altra (default 5 sec)

La funzione WaitExten() permette di modificare “in corsa” il RESPONSE TIMOUT

Estensioni Speciali

Per gestire situazioni speciali Asterisk usa estensioni speciali rappresentate da una singola lettera. Le più comuni sono:

– i : immissione di entry invalide
– t : scadenza response time
– T : durata massima di una chiamata
– h : estensione hangup
– s : estensione start

Estensione i : sta per “invalid”. Quando l’utente digita un numero invalido la chiamata viene passata all’estensione i

Estensione s :  vale per le chiamate analogiche in cui il nella chiamata non viene trasportata l’informazione del numero chiamato (c’è solo “anonymous”)

Estensione t : sta per “timout”. Quando il chiamante aspetta troppo tempo durante l’applicazione Background() o WaitExten() pria di digitare sulla tastiera la chiamata viene inviata all’estensione t

Estensione T : “absolute timeout” rappresenta la durata massima di una chiamata. Quando la lunghezza della chiamata supera il l’absolute timeout la chiamata viene inviata a questa estensione.

Salti e loop

Vediamo ora come implementare sia dei salti tra differenti estensioni sia un sistema che permetta di ripetere più volte (loop) l’esecuzione di uno stesso dialplan

L’applicazione GoTo()

Permette di saltare da un punto ad un altro all’interno del dialplan. Puoi avere da uno a tre parametri:

– un numero di priorità o una label (per salti all’interno della stessa estensione)

GoTo (priority)

– un estenzione ed una priorità (per salti all’interno dello stesso contesto)

GoTo (exten,priority)

– un contesto, un estensione ed una priorità (per salti in qualsiasi punto del dialplan)

Goto (context,exten,priority)

Esempio di GoTo con le label:

exten => 123,1,Answer()
exten => 123,n,Wait(0,5)
exten => 123,n(playit),Playback(tanks-for-calling)
exten => 123,n,Goto(playit)

Altre Applicazioni

Wait() : aspetta per il numero di secondi (o frazione di secondi).

NoOp() : sta per “No Operation”. Viene utilizzata come un tool di debugging. Stama infatti sulla console l’argomento che le viene passato se il livello di verbosità impostato è maggiore/uguale a tre.

Verbose() : come NoOp con in più la possibilità di impostare il livello di verbosità

Vediamo un esempio di un IVR base:


;*******************************************
;*** GLOBAL SETTING FOR EXTENSION

[general]
static=yes
writeprotect=no
autofallthrough=yes
clearglobalvars=no
priorityjumping=no

;*******************************************
;*** GLOBAL SETTING FOR variables

[globals]

;*******************************************
;*** EXTENSION CONTEXT

[users]
exten => 6001,1,Dial(SIP/6001,20)
exten => 6002,1,Dial(SIP/6002,20)
;exten => _600x,1,Dial(SIP/${EXTEN},20)
include => features

[features]
exten => 6599,1,Answer()
exten => 6599,n,Playback(hello-world)
exten => 6599,n,wait(2)
exten => 6599,n,Playback(good-evening)
exten => 6599,n,Hangup()
exten => 6598,1,Goto(demo-menu,s,1)

[demo-menu]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Background(press-1)
exten => s,n,Background(or)
exten => s,n,Background(press-2)
exten => s,n,WaitExten(3) ;aspetta 3 secondi passati i quali va all’estensione t

exten => 1,1,Playback(you-entered)
exten => 1,n,Playback(digits/1)
exten => 1,n,Goto(s,1) ;

exten => 2,1,Playback(you-entered)
exten => 2,n,Playback(digits/2)
exten => 2,n,Goto(s,1)

exten => h,1,NoOp(Shucks, they hung up!!!)

exten => t,1,Playback(too-low)
exten => t,n,Hangup()

exten => i,1,Playback(pbx-invalid)
exten => i,n,Hangup()

L’applicazione Dial()

Permette a un endpoint (telefono) di chiamare un altro endpoint. Dial() processa la chiamata, se la chiamata viene risposta unisce i canali per la conversazione. Questa funzione ha 2 parametri principali

Device(s) – l’endpoint può essere specificato come una tecnologia e canale come SIP/6001 DAHDI/g1
Quando si chiama attraverso un trunk o un service provider la sintassi è tecnologia/canale/numero. Es:

SIP/myprovider/55599123

tecnologia/canale/numerodachiamare

Timeout – per quanto tempo l’endpoint destinazione deve squillare prima di andarà avanti nelle priorità dell’estensione

E’ possibile chiamare più enpoint contemporaneamente

exten => 123,1,Dial(SIP/6001/6002)

E’ possibile anche chiamare un’altra estensione usando il Local channel

exten => 123,1,Dial(Local,456@Incoming)

Fa un dial sull’estensione (è come il GoTo())

Categories: Articolo Tecnico, Voip Tags:
  1. No comments yet.
  1. No trackbacks yet.
You must be logged in to post a comment.