Asterisk Rellamada con archivos call files y Disa

Tenemos que hacer una llamada con el celular pero con nuestra compañía de telefonía celular nos sale muy cara. Podemos aprovechar de nuestra centralita? Hay algún modo de decirle que nos llame y que nos de línea para hacer la llamada? Claro que si.

El método que vamos a explicar hoy, aprovecha la capacidad de Asterisk de procesar algunos archivos de texto y transformarlos en llamadas salientes. Estos tipos de archivos se llaman call files y pueden leer una explicación de como funcionan en este archivo (en ingles).

La estructura de un call files es la siguiente:

Channel: <channel>  ; La extensión que  queremos llamar

Callerid: <callerid>    ; El identificativo de llamada que queremos enviar a la extensión llamada

WaitTime: <number>  ; Cuantos segundos esperamos antes de considerar la llamada sin éxito

Maxretries: <number>   ; Numero de veces que intentaremos llamar la extensión

RetryTime: <number>    ; Cuantos segundos debe esperar asterisk para volver a marcar

Account: <account>      ; El nombre de la cuenta con la cual queremos grabar esta llamada (CDR)

Una vez que la extensión llamada conteste tenemos que decirle a asterisk lo que tiene que hacer. Esto también se define en el mismo archivo. Hay dos opciones:

  • Ejecutar una aplicacion

    Application: <appname>  ; la aplicación que queremos utilizar

    Data: <args>            ; aquí podemos definir las opciones de la aplicación

 

  • Ejecutar un punto exacto del plan de llamadas (dial plan)

    Context: <context>   ; El contexto en el dial plan

    Extension: <exten>    ; La extensión que queremos usar en el contexto especificado

    Priority: <priority>     ; El numero de la prioridad o la etiqueta si definida

    Setvar: <var=value>    ; Variables que se pueden necesitar en el contexto, extensión y prioridad que definimos.

Estos archivos de texto, una vez creados, hay que moverlos en la carpeta /var/spool/asterisk/outgoing. Asterisk controlará cada segundo si hay algún archivo nuevo en la carpeta y lo procesarà enseguida. Propio por el sistema utilizado por asterisk para procesar estos archivos, éstos no se pueden crear directamente en la carpeta /var/spool/asterisk/outgoing

Si, por ejemplo, nuestro numero de celular es 3103333333 en extension.conf vamos a configurar las siguientes líneas:

[from-linea-interna] ; contexto donde llegan las llamadas externas

exten => s,1,Answer() ; contestamos
exten => s,n,Set(ID=${CALLERID(num)}) ; le asignamos a la variable ID el numero de teléfono de quien está lamando
exten => s,n,GotoIf($[${ID}=3003333333]?llamada:normal) ; Si estoy llamando yo desde mi celular va a la etiqueta llamada, sino cuelga
exten => s,n(llamada),System(echo Channel:SIP/Proveedor/00573003333333 >> /tmp/callback) ; Creamos un archivo de texto llamado callback en
exten => s,n,System(echo Callerid:Fulano <2000> >> /tmp/callback) ; la carpeta tmp donde vamos a grabar todas las líneas que se necesitan
exten => s,n,System(echo WaitTime:30 >> /tmp/callback) ; para que el archivo pueda ser procesado correctamente por asterisk
exten => s,n,System(echo Maxretries:2 >> /tmp/callback)
exten => s,n,System(echo RetryTime:300 >> /tmp/callback)
exten => s,n,System(echo Account:2000 >> /tmp/callback)
exten => s,n,System(echo Application:Disa >> /tmp/callback)
exten => s,n,System(echo Data:no-password,llamada-externas >> /tmp/callback)
exten => s,n,Wait(1)
exten => s,n,Playback(call-terminated) ; Escucharemos una voz que nos dirá que la llamada se ha terminado
exten => s,n,System(mv /tmp/callback /var/spool/asterisk/outgoing ; moveremos el archivo de text en la carpeta de destino (comando mv=move)
exten => s,n(normal),Hangup() ; Terminaremos la llamada

Este es el archivo de texto que resultará

Channel:SIP/Proveedor/00573003333333 ; Asterisk llamará nuestro celular utilizando el proveedor de llamas VoIP llamado Proveedor
WaitTime:30 ; esperará que contestemos por 30 segundos
Maxretries:2 ; si la primera llamada no tendrá éxito lo intentará otra vez
RetryTime:300 ; entre una llamada y otra esperará 300 segundo (5 minutos)
Account:2000 ; registrará la llamada en en la base de datos en la cuenta de la extensión 1000
Application:Disa ; Ejecutará la aplicación DISA con la variables definidas en la línea que sigue
Data:no-passowrd,llamadas-externas ; no pedirá ninguna contraseña y usará el contexto llamadas-externas para efectuar la llamada

En unos segundo nuestro celular timbrarà y una vez que contestemos escucharemos el tono que nos indicará que tenemos la línea disponible para efectuar la llamada. Marcamos el numero de destino y listo.

Si quieren saber más de la aplicación DISA pueden usar la ayuda desde la consola de asterisk

asterisk -rvvvvvvvvvvvvvv

CLI> core show application disa

No lo pego aquí porque la pagina de ayuda es bastante extensa.

Próximos artículos:

  1. Como programar llamadas de trabajo a una fecha y hora determinada con Asterisk
  2. Como usar el programa talkonaut en un nokia 6300i (y muchos modelos más) para originar una llamada cuando no podemos usar una red inalámbrica (wi-fi)

Interesante no?

Chao

Etiquetas: 

3 comentarios

Hay algo mal por algun sitio y no lo localizo

Hola admin, muchas gracias por tu web ante todo.

En la linea Data:no-passowrd,llamadas-externas, ¿no debería ser DISA:no-passowrd,llamadas-externas?

¿Sería válido en la línea exten => s,n,System(echo Application:Disa >> /tmp/callback) poner
exten => s,n,System(echo Application:Disa(no-password|llamadas-externas) >> /tmp/callback)

Haciendo esto no consigo que me dé tono para marcar, esto dice el CLI:

Attempting call on Zap/1/666999666 for application DISA() (Retry 1)
[Jan 29 12:52:00] NOTICE[4611]: channel.c:3015 __ast_request_and_dial: Unable to request channel Zap/1/666999666
[Jan 29 12:52:00] NOTICE[4611]: pbx_spool.c:356 attempt_thread: Call failed to go through, reason (0) Call Failure (not BUSY, and not NO_ANSWER, maybe Circuit busy or down?)
-- Attempting call on Zap/1/666999666 for application DISA() (Retry 2)
> Channel Zap/1-1 was answered.
> Launching DISA() on Zap/1-1
[Jan 29 12:52:49] WARNING[4617]: app_disa.c:135 disa_exec: DISA requires an argument (passcode/passcode file)
-- Hungup 'Zap/1-1'
[Jan 29 12:52:49] NOTICE[4617]: pbx_spool.c:366 attempt_thread: Call completed to Zap/1/666999666

Gracias de antemano.

Disa

Hola,

de nada :)

