Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Tutorial Asterisk: IVR y funciones Dialplan

Diego Castillo Barnés
  • Escrito por Diego Castillo Barnés el 05 de Febrero de 2015
  • 3 min de lectura | Sistemas
Tutorial Asterisk: IVR y funciones Dialplan

Ver Indice Tutorial

Creando un IVR

Un IVR (de Interactive Voice Response ) es, como su propio nombre indica, un menú de voz interactivo que permite interactuar de forma automática con el otro extremo de la comunicación con un fin determinado.

Hoy en día lo normal es encontrarse con un IVR de bienvenida cuando se llama a cualquier gran empresa. El caso más obvio es el de las grandes operadoras de telefonía que cuentan con IVRs cuyo único objetivo es redirigir al usuario al departamento que pueda resolver su consulta de la forma más precisa posible pero que lo hacen con tanto nivel de detalle (submenús) que puede resultar muy molesto de cara al usuario final.

En este apartado vamos a diseñar un IVR que haga que todas las llamadas entrantes escuchen una locución de bienvenida seguida de una locución que le pida al usuario hacia dónde quiere redirigir su llamada (departamento comercial o departamento de soporte técnico). El cliente puede llamar 24 horas al día al departamento comercial (que será la opción 1) pero si lo hace al de soporte (opción 2) fuera de su horario de oficina (que vamos a suponer de 08:00 a 15:00), entonces saltará el buzón de voz de soporte. Si el cliente no selecciona ninguna de las dos opciones o la opción seleccionada no es válida, saltará un mensaje de despedida. Toda esta configuración se incluye en el fichero extensions.conf .

[globals]
COMERCIAL=SIP/200&SIP/201&SIP/202 ; Variable con las extensiones del dpto comercial
SOPORTE=SIP/300&SIP/301           ; Variable con las extensiones del dpto de soporte

