Capitulo 4

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 21

El Dialplan

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
El Dialplan (Parte I)
Vamos a repasar un poco el archivo de configuración donde volcaremos las reglas que formarán el
dialplan o plan de discado de cada llamada.

Cuando decimos dialplan nos estamos refiriendo al tratamiento de las llamadas que pasen por
nuestra PBX, podemos tener distintos dialplans para cada tipo de llamada; entrantes, salientes, entre
internos, etc.

Este archivo como dijimos se denomina extensions.conf y tiene la siguiente fachada.

- La parte general donde se configuran algunos parámetros generales


- la parte globals donde se definen las variables globales que se van a utilizar en la centralita
- Una ultima parte donde queda toda las configuración de las llamadas

Vamos a repasar la sección general del archivo.

[general]
static=yes
; Si static es “yes” y writeprotect es “no”, para guardar los cambios hechos en el plan de llamadas,
desde la consola de Asterisk habrá que escribir el comando dialplan save.

writeprotect=no

autofallthrough=yes
; Si es “yes” cuando una llamada se sale del plan de llamadas se terminará.

priorityjumping=yes
; Algunas aplicaciones y/o funciones tienen la capacidad, bajo algunas circunstancias, de “saltar”
desde la prioridad donde se encuentran a una prioridad que normalmente es n= +101 donde n es el
numero de la prioridad que se está ejecutando. Si está en “yes” hará ese salto sino no.

extenpatternmatchnew=no
; para plan de llamadas extensos se aconseja poner este parámetro en yes para velocizar la
elaboración del mismo

clearglobalvars=no
;si configurado en yes las variables globales serán borradas y reasignadas cada ver que se recargue
el plan de llamadas con el comando dialplan reload

[globals]
VOIPACK = SIP/iplan
TRAMA = DAHDI/g0
RECEPCION = Sip/100&Sip/101

En Globals se configuran las variables globales que se quiere usar en el dialplan. Pueden ser
invocadas desde cualquier contextos como ${variable}.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Por ejemplo:

exten => _XXXXXXX,1,Dial(${TRAMA}/${EXTEN})


Ahora si en la tercera sección del archivo, va el dialplan en sí. El mismo se divide en “contextos” y
dentro de éstos hay “extensiones”, “prioridades” y “aplicaciones”.

Seguramente a esta altura no somos conscientes, pero acabamos de definir Asterisk a grandes rasgos
todo se basa en contextos, extensiones, prioridades y aplicaciones !!! Si entendemos como se
definen y aplican esos términos, vamos a aprender Asterisk rápidamente.

Los contextos son objetos que almacenan extensiones. Las extensiones son un patrones de números,
a diferencia de las PBX convencionales donde una extensión es un interno, en Asterisk una
extensión puede ser un interno, un voicemail, una sala de conferencias, una cola de llamadas, etc.

En el ejemplo de la figura, vemos que en el contexto test, tenemos la extensión 1234 y para dicha
extensión en la prioridad 1, la aplicación Playback. Esto lo que hace a nivel dialplan es, si algún
peer que tenga como contexto test, cuando marque 1234, lo primero que va a hacer la llamada es
escuchar una locución “tt-weasels” reproducida por la aplicación Playback.

El Dialplan consiste de instrucciones de código que Asterisk ejecutará secuencialmente, en


resumen:

El Dialplan es el corazón del sistema. Esto provee de lógica al sistema, Contiene instrucciones
como:

-Qué hacer cuando alguien realiza una llamada?


-Qué hacer cuando recibimos una llamada por alguna troncal?
-Cómo el sistema interactúa con los llamantes?

El dialplan de Asterisk es como un lenguaje de scripting, Esto es lo que hace que Asterisk sea
poderoso y muy flexible.

El dialplan consiste en una colección de contextos que iremos creando, a su vez cada contexto
consiste en una colección de extensiones (instrucciones con una sintaxis particular)

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Existen cuatro componentes básicos para programar estas instrucciones que van dentro de los
contextos:

- Extensiones
- Prioridades
- Aplicaciones

Como vimos, la sintaxis de una línea del dialplan luce de la siguiente manera:

[contexto]
exten => extensión, prioridad, aplicación

Donde cada uno de estos cuatro componentes de la línea de código (el contexto + los tres elemento
que siguen después de la flecha) los vamos a intentar explicar a continuación. El fragmento de
código “exten =>” es simplemente sintaxis obligatoria.

Contexto: Es un objeto especial en Asterisk, tiene una función esencial que es la de agrupar
debajo de él todas las líneas de código o instrucciones para procesar las llamadas que hereden dicho
contexto.

Aquí trajimos otro término ya citado anteriormente pero no explicado hasta ahora. Cuando decimos
que todas las llamadas heredan un contexto dentro del dialplan tengo que volver al capítulo anterior,
más específicamente a la parte de creación de internos y troncales. Ya que al momento de crear un
interno nosotros definimos dentro del contexto [1000] en el archivo sip.conf un parámetro que se
llamó, valga la redundancia, “context”. Repasemos:
[1000]
type=friend
disallow=all
allow=ulaw
allow=gsm
host=dynamic
qualify=yes
secret=algun_password
context=from­internos

En negrita el parámetro que nos interesa, cuando seteamos context=from-intenos, estamos diciendo
que todas las llamadas que envía el peer 1000 a Asterisk serán tratadas en el contexto from-internos
del archivo extensions.conf de Asterisk. Entonces, podemos imaginar que creamos el contexto
from-internos en el extensions.conf en el cual vamos a procesar todas las llamadas que originen los
internos que tengan dicho contexto seteado. Así quizás debamos generar las instrucciones de código
necesarias, para dichos internos se puedan llamar entre ellos, puedan checkear sus voicemails,
puedan llamar a teléfonos celulares, etc. Cómo hacemos esto? Creando el contexto from-internos y
usando extensiones, prioridades y aplicaciones dentro del contexto.

Es normal que usted se siente un tanto mareado, todo se aclarará fácilmente con un poco de
práctica. Después de hacer los laboratorios correspondientes a este capitulo le recomiendo que
vuelva a leer esta parte.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Dijimos que la la sintaxis de una línea (extensión) del dialplan luce de la siguiente manera:
[contexto]
exten => extensión, prioridad, aplicación

Entonces sigamos con la explicación de cada componente del dialplan...

Extensión: para mantener el hilo de esta parte del capítulo, extensión es un término que también
se presta a la confusión, ya que para los que vienen de la telefonía, la palabra extensión se usa para
referirse a un interno de la PBX. En Asterisk una extensión es un número que los usuarios o clientes
pueden marcar y que contiene acciones que son ejecutadas de manera secuencial, por orden de
prioridad, este número o “extensión” puede tratarse de una llamada a otro interno, a un celular, un
DID para una llamada entrante o quizás el número para checkear los voicemails de su casilla.
exten => 123,1,hacer algo con la llamada
exten => 123,2,hacer otra cosa con la llamada
exten => 123,3, hacer otra cosa diferente con la llamada

En un grupo de código alusivo a una extensión, la primer linea debe tener la prioridad “1”.

Paciencia, todo este enrriedo se aclara con un par de ejemplos.

Prioridad: podemos ir deduciendo que, cuando un interno (por ejemplo) digita una número
“extensión” ésta es buscada en el contexto que heredan las llamadas hechas por ese interno y en
caso de encontrar ese patrón de dígitos que conforman la extensión, se comienzan a realizar
acciones empezando por la prioridad 1 y siguiendo secuencialmente por las prioridades
subsiguientes.

Aplicación: mientras la llamada va “caminando” por el dialplan (conjunto de código con una
extensión en común dentro de un contexto) se van ejecutando diversas aplicaciones, mejor dicho las
aplicaciones que nosotros querramos que se ejecuten. Denominamos aplicaciones a aquellos
módulos de Asterisk que realizan algún tipo de acción sobre la llamada (por ejemplo grabarla). Por
cada prioridad se ejecuta siempre una aplicación.

Ya es hora de tirar algún ejemplo de un código real.

[from­internos]
exten => 1000,1,Dial(Sip/1000,30)
exten => 1000,2,Voicemail(1000)
exten => 1000,3,Hangup()

exten => 2000,1,Dial(Iax2/2000,30)
exten => 2000,2,Voicemail(2000)
exten => 2000,3,Hangup()

Bajo el contexto from-internos vemos dos extensiones, la 1000 y la 2000. Entonces si desde el
interno 1000, cuyo contexto es from-internos (definido en el sip.conf) marcamos el número 2000
(extensión 2000), la llamada buscará “matchear” en el contexto from-internos con la extensión
2000, como esta existe, se ejecutará la prioridad 1, por lo tanto se lanza la aplicación Dial que lo
que hace es “discar” al interno iax 2000 por unos 30 segundos. El interno 2000 ringueará por 30

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
segundos y si no contesta la llamada seguirá en la siguiente prioridad 2 en la que se invoca a la
aplicación Voicemail, que tiene como fin invitar al llamante (en este ejemplo el 1000) a dejar un
correo de voz para el usuario 2000. Finalmente, independientemente de que si dejamos o no el
correo de voz, la llamada continua “caminando” por el dialplan para finalmente terminar en la
última prioridad de la extensión 2000, que se trata de la aplicación Hangup cuyo fin es cortar la
llamada (liberar los canales).

Vamos a aclarar un poco todo esto con un par de gráficos

Figura 1: Escenario planteado

Figura 2: El interno 1000 quiere llamar a la extensión 2000

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Figura 3: Asterisk analiza el contexto del interno 1000

Figura 4: Asterisk corrobora si la extensión está explicitada en el contexto

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Figura 5: Asterisk lleva a cabo la ejecución de la aplicación Dial

Figura 6: se establece la llamada

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Figura 7: se intenta marcar una extensión que no existe en el contexto

Figura 8: Se verifica el contexto del interno 2000

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Figura 9: Se verifica si existe la extensión en el contexto heredado

Figura 10: Asterisk “señaliza“ al interno 2000 que la extensión no existe

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Práctico 3

“Comunicando internos”

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Dialplan (Parte II):

Espero que el práctico recientemente realizado haya sido de ayuda para aclarar todos estos nuevos
conceptos. Vamos a hablar de las Aplicaciones, una de las fuentes de poder de Asterisk.

Aplicaciones
Dijimos que por cada prioridad de una extensión en particular usamos una aplicación la cual
realizará alguna acción sobre el canal establecido entre el terminal que marcó la extensión y
Asterisk. Por ejemplo la aplicación Dial recibe como parámetros el tipo (protocolo) de canal por el
cual discar, el número a discar y establece un nuevo canal entre Asterisk y el destino pasado como
argumento, para luego unir en caso de que el destino tome la llamada.

Antes de comenzar a describir las aplicaciones vistas hasta aquí, debemos saber que desde el cli
disponemos de un help para las aplicaciones, es decir si tecleamos en el cli:

CLI>core show applications

Obtendremos una lista con todas la aplicaciones disponibles y si queremos referirnos a un


aplicación específicamente tecleamos:

CLI>core show application dial

Para el ejemplo usamos la aplicación Dial, pero la ayuda está disponible para cualquier aplicación.
Esto vendría a ser como el man de algún comando de shell.

Vamos a ir aprendiendo aplicaciones todo el tiempo a medida que avancemos en los tópicos, ahora
vamos a aprendernos unas cuantas básicas como para empezar a realizar los primeros pasos.

Aplicación Dial:

Sintaxis:

Dial(Tipo_de_Canal/Nombre_del_canal/Extension,opciones,timeout)

Quizás la aplicación más importante, ya que no permite nada menos que realizar las llamadas!

Donde, el argumento Tipo_de_Canal se refiere a qué clase de vínculo con el destino (troncal) que
queremos crear desde Asterisk hacia el destino. Supongamos que el destino sea un número de un
domicilio conectado a la PSTN. Por lo tanto vamos a suponer también que nuestra PBX se conecta
a la PSTN por medio de una linea análoga, por lo tanto debemos crear un canal DAHDI entre
Asterisk y el destino y luego Asterisk hará un bridge internamente entre los canales, como ya hemos
visto. Además del tipo de canal a crear necesitamos especificarle el nombre del troncal por donde
sacar la llamada, siempre suponiendo que estamos haciendo una llamada saliente. Ya tenemos el
tipo de troncal y el nombre de la troncal (obviamente esta troncal ya debe estar creada) ahora nos
falta el número óoextensión a llamar..., ese es el parámetro Extensión.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Ahora llega el turno de explicar el parámetro opciones, entre ellas citamos las más importantes:

t – Permite al usuario que recibió la llamada transferirla.


T – Permite al usuario que realizó la llamada transferirla.
m – Reproduce música en espera a la parte que llama, en vez del ringback.
W – Permite a la parte llamante comenzar a grabar la llamada ingresando una conminación
de DTMF dada de alta en features.conf (más adelante lo veremos)
w – Permite a la parte llamada comenzar a grabar la llamada ingresando una conminación de
DTMF dada de alta en features.conf.

Finalmente el parámetro timeout, especifica el número de segundos a intentar ringuear a la


extensión destino, cuando se cumple ese tiempo el canal establecido entre Asterisk y el terminal que
origina llamada sigue en la próxima prioridad.

Hagamos una pequeña modificación al dialplan del práctico anterior.


exten => 1000,1,Dial(SIP/1000,tT,20)
exten => 1000,2,Hangup()

exten => 2000,1,Dial(IAX2/2000,tT,20)
exten => 2000,2,Hangup()

exten => 666,1,Playback(demo­congrats)
exten => 666,2,Goto(1000,1)

Cuando por ejemplo el interno 1000 llame a la extensión 2000, Asterisk creará un nuevo canal tipo
IAX2 con el interno 2000, hasta ahora nada diferente. Como pasamos como argumento la opción
“t” y “T”, una vez establecida la llamada entre 1000 y 2000, la persona que esté hablando en el
interno 1000 puede transferir la llamada a otra extensión (otro interno, un teléfono de la PSTN, etc.)
esto es muy común en los entornos corporativos, donde hay veces que un gerente le pide a la
recepcionista que haga una llamada a algún número y después se lo transfiera. La “t” permitiría al
2000 transferir la llamada también a otra extensión. Por supuesto cualquier extensión accesible
desde su contexto. Para nuestro pequeño dialplan sólo podrán transferir a la extensión 666.

Aplicación Playback:

Sitanxis:

Playback(archivo)

Esta aplicación reproduce el archivo de audio pasado como argumento sobre el canal que se crea
entre el terminal que digita la extensión y Asterisk.

exten => 666,1,Playback(demo­congrats)
exten => 666,2,Goto(1000,1)

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Note que no hace falta especificar la extensión del archivo. Este archivo de audio puede ser wav,
gsm y mp3 en caso de haber compilado Asterisk-Addons y debe estar ubicado en
/var/lib/asterisk/sounds/en o /var/lib/asterisk/sounds/es dependiendo de la configuración del
canal del cual está originando la llamada. Es decir si usted está realizando la llamada desde un
interno sip en cuyo archivo se especifica el idioma como inglés, entonces la aplicación Playback
invocada aquí buscará el audio pasado como argumento en: /var/lib/asterisk/sounds/en.

Por defecto obviamente viene todo en inglés, lo que yo hago es reemplazar en la carpeta
/var/lib/asterisk/sounds/en los audios en castellano. Ya veremos como hacerlo en los próximos
laboratorios.

Aplicación Goto:

Sintaxis:

Goto(contexto,extensión,prioridad)

Esta aplicación permite a un canal saltar por el dialplan. Ya hemos visto como funciona así que no
voy a explayarme demasiado. Simplemente decirles que no hace falta pasarle todos los parámetros,
por ejemplo si queremos que el canal vaya a una extensión dentro del mismo contexto no hace falta
que le pase el nombre del contexto, por ejemplo tomemos de nuevo el dialplan del práctico anterior:

[Perfil_1]
exten => 1000,1,Dial(SIP/1000)
exten => 1000,2,Hangup()

exten => 2000,1,Dial(IAX2/2000)
exten => 2000,2,Hangup()

exten => 666,1,Playback(demo­congrats)
exten => 666,2,Goto(Perfil_1,1000,2)

Si yo escribo así la instrucción del goto también hará lo mismo:


exten => 666,2,Goto(1000,2)

Además si queremos que el canal vaya a una prioridad dentro de la misma extensión por donde
viene “caminando” sólo le pasamos dicha prioridad, por ejemplo:
exten => 666,1,Playback(demo­congrats)
exten => 666,2,Goto(5)
exten => 666,3,Voicemail(1000)
exten => 666,4,Playback(tt­weasels)
exten => 666,5,Hangup()

En este dialplan, cuando la llamada llegue al Goto, saltará a la linea

exten => 666,5,Hangup()

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Aplicación Hangup:

Sintaxis:

Hangup()

Como comentamos en el práctico anterior, la aplicación Hangup como su nombre lo dice, hace un
hangup del canal, lo da de baja.

Aplicación WaitExten:

Sintaxis:

WaitExten(segundos)

Esta aplicación es vital para el armado de IVRs, ya veremos más adelante de que se tratan y como
se construye una. Por ahora sólo veremos el comportamiento de WaitExten. Esta aplicación espera
una cantidad de segundos a que el dispositivo que está caminando por esa extensión marque una
nueva extensión y si éste lo hace salta a esta nueva extensión.

Donde segundos es el tiempo que el canal se va a quedar varado en esa prioridad esperando que el
dispositivo introduzca la extensión a donde saltar. En caso de que se cumpla ese tiempo y el
dispositivo no haya introducido ninguna extensión, el canal sigue su curso en la próxima prioridad
dentro de la misma extensión.

Ejemplo:

exten => 1000,1,Dial(SIP/1000)
exten => 1000,2,Hangup()

exten => 2000,1,Dial(IAX2/2000)
exten => 2000,2,Hangup()

exten => 666,1,Playback(demo­congrats)
exten => 666,2,WaitExten(5)
exten => 666,3,Goto(Perfil_1,1000,2)

exten => 1,1,Playback(tt­monkeys)
exten => 1,2,Hangup()

exten => 1,1,Goto(1000,2)

Luego, si llamamos desde un interno a la extensión 666, primero nos reproducirá el audio demo-
congrats y luego nos invitará a digitar una extensión a la cual saltar, esperando 5 segundos para ello.
Si no digitamos nada, la llamada seguirá su curso y se ejecutará la prioridad 3 para la extensión 666
que es un Goto a la prioridad 2 de la extensión 1000.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Si en cambio en la prioridad 2 de la extensón 666, el WaitExten digitamos “1” seguiremos en la
prioridad 1 de la extensión 1, ósea nos reproducirá el archivo de audio tt-monkyes y luego hará un
hangup del canal.

Si en el WaitExten digitamos 2, seguiremos en la prioridad 1 de la extensión 2, ósea el Goto nos


llevará a la prioridad 2 de la extensión 1000, que es un hangup del canal.

Imagine qué útil resulta esta aplicación a la hora de por ejemplo reproducir un audio que
diga...”usted se a comunicado con “Academias Linux” si conoce el número de interno márquelo o
aguarde y será atendido...”

Aplicación Background
Sintaxis:

Background(archivo)

Ya que estamos hablando por anticipado de IVRs vamos a presentar otra aplicación que usaremos
cuando construyamos IVRs. Esta aplicación similar a Playback, ya que reproduce el archivo de
audio que se le pase como argumento, pero además permite el ingreso de dtmf mientras se está
reproduciendo el archivo de audio. Con un ejemplo lo entenderemos mejor:

exten => 666,1,Playback(demo­congrats)
exten => 666,2,WaitExten(5)
exten => 666,3,Goto(Perfil_1,1000,2)

exten => 1,1,Playback(tt­monkeys)
exten => 1,2,Hangup()

exten => 1,1,Goto(1000,2)

Como vemos en la prioridad 1 se reproduce el archivo de audio demo-congrats, luego se lanza la


aplicación WaitExten para que podamos saltar a otra extensión dentro del contexto. Ahora bien,
supongamos que queremos poder ingresar la extensión a saltar mientras se reproduce el archivo de
audio. Con playback esto no lo podemos hacer y ésto es lo que Background nos deja hacer.
exten => 666,1,Background(demo­congrats)
exten => 666,2,WaitExten(5)
exten => 666,3,Goto(Perfil_1,1000,2)

exten => 1,1,Playback(tt­monkeys)
exten => 1,2,Hangup()

exten => 1,1,Goto(1000,2)

Para este caso, si mientras se está reproduciendo el archivo de audio ingresamos 1, automáticamente
se deja de reproducir el archivo de audio y saltamos a la extensión 1. Lo mismo si ingresamos 2.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Esto es útil cuando ya conocemos por ejemplo el pre-atendedor de la empresa, entonces marcamos
directamente el número de interno mientras nos está reproduciendo el ya conocido pre-atendedor.
Un ejemplo de ello también es cuando usted checkea sus correos de voz en su celular, generalmente
no escucha el 100% de la locución...”para escuchar nuevos mensajes presione 1, para opciones
personales ingrese 2.....,etc etc etc.” usted se adelanta a ello y pisa el mensaje con alguna de las
opciones.

Aplicación Wait

Sintaxis:

Wait(segundos)

Esta aplicación simplemente hace esperar un número de segundos el canal en esa prioridad.

Útil para usar junto a la aplicación NoOp para hacer debugs.

Bueno, hasta el momento sólo hemos explicado más formalmente lo que hicimos en el prácico 3 y
vimos alguna que otra aplicación nueva. Desde este momento vamos a empezar a introducir nuevas
funcionalidades y trucos que nos facilitarán las cosas y hará todo mucho más flexible a la hora de
escribir los dialplans.

Siguiendo con el hilo, voy a ir citando estos conceptos de a uno y por medio de ejemplos.

Prioridad 'n' & labels


A esta altura ya sabemos que al marcar una extensión desde algún terminal, Asterisk buscará la
extensión marcada en el dialplan dentro del contexto de ese terminal, si la extensión existe entonces
se ejecuta la prioridad “1” y desde allí sigue ejecutando las prioridades subsiguientes. No hay un
límite de cantidad de prioridades, así que imaginemos que puede resular tedioso cambiar una linea
de programación dentro de una extensión, ya que cada vez que hagamos ello (quitar o agregar una
linea) tendremos que volver a corregir todas las prioridades.

Volvamos al ejemplo anterior, donde teníamos lo siguiente:

exten => 666,1,Playback(demo­congrats)
exten => 666,2,Goto(5)
exten => 666,3,Voicemail(1000)
exten => 666,4,Playback(tt­weasels)
exten => 666,5,Hangup()

Supongamos que queremos borrar la linea del “Goto”. Además de suprimirla, debemos corregir las
prioridades para que queden en orden, es decir:

exten => 666,1,Playback(demo­congrats)
exten => 666,2,Voicemail(1000)
exten => 666,3,Playback(tt­weasels)
exten => 666,4,Hangup()

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Observe que ahora “Voicemail” es prioridad 2, “Playback” 3 y “Hangup” 4. Imaginemos una
extensión con 20 prioridades y debemos suprimir o agregar una línea entre la prioridad 1 y la 2, esto
implicaría modificar el campo prioridad de las 18 instrucciones siguientes!!! Por lo tanto es
evidente que el uso de prioridades numéricas puede dificultar la modificación del dialplan a futuro.

Bueno, aquí es donde la prioridad “n” nos ahorra muchísimo trabajo, cuando en una instrucción
dentro de una extensión nos encontramos con el letra “n” en lugar de el número de prioridad la
instrucción es válida y “n” pasa a tomar el valor de la “prioridad anterior + 1”. Veámoslo con el
ejemplo anterior.

exten => 666,1,Playback(demo­congrats)
exten => 666,n,Goto(5)
exten => 666,n,Voicemail(1000)
exten => 666,n,Playback(tt­weasels)
exten => 666,n,Hangup()

Aquí “Goto” tiene prioridad 2, “Voicemail” tiene prioridad 3, “Playback “ 4 y “Hangup” 5.


Para Asterisk la prioridad “n” toma el valor de “prioridad anterior + 1”, es lo mismo usar la
prioridad “n” a que pongamos la prioridad numérica. Siendo esto para nosotros una gran ventaja ya
que si ahora queremos aplicar por ejemplo la modificación anterior en la cual suprimíamos la linea
del “Goto”, no tenemos que volver a modificar todas las prioridades, ya que “n” va asumiendo el
valor automáticamente.
exten => 666,1,Playback(demo­congrats)
exten => 666,n,Voicemail(1000)
exten => 666,n,Playback(tt­weasels)
exten => 666,n,Hangup()

Ahora “Voicemail” al estar debajo de la prioridad 1 asume la prioridad 2, “Playback “ 3 y así


sucesivamente a medida que vayamos agregando instrucciones con “n” como prioridad.

Un problema que se nos puede presentar es a la hora de introducir en alguna instrucción un salto a
alguna otra parte del dialplan con la aplicación “Goto” ya que se nos hace más incómodo visualizar
la prioridad a la hora de indicarle al Goto a qué prioridad ir. No significa que no se pueda hacer, en
el ejemplo anterior si hago la siguiente modificación:

exten => 666,1,Playback(demo­congrats)
exten => 666,n,Voicemail(1000)
exten => 666,n,Playback(tt­weasels)
exten => 666,n,Goto(2)