Sería valido si usas la aplicación DISA en el archivo extensions.conf (plan de llamadas) pero si la usas en un call file la estructura es distinta.

En una línea va la aplicación que quieres usar y en otra los parámetros para dicha aplicación

Intenta poner (en asterisk 1.6.x)

exten => s,n,System(echo Application:Disa >> /tmp/callback)

exten => s,n,System(echo Data:no-password,llamadas-externas,,,p) >> /tmp/callback)

Controla la sintaxis de la función Disa para la versión de tu asterisk.

Espero que te funcione...

Problema Test de call file

Buenas tardes,

necesito utilizar mi servidor Asterisk para manejar tanto envíos de documentos vía Fax como recepciones empleando para ello, respectivamente, las aplicaciones SendFax y ReceiveFax. Por la documentación que he encontrado hasta ahora, la única forma de indicar a la aplicación SendFax el destinatario deseado es hacer uso de la utilidad que se comenta en el post, los call files. 

Por ello me he puesto manos a la obra con el tema y he realizado algunas pruebas sencillas. Mi primer objetivo era realizar una llamada a un número de teléfono móvil (usando para ella mi tarjeta FXO instalada) y una vez se respondiera en el teléfono móvil se escuchara una grabación de prueba (por ejemplo el hello world).

La primera aproximación realizada para solucionar el problema consiste en lo siguiente:

- Por un lado, el call file:


Channel: DAHDI/1/0615XXXXXX

WaitTime: 45

Maxretries: 0

RetryTime: 300

Context: callfile-test

Extension: s

Priority: 1

Archive: yes


 

- Por otro lado, el contexto definido en el extensions.conf que nos interesa en este caso, callfile-test:

 


[callfile-test]

 

exten => s,n,Playback(hello-world)

 

exten => s,n,Hangup()


 

Obtengo los siguientes mensajes en la CLI al mover el fichero al directorio /var/spool/asterisk/outgoing:  

 


-- Attempting call on DAHDI/1/0615683231 for s@callfile-test:1 (Retry 1)

 

    -- Executing [s@callfile-test:1] Playback("DAHDI/1-1", "hello-world") in new stack

    -- <DAHDI/1-1> Playing 'hello-world.gsm' (language 'en')

    -- Executing [s@callfile-test:2] Hangup("DAHDI/1-1", "") in new stack

  == Spawn extension (callfile-test, s, 2) exited non-zero on 'DAHDI/1-1'

    -- Hungup 'DAHDI/1-1'

[Jul 21 13:18:26] NOTICE[4610]: pbx_spool.c:349 attempt_thread: Call completed to DAHDI/1/0615683231


 

De esta forma en el teléfono móvil no se obtiene ningún timbre de llamada, llamada perdida ni nada por el estilo. En cambio, si en el fichero extensions.conf defino el contexto de esta otra forma:


[callfile-test]

exten => s,1,Wait(30)

exten => s,n,Playback(hello-world)

exten => s,n,Hangup()


 

Sí que recibo la llamada en el teléfono móvil. Al contestarla, no se escucha nada durante un tiempo y al cabo de un rato (lo correspondiente a los 30 s de la llamada a la aplicación Wait) se escucha efectivamente el hello-world como consecuencia de ejecutar la aplicación Playback.

No termino de entender la razón de este comportamiento. Yo en un principio esperaba que mi móvil estuviese sonando hasta que o bien, yo decidiera responder, momento en el que escucharía el hello-world, o bien se pasaran los 45 s definidos como WaitTime del call file.

¿Hay algo que estoy haciendo mal? ¿Estoy experimentando el comportamiento que se debe dar? En este último caso, ¿que cambios habría que realizar para que sucediera lo que yo esperaba en un principio?

Muchas gracias por la ayuda.

Un saludo,

Fernando.

Suscribirse a Comentarios de "Asterisk Rellamada con archivos call files y Disa" Suscribirse a VozToVoice - Todos los comentarios