Curso Asterisk (IV): El Dialplan

En la anterior entrada vimos cómo dar de alta algunas extensiones internas, y trabajamos muy por encima con el Dialplan para poder llamar de una extensión a otra.

El Dialplan es el verdadero corazón de Asterisk y de cualquier sistema VoIP. El Dialplan, o plan de marcado, es una colección ordenada de acciones que se ejecutan cuando alguien marca un número dentro de nuestro Asterisk. El ejemplo más trivial sería que cuando alguien marca la extensión de otra persona, por ejemplo “3001”, suene el teléfono de ese usuario. Sin embargo, se pueden hacer cosas mucho más avanzadas, como por ejemplo gestionar las llamadas en función de un horario, crear una centralita automática de recepción de llamadas, grabar conversaciones, poner música en espera, etc.

Antes de entrar en lo que se puede hacer con el Dialplan, vamos a definir algunos conceptos básicos.

CONCEPTOS BÁSICOS

Extensiones

Definición: Una extensión es una marcación en el teclado de un teléfono.

Por ejemplo, un usuario podría marcar “3001” en su teléfono, y eso sería una extensión. También podría marcar un número de teléfono nacional, como por ejemplo “915881000”, y también sería una extensión.

Aunque lo normal es que las extensiones sean numéricas, no debemos pensar sólo en números, ya que en Asterisk también se pueden definir extensiones como texto. Por ejemplo, “pizza” sería una extensión válida.

Un plan de marcado empieza con una colección de extensiones a las que se puede llamar. Esta definición de extensiones puede ser literal, o puede ser una expresión. Por ejemplo, si hemos definido las extensiones desde la 3001 hasta la 3009, podemos definirlas en nuestro dialplan enumerándolas una detrás de otra, de forma literal:

  • 3001
  • 3002
  • 3003
  • 3004
  • 3005
  • 3006
  • 3007
  • 3008
  • 3009

Sin embargo, si todas ellas van a tener la misma colección de acciones (en general, pasar la llamada a la extensión marcada), sería mucho más cómodo definirlas todas a la vez con una expresión:

  • _300X

Las expresiones van precedidas de guión bajo “_”, que indica que lo que viene a continuación es una expresión que puede cuadrar con más de una extensión. Para definir expresiones en Asterisk disponemos del siguiente lenguaje:

Símbolo Significado
X Cualquier cifra de 0 a 9
Z Cualquier cifra de 1 a 9
N Cualquier cifra de 2 a 9
[x-y] Cualquier cifra de "x" a "y"
[xyz] Las cifras "x", "y" o "z"
. Una o más repeticiones del símbolo anterior
! Cero o más repeticiones del símbolo anterior

En general necesitaremos hacer uso de expresiones para definir las extensiones de nuestro sistema, ya que hay cosas que no se pueden hacer de forma literal. Por ejemplo, no podemos definir uno a uno todos los números de teléfono posibles de España. Lo lógico es decir “los teléfonos móviles en España empiezan por “6” y tienen 9 dígitos en total”, y no empezar a enumerar las 1.000.000.000 (mil millones) de posibilidades existentes. Veamos algunos ejemplos:

Significado Expresión
Todas las extensiones de 4 cifras _XXXX
Todas las extensiones de 4 cifras que empiecen por 3 _3XXX
Móviles de España que empiecen por 6 _6XXXXXXXX
Móviles de España que empiecen por 7 _7[1-4]XXXXXXX
Fijos de España que empiezan por 9 _9[1-8]XXXXXXX
Todos los fijos de España _[8-9][1-8]XXXXXXX

A continuación veremos cómo se relacionan las extensiones con las acciones, llamadas “aplicaciones” en Asterisk.

 

Aplicaciones (acciones)

Definición: Las aplicaciones son el conjunto de acciones a ejecutar cuando un usuario inicia una llamada.

Por ejemplo, supongamos que cuando alguien marque “3001”, queremos que suene el teléfono de esa persona. Sería algo así:

También podríamos querer darle un mensaje a la persona que llama antes de pasar la llamada a destino. Por ejemplo:

O pasar la llamada sólo entre las 10h de la mañana y las 20h de la tarde:

Las aplicaciones más utilizadas son las siguientes:

Aplicación Ficha Descripción
Answer URL Descuelga la llamada entrante
Dial URL Realiza una llamada saliente
Hangup URL Termina la llamada en curso
Wait URL Espera X segundos antes de continuar con la siguiente acción
Festival URL Utiliza el sintetizador Festival para emitir mensajes de voz
Playback URL Reproduce un archivo de sonido o vídeo
SayUnixTime URL Dice la fecha y hora actual a la persona llamante
Background URL Reproduce música en espera
NoOp URL No realiza ninguna operación, pero imprime el mensaje indicado en la consola de Asterisk
ExecIf URL Ejecutar la aplicación indicada si se cumple la condición dada
ExecIfTime URL Ejecutar la aplicación indicada si se cumple el requisito de fecha y hora indicados

En esta página web se puede ver un listado completo de aplicaciones de Asterisk junto con la descripción y sintaxis de cada una de ellas:

Asterisk Applications

 

Prioridades

En un lenguaje de scripting, las acciones se van ejecutando de arriba a abajo, en orden. En cambio, en Asterisk, el orden en el que se ejecutan las acciones debe ser explícitamente indicado mediante números. Así, primero se ejecutará la acción 1, después la acción 2, y así sucesivamente.

Es decir, en los ejemplos anteriores no basta con poner las aplicaciones (acciones) una debajo de la otra. Hay que indicar numéricamente el orden, de forma explícita.

Definición: La prioridad representa el orden en el que se ejecutarán las acciones del dialplan.

La sintaxis para indicar el orden la veremos a continuación.

 

PONIENDO TODO JUNTO

Hemos visto cómo se definen las extensiones mediante expresiones, qué aplicaciones (acciones) podemos utilizar, y también que es necesario especificar de forma explícita el orden de éstas. ¿Cuál es la sintaxis de Asterisk para poner todo esto junto?

Por ejemplo, supongamos que cuando alguien marque la extensión 3001, se pase la llamada sólo entre las 10h de la mañana y las 20h de la tarde:

Generalizando el ejemplo anterior, supongamos que queremos el mismo comportamiento cuando alguien marque cualquier extensión desde la 3001 hasta la 3009. Para esto, lo más cómodo es utilizar expresiones:

Fijaos que en este caso hemos utilizado la variable ${EXTEN} dentro de la llamada a Dial() para que se lance la llamada a quien corresponda. La variable ${EXTEN} es una de las variables básicas que utilizaremos, y que contiene la extensión marcada por la persona llamante.

 

PONIENDO TODO JUNTO: VARIANTES

En “Poniendo todo junto” hemos visto la sintaxis básica del dialplan de Asterisk. Sin embargo, a la larga es una sintaxis muy engorrosa de mantener. El problema es que hay que repetir la expresión en cada línea, y hay que indicar la prioridad de ejecución cuando lo normal es que las acciones se ejecuten de arriba a abajo.

Supongamos este dialplan de ejemplo, donde la expresión cuadra con todos los fijos nacionales de España en formato internacional:

Si quisiéramos introducir una nueva aplicación entre Wait() y Dial(), nos obligaría a actualizar los números de prioridad de todas las aplicaciones que vienen debajo. Si el dialplan fuese mucho más largo, digamos 50 acciones en lugar de 5, imaginaos el engorro que puede suponer esto.

Una solución mejor es indicar que las aplicaciones se ejecuten de forma consecutiva, de arriba a abajo. Para esto, podemos utilizar la prioridad “n”, que indica “next”. De esta forma, podemos introducir nuevas aplicaciones en mitad de un dialplan sin tener que actualizar los números de prioridad. Sólo tenemos que indicar cuál es la prioridad “1”, y utilizar prioridad “n” para el resto:

Por otro lado, cambiar la expresión de las extensiones a las que se hacen referencia también resulta un engorro, ya que la expresión aparece en cada una de las líneas del dialplan. Si quisieramos que el segundo dígito admitiera “cero” para poder llamar a números “902 XXX XXX”, tendríamos que modificar cada una de las líneas de este dialplan. Sin embargo, hay otra sintaxis que permite definir la expresión sólo una vez, e indicar en las siguientes líneas que se trata de la misma extensión:

Esta última sintaxis es la que utilizaremos en el presente curso a partir de ahora, ya que es la más cómoda y compacta de todas las posibles.

 

CONTEXTOS

Ya hemos visto cómo se definen las extensiones de marcación y las acciones asociadas a ellas. Según lo estudiado hasta ahora, todos los usuarios tienen las mismas libertades. Ya que no todos los usuarios son iguales, necesitamos algún mecanismo que nos permita variar el comportamiento del sistema en función del mismo. Eso son los contextos.

Cuando definimos un usuario en sip.conf le asignamos un contexto. Cuando ese usuario inicia una llamada, se utiliza ese contexto del dialplan para ver qué extensiones tiene accesibles y qué acciones debe realizar el sistema.

Definición: Los contextos representan la unidad de organización más básica del dialplan de Asterisk. Un contexto engloba extensiones y acciones. Se utiliza para aumentar la seguridad del sistema, y para ofrecer servicios diferenciados en función del usuario.

Un contexto se define de la siguiente manera:

 

EJEMPLO COMPLETO

Supongamos un hotel con una recepción y tres habitaciones que cumple lo siguiente:

  • Para llamar a la recepción hay que marcar “0”
  • Para llamar a las habitaciones hay que marcar el número de habitación: “101”, “102” o “103”
  • La recepcionista puede llamar a cualquier habitación
  • Los huéspedes sólo pueden llamar a recepción (no pueden llamar a otras habitaciones)

Índice del Curso Asterisk: