Aparte de las extensiones que podemos declarar en el extensions.conf, Asterisk dispone de unas cuantas ‘de serie’, entre las que destacan:
- s – start
- i – invalid
- t – timeout
- h – hangup
Las 3 primeras son mayormente utilizadas en IVRs, mientras que la última (hangup) es bastante utilizada en temas de billing.
Hoy he estado jugando un rato con la extensión h, así que voy a comentar un poco su uso, ya que en ocasiones puede resultar confuso:
¿Por qué queremos utilizar la extensión h?
Porque se ejecuta justo al finalizar la llamada, por lo que si queremos llevar a cabo algún proceso en ese momento, como tarificar una llamada, por ejemplo, la extensión ‘h’ es nuestra aliada.
Lo primero que necesitamos saber antes de comenzar a utilizarla, es que la extensión ‘h’ se ejecuta en el contexto desde el que hemos realizado la llamada. Veámoslo con un ejemplo:
[desde-pruebas]
include => prueba1
include => prueba2
[prueba1]
exten => 1234,1,Playback(tt-monkeys)
exten => h,1,Noop(Extension h -- PRUEBA1)
[prueba2]
exten => 5678,1,Playback(demo-congrats)
exten => h,1,Noop(Extension h -- PRUEBA2)
Ahora, si definimos nuestro usuario SIP (por ejemplo) en el contexto desde-pruebas, ¿qué ocurrirá al colgar si llamamos al 1234? ¿y al 5678?
En ambos casos se mostrará “Extension h — PRUEBA1″ porque lo que Asterisk busca es la extensión ‘h’ del contexto desde-pruebas, que es donde se ha originado la llamada, y como el primer include es el de prueba1, prevalecerá esa.
Otra cosa que nos puede suceder es que si realizamos algún tratamiento en la extensión ‘h’, después, en el CDR, nos aparezca ‘h’ como campo dst, en lugar del destino.
Para solucionar esto podemos usar la aplicación ResetCDR de la siguiente manera:
[desde-pruebas]
include => prueba1
include => prueba2
exten => h,1,ResetCDR(w)
exten => h.n.Noop(Estoy en el colgado)
El parámetro w pasado a la aplicación ResetCDR hará que el CDR sea grabado justo en ese instante, por lo que el campo dst quedará intacto
PEERO! Ahora es probable que tengamos 2 registros en el CDR por cada llamada: uno con el dst bien y otro con la ‘h’ que comentábamos antes. Para solucionarlo podemos usar la aplicación NoCDR, que anula la creación del CDR, de la siguiente manera:
[desde-pruebas]
include => prueba1
include => prueba2
exten => h,1,ResetCDR(w)
exten => h,n,NoCDR()
exten => h.n.Noop(Estoy en el colgado)
Así, lo que ocurrirá será que se grabará el CDR, y justo a continuación se dejará de crear, por lo que tendremos un único registro, y con el dst correcto
Happy Asterisk hacking!
Te ha gustado? Compartelo: