Programar - Reservar llamadas en Asterisk

Decir que no tengo una buena memoria es hacerme un cumplido. Más pasan los años y peor es el desarrollo de mis sinapsis, con graves repercusiones en todo lo que tiene que ver con acordarme de las cosas que tengo que hacer. De hecho apunto todas mis citas donde pueda y esto me ayuda mucho. Ayer estaba pensando en como se podría usar asterisk para aliviar el trabajo de quien, a menudo, tiene que programar llamadas con clientes, usuarios, proveedores, etc. Me puse a pensar y repensar y al final encontré una solución que le explicaré paso a paso esperando que les pueda ser útil. Siendo una prima formulación de la solución, creo que el "código" que he escrito hasta ahora se puede mejorar, pero lo más importante, creo, es que funciona sin problemas.

Primero abrimos el archivo extensions.conf y le añadimos estas líneas:

nano /etc/asterisk/extensions.conf

;citas telefónicas
exten => 200,1,Answer
exten => 200,n,Wait(1)
exten => 200,n(inicio),Set(id=${CALLERID(num)})
exten => 200,n,Playback(telephone-number&astcc-followed-by-the-pound-key)
exten => 200,n,Read(appunt,,15,,2,10)
exten => 200,n,SayDigits(${appunt})
exten => 200,n,Wait(1)
exten => 200,n,Playback(year&month&day)
exten => 200,n,Read(fecha,,8,,2,10)
exten => 200,n,SayDigits(${fecha})
exten => 200,n,Playback(hours)
exten => 200,n,Read(hora,,4,,2,10)
exten => 200,n,Saydigits(${hora})
exten => 200,n,Playback(if-this-is-correct-press&digits/1&if-this-is-not-correct&digits/2)
exten => 200,n,Read(sino,,1,,,5)
exten => 200,n,GotoIf($["${sino}" = "1"]?cita:inicio)
exten => 200,n(cita),System(echo Channel:SIP/${id} >> /tmp/callback)
exten => 200,n,System(echo Callerid:citatel >> /tmp/callback)
exten => 200,n,System(echo WaitTime:30 >> /tmp/callback)
exten => 200,n,System(echo Maxretries:3 >> /tmp/callback)
exten => 200,n,System(echo RetryTime:300 >> /tmp/callback)
exten => 200,n,System(echo Account:${id} >> /tmp/callback)
exten => 200,n,System(echo Application:Dial >> /tmp/callback)
exten => 200,n,Gotoif($["${appunt:0:2}" = "00"]?just:local)
exten => 200,n(local),System(echo Data:SIP/${appunt},45,m >> /tmp/callback)
exten => 200,n,System(touch -t ${fecha}${hora} /tmp/callback)
exten => 200,n,System(mv /tmp/callback /var/spool/asterisk/outgoing/${fecha}${hora})
exten => 200,n,Hangup
exten => 200,n(just),System(echo Data:SIP/justvoip/${appunt},45,m >> /tmp/callback)
exten => 200,n,System(touch -t ${fecha}${hora} /tmp/callback)
exten => 200,n,System(mv /tmp/callback /var/spool/asterisk/outgoing/${fecha}${hora})
exten => 200,n,Hangup

Ahora vamos a analizar línea por línea.

  1. si llamamos desde nuestro softphone conectado a la centralita la extensión 200, lo primero que ocurre es que asterisk contesta la llamada (aplicación Answer)
  2. espera un segundo - Wait(1) -
  3. asigna a la variable id el numero del llamante
  4. escucharemos una voz que dirá "numero de teléfono seguido de la tecla numero" - Playback(telephone-number&astcc-followed-by-the-pound-key) - Tenemos que indicar el numero de teléfono que llamaremos (ej: el numero de un cliente).
  5. Asterisk se pondrá a la espera de recibir el numero de teléfono. La aplicación Read lee literalmente los dígitos que presionaremos  y los asignará a la variable appunt - para la sintaxis completa de la aplicación Read en la consola de asterisk escriban core show application Read
  6. escucharemos dígito por dígito el numero de teléfono que acabamos de teclear - SayDigits(${appunt})
  7. pausa de un segundo - Wait(1)
  8. escucharemos una voz que dirá: "año, mes, día" - Playback(year&month&day)
  9. Asterisk se pondrá a la esperas de recibir año, mes y día de esta forma: 4 dígitos para el año, 2 dígitos para el mes y dos dígitos para el día. La aplicación Read asignará esta fecha a la variable fecha - Esta será la fecha en que se efectuará la llamada
  10. escucharemos dígito por dígito la fecha que acabamos de teclear - SayDigits(${fecha})
  11. escucharemos una voz que dirá "hora" - Playback(hours)
  12. Asterisk se pondrá a la espera de recibir la hora de esta forma: dos dígitos para las hora y dos dígitos para los minutos (ej 1130 para las once y treinta, 20:10 para las veinte y diez). La aplicación Read asignará esta hora a la variable hora - Esta es la hora programada para la llamada
  13. escucharemos dígito por dígito la hora que acabamos de teclear.
  14. escucharemos una voz que dirá: "si es correcto presione 1 sino es correcto 2" - Playback(if-this-is-correct-press&digits/1&if-this-is-not-correct&digits/2) - Esto sirve para confirmar todos los datos hasta entonces digitados.
  15. Asterisk se pondrá a la espera de recibir nuestra respuesta (dígito 1 o dígito 2) - La variable Read asignará nuestra respuesta a la variable sino
  16. Si la variable sino es igual a 1 iremos directamente a la prioridad marcada con la etiqueta (cita) sino a la prioridad con la etiqueta (inicio) - GotoIf($["${sino}" = "1"]?cita:inicio) -
  17. aquí inicia la parte marcada con la etiqueta (cita) - Si confirmamos los datos seguiremos desde esta línea. Aquí empieza la creación del archivo de texto callback en la carpeta /tmp que tendrá la sintaxis requerida para los callfiles. Primera línea del archivo - Channel: SIP/${id} donde la variable id contiene el numero del llamante
  18. segunda línea del archivo callback: Callerid:citatel - Cuando asterisk ejecutará el callfile en la pantalla de nuestro softphone aparecerá como identificativo citatel y sabremos que es una de las llamadas programadas.
  19. tercera línea del archivo callback: WaitTime:30 - Este es el tiempo (en segundos) que asterisk esperará que la extensión que programó la llamada conteste.
  20. cuarta línea del archivo callback: Maxretries:3 - Si la extensión que programó la llamada no ha contestado dentro de los treinta segundos, asterisk intentará repetir la llamada 2 veces más (para un total de tres).
  21. quinta línea del archivo callback: RetryTime:300 - Asterisk esperará 300 segundo (5 minutos) entre un intento y otro
  22. sexta línea del archivo callback: Account:${id} los datos de la llamada se registraran en la cuenta de la extensión que reservó la llamada.
  23. séptima línea del archivo callback:Application:Dial una vez que la extensión que reservó la llamada conteste asterisk ejecutará la aplicación Dial
  24. Ahora podemos tener dos situaciones: a) el numero de destinación es una extensión interna de la centralita, b) el numero es externo (por ejemplo un celular). Si el numero es externo el dialplan seguirá desde la etiqueta (just), es decir que utilizaremos el proveedor VoIP justvoip para hacer la llamada, sino desde la etiqueta (local).
  25. en el caso de la etiqueta (just) la octava línea del archivo callback será: Data:SIP/justvoip/${appunt},45,m que representa las opciones con las cuales la aplicación Dial será ejecutada por Asterisk - ${appunt} es la variable que contiene el numero a llamar
  26. en el caso de la etiqueta (local) la octava línea de archivo callback será: Data:SIP/${appunt},45,m
  27. Con el comando touch cambiamos la fecha y la hora del archivo callback según fecha y hora escogidas. Esta serán la fecha y la hora a la que se ejecutara la llamada programada.
  28. movemos el archivo callback en la carpeta usada por asterisk para buscar los callfiles y, para que no hayan duplicados le cambiamos el nombre usando la fecha y la hora de la llamada programada.
  29. Terminamos la llamada.

Ahora a la fecha y hora programadas, asterisk llamará la extensión que reservó la llamada, una vez que conteste, ejecutará la aplicación Dial y llamará el numero de teléfono escogido para la llamada programada y podremos hablar, por ejemplo, con nuestro cliente.

Limites de este "código":

  • las llamadas pueden ser programadas solamente desde una extensión interna de nuestra centralita.
  • para todas las llamadas a números externos (fijos y celulares) se usará siempre el mismo proveedor VoIP (para una diferenciación basada en el numero a llamar se necesitaban muchas más líneas de "código", pero es algo factible.
  • Una vez programadas, las llamadas no se pueden borrar.

Si alguien quiere hacer sugerencias, correcciones, pues aquí estoy.

Ahora los dejo con dos imágenes. La primera es como aparece el archivo callfiles en la carpeta /var/spool/asterisk/outgoing, la segunda es como aparece el identificativo a la extensión que programó la llamada.

Chao

Etiquetas: 

Suscribirse a Comentarios de "Programar - Reservar llamadas en Asterisk" Suscribirse a VozToVoice - Todos los comentarios