Questa volta il taglio è “vagamente” tecnico, riporto infatti le informazioni per poter in qualche modo gestire lo stato di una chiamata con asterisk (intendo il DIALSTATUS).
E’ infatti buona regola definire in modo piu’ o meno grezzo il comportamento del nostro PBX all’insorgere di problemi. Il mio, in particolare, era di gestire lo stato CHANUNAVAIL, che si ha quando non è possibile realizzare un canale Zap o si è staturato il limite di chiamate concorrenti su un trunk sip/iax.
L’approccio è semplice: successivamente alla chiamata DIAL(), prende valore la variabile $DIALSTATUS contenente, appunto uno dei seguenti:
- CHANUNAVAIL
- CONGESTION
- NOANSWER
- BUSY
- ANSWER
- CANCEL
- DONTCALL
- TORTURE
- INVALIDARGS
Quindi, valorizzando $DIALSTATUS, possiamo sfruttare GOTO() per passare ad una nuova exten del nostro contesto, che contenga la logica per gestire l’evento.
Ecco il codice che uso io:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [outbound]
exten => _9.,1,Dial(SIP/${EXTEN:1}@voip.eutelia.it)
exten => _9.,n,GOTO(ext-${DIALSTATUS},1);
[internal]
exten => _1XXX,1,Dial(SIP/1${EXTEN:1})
exten => 333,1,Set(CHANNEL(language)=it)
exten => 333,n,VoiceMailMain(1000@asheticmail)
exten => ext-BUSY,1,Busy()
exten => ext-CHANUNAVAIL,1,AGI(error_handler.php)
exten => ext-NOANSWER,1,Hangup()
exten => ext-CONGESTION,1,Congestion()
exten => ext-CANCEL,1,Hangup()
include => outbound |
La spiegazione è semplice.
I miei telefoni, usano il context [internal], che a sua volte, include [outbound].
La linea 2 viene utilizzata per chiamare le destinazioni non interne tramite il mio provider sip
La linea 3 redirige la chiamata all’estensione data dalla valorizzazione della variabile $DIALSTATUS (righe 11-15). Questa è il cuore dell’articolo, in pratica
La linea 6 indica che per i numeri 1xxx, il call routing è interno (i miei interni sono da 1000 a 1999).
Le linee 8 e 9, sono per l’attivazione della Voicemail generale.
Le linee 11-15 sono quelle cui si giunge con la linea 3
La linea 17 include (append) il contxt [outbound]
Molto semplice da implementare. Come si puo’ vedere alla riga 12, ogni volta che si giunge ad un CHANUNAVAIL, viene chiamato uno script AGI che si occupa di inserire l’evento nel database ed avvisarmi per email dei dettagli (lo script non è incluso in asterisk, ma è comunque molto semplice da realizzare).