Al llegar al Goto se volverá a la instrucción del Voicemail, formando un bucle infinito, ya que cada
vez que se llegue al Goto se vuelve a Voicemail, a menos que el dispositivo que marcó la extensión
666 cuelgue la llamada.

Más allá del ejemplo, lo que importa es que se vea que el “Goto(2)” me sigue llevando a la
prioridad 2 para la extensión 666 por más de que hayamos armado el dialplan con las “n” como
prioridades de cada instrucción.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Si bien la aplicación Goto sigue funcionando cuando usamos “n” como prioridad, resulta algo
incómodo andar contando con la vista donde estará la prioridad por ejemplo “17 “ para alguna
extensión. Entonces lo que usamos en estos casos son “labels” o etiquetas. Las etiquetas nos sirven
para etiquetar o marcar una prioridad de una extensión y periódicamente referirnos a ella. Veamos
un ejemplo.

exten => 666,1,Playback(demo­congrats)
exten => 666,n(correo),Voicemail(1000)
exten => 666,n,Playback(tt­weasels)
exten => 666,n,Goto(correo)

Este código y el anterior funcionan exactamente igual, un dispositivo marca la extensión 666 y al
llegar al Goto se volverá a la instrucción del Voicemail, formando un bucle infinito. Entonces
usando labels esta sintaxis es válida para la aplicación Goto:

Goto(contexto,extensión,label)

Donde es lo mismo usar un label o un número de prioridad.

Variables
En Asterisk las variables pueden ser como las ya vistas “globales”, pero existen otras dos tipos de
variables las “variables de canal” y “variables de entorno”. Asterisk puede hacer uso de las variables
como argumentos para las aplicaciones.

En el dialplan las variables son referenciadas usando la sintaxis siguiente:


${VARIABLE}

De ésta forma, si por ejemplo VARIABLE contiene la cadena “demo-congrats”, si la queremos usar
como argumento de la aplicación Playback lo haríamos de la siguiente forma:
Playback(${VARIABLE})

Y se reproduciría el archivo de audio “demo-congrats”, aunque podemos cambiar el valor de


VARIABLE y por ende Playback reproducirá el archivo de audio al que hagamos referencia con
VARIABLE.

El nombre de una variable puede ser cualquier cadena alfanumérica que comience con una letra.

Como dijimos, existen tres tipos de variables:

- Variables Globales: son aquellas definidas en el contexto [globals] del archivo extensions.conf.
Una vez definidas, éstas pueden ser referenciadas desde cualquier contexto.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
- Variables de canal: hay una colección de ésta clase de variables que son predefinidas por Asterisk
y nosotros podemos referenciar desde el dialplan, dichas variables son muy útiles a la hora de
programar nuestros dialplans. También nosotros podemos crear variables y asignarles un valor
desde el dialplan. Con la aplicación Set las creamos y le asignamos un valor. La variable se crea y
vive para el canal que la invoca, luego de ello de destruye. Ésta clase de variables sólo están
definidas dentro del contexto donde fueron creadas.

- Variables de entorno: proporcionan un medio para acceder a las variables de entorno de Linux
desde Asterisk.

Nos vamos a centrar en la segunda clase de variables, que son las más usadas a la hora de construir
nuestros dialplans.

Listado de variables más importantes:

• ${CALLERID}: Caller ID actual del dispositivo que marcó la extensión.


• ${CONTEXT}: Contexto actual, por el qué va “caminando” el canal.
• ${EXTEN}: Extensión actual, por la que va “caminando” el canal.
• ${PRIORITY}: Prioridad actual.
• ${DATETIME}: Hora actual.
• ${LANGUAGE}: El lenguaje seteado para el tipo de canal.

Exista una aplicación con fines de debug a la que vamos a acudir a la hora de observar en el cli el
valor que posee una variable en ese instante. La aplicación se llama “NoOp”.

Aplicación NoOp:

Sintaxis:

NoOp(lo que quiero imprimir en el cli)

Para el caso de una variable a referenciar sería:

NoOp(${VAR})

Es recomendable que realice el práctico 4 antes de seguir avanzando en el dialplan.

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer
Práctico 4

“Prioridades n, labels & Variables


de canal”

Fabián Pignataro – [email protected]
RHCSA Red Hat Certified Sys. Admin.
dCAP Digium­Certified Asterisk Professional
ECE Elastix Certified Engineer

También podría gustarte