sábado, 14 de marzo de 2009

DIAL PLAN & FEATURES

• Dial Plan & Features
– Dial Plan: Basic DP simple, DP Interactivo
– Dial Plan: Variables, Funciones, Condicionales
– Dial Plan: Voicemail, Macros
– Asterisk: Features

COMANDOS BASICOS ASTERISK

Comandos Asterisk:
asterisk –r: permite reconectarse al servidor
asterisk –g: permite iniciar el servicio asterisk
restart now: permite reiniciar el servicio de asterisk
stop now: permite detener el servicio asterisk
exit: Cierra la consola de asterisk

DIAL PLAN BASICS

El plan de marcación o “Dial Plan”, es el corazón de toda configuración en asterisk, y de esta configuración dependerá el performace y eficiencia de nuestra central telefónica.

Para poder personalizar la central a gusto se deberá comprender plenamente el funcionamiento del plan de marcación de asterisk

Sintaxis:
El plan de marcación se configura en el archivo extensions.conf, este archivo reside usualmente en la carpeta /etc/asterisk/

El dial plan esta compuesto de 04 conceptos principalmente:
- Contextos
- Extensiones
- Prioridades
- Aplicaciones

CONTEXTOS:
El dial plan se divide en secciones llamadas contextos, los contextos son nombres para un grupo de extensiones, las cuales pueden tener diferentes propósitos. Los contextos también pueden interactuar entre ellos.

Los contextos se denotan escribiendo el nombre del contexto entre corchetes “[nombre_de_contexto]”.

Durante la creación de una extensión (sip.conf, iax.conf, etc) se define a que contexto pertenece.

p.e. context=from-internal

Todas las instrucciones por debajo del nombre del contexto son asignadas a ese mismo contexto hasta que un nuevo contexto sea declarado.

Al inicio del archivo extensions.conf, existen dos contextos especiales

-[General]
-[Globals]

La sección general, contiene los parámetros generales del dial plan.

La sección globals, contiene las variables globales del sistema, las cuales irán siendo utilizadas por los contextos siguientes.

EXTENSIONES:
Normalmente conocemos con el nombre de extensión, al numero que se le asigna a los terminales telefónicos, sin embargo en asterisk una extensión es mucho mas que un número _ telefónico, ya que define una serie de pasos (donde cada paso contiene una aplicación) que asterisk realizara durante una llamada.

La sintaxis usada para declarar una extensión es la palabra “exten”, seguido de una flecha formada por una signo igual y un signo mayor

p.e. exten =>

Esto va seguido por el numero de la extensión.

exten => name,priority,application()

Una extensión completa esta compuesta de:

El nombre (o numero) de la extensión.

La prioridad (cada extensión puede incluir múltiples pasos, el numero del paso es llamado prioridad)

La aplicación (o comando) es el que realiza la acción en la llamada.

PRIORIDADES:
Cada extensión puede tener multiples pasos, llamados prioridades, cada prioridad es numerada secuencialmente, comenzando con 1, y ejecutando una aplicación especifica.

Existe un tipo de prioridad “no numerada” que se representa con la letra n y permite evitar problemas generados por la numeración secuencial.

Esta prioridad “no numerada” significa que cada prioridad es igual a la prioridad anterior +1

Por lo tanto: n=n+1
p.e. exten => 123,1,Answer()
exten => 123,n,do something
exten => 123,n,do something else
exten => 123,n,do one last thing
exten => 123,n,Hangup()


PRIORIDADES - ETIQUETAS:

Desde asterisk 1.2, es muy común asignar etiquetas de texto (labels), a las prioridades. Esto es para asegurarnos que podremos referirnos a esa prioridad por un valor distinto a su numero, el cual probablemente no se conozca (prioridad n), y dado que actualmente el uso de prioridades no numeradas es muy usual en el diseño de una dial plan.

Para asignar una etiqueta de texto a una prioridad, solo basta con agregarla entre paréntesis justo después del numero de la prioridad.

p.e. exten => 123,n(label),application()

APLICACIONES:

Las aplicaciones son el caballito de batalla del dial plan, cada aplicación realiza una acción especifica sobre el canal actual, como por ejemplo, tocar una melodía, aceptando entradas de tono, marcar un canal, colgar una llamada, y así sucesivamente.

Algunas aplicaciones como Answer() o Hangup(), no requieren mayor información para hacer su trabajo, sin embargo existen otras aplicaciones que si requieren de cierta información adicional para procesarla, a esta información adicional se le conoce como parámetros, y para pasarle los parámetros a la aplicación deben colocarse entre los paréntesis.

Ocasionalmente podríamos ver el pipe entre los paréntesis, y es que este signo es utilizado para separar mas de un parámetro.

CONSTRUYENDO UN DIAL PLAN SIMPLE:
Answer(), Playback(), Hangup()

Vamos a construir un dial plan que consista en que , asterisk contesta la llamada, toca una melodía, y luego cuelga.
Para este ejemplo vamos a asumir que ya hemos creado la extensión y que tiene como nombre de contexto “from-internal”

Para la construcción de este dial plan utilizaremos las siguientes aplicaciones:

Answer()
Playback()
Hangup()

Answer(), es la aplicación que se utiliza para que la central conteste una llamada que esta timbrando.

Se puede utilizar al inicio de la configuración del contexto para una extension, pero en algunas ocasiones no es necesario.

Como ya mencionamos, Anwser() no tiene argumentos

Playback(), es la aplicación que se utiliza para reproducir un sonido grabado previamente en un archivo o a través de un canal.

Cuando utilizamos playback, las entradas (inputs) del usuario desde la extension son ignoradas.

Para utilizar playback() se debe ingresar el nombre del archivo sin la extension (p.e. .wav o .mp3) como argumento entre los paréntesis.

Por defecto playback buscara el archivo ingresado como argumento en la ruta “/var/libs/asterisk/sounds”

Si se desea hacer referencia a un archivo ubicado en otra ruta, se deberá ingresar la ruta completa entre los paréntesis

Playback(/home/john/sounds/filename)

Lo mas comun es crear una carpeta para estos archivos dentro de la ruta por defecto

Playback(custom/filename)

Ahora si vamos a crear nuestro dial plan

[from-internal]
exten => 1234,1,Answer()
exten => 1234,n,Playback(hello-world)
exten => 1234,n,Hangup()

CONSTRUYENDO UN DIAL PLAN INTERACTIVO:
Background(), WaitExten(), and Goto()

La aplicación background, es la pieza vital para un dial plan interactivo.

El background(), al igual que playback() reproduce una grabación, pero a diferencia de playback(), esta aplicación si permite al usuario ingresar entradas (inputs) desde el teclado del teléfono, estas entradas interrumpen la reproducción y se dirige a la extensión correspondiente.

El uso mas común que suele dársele a la aplicación background, se encuentra en la construcción de menús de voz.

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)

En el ejemplo anterior por defecto se cortara la llamada, pero si lo que queremos es esperar a que el usuario ingrese o marque algun codigo podemos agregarle la aplicación waitexten() al final.

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()

La aplicación WaitExten(), le indica al sistema que espere por el ingreso de una extensión, la cual deberá estar dentro del contexto.

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)
Que ocurre cuando, tenemos un duplicado entre los primeros digitos de las extensiones disponibles:

p.e.

exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)

Del ejemplo anterior si llamamos al 123, y luego presionamos la opción 123, volveremos a ir al menú, pero que ocurre si solo presionamos 1.

Como se puede comprobar en la practica asterisk esperara unos segundos cuando se encuentra con mas de una alternativa posible.

Luego de este tiempo ejecutara la extensión según los dígitos que fueron ingresados.

Finalmente vamos a mencionar que la aplicación WaitExten() soporta como argumento el tiempo en segundos que esperara para que el usuario ingrese una extensión valida, luego de este tiempo terminara esta aplicación, y pasara a la siguiente prioridad si existiera.

Ahora vamos a utilizar la aplicación Goto().

La aplicación Goto(), es utilizada para enviar una llamada a otra parte del dial plan, la sintaxis de la aplicación Goto(), requiere los argumentos contexto, extensión y prioridad.

exten => 123,n,Goto(context,extension,priority)

Background(), WaitExten(), and Goto()

[from-internal]
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(incoming,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(incoming,123,1)

MANEJANDO INPUTS Y TIMEOUTS

[from-internal]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(from-internal,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(from-internal,123,1)
exten => 3,1,Playback(digits/3)
exten => 3,n,Goto(from-internal,123,1)
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(from-internal,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()

MANEJANDO INPUTS Y TIMEOUTS

La opción i, se ejecuta cuando el usuario ingresa una opción invalida, y cuando se cumple el tiempo máximo disponible para que el usuario marque una extensión, la llamada será direccionada automáticamente hacia la extensión t (el timeout por defecto es de 10 segundos).

Utilizando las opciones “i” y “t”, obtenemos un dial plan un poco mas robusto y amigable.

La extensión “S”
Cuando una llamada entra en un contexto sin un destino especifico (por ejemplo una llamada en la línea FXO), se pasa a la extensión s, “S” significa inicio o start.

La extensión “S” es muy utilizada para generar menús en la central telefónica.

El siguiente ejercicio intentara mostrar el funcionamiento de la extensión s, haciendo uso de la aplicación Goto().

[menu]
exten => _98,1,Goto(from-pstn,s,1)

[from-pstn]
exten => s,1,Answer()
exten => s,n,Playback(hello-world)
exten => s,n,Hangup()

Habiendo definido esto ahora pasaremos a ver otras aplicaciones muy importantes, como la aplicación DIAL(), que nos permite comunicar a dos anexos (personas) entre si.

Usando la aplicación Dial()

La aplicación Dial(), es una de las aplicaciones mas importantes con las que cuenta asterisk, tiene la capacidad de conectar dos usuarios uno con el otro.

Esto resulta muy útil sobre todo cuando los usuarios están utilizando distintos tipos de medio de comunicación, por ejemplo.

Por ejemplo podemos utilizar la aplicación Dial() para comunicar a un usuario que llama desde un teléfono analógico a través de la rede de telefonía tradicional, con otro usuario que se puede encontrar en cualquier parte del mundo conectado a través de Internet con su teléfono IP.

La sintaxis de Dial(), es mas compleja que la sintaxis de la funciones anteriores, y puede tener hasta 4 argumentos, el primero el el destino al cual esta intentando conectarte.

Dial(type/identifier, timeout, options, URL)

p.e.
exten => 204,1,Dial(SIP/201)
exten => 202,1,Dial(IAX2/202)

También se pueden llamar a un conjunto de extensiones
p.e.
exten => 111,1,Dial(SIP/202&SIP/203&SIP/204)

Usando la aplicación Dial()

El segundo argumento me permite colocar el tiempo máximo que se ejecutara la aplicación Dial.

exten => 123,1,Dial(Zap/1,10)
exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()

El tercer parámetro puede ser una cadena o carácter, la lista de opciones es bastante larga, y pueden encontrarla en el siguiente hipervínculo:

http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial

Usando la aplicación Dial()
p.e.

exten => 123,1,Dial(Zap/1,10,m)
exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()

El carácter “m”, permite que el usuario que esta llamando escuche la MOH en lugar del tono de ring, hasta que la llamada sea contestada.

Cuando recibimos una llamada podemos derivarla a un menú como el que hemos creado, pero a su vez podemos formar un menú mas completo con el comando Dial(), tal como se aprecia en el siguiente ejemplo:

[from-pstn]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Dial(Zap/1,10)
exten => 1,n,Playback(vm-nobodyavail)
exten => 1,n,Hangup()
eten => 2,1,Dial(SIP/Jane,10)
exten => 2,n,Playback(vm-nobodyavail)
exten => 2,n,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(from-internal,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()

DIAL PLAN: VARIABLES, FUNCIONES, CONDICIONALES

Las variables pueden ser de 03 tipos:

Variables Globales

Variables de Canal

Variables de Entorno

Las variables ayudan a reducir o simplificar el contenido y la estructura del dial plan optimizando de esta manera el proceso de lectura de los archivos de configuración de nuestra centralita. También sirven para agregar lógica a nuestro dial plan.

Una variable es como un contenedor que puede mantener una valor durante un periodo.

Variables Globales, se aplican a todas las extensiones en todos los contextos, esta variables deberán ser declaradas debajo del contexto [globals].

Por ejemplo vamos a guardar el valor SIP/201 en la variable JESUS

[globals]
JESUS=SIP/201
JESSICA=SIP/202
PABLO=SIP/208

exten => 123,1,Dial(${JESUS}&${JESSICA})

Ciertamente el tema de las variables resulta mas interesante cuando las asignamos a las troncales

[globals]

TELEFONICA=ZAP/1
1977=ZAP/2
BASE CLARO=ZAP/3
JESUS=SIP/201
JUAN=SIP/202

Este tipo de esquema nos permite elaborar un dial plan en funciona a variables y si se produce alguna modificación en el esquema, solo bastara con cambiar el valor de la variable y no será necesario modificar todo nuestro dial plan.

Variable de canal, esta variable se asocia solamente con una llamada, y a diferencia de las variables globales, las variables de canal se definen solo para la duración de la llamada actual, y solo están disponibles para los canales que participan de esa llamada.

Existen varias variables de canal predefinidas y están disponibles para ser utilizadas durante la marcación.

p.e.

exten => 125,1,Set(MAGICNUMBER=42)

Las variables de entorno, son una forma de acceder a las variables del entorno unix desde asterisk, podemos hacer referencia a estas variables a través de la funciona de marcación env(), la sintaxis de esta variables es:

${ENV(var)} ; donde var es una variable del entorno de linux o unix a la cual queremos referenciar.

Este tipo de variables no son de uso común en el dial plan pero están disponibles si fuesen necesarias.

Patrones de Marcado y Variable ${EXTEN}

Los patrones de marcación son comodines que nos permiten simplificar un grupo de extensiones, con este tipo de comodines podemos crear reglas que agrupen grandes conjuntos de números en unas cuantas líneas.

X : equivale a un digito 0 – 9
Z : equivale a un digito 1 – 9
N : equivale a un digito 2 – 9
[15-7] : equivale a los dígitos 1, 5, 6, 7.
. : Este comodín equivale a un o mas dígitos sin importar el valor

Patrones de Marcado y Variable ${EXTEN}

La variable EXTEN, toma el mismo valor que el numero de la extensión.

exten => _XXXX,1,SayDigits(${EXTEN})

A partir de esta variable también podemos mutilar el numero marcado, por ejemplo si seguimos la siguiente sintaxis conseguiremos recortar los primeros dígitos del numero.

${EXTEN:x:y} ; “X” es la posición donde comenzara el numero resultante y “Y” es la cantidad de dígitos que serán retornados

exten => _XXXX,1,SayDigits(${EXTEN:2})

Patrones de Marcado y Variable ${EXTEN}

Los siguientes ejemplos ayudaran a comprender mejor las opciones:

exten => _273443,1,SayDigits(${EXTEN:2}); ${EXTEN:2}=3443
exten => _273443,1,SayDigits(${EXTEN:1}); ${EXTEN:1}=73443
exten => _9388211,1,SayDigits(${EXTEN:3}); ${EXTEN:3}=8211
exten => _9388211,1,SayDigits(${EXTEN:3:2}); ${EXTEN:3:2}=82
exten => _9388211,1,SayDigits(${EXTEN:0:1}); ${EXTEN:0:1}=9
exten => _9388211,1,SayDigits(${EXTEN:0:2}); ${EXTEN:0:2}=93
exten => _9388211,1,SayDigits(${EXTEN:-4:2}); ${EXTEN:0:2}=82


exten => _XXXX,1,SayDigits(${EXTEN:2}), devolverá los últimos 3 dígitos que se hallan marcado

Patrones de Marcado y Variable ${EXTEN}

Un ejemplo mas practico seria el siguiente:

Si queremos que los usuarios marquen el nueve antes del numero que van a llamar como en la mayoría de las centrales telefónicas el dial plan seria:


exten => _9.,1,SayDigits(${EXTEN:1}), de esa manera se devolverá el numero que se halla marcado pero sin el 9, listo para salir a la red publica de telefonía.

Patrones de Marcado y Variable ${EXTEN}

Habilitando una ruta saliente:
OUTBOUNDTRUNK=ZAP/1
[outbound-local]
exten => _9NXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1})
exten => _9NXXXXX,n,Congestion()
exten => _9NXXXXX,n,Hangup()

Habilitando una llamada a Numero Fijo Local sin prefijo 9:
OUTBOUNDTRUNK=ZAP/1
[fijo-local]
exten => _[2-8]XXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN})
exten => _[2-8]XXXXXX,n,Congestion()
exten => _[2-8]XXXXXX,n,Hangup()

Patrones de Marcado y Variable ${EXTEN}

Habilitando una ruta saliente a números Fijos LDN:
OUTBOUNDTRUNK=ZAP/1
[outbound-local]
exten => _0[4-8]X[2-8]XXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN})
exten => _0[4-8]X[2-8]XXXXX,n,Congestion()
exten => _0[4-8]X[2-8]XXXXX,n,Hangup()

Habilitando una llamada a Numero LDI:
OUTBOUNDTRUNK=ZAP/1
[fijo-local]
exten => _00.,1,Dial(${OUTBOUNDTRUNK}/${EXTEN})
exten => _00.,n,Congestion()
exten => _00.,n,Hangup()

Includes

Es posible concatenar los contexto mediante el comando include, de echo lo mas común es diseñar distintos contextos para diferentes funciones de la central y luego enlazarlos para formar unos pocos para asignar a los diferentes tipos de extensiones según los privilegios o características que les queremos asignar a cada uno.

Sintaxis:
[contextoA]
include => contextB

Funciones:

Las funciones nos premitiran aumentar el potencial de nuestro dial plan, exiten varias funciones disponibles y trataremos de explicar las mas utilizadas.

Sintaxis:
FUNCTION_NAME(argument)

Al igual que muchas funciones podemos referenciar a la funcion tal como esta escrito en la sintaxis, sin embargo tambien podemos hacer referencia del valor de dicha funcion de la siguiente manera:

${FUNCTION_NAME(argument)}

Funciones:

Una función puede encapsular otra función:

${FUNCTION_NAME(${FUNCTION_NAME(argument)})}

Ejemplo:

exten => 123,1,Set(TEST=example)
exten => 123,n,SayNumber(${LEN(${TEST})})

La función Set(), asigna un valor a una variable.
La función SayNumber(), reproduce el valor de un numero
La función LEN(), devuelve el valor de la longitud de una cadena de letras.

Funciones:

Otra función muy utilizada es la función TIMEOUT(), la cual puede
recibir tres tipos de argumentos, solo uno a la vez:


Absolute; asigna el tiempo absoluto máximo de duración de la llamada

Digit; asigna el máximo de tiempo entre dígitos que puede tomarse un usuario.

Response; es el tiempo máximo de espera cuando el usuario no ingresa ningún digito.


DIAL PLAN CONDICIONALES

La aplicación Gotoif()

La clave para lograr una ramificación condicional entre los contextos de nuestro dial plan es la función gotoif(). Gotoif() evalúa los argumentos ingresados y reenvía al llamante a un destino especifico dependiendo si la evaluación resulto verdadera o falsa.

Sintaxis

GotoIf(expression?destination1:destination2)

Si la expresión resulta verdadera, entonces la llamada saltara hacia el destino 1 si resulta falsa ira hacia el destino 2.

El valor verdadero es representado por el numero 1 y el falso por el numero 0

Los destinos posibles pueden ser los siguientes:

1.- Una prioridad etiquetada dentro de la misma extensión.

2.- Un prioridad etiquetada de otra extensión dentro del mismo contexto.

3.- Una prioridad etiquetada de otra extensión en otro contexto.

Cualquiera de los dos destinos puede ser omitido pero nunca se puede omitir los dos destinos al mismo tiempo.

En caso de que la condicional resulte hacia uno de los destinos omitidos simplemente se proseguirá hacia la siguiente línea o prioridad.

Ejemplo:

exten => 345,1,Set(TEST=1)
exten => 345,n,GotoIf($[${TEST} = 1]?uno:dos)
exten => 345,n(uno),Saydigits(12)
exten => 345,n,Hangup()
exten => 345,n(dos),Saydigits(34)
exten => 345,n,Hangup()


DIAL PLAN VOICEMAIL

Una de las características mas populares de los teléfonos modernos es el sistema de buzón de voz, y naturalmente asterisk tenia que contar con un sistema de voz muy flexible, algunas de las principales características del buzón de voz que nos ofrece asterisk son las siguientes:

Contiene distintos fólderes para organizar los mensajes en el buzón.
Saludos distintos para los estados Ocupado
Saludos por defecto, y personalizados
Posibilidad de asociar varios teléfonos con un buzón y varios buzones con un teléfono
Indicador de mensaje de espera, visual con luz intermitente, y audible con tren de tonos Directorio de la compañía, basado en el buzón de voz.

El archivo de configuración se llama “voicemail.conf”

Creando un Buzón:
Dentro de cada contexto del correo de voz, definiremos distintos buzones de voz, la sintaxis para definir un buzón de voz es la siguiente:

mailbox => password,name[,email[,pager_email[,options]]]

Pero que función cumple cada uno de estos parámetros?

Mailbox: es el numero del buzón de voz, usualmente lleva el mismo numero que la extensión a la que esta asociado.

Password: es la contraseña numérica que el propietario del buzón de voz utilizara para ingresar a su buzón. Si el propietario cambia su contraseña el sistema la actualizara en este archivo (voicemail.conf)

Name: Es el nombre del propietario del buzón de voz, el directorio de la compañía utiliza este campo para realizar la búsqueda del usuario.

Email: Aquí va la dirección de correo electrónico del propietario del buzón de voz, Asterisk puede enviar mensaje al correo, incluyendo el mismo audio del mensaje.

Pager email: dirección de correo del localizador o celular del propietario donde se enviara un mensaje corto.

Options: en esta campo pueden ir una lista de opciones que permitirán afinar la configuración del buzón de voz del propietario del buzón y prevalecen sobre la configuración global. Hay nueve opciones validas: adjuntar, servermail, tz, saycid, review, operator, callback, dialout, y exitcontext.

Estas opciones deber ingresarse respetando el formato “opción=valor” y separadas por el signo pipe “|”, la opción tz permite definir la zona horaria, a las zonas previamente definidas en la sección [zonemessages] en el mismo archivo (voicemail.conf),

Una definición típica para un buzón de voz es la siguiente:

101 => 1234,Joe Public,jpublic@somedomain.com,jpublic@pagergateway.net,tz=central|attach=yes

El buzón de voz utiliza la aplicación voicemail(), esta aplicación envía al llamante a una especifico buzón de voz para que pueda dejar el mensaje, el buzón de voz debe ser especificado como “mailbox@context” donde “context” es el nombre del contexto del correo de voz, opcionalmente se puede agregar las letra “b” y “u”, para diferencias los tipos de saludo (ocupado y no disponible).

Vamos a poner algunos ejemplos de cómo configurar el buzón de voz en nuestro dial plan

exten => 201,1,Dial(${JOHN})

; esta extensión permite llamar a la extensión de Jhon.


exten => 201,1,Dial(${JOHN},10)
exten => 201,n,VoiceMail(101@default,u)

; con esta otra podemos hacer que la extensión de jhon timbre durante 10 segundos y si no contesta derivar la llamada al buzón de jhon, y la u indica que Jhon no esta disponible.


Ahora vamos a combinarlo con la aplicación gotoif()


exten => 201,1,Dial(${JOHN},10)
exten => 201,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => 201,n(unavail),Voicemail(101@default,u)
exten => 201,n,Hangup()
exten => 201,n(busy),VoiceMail(101@default,b)
exten => 201,n,Hangup()

Ingresando al buzón de voz:

Para acceder al buzón de voz utilizaremos la aplicación, VoiceMailMain()

exten => 700,1,VoiceMailMain()
; esto nos preemitirá ingresar al buzón de voz por medio de la extensión 700.

Otra manera también interesante de ingresar al buzón de voz es la siguiente:

exten => _*982XX,1,VoiceMailMain(${EXTEN:3}@default)
exten => _*982XX,1,Hangup

Aplicación Directorio: directory()

Esta aplicación puede aceptar hasta 3 argumentos, el primero el es contexto dentro del archivo voicemail.conf, donde buscara a los usuarios, el segundo es el contexto en extensions.conf, desde donde intentara llamar a los usuarios, y el tercero (es opcional), puede ser la letra f, por defecto el directorio realiza la búsqueda por el apellido, pero con la letra f se puede configurar el directorio para que realice la búsqueda por nombre.

Por ejemplo:
exten => 8,1,Directory(default,from-internal,f)
exten => 9,1,Directory(default,from-internal)


DIAL PLAN MACROS

Las macros resultan de mucha ayuda a la hora de elaborar el dial plan, ya que nos permiten simplificar aun mas la elaboración de nuestro dial plan, es como crear nuestras propias funciones personalizadas para el dial plan, a continuación vamos a utilizar como ejemplo la creación de una macros para el buzón de voz.

Observemos el siguiente dial plan:

exten => 201,1,Dial(${JOHN},10)
exten => 201,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => 201,n(unavail),Voicemail(101@default,u)
exten => 201,n,Hangup()
exten => 201,n(busy),VoiceMail(101@default,b)
exten => 201,n,Hangup()

En el hemos automatizado la forma como las llamadas ingresaran directamente al buzón de voz dependiendo del estado de la extensión utilizando la variable ${STATUS}, sin embargo así como esta tendríamos que agregar estas líneas por cada extensión en la central ya que esta extensión estará siempre ligada hacia el usuario Jhon o sea la extensión 201.

Utilizaremos las macros para mostrar cual es la mejor manera de configurar una buzón de voz para varias extensiones.

Definiendo la macros
La macros se definen de una manera muy similar a los contextos,
debemos definir una macros entre corchetes y anteponiendo la palabra
“macro-” antes del nombre de la macro que vamos a crear.

Ejemplos:

[macro-prueba]

[macro-voicemail]

De esta manera el sistema podrá diferenciar una macro de un contexto
normal

Definiendo la macros

Veamos un ejemplo con el buzón de Jhon pero ahora dentro de una
macros

[macro-voicemail]
exten => s,1,Dial(${JOHN},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(101@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(101@default,b)
exten => s,n,Hangup()

Uno punto importante es mencionar que las macros solo soportan la
extensión “S”
Todo va bien solo que aun seguimos amarrados al buzón de Jhon.

Definiendo la macros

Sin embargo las macros tienen propiedades importantes a comparación
de un contexto común corriente. Y es que permiten trabajar con algunas
variables adicionales e incluso soportan el envió de argumentos

Incorporando una macros al Dial Plan:

exten => 201,1,Macro(voicemail)

Las aplicación macro define variables especiales, para su utilización:

${MACRO_CONTEXT}, contiene el contexto original desde donde fue ejecutada la macro

${MACRO_EXTEN}, contiene el valor de la extensión original donde fue ejecutada la macro

${MACRO_PRIORITY}, contiene la prioridad original desde donde fue ejecutada la macro

${ARGn}, contiene el “n” mismo argumento ingresado a través de la macro, por ejemplo, el primer argumento será ${ARG1}, el segundo argumento será {ARG2} y así sucesivamente.

En el siguiente ejemplo trataremos de explicar como se pueden utilizar esta variables especiales:

[macro-voicemail]
exten => s,1,Dial(${JOHN},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

Usando argumentos en las macros

Ahora vamos a prepara una macros genérica gracias a los argumentos, observemos el siguiente ejemplo donde por fin separamos la macros del numero de la extensión, para poder utilizarla desde cualquier extensión.

[macro-voicemail]
exten => s,1,Dial(${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

De esta manera podemos llamar a la macros desde el dial plan

[macro-voicemail]
exten => s,1,Dial(${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

[from-internal]
exten => 101,1, Macro(voicemail,${JOHN})
exten => 102,1,Macro(voicemail,${JANE})
exten => 103,1,Macro(voicemail,${JACK})

Incluso podemos simplificar una vez mas utilizando la variable ${EXTEN}

[macro-voicemail]
exten => s,1,Dial(SIP/${ARG1},10)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()

[from-internal]
exten => 1XX,1,Macro(voicemail,${EXTEN})

Solo debemos tomar en cuenta que en esta ocasión estamos amarrados al protocolo SIP, en el ej. Anterior no importaba el tipo de canal utilizado ya que este se declaraba como variables globales.

Un ejemplo mas avanzado he interesante de analizar es el siguiente:

[macro-voicemail]
exten => s,1,Dial(${ARG1},20)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Voicemail(${MACRO_EXTEN},u)
exten => s-NOANSWER,n,Goto(incoming,s,1)
exten => s-BUSY,1,Voicemail(${MACRO_EXTEN},b)
exten => s-BUSY,n,Goto(incoming,s,1)
exten => _s-.,1,Goto(s-NOANSWER,1)

En esta ocasión estamos incluyendo el comando Goto y esto nos puede servir para reenviar la llamada hacia un menú por ejemplo donde el usuario llamante tenga mas de una opción.

ASTERISK: FEATURES

Podemos configurar algunas características adicionales en el archivo features.conf.

Las características principales son las siguientes:

Transferencia desatendida (blind transfer)
Parqueo de llamadas (parking lot)
Grupo para jalar llamadas (pickup group)
Sala de conferencias (meetme)

Para ello será necesario que editemos el archivo features.conf ubicado en la carpeta de asterisk.

TRANSFERENCIAS DESATENDIDA

Normalmente por defecto la transferencia desatendida se realiza presionado el boton #

Este tipo de transferencia consiste en derivar la llamada hacia otro anexo sin habernos cerciorado antes si la persona en la extensión destino se encuentra disponible para recibir la llamada.

Vamos a editar el archivo de la ruta /etc/asterisk/features.conf
Donde buscaremos el parámetro blind transfer y cambiaremos el varo “#” por “##”, con esto conseguiremos evitar problemas con las llamadas hacia números que comiencen con la tecla “#” como los móviles RPM por ejemplo.

El siguiente grafico ilustrara mejor el proceso de comunicación



Realizar una transferencia atendida, consiste en llamar al destino para confirmar la transferencia, antes de realizarla.
Este tipo de transferencia suele ser necesario para trabajadores que no acostumbran contestar ni llamar directamente de su extensión, tales como funcionarios, gerentes, ejecutivos, etc.

El siguiente grafico nos ilustrara el proceso de comunicación.

Se puede habilitar una combinación para la transferencia atendida, por ejemplo *2 para simular la tecla flash



PARQUEO DE LLAMADAS

En algunas ocasiones durante una conversación telefónica es necesario movilizarnos ( para ir a conseguir un archivo, documento, o realizar alguna consulta), pero lamentablemente no es posible ni practico que todos los usuario cuenten con un anexo inalámbrico, en estos casos es ideal contar con la función de parqueo de llamadas.

Esta función consiste en aparcar una llamada en una extensión virtual dentro de nuestra central telefónica, de esta manera podremos recuperar esa llamada simplemente llamando a la extensión virtual creada en el momento que aparcamos la llamada



Esta función se habilita en la sección [general]

Y cuenta con los siguientes parámetros:

Parkext => 700 donde 700 es el numero de la extensión de entrada al estacionamiento

Parkpos => 701-720, aquí definimos el rango de posiciones apra nuestro estacionamiento

Context => parkedcalls, aquí definimos el nombre del contexto en para nuestro estacionamiento, no olvidar que este contexto debe estar incluido (include) en el contexto de las extensiones que queramos que puedan recuperar llamadas desde el estacionamiento.

Parkingtime => 180, este será el tiempo máximo en segundos que una llamada se mantendrá en el estacionamiento.

PICKUP GROUP

Un Pick up group es un grupo conformado por extensiones con autorización para “jalarse” las llamadas, es decir; estas extensiones podrán contestar llamadas dirigidas hacia cualquier anexo de su grupo, pero marcando previamente un código.

Por ejemplo si tenemos dos extensiones en un mismo grupo, y llaman a una de ellas pero justo no se encuentra la persona en su extensión, entonces otra persona podrá contestar la llamadas desde su extensión (siempre que este dentro del mismo pickup group) con solo presionar: *8



Esta opción también se encuentra en la sección general y podemos definir o modificar el código por defecto *8 en el parámetro:

Pickupexten = *8

Pero será necesario también que asignemos los grupos a cada extensión en el archivo sip.conf.

El grupo puede asignarse mediante los parámetros:
Callgroup=1, donde 1 es el número del grupo de llamada
Pickupgroup=1, donde 1 es el número del grupo para pickup

2 comentarios:

Unknown dijo...

thank you!

Unknown dijo...

Excelente Gracias!!

Publicar un comentario