Rellamada en ocupado con call file

Estamos llamando una extensión en Asterisk, pero resulta que la misma se encuentra ocupada. Normalmente este tipo de situación se procesa enviando el llamante al contestador automático para que deje un correo de voz; si queremos podemos usar otro tipo de solución. Permitir al llamante de presionar una tecla a través de la cual asterisk se encargará de marcar la extensión ocupada y una vez que esté libre conectarla con el llamante.

Para hacer esto podemos usar un call file. Siguen la líneas que hay que poner en el extensions.conf

nano /etc/asterisk/extensions.conf

[macro-internos]

exten => s,1,Answer() ; asterisk contesta el canal
exten => s,n,Wait(1); espera un segundo
exten => s,n,Set(ID=${CALLERID(num)}); asigna a la variable ID el numero de la extensión del llamante
exten => s,n,Dial(SIP/${MACRO_EXTEN},30,tTwmkKxX); llama la extensión
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail); si la extensión está ocupada va a la prioridad con etiqueta busy, si no está disponible a la prioridad con la etiqueta unavail
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u) ; envía la llamada al contestador automático anunciando que la extensión no se encuentra disponible
exten => s,n,Hangup() ; cuelga la llamada
exten => s,n(busy),Swift(La Extensión llamada está ocupada. Presione la tecla 6 para ser rellamado) ;en el caso que la extensión llamada esté ocupada anunciaremos que presionando la tecla 6 del teléfono podremos ser rellamados cuando la extensión se encuentre libre. Podemos hacer esto con Cepstral, Festival o creando un archivo audio que luego copiamos en la carpeta /var/lib/asterisk/sounds/custom. En este ejemplo se está usando Cepstral
exten => s,n,Read(callbusy,,1,,1,5) ; la variable Read espera que el llamante presione una tecla
exten => s,n,GotoIf($["${callbusy}" = "6"]?callfile) ; si la tecla presionada es el 6 se seguirá procesando la llamada en la prioridad con etiqueta callfile. De lo contrario se seguirá enviando la llamada al contestador automático anunciando que la extensión se encuentra ocupada.
exten => s,n,VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()
exten => s,n(callfile),System(echo Channel:SIP/${MACRO_EXTEN} >> /tmp/callback${MACRO_EXTEN}) ;
Aquí empieza la creación del call file. Asterisk llamará la extension ocupada
exten => s,n,System(echo Callerid:CallBack "<VozToVoice>" >> /tmp/callback${MACRO_EXTEN}) ; definimos el identificativo de la llamada
exten => s,n,System(echo WaitTime:30 >> /tmp/callback${MACRO_EXTEN}) ; Espera 30 segundos para que conteste
exten => s,n,System(echo Maxretries:10 >> /tmp/callback${MACRO_EXTEN}); numero máximo de intentos (10)
exten => s,n,System(echo RetryTime:30 >> /tmp/callback${MACRO_EXTEN}) ; tiempo (en segundos) entre un intento y otro
exten => s,n,System(echo Account: ${ID}>> /tmp/callback${MACRO_EXTEN}); numero de cuenta para el registro de las llamadas
exten => s,n,System(echo Application:Dial >> /tmp/callback${MACRO_EXTEN}); aplicación que se usará (dial)
exten => s,n,System(echo Data: SIP/${ID} >> /tmp/callback${MACRO_EXTEN}); numero del llamante que asterisk conectará con la extensión ocupada una vez que esté libre.
exten => s,n,Wait(1); espera un segundo
exten => s,n,System(mv /tmp/callback${MACRO_EXTEN} /var/spool/asterisk/outgoing); mueve el archivo creado en la carpeta usada por asterisk para procesar los Call Files
exten => s,n,Hangup() ; cuelga la llamada
exten => h,1,Hangup ; cuelga la llamada si el llamante cuelga estando en cualquier línea de la macro

Si queremos que todas las llamadas sean enviada a esta macro y suponiendo que la extensiones configuradas en nuestra centralita van desde las 2000 hasta las 2999, ponemos esta línea en nuestro contexto local:

[local]

exten => _2XXX,1,Macro(internos)

De esta forma todas las llamadas a una extensión será enviada a la macro internos.

Guardamos el archivo y actualizamos asterisk

asterisk –rvvvvvvvvvvvvvvv

CLI> dialplan reload

 

Algunos datos adicionales

Cuando llamamos una extensión o un numero en general, asterisk guarda dicho numero en una variable llamada ${EXTEN}). Esta es una variable de canal, es decir que es valida solamente para quien ha marcado el numero hasta que no cuelgue.

En el caso de una macro la variable ${EXTEN}  cambia en ${MACRO_EXTEN} y tiene la misma validez.

Un ejemplo:

si desde una extensión marco el numero 2150 la variable ${EXTEN} contendrá ese numero.

Si envío la llamada a una macro el numero 2150 será asignado a la variable ${MACRO_EXTEN}

Por eso en la línea donde aparece la aplicación Dial aparece SIP/${MACRO_EXTEN}. Esto significa que se está llamando usando la tecnología o protocolo SIP el numero almacenado en la variable (en nuestro caso 2150).

Sobre la aplicación Read echen una mirada al wiki de traducción de asterisk

 

Etiquetas de Technorati: ,,

Vota el Articulo: 

Sin votos (todavía)
Evalúa la calidad del articulo

12 comentarios

Where's .call file??

Que tal, saludos.

Esta es una de mis paginas preferidas de voip-asterisk, buenos articulos, felicidades y gracias...Bueno al grano; noto que mencionas lo de crear un archivo .call y todo.... El codigo presentado arriba es el que ingreso en el extensions_custom.conf; sin embargo, en donde o en que momento llamo mi archivo .call?? debo crearlo aprte con algunos parametros adicionales??? porque...ingreso este codigo dentro del extensions_custom.conf, y en el CLI, no veo que este trabajando ha de ser por el archivo .call, espero aclaren mis dudas..Gracias...

Pequeña duda

Hola amigo!

 

Tengo una duda al respecto de la variable DIALSTATUS...

Si entiendo bien, si un teléfono está ocupado atendiendo una llamada, esa variable debería devolver BUSY, y si lo que ocurre es que o bien no se puede crear el canal o el teléfono está desregistrado, la variable devuelve CHANUNAVAIL.

Pues bien, en mi caso, tengo una pequeña macro para que en caso de que la persona en la extensión a la que se llama esté hablando, salte una locución que indique que esa extensión comunica (BUSY) y que si, por lo que sea, el teléfono no está disponible (CHANUNAVAIL) la locución dice que la extensión no está disponible (siempre hay gente que dice que no van los teléfonos cuando realmente están comunicando. Hay que dárselo todo mascadito...) Incomprensiblemente para mi, haciendo las pruebas, si la persona a la que llamo está al teléfono, la variable DIALSTATUS toma valor CHANUNAVAIL, y no BUSY, como creo que debería ser...

¿Me he equivocado en algo? ¿Es necesario cambiar algo para que tome bien los valores?

 

Un saludo, y gracias por tu tiempo.

Javier

Re: pequeña duda

Hola,

la verdad me parece muy raro que no te devuelva el valor de la variable corecto.

Has probado a mirar en la consola de Asterisk que aparece cuando intentas llamar una extension que se encuentra ocupada?

Creo que de esta forma se podrían aclarar algunas cosas.

Saludos

 

Re: Pequeña duda

Buenos días

include => s,n,NoOp(${DIALSTATUS})

Cuando miro en la consola qué aparece al realizar la llamada a una extensión ocupada, este NoOp devuelve CHANUNAVAIL. Ese teléfono tiene call-limit=1, por lo que si está ocupado debería ser BUSY... No sé si se me escapa alguna cosa más, pero ya no sé dónde mirar.

 

Saludos, y gracias por contestar

Busy Dialstatus

Hola,

me parece muy raro que no conteste con un busy cuando la extension estè ocupada A menos que no sea un problema de configuración del telefono IP.

Mira si en la configuración del telefono tienes activado el call waiting. Si así fuera intenta disactivrlo.

Lo de call-limit yo lo quitaría.

Saludos

 

Solucionado

Efectivamente, el problema estaba en el teléfono. Le he deshabilitado el Call Waiting, y además he eliminado el call-limit de la configuración SIP. Desde ese momento, si el teléfono está ocupado, el estado es BUSY.

Eres un crack!

Mil gracias!

duda

Hola dime, los utilizado a este script en asterisk puro con debian, centos, o en alguno tipo elastrix, trixbox?

 

quiero hacerlo y estoy perdido

 

gracias

Re: duda

Hola,

para todos lo articulos presentes en este sitio, si no se hace referencia explicitamente a otro programa, se ha utilizado asterisk puro en CentOS

Saludos

 

Hola! Lo primero de todo

Hola!

Lo primero de todo agradecer el esfuerzo tanto de hacer los ejemplos como de solucionar los problemas que nos van surgiendo. Y luego comentar que estoy haciendo uso de callfiles y todo genial, salvo por el hecho de que al usar la variable ${CALLERID(num)} no me funciona para el protocolo IAX2, sin embargo con sip no tengo problemas...

Uso Asterisk bajo linux y el cliente Kiax para el protocolo IAX2, que viene por defecto instalado

¿Alguna idea de cuál puede ser el fallo?

Lineas activadas

Hola, una consulta.. si estuviera utilizando las dos lineas activas en el teléfono, vale decir que tiene activada la opción de permitir otra llamada mientras estoy utilizando el teléfono, ya no funciona la opción de rellanada?   o me equivoco

Yessica

Lineas activadas

Hola, una consulta.. si estuviera utilizando las dos lineas activas en el teléfono, vale decir que tiene activada la opción de permitir otra llamada mientras estoy utilizando el teléfono, ya no funciona la opción de rellanada?   o me equivoco

Yessica

No logro hacerlo funcionar

Hola. Si bien esta publicacion ya lleva unos años espero que puedan contestarme.

He realizado los pasos indicados, y logro que me reproduzca el anuncio para oprimir el 6 para realizar la llamada. La idea es oprimir el 6 y colgar y cuando la extension que yo llamo y da ocupado realice la llamada. Pero no logro nada.

Cuando la extension corta no hace absolutamente nada. De hecho cuanod llamo en lugar de decir el nombre y el numero, solo aparece device y el numero que llama.

Desde ya muchas gracias por la ayuda.

Suscribirse a Comentarios de "Rellamada en ocupado con call file" Suscribirse a VozToVoice - Todos los comentarios