Dialplan Avanzado

De Asterisk Wiki
Ir a la navegación Ir a la búsqueda

Toda la parte que podríamos considerar como "Avanzada" del Plan de Marcación de Asterisk es aquella que no es imprescindible para poder realizar instalaciones de pequeña escala, pero se vuelve fundamental cuando empezamos a trabajar de forma intensiva con el sistema Asterisk. Todo lo básico y necesario para montar un sistema funcional podemos verlo en el apartado de Introducción, y profundizando aún mas en las Aplicaciones de uso más común. Con el uso de toda la batería de Módulos de Asterisk podemos diseñar y escalar un sistema de Telefonía totalmente hecho a medida.

Macros

Como su nombre indica, los Macros sirven para simplificar la tarea repetitiva de insertar un conjunto de elementos del script del Plan de Marcación que son comunes para un número elevado de extensiones. Además como característica adicional, los Macros pueden tomar argumentos adicionales, lo que los convierte en una herramienta muy versátil

Sintaxis de Macros

Las macros se componen de dos niveles:

  • La Aplicación Macro que realiza la llamada a la Macro en cuestión
  • La Macro en si, que se forma como un tipo de "Contexto" dentro del Plan de Marcación.

En cuanto a la descripción de la Macro, la sintaxis es sencilla, se especifica como un contexto cualquiera con la siguiente pecularidad:

[macro-<nombre_de_macro>]

Por otro lado dentro de este contexto, se define una extensión por la cual empezará la ejecución del mismo, la extensión de inicio (s, start), y a partir de ahí ya la Macro se trata como si fuera una extensión cualquiera que sigue su curso natural.

En cuanto a la aplicación Macro la sintaxis es sencilla:

  • Macro(<nombre_de_macro>,<argumento_1>[,<argumento_N>])

Podemos especificar cualquier número de argumentos que pasaremos a la Macro en cuestión.

Además podríamos plantearnos el hecho de Anidar estas Macros dentro de otras Macros. Por regla general no se recomienda anidar muchas Macros dado que Asterisk podría sufrir serios problemas de rendimiento. Además considerar como veremos a continuación acerca de las Varibles de Canal y de Macro, que podrían verse afectadas y complicar bastante el concepto. Comentar que el anidamiento esta limitado por el sistema a un máximo de 7 niveles. [1]

Variables Generales de Macros

Si utilizáramos las Variables generales de Asterisk, dentro de una Macro, obtendríamos valores que posiblemente no sean los que buscamos, dado que serían los específicos a la misma. Este caso se da por ejemplo con las variables ${CONTEXT} (que tendríamos el nombre del contexto de la macro, macro-...), ${PRIORITY} la prioridad dentro de la macro, y ${EXTEN}, que será regularmente la s como comentábamos en el apartado anterior.

Por eso surgen variables de Macros especificas para tratar estas situaciones, simplemente con el prefijo MACRO_ delante.

  • ${MACRO_CONTEXT}, si haría referencia al Contexto de donde viene la Macro originalmente
  • ${MACRO_EXTEN}, haría referencia al número de extensión de donde viene la Macro, este es una de las variables más interesantes si queremos asociar extensiones a posiblemente otros aspectos del sistema (como nombres de dispositivo SIP, o nombres de Buzones de Voz.
  • ${MACRO_PRIORIRY}, sería la misma historía que las dos anteriores, prioridad concreta en la que se encuentra antes de saltar al "contexto especifico" de la Macro.

Variables de Argumentos

Como veíamos en la sintaxis de la Aplicación Macro, es posible pasar varios argumentos a la misma. Para poder acceder a ellos dentro de la Macro utilizamos la sintaxis: ${ARG1}, ${ARG2}, ${ARGN}, siendo N el número posible de argumentos especificados en el uso de la aplicación.

Subrutinas

Subrutinas de Bajo Nivel

Podríamos ir un paso más allá de las Macros, que como sabemos, no son mas que simplemente una "[1]" (de alguna forma resumida, una simplificación en la abstracción del código), utilizando las Subrutinas del Dialplan.

Características Generales

Poseen varios aspectos iguales o parecidos a las Macros, los cuales podríamos destacar:

  • Mismo nombre para las variables de Argumentos ${ARG1}, ${ARG2}, etc...
  • La aplicación que las llama, GoSub, toma la siguiente sintaxis:
    • GoSub(<nombre_subrutina>,start,1(<argumento_1>[,<argumento_N>]))
  • No existe una forma de definirías concreta como el caso de las macro con los contextos [macro-...]. En este caso, las Subrutinas se definen como un contexto cualquiera a voluntad, pero existe una convención de utilizar algún método identificativo para poder reconocerlas dentro de un Dialplan complejo, algo así como [sub-<nombre_subrutina>] o [Sub<nombre_subrutina>] pero no es crucial.
  • Al contrario de las Macros, las subrutinas si están diseñadas para hacer verdaderos algoritmos sofisticados dentro de lo que la potencia de Asterisk nos permite. Por ello no existe una limitación de Anidamiento como aparecía con las Macros.

Retorno de Subrutinas

Cuando entramos en una subrutina, a través de la Aplicación GoSub, hay que considerar, que ya no volveríamos al punto donde lo dejamos en nuestro DialPlan por defecto. En cierto sentido una subrutina se comporta como una especie de Salto no condicional con el pase de una serie de Parámetros (de hecho todo este sistema conceptual viene dado por lenguajes de muy bajo nivel como Ensamblador).

Pero siguiendo con esta comparación a lenguajes de bajo nivel, existe una forma de regresar al punto donde lo dejamos, con otra aplicación que acompaña a las subrutinas: Return. Simplemente con una llamada a esta Aplicación volveríamos exactamente al punto en el flujo del Dialplan donde lo dejamos, lo que haría asemejarse de alguna forma más, al comportamiento de las Macros.

Interactive Voice Response

Un IVR como su traducción literal, es un sistema interactivo de respuesta por voz. Esto quiere decir, que una máquina que incorpore este sistema integra las dos partes fundamentales de interacción de una máquina y una persona, por voz, utilizando un mecanismos TTS y ASR, especialmente si hablamos de un sistema de telefonía, aunque también pueden basarse en sistemas de introducción de dígitos por teclado, para realizar una función específica.

Podría considerarse hasta cierto punto, un tipo de Operadora Automática pero con un nivel más avanzado de gestión, dado que por regla general, los sistemas IVR suelen interactuar con otros sistemas del entorno, mientras que las operadoras automáticas, se restringen a la funcionalidad que aporta el sistema PBX en sí.

En términos generales, podrían considerarse aplicaciones en si, ya que existen tres componentes, comunes en la mayor parte de estas

- Método de introducción de datos a la máquina, ya sea por teclado del teléfono, o por Voz (ASR), o una combinación de ambas - Procesamiento de los datos buscando algún tipo de resultado - Ofrecer el resultado con un medio de salida, ya sea, utilizando algún sistema de salida estándar como una pantalla o por audio utilizando sistemas TTS, o mensajes concretos pregrabados.

Mecanismos de entrada

Principalmente existen dos mecanismos de entrada más comunes:

Aplicación Read

Mientras que la mayoría de las operadoras automáticas, pueden formalizarse utilizando aplicaciones específicamente diseñadas para este propósito como [[Aplicaciones Básicas|Background y WaitExten}}, para poder diseñar un IVR, es muy probable que necesitemos utilizar adicionalmente a los sistemas ASR para el recoger información por el medio de voz, también poder acompañar con un medio digital, basado en la marcación de tonos DTMF.

Con la aplicación Read podemos hacer prácticamente los mismo que con las dos anteriores, aún un poco más complejo tenemos más versatilidad, y se desarrollo expresamente para cumplir el cometido de poder generar IVR de manera eficiente.

La sintaxis específica de esta aplicación es la siguiente: Read(<variable>,<pista_audio_1>[,<pista_audio_N>],,<máximos_dígitos>,<opciones>,<intentos>,<tiempo_de_espera>)

  • variable: podemos definir el nombre de una variable en el que almacenaremos los dígitos marcados a través de esta aplicación. Con ello conseguimos la posibilidad de extender nuestra funcionalidad, más allá de 1 solo dígito como es el caso de las Operadoras Automáticas, sino incluso, podríamos crear un menú de dos o hasta tres dígitos.
  • pista_audio: podemos definir tantas pistas de audio como queremos que se reproduzcan consecutivamente. Hay que considerar que la marcación de lectura puede realizarse mientras se escuchan las pistas de sonido.
  • máximos_dígitos: podemos definir, el número máximo de dígitos que han de ser marcados, es posible interrumpir la inserción de dígitos con la tecla #. Si ponemos 0, entonces no hay limite y tendremos que acabar con # o cuando se acabe el tiempo de espera.
  • intentos: número máximo de intentos, hasta que demos por finalizada la operación, en caso que acabe el tiempo de espera.
  • tiempo_de_espera: tiempo en segundos máximo que esperara la aplicación antes de darse por terminada.
  • opciones: aquí se pueden especificar algunas opciones que pueden variar el comportamiento:
    • s: si no hemos lanzado una apliación Answer (o se ha respondido la linea indirectamente), saltaríamos esta aplicación
    • n: justo lo contrario que la s, aunque no haya sido respondida, intentamos leer digitos del llamante
    • i: podemos lanzar un tono dentro de indications.conf en vez de una pista de audio si ponemos esta opción

Procesamiento de Datos

En Asterisk, existen múltiples variantes por defecto, para procesar la información recibida por un llamante. El nivel de flexibilidad que ofrece es literalmente infinito, ya que estos mecanismos a su vez, permiten la integración con terceros sistemas, algo que ofrece y es en esencia el verdadero potencial de Asterisk.

Los más destacados son:

  • Interfaz AMI, dado que es posible, introducir comandos, y recibirlos en modo "escucha", y a su vez, crear aplicaciones que sean capaces de conectar con la misma, procesar esta información y ofrecer un resultado concreto.
  • Interfaz AGI, es la puerta al mundo de los lenguajes de programación ya que existe una integración prácticamente con todos y cada uno de ellos. Podemos pasarle variables que luego estas pueden ser procesadas a voluntad gracias a aplicaciones que realicemos en uno de esos lenguajes a volutad
  • Función cURL [2]
  • Funciones ODBC, podrían considerarse un nivel más avanzado y personalizable de funciones, definidas en un fichero de configuración func_odbc.conf cuya esencia es en función de los parámetros que pasemos a la función ODBC, ejecutarán una sentencia SQL con esos parámetros según definida en el fichero de configuración.

Mecanismos de Salida

Por regla general contamos con varios mecanismos esenciales:

  • Utilizar una interfaz gráfica de cualquier tipo, para mostrar los datos ya procesados que queremos devolver, inclusive considerando que el resultado haya sido una interfaz con un sistema externo, por ejemplo escribir algo en la base de datos de otra empresa asociada
  • Text-To-Speech (TTS)
  • Aplicaciones más básicas como Playback sobre ficheros de audio predefinidos.

Referencias

  1. Asterisk Macros, Digium Inc. (2012)
  2. Página oficial Librería cURL, Daniel Stenberg (1999)

Véase también

Enlaces Externos