[llamadas-entrantes]
exten => s,1,NoOp(Llamada entrante de ${CALLERID(num))
   same => n,Answer()
   same => n,Playback(bienvenida)
   same => n,Background(menu-ivr)
   same => n,WaitExten(4)

exten => 1,1,NoOp(El usuario ha elegido la opción ${EXTEN} - Departamento Comercial)
   same => n,Dial(${COMERCIAL})
   same => n,Hangup()

exten => 2,1,NoOp(El usuario ha elegido la opción ${EXTEN} - Departamento Soporte)
   same => n,GotoIfTime(08:00-15:00,mon-fri,*,*?continuar,contestador)

   same => n(continuar),NoOp(Llamando al Departamento de Soporte)
   same => n,Dial(${SOPORTE})
   same => n,Hangup()

   same => n(contestador),NoOp(Llamada fuera de horario)
   same => n,Playback(fuera-de-horario)
   same => n,VoiceMail(1000@default)
   same => n,Hangup()

exten => _ [ti],1,NoOp(Ha saltado temporizador 't' u opción no válida 'i')
   same => n,Playback(despedida)
   same => n,Hangup()

Comentar un par de detalles sobre este ejemplo:

  • La extensión s es la extensión por defecto de Asterisk. Coincide con todas las entradas por lo que suele ser una buena opción a la hora de definir llamadas entrantes que queremos que pasen por un único camino.

  • La aplicación GotoIfTime permite realizar un salto en la ejecución del dialplan en función del tiempo del sistema. En este caso, si el momento en que se ejecuta esta regla es entre las 08:00 y las 14:00 de lunes a viernes, entonces saltará a la prioridad con etiqueta ' continuar '. Si la condición no se cumple, saltará a la prioridad con la etiqueta ' contestador '.

Buzones de Voz

Quizás uno de los servicios que más ha costado conseguir para la telefonía tradicional, es uno de los servicios más sencillos de Asterisk. Para crear un buen sistema de buzón de voz tan solo hace falta responder a tres cuestiones: ¿Cuántos mensajes esperamos recibir en nuestro buzón de voz? ¿Cuántos buzones de voz hacen falta en una empresa? y ¿Queremos integrar el servicio de buzón de voz con otros servicios como es el caso del correo electrónico?

Con Asterisk se pueden responder a estas tres preguntas y sin más dificultad que añadir pocas líneas más en el dialplan y configurar también el fichero voicemail.conf que es el que permite definir cada buzón de voz y su comportamiento.

Sea una empresa de 2 empleados en la que queremos configurar un buzón de voz para cada uno de éstos empleados y uno en común que será el general de la empresa. Cada empleado tiene su cuenta de correo de empresa y un usuario SIP definido en el fichero sip.conf . Se añaden las siguientes líneas en los siguientes ficheros:

Fichero sip.conf

[general]
language=es
disallow=all
allow=alaw
allow=ulaw
videosupport=no
...

[103]
type=friend
secret=e7uKz
host=dynamic
context=trabajadores
callerid="Beatriz" <103>
dtmfmode=rfc2833
qualify=yes
mailbox=1003@default
...

[104]
type=friend
secret=ieLp3
host=dynamic
context=trabajadores
callerid="Ángeles" <104>
dtmfmode=rfc2833
qualify=yes
mailbox=1004@default
...

Fichero extensions.conf

[trabajadores]
include => internas
include => funciones ; Incluimos varios contextos como si fueran parte del contexto 'trabajadores'

[internas]
...
exten => _000XXXX,1,NoOp(Dejar mensaje en buzón de ${EXTEN:3}) ; Con ${EXTEN:3} se recortan los 3 primeros dígitos de la variable EXTEN
same => n,Answer()
same => n,VoiceMail(${EXTEN:2}@default) ; Para dejar un mensaje en el buzón XXXX del grupo 'default' del voicemail.conf
same => n,Hangup()
...

[funciones]
...
exten => _000*,1,NoOp(Accediendo al buzón de ${CALLERID(num)})
same => n,Answer()
same => n,VoiceMailMain(${CALLERID(num)}@default) ; Para acceder al buzón de voz de la propia extensión que está llamando
same => n,Hangup()
...

Fichero voicemail.conf

[general] format=wav49|gsm|wav ; Formato del mensaje de audio ... [zonemessages] european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM [default] 1003 => pass_bea,B. Sanchez,beatriz@miempresa.com,,attach=yes|saycid=yes|envelope=yes|delete=yes|tz=european 1004 => pass_ángela,A. Santos,angeles@miempresa.com,,attach=yes|saycid=yes|envelope=yes|delete=yes|tz=european

Como se puede comprobar, el fichero voicemail.conf contiene todos los parámetros necesarios para configurar cada buzón de voz. Los mensajes convertidos a ficheros de audio se almacenan por defecto en el directorio /var/spool/asterisk/voicemail/ aunque hoy en día es difícil encontrar a una empresa que prefiera almacenar éstos mensajes de voz y no enviarlos directamente por correo electrónico configurando los parámetros delete , attach y email de la forma adecuada.

Aplicaciones imprescindibles en tu Dialplan

Aunque Asterisk ofrece cientos de aplicaciones para personalizar hasta el último detalle cualquier dialplan, casi siempre se utiliza una lista mucho más corta pues son las que ofrecen los servicios más demandados o más comúnmente demandados por las empresas. En esta sección hemos querido recoger una pequeña selección con algunas de estas aplicaciones:

Para los interesados, la lista completa puede encontrarse en este enlace de la Wiki oficial de Asterisk .

  • AGI

    Permite ejecutar aplicaciones externas (principalmente scripts). Tiene una variable asociada, AGISTATUS que permite comprobar si la ejecución del programa externo ha sido un éxito, ha fallado o incluso si ha sido la responsable de colgar una llamada.

    Sintaxis: AGI(command,arg1,[arg2[,...]])

  • Answer

    Responder a una llamada entrante (para ser más exactos, responde a un canal en estado ' ringing ').

    Sintaxis: Answer([delay,[nocdr]])

  • Background

    Reproduce una locución pasada como parámetro a la vez que espera a que el lado al que se le está reproduciendo la locución marque una extensión a la que saltar dentro del Dialplan. En función del número de DTMFs que se quiera especificar para el menú, puede ser también necesario el uso de la aplicación WaitExten() .

    Sintaxis: BackGround(filename1&[filename2[&...]],[options,[langoverride,[context]]])

  • Busy

    Indica al lado llamante ( calling part ) que el lado llamado ( called part ) está ocupado.

    Sintaxis: Busy([timeout])

  • ConfBridge

    Permite que un usuario entre en una sala de conferencias específica. Si lo desea, el usuario puede salirse de la sala colgando la llamada o pulsando un DTMF si está configurado así. Esta aplicación es la evolución de la aplicación MeetMe . El uso de esta aplicación es algo avanzado y está asociado al fichero confbridge.conf .

    Sintaxis: ConfBridge(conference,[bridge_profile,[user_profile,[menu]]])

  • Congestion

    Indica al lado llamante ( calling part ) que el lado llamado ( called part ) está congestionado.

    Sintaxis: Congestion([timeout])

  • Dial

    Es la aplicación ḿas importante de Asterisk. Permite lanzar una llamada a uno o más destinos especificados como argumentos de la aplicación. Tiene varias variables asociadas, DIALEDTIME , ANSWEREDTIME y DIALSTATUS además de más de 20 opciones disponibles para utilizar como argumento options .

    Sintaxis: Dial(Technology/Resource&[Technology2/Resource2[&...]],[timeout,[options,[URL]]])

  • GoSub

    Salta al punto del dialplan objetivo y continúa la ejecución del dialplan. Una vez encuentra una orden de Return , vuelve al punto del programa desde el cual se inició el salto. Existen alternativas a esta aplicación con saltos condicionales.

    Sintaxis: Gosub([context,[exten,]]priority[(arg1,[...][argN]]))

  • Goto

    Es prácticamente idéntica a la aplicación GoSub nada más que en este caso no existe una ruta directa al mismo punto del programa desde el cual se inició el salto. Existen alternativas a esta aplicación con saltos condicionales.

    Sintaxis: Goto([context,[extensions,]]priority)

  • Hangup

    Permite colgar un canal que está siendo utilizado.

    Sintaxis: Hangup([causecode])

  • NoOp

    " Do Nothing ". No realiza ninguna operación pero si se le pasa como argumento un string de texto, éste aparecerá en el CLI de Asterisk cada vez que se ejecute esta línea. Principalmente se utiliza para depurar el dialplan.

    Sintaxis: NoOp([text])

  • Queue

    Mete la llamada entrante en una queue de llamadas a la espera de ser atendidas por un agente libre. Tiene una variable asociada, QUEUESTATUS que controla el estado de la queue a la que se quiere enviar la llamada.

    Sintaxis: Queue(queuename,[options,[URL,[announceoverride,[timeout,[AGI,[macro,[gosub,[rule,[position]]]]]]]]])

  • Read

    Lee un valor por la entrada estándar y lo almacena en una variable.

    Sintaxis: Read(variable,filename&[filename2[&...]],[maxdigits,[options,[attempts,[timeout]]]]])

  • Récord

    Graba en un fichero todo lo que diga quien ha lanzado la llamada a la aplicación. Es la función que se suele utilizar para grabar en el sistema mensajes de voz personalizados.

    Sintaxis: Record(filename.format,[silence,[maxduration,[options]]])

  • Set

    Permite asignarle un valor a una variable.

    Sintaxis: Set(name=value)

  • Verbose

    Envía el mensaje pasado como parámetro a la salida de Verbose (si está configurado el fichero logger.conf , los mensajes aparecerán en los logs del sistema).

    Sintaxis: Verbose([level,]message)

  • VoiceMail

    Permite dejar un mensaje en el buzón de voz ( mailbox ) indicado como parámetro. Tiene una variable asociada, VMSTATUS que permite comprobar si la llamada a la aplicación VoiceMail ha sido un éxito, ha fallado o incluso si se ha abandonado antes de que la ejecución de la aplicación haya almacenado algún dato.

    Sintaxis: VoiceMail(mailbox1&[mailbox2[&...]],[options])

  • VoiceMailMain

    Permite comprobar el estado del buzón de voz indicado como argumento. Da acceso al menú del buzón de voz para escuchar, cambiar de directorio o borrar los mensajes de voz almacenados.

    Sintaxis: VoiceMailMain([mailbox@[context]],[options])

  • Wait

    Detiene la ejecución del Dialplan durante el tiempo (en segundos) que se le indique a la aplicación como argumento.

    Sintaxis: Wait(seconds)

  • WaitExten

    Espera durante un tiempo a que el usuario introduzca un número de extensión al que saltar.

    Sintaxis: WaitExten([seconds,[options]])


Y en el próximo artículo interactuaremos con bases de datos. ¿Te lo vas a perder? ;)

Ver Indice Tutorial

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars