Date post: | 14-Dec-2014 |
Category: |
Technology |
Upload: | gabriel-astudillo |
View: | 17,123 times |
Download: | 2 times |
Sistemas de VoIP con Asterisk
Modulo III
¿ Que es Asterisk?
Asterisk es una central telefónica IP (IPBX)
de código abierto que corre sobre linux y que
es compatible con la mayoría de tecnologías
de VoIP (SiP, H323, MGCP, IAX, ) y de
telefonía tradicional Análoga y Digital (TDM,
ISDN, BRI, PRI)
Brinda todos los servicios de una PBX
propietaria tradicional
Preparando un Sistema para Asterisk
Selección de Hardware para el Servidor
En términos de requerimientos asterisk es similar a aquellas
aplicaciones embebidas y de tiempo real
En diseños de grandes aplicaciones es común observar una
distribución de de funcionalidades entre múltiples servidores
La flexibilidad es una de las razones de peso por las cuales
los negocios de rápido crecimiento toman la decisión de
implementarlo
Preparando un Sistema para Asterisk
Selección de Hardware para el Servidor
Preparando un Sistema para Asterisk
Selección de Hardware para el Servidor
La selección del hardware puede ser muy sencilla, como
muy complicada al mismo tiempo:
Sencilla porque cualquier plataforma x86 puede servir
Complicada porque el rendimiento del sistema dependerá del
cuidado que se tenga al momento de seleccionar el hardware
Si estamos implementando un sistemas de hobbie o de
aprendizaje podemos obviar este diseño, pero si se trata de
una solución corporativa es importante tener en cuenta las
siguientes diapositivas
Preparando un Sistema para Asterisk
Consideraciones respecto a rendimiento
El máximo numero de conexiones simultaneas:
Cada conexión incrementa carga al sistema
El porcentaje del trafico que requiere un intensivo
procesamiento DSP cuando se usa códecs de compresión
El procesamiento DSP que asterisk hace por software tiene un
impacto directo en el numero de llamadas concurrentes que se
pueden soportar. Ejem: 50 G.711 vs. 10 G.729
Que nivel de conferencia va a brindar el sistema y con que
frecuencia se hará
Preparando un Sistema para Asterisk
Consideraciones respecto a rendimiento
Cancelación de Eco :
Se utiliza cuando se utilizan redes PSTN, es una función matemática
por lo tanto aumenta los recursos de procesamiento
Como alternativa existen las tarjetas para cancelación de ECO y
traducción de códecs que ofrece digium
Preparando un Sistema para Asterisk
Consideraciones respecto a rendimiento
Observar los puertos PCI
Preparando un Sistema para Asterisk
Consideraciones adicionales:
Fuentes de poder
Switch PoE
Medio Ambiente
Humedad
Temperatura
Puesta a Tierra
Seguridad
Requerimientos de Hardware
No indispensable:
Tarjeta de telefonía Analoga TDM400p (4
FXS & FXO), TDM2400p (24 FXS & FXO)
Tarjeta de telefonía Digital TE205p (2 E1
En un ambiente netamente IP solo se necesita cargar
el modulo ztdummy (USB timing)
Requerimientos de software
Primero debemos averiguar la versión exacta de nuestro kernel con el comando: uname -adeberíamos ver algo como:
[root@asterisk ~]# uname -aLinux asterisk.fiec.espol.edu.ec 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
Requerimientos de software
Luego deberíamos verificar si tenemos instaladas las fuentes del kernel, para ello utilizamos el comando rpm -q kernel-devel, deberiamos ver algo como esto:
[root@asterisk ~]# rpm -q kernel-develkernel-devel-2.6.18-8.el5
Si no están instaladas podemos hacerlo con yum de la siguiente forma:
yum install kernel-devel
Requerimientos de software
Ahora si, debemos ejecutar los siguientes comandos para verificar si tenemos instalados los paquetes:
rpm -q bisonrpm -q bison-develrpm -q ncursesrpm -q ncurses-develrpm -q zlibrpm -q zlib-develrpm -q opensslrpm -q openssl-develrpm -q gnutls-develrpm -q gccrpm -q gcc-c++
Requerimientos de software
Si alguno de estos paquetes falta, lo instalamos con yum install nombre-del-paquete
por ejemplo:
[root@asterisk ~]# rpm -q gnutls-develpackage gnutls-devel is not installed[root@asterisk ~]# yum install gnutls-devel
Requerimientos de software
5.- Un paso más antes de empezar con la instalación, CentOS no instala las fuentes del kernel en el directorio /usr/src/linux como esta escrito en los Makefile de Zaptel y Asterisk, para ello nos vamos a /usr/src/ y creamos un link llamado linux hacia el directorio con las fuentes del kernel el cual esta ubicado en /usr/src/kernels/mi_version_del_kernel (aqui utilizamos la información obtenida del paso 2) estos son los resultados que esperamos:
[root@asterisk ~]# cd /usr/src/[root@asterisk src]# ln -s kernels/2.6.18-8.el5-i686/ linux[root@asterisk src]# lltotal 28drwxr-xr-x 2 root root 4096 jun 13 08:43 asteriskdrwxr-xr-x 3 root root 4096 jun 12 13:17 kernelslrwxrwxrwx 1 root root 26 jun 13 09:12 linux -> kernels/2.6.18-8.el5-i686/
Asterisk add-ons
cd /usr/src/asterisk-addons
./configure
make
make install
Opciones del inicio de asterisk
asterisk –h muestra la ayuda
Esta es una lista de las opciones mas usadas:
-c Console, nos permite conectarnos a la consola de asterisk o CLI.
-v Verbosity. Es usada para indicar el numero de lineas que queremos
mostrar en el debug .
-g Core dump. Si asterisk termina inesperdamente, crea un archivo de
core en el que se puede determinar las causas de la falla
-r Remote. Esto es usado para reconectarnos remotamente a un
proceso de Asterisk que este corriendo con aterioridad
Directorios usados por asterisk
/etc/asterisk/
Contiene los archivos de configuración de Asterisk
(.conf). Sin embargo el archivo zaptel.conf se
encuentra ubicado en el directorio /etc/.
Cualquier otro software puede usar el hardware y el
driver de zaptel, por lo tanto el archivo zaptel.conf
no esta ubicado directamente en el directorio
/etc/asterisk
Directorios usados por asterisk
/usr/lib/asterisk/modules/
Este directorio contiene todos los módulos que asterisk
puede llegar a cargar , dentro de este directorio se
encuentran varias aplicaciones, codecs, formatos y canales
usados por Asterisk. Por defecto Asterisk carga todos estos
módulos al inicio. (modules.conf).
/var/lib/asterisk/
Este directorio contiene el archivo astdb y una serie de
subdirectorios. astdb contiene la información de la base de
datos local de Asterisk, una especie de Registro de Win
Directorios usados por asterisk
Los subdirectorios dentro de /var/lib/asterisk son:
agi-bin/
Contiene scripts personales
firmware/
Contiene imágenes binarias de firmware de varios
dispositivos compatibles con asterisk
images/
Las aplicaciones que se comunican con canales que
soportar imagenes, buscan en este directorio
Directorios usados por asterisk
keys/
Aquí se guardan las llaves RSA que se utilizaran en las
comunicaciones peer to peer (IAX2)
mohmp3/
Las aplicaciones que usan music on hold buscaran por
defecto los archivos de audio en este directorio
sounds/
Aquí se buscan por defecto los sonidos básicos de asterisk
reproducios por playback( ) y background( )
Directorios usados por asterisk
/var/log/asterisk
Como el nombre lo indica en esta carpeta asterisk
guarda los logs o archivos de eventos
/var/log/asterisk/cdr-cvs
Este directorio es usado para guardar los CDRs en
un formato CVS o comma-separated value
/var/spool/asterisk/ Este directorio contiene algunos subdirectorios, incluyendo outgoing/, qcall/,
tmp/, y voicemail/. Asterisk monitorea estos directorios en busca de archivos de
texto que contienen información respecto a requerimiento de llamadas.
Configuración inicial de Asterisk
En esta primera parte vamos a asumir que
tenemos una tarjeta Digium TDM11B es decir con 1
puerto FXS y un puerto FXO. Los archivos que
vamos a modificar son:
/etc/zaptel.conf
En este archivo se hace la configuración de “bajo
nivel” para la interfaz de hardware. Vamos a
configurar un canal FXS y FXO. #ztcfg -vv
Configuración inicial de Asterisk
/etc/asterisk/zapata.conf
En este archivo, vamos a configurar para Asterisk
la interfaz de hardware, en otras palabras aquí
configuraremos los canales analógicos.
CLI>module reload chan_zap.so
/etc/asterisk/extensions.conf
En este archivo se creara el plan de marcado, el
primero que haremos será muy primitivo pero
permitirá comprobar que el sistema funciona.
CLI>module reload pbx_config.so
Configuración inicial de Asterisk
/etc/asterisk/sip.conf
En este archivo configuraremos los canales SIP
CLI>module reload chan_sip.so
/etc/asterisk/iax.conf
En este archivo configuraremos los canales IAX
CLI>module reload chan_iax2.so
Antes de empezar…
Vamos a hacer un respaldo de nuestros archivos
para ello en el terminal ejecutamos:
cp /etc/zaptel.conf zaptel.sample
cp /etc/asterisk/zapata.conf zapata.sample
cp /etc/asterisk/extensions.conf
extensions.sample
cp /etc/asterisk/sip.conf sip.sample
cp /etc/asterisk/iax.conf iax.sample
FXS y FXO para Asterisk
Mas simple:
Un puerto FXO no genera tonos de marcado, por el
contrario los recibe.
Un puerto FXS genera un tono de marcado y el voltaje
necesario para hacer indicar a la estación que hay una
llamada entrante.
Los puerto son definidos en los archivos de configuración de
acuerdo a la señalización que usan y en sentido contrario al
tipo de puerto que físicamente son.
Es decir un puerto FXS se define en la configuración como
FXO y viceversa.
FXS y FXO para Asterisk
En tarjetas Digium y en general el modulo FXS es
verde, el FXO es rojo
IMPORTANTE: Conectar la PSTN en un modulo
verde puede destruir el modulo y hasta la tarjeta !!
TDM400P
PCI 2.2
Fuente de Voltaje
FXO PortsFXS Ports
Entradas RJ-11
Configuración de un canal FXO
Configuración del hardware en zaptel
La siguiente configuración mínima define un canal fxo con
señalización fxs:
editamos /etc/zaptel.conf
fxsks=4
loadzone=us
defaultzone=us
La primera línea define el tipo de señalización y el protocolo
para el canal 4:
Loopstart (ls) Groundstart (gs) Kewlstart (ks)
Configuración de un canal FXO
La diferencia esta en la forma como el equipo remoto
solicita el tono de marcado, en groundstart lo hace
mandando momentáneamente a tierra la línea, loopstart lo
hace en cambio usando un corto momentáneo para pedir
tono de marcado. Kewlstart es lo mismo que loopstart pero
es un poco mas eficiente en cuanto permite detectar
desconexiones remotas.
Kewlstart es el mas usado en las implementaciones de
asterisk y funciona bien con las líneas de nuestra localidad.
Configuración de un canal FXO
loadzone configura un grupo de indicaciones (determinadas
en zonedata.c) relativas a los sonidos de la línea en
determinada región o país, tales como tono de marcado,
ciclos de timbrado, tono de ocupado, etc.
defaultzone es usada si ninguna zona se ha especificado
para un canal en particular
Para comprobar los cambios hacemos ztcfg -vvv
Configuración de un canal FXO
Configuración del hardware en zapata
Asterisk usa la información en /etc/asterisk/zapata.conf para
determinar las configuraciones del hardware de telefonía
instalado en el sistema.
El archivo zapata.conf también controla las características y
funcionalidades asociadas con los canales físicos: caller id,
llamada en espera, cancelación de eco y muchas mas.
Configuración de un canal FXOConfiguración del hardware en zapata: /etc/asterisk/zapata.conf
[channels]
; canales físicos:
; opciones por defecto para todos los canales
usecallerid=yes
hidecallerid=no
callwaiting=no
threewaycalling=yes
transfer=yes
echocancel=yes
echotraining=yes
; definicion de canales:
context=incoming ; llamadas entrantes se dirigen a [incoming] en extensions.conf
signalling=fxs_ks ; Use señalizacion FXS para un canal FXO
channel => 4 ; PSTN se conecta al puerto 4
Configuración de un canal FXO
Configuración del hardware en zapata
La sección [channels] determina el método de señalización
para los canales físicos y sus opciones.
Cuando una opción es definida esta es heredada hacia
abajo al resto del archivo.
Un canal se define usando channel => , y cada definición
del canal hereda todas las opciones definidas por encima de
esa línea.
usecallerid=yes habilita el caller ID
hidecallerid=no
No se ocultará el caller ID para las llamadas salientes.
Configuración de un canal FXO
Configuración del hardware en zapata
callwaiting=no
La llamada en espera es desactivada para una linea FXO
threewaycalling=yes
Permite que una llamada activa pueda ser puesta en espera
con un hook flash luego podemos llamar a un tercero e
invitarlo a la conversación con otro hook flash.
transfer=yes
Permite transferir llamadas con un hook flash; requiere que
three-way calling este activada
Configuración de un canal FXO
Configuración del hardware en zapata
echocancel=yes
Habilita la cancelación de eco, se requiere especialmente
en líneas análogas.
echotraining=yes
Le indica a asterisk que envíe un tono a través de la
línea al inicio de la llamada para medir el eco y luego
aprender de el mas rápidamente.
Cuando una llamada ingresa a una interfaz FXO, Usted
desearía que se realice alguna acción verdad ?
Configuración de un canal FXO
Configuración del hardware en zapata
La acción a realizar es configurada dentro de un bloque de
instrucciones llamado contexto el mismo que se configura
en el extensions.conf.
Las llamadas entrantes en la interfaz FXO son
direccionadas al contexto incoming con la línea
context=incoming.
Finalmente como un canal FXO usa señalización FXS, la
definimos en la linea signalling=fxs_ks
Configuración de un canal FXO
CONFIGURACION DEL DIALPLAN
[incoming]
;las llamadas que provienen del puerto FXO son
direccionadas a este contexto desde zapata.conf
exten => s,1,Answer()
exten => s,2,Echo()
Configuración de un canal FXS
La configuración en muy similar a un canal FXO
Configuración del Hardware en zaptel.conf
fxoks=1
fxsks=4
loadzone=us
defaultzone=us
ztcfg –vv:Zaptel Configuration
======================
Channel map:
Channel 01: FXO Kewlstart (Default) (Slaves: 01)
Channel 02: FXS Kewlstart (Default) (Slaves: 02)
2 channels configured.
Configuración de un canal FXS
Configuración del hardware en zapata.conf
La configuración viene prácticamente a ser la misma con la adición de
la línea inmediate=no y las líneas referentes al puerto fxs:
[channels]
; canales físicos:
; opciones por defecto para todos los canales
usecallerid=yes
hidecallerid=no
callwaiting=no
threewaycalling=yes
transfer=yes
echocancel=yes
echotraining=yes
inmediate=no
Configuración de un canal FXS
; definición de canales:
context=internal ; Usaremos el contexto [internal] para las
extensiones en el extensions.conf
signalling=fxo_ks ; Use señalización FXO para un canal FXS
channel => 1 ; teléfono conectado al puerto 1
context=incoming ; Las llamadas entrantes se dirigen hacia
[incoming] en elextensions.conf
signalling=fxs_ks ; Use señalización FXS para un canal FXO
channel => 4 ; PSTN se conecta al puerto 4
Configuración de un canal FXS
CONFIGURACION DEL DIALPLAN
Para probar la configuración que hemos realizado vamos a
agregar las siguientes líneas a nuestro dial plan:
[internal]
exten => 611,1,Answer( )
exten => 611,2,Echo( )
Configuración de un canal SIP
El archivo /etc/asterisk/sip.conf empieza con la sección
[general] que contiene las opciones por defecto y
configuraciones de canal para todos los usuarios y peers
definidos dentro del sip.conf.
Podemos sobrescribir estas configuraciones para un
usuario/peer especifico haciendo los cambios en la
configuración de cada usuario/peer
Configuración de un canal SIP
[general]
context=default
srvlookup=yes
[201]
type=friend
secret=201
qualify=yes ; Qualify peer is no more than 2000 ms away
nat=no ; este usuario no esta a travez de nat
host=dynamic ; este usuario se registrara con nosotros
canreinvite=no ; por defecto asterisk intentara hacer el reenvio
context=internal ; el contexto internal controla el comportamiento de
este canal
Configuración de un canal SIP
srvlookup=yes
Permite que asterisk use los registro DNS SRV para reenviar llamadas usando
nombres de dominio
[201]
Los usuarios se definen entre [] y puede ser cualquier combinación
alfanumerica
type=friend
Los usuarios pueden ser tipo user, peer o friend, user se utiliza para permitir que
el usuario solo pueda recibir llamadas, peer para hacer llamadas salientes y
friend ambas.
secret=201
Secret es el password usado para la autenticación
qualify=yes
Esta linea le permite a asterisk monitorear la latencia entre el usuario y el
servidor por defecto hasta 2000 ms
Configuración de un canal SIP
nat=no
Si una extensión se encuentra a través de un dispositivo que realiza
NAT se debe configurar nat=yes para forzar a Asterisk a ignorar la
información de contacto de la extensión y usar la dirección desde la cual
los paquetes son enviados.
host=dynamic
Requerirá que la extensión se registre para que asterisk sepa como
alcanzar el teléfono. Para limitar el registro desde una sola dirección
IP , colocamos esta en lugar de dynamic, en cambio si se setea
host=static, no se requiere que el dispositivo se registre
canreinvite=no
Asterisk forza a los usuarios a mantenerse en el flujo de media, no
permitiendo que los usuarios intercambien mensajes RTP directamente
Configuración del Cliente SIP
En este curso utilizaremos como cliente SIP a X-lite, que
podemos descargar de www.counterpath.com
Una vez descargado debemos copiar el instalador a
/usr/src/ y lo descomprimimos
Abrimos un terminal, ingresamos a la carpeta que contiene
el instalador con cd /usr/src/x-lite y cambiamos los permisos
para el archivo con :
chmod +x xtensoftphone
./xtensoftphone
Realizamos el wizard de configuración del audio
Configuración del Cliente SIP
El plan de marcado
El plan de marcado es único y se configura
en /etc/asterisk/extensions.conf
Es una lista de instrucciones que asterisk
debe seguir
El plan de marcado tiene 4 definiciones
fundamentales: contexto, extensiones,
prioridades y aplicaciones.
El plan de marcado: contexto
Son secciones del plan de marcado
Son grupos de extensiones “nombradas”
Permite la interacción de diferentes partes
del plan de marcado
Una extensión definida en un contexto esta
totalmente aislada de otra en otro contexto.
En programación “subrutinas”
Se definen así: [contexto] [general] [globals]
[general ] y [globals]
[general]
autofallthrough=no
clearglobalvars=no
El plan de marcado: extensiones
Es una instrucción que asterisk seguirá como
consecuencia de una llamada entrante o por
dígitos marcados en un canal activo
exten => nombre, prioridad, aplicación(p,q,r)
exten => 101,1, Answer( )
El nombre puede ser cualquier combinación
alfanumérica: Juan, 101Juan, 282
El plan de marcado: extensiones
Cada extensión tiene un nombre, puede
tener algunos pasos, cada paso es una
prioridad, la aplicación es el comando que
ejecuta, una acción en la llamada.
exten => 101,1, Answer( )
exten => 101,2, Playback(hello-world)
exten => 101,3, Hangup( )
El plan de marcado: prioridades
Cada prioridad esta numerada secuencialmente
empezando en 1, si se salta una prioridad asterisk
no continuará.
Prioridades no numeradas:
exten => 101,1, Answer()
exten => 101,n, Hacer_algo()
exten => 101,n, Hacer_algo_mas()
exten => 101,n, Hacer_ultimo_paso()
exten => 101,n, Hangup()
exten => 123,n(label),hacer_algo
Plan de marcado simple:
[incoming]
exten => s,1,aplicacion( )
exten => s,2,aplicacion( )
exten => s,3,aplicacion( )
La extensión s
Cuando una llamad entra a un contexto sin una
extensión especifica de destino (por ejemplo una
llamada a un puerto fxo) son recibidas
automáticamente por la extensión s “start”
Las funciones Answer( ), Playback( ) y Hangup( )
[internal]
exten => 555,1,Answer( )
exten => 555,2,Playback(hello-world)
exten => 555,3,Hangup( )
Playback(ruta_al_archivo/archivo)
Solo reproduce el archivo de audio, no presta
atención ni ejecuta acción alguna a los ingresos
hachos por el dialpad, por defecto busca en
/var/lib/asterisk/sounds/
Voces en Español
www.voipnovatos.es/voces/ Descomprimir y copiar en
/var/lib/asterisk/sounds
Agregar la siguiente línea en las configuraciones
globales de zapata.conf y sip.conf:
language = es
Agregando lógica al Dialplan
[internal]
exten => 555,1,Answer( )
exten => 555,2,Background(enter-ext-of-person)
exten => 1,1,Playback(digits/1)
exten => 1,2,Goto(internal,555,1)
exten => 2,1,Playback(digits/2)
exten => 2,2,Goto(internal,555,1)
Agregando lógica al Dialplan
Background(ruta_al_archivo/archivo)
A diferencia de Playback( ), cuando el llamante
presiona una tecla (o serie de teclas) en el pad del
teléfono, este interrumpe la reproducción de audio
y lo envía a la extensión que corresponda de
acuerdo al digito(s) presionados.
Por ejemplo si el llamante presiona 5 asterisk deja
de reproducir el audio y le pasa el control de la
llamada a la primera prioridad de la extensión 5
dentro del mismo contexto en que fue llamado
Agregando lógica al Dialplan
Goto(context, extension, prioridad)
Esta aplicación hace fácil mover una llamada entre
las distintas partes del dialplan.
La sintaxis de la aplicación Goto() nos solicita que
pasemos como argumentos: el contexto, extensión
y prioridad del destino.
En conjunto con background permiten la
interacción con el usuario, su uso mas común es el
los llamados menús de voz, auto atendedores o
arboles telefónicos
Validando entradas y tiempos de espera
Para no permitir el ingreso de extensiones
invalidas(3 en nuestro ejemplo), usamos una
extensión especial ( i )
En cambio para el caso en que el usuario no
ingrese una extensión después de un tiempo
determinado (10 seg.) usamos la extensión t.
Las llamadas serán enviadas a la extensión t si el
llamante toma mucho tiempo en ingresar una
extensión después que Backgrund() ha terminado
de reproducir el archivo de audio
Validando entradas y tiempos de espera
[internal]
exten => 555,1,Answer( )
exten => 555,2,Background(enter-ext-of-person)
exten => 1,1,Playback(digits/1)
exten => 1,2,Goto(internal,555,1)
exten => 2,1,Playback(digits/2)
exten => 2,2,Goto(internal,555,1)
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(internal,555,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup( )
Creación de 2 usuarios SIP
De ahora en adelante vamos a trabajar en grupos de 3 personas: 1 IPBX, 2 Usuarios
Definir:Usuarios y passwordsDireccion IP del Servidor
Llenar el Reporte de instalación
Uso de la aplicacion DialDial(tech/user, timeout, opcion)
El primer parametro es el destino al cual queremos
llamar conformado por la tecnologia (SIP,Zap,IAX)
un slash (/) y la fuente remota(tipicamente un
numero o un usuario)
exten => 123,1,Dial(Zap/1)
exten => 123,1,Dial(SIP/201)
exten => 123,1,Dial(Zap/1&Zap/2&Zap/3)
Uso de la aplicacion DialDial(tech/user, timeout, opcion)
El segundo parametro es el timeout especificado
en segundos y es el tiempo que asterisk intentara
llamar a esa extension, sino lo haria
indefinidamente.
exten => 123,1,Dial(Zap/1,10)
Si el canal es contestado antes del timeout asterisk
puentea ambos canales para permitir la
comunicacion
Uso de la aplicacion Dial
Dial(tech/user, timeout, opcion)
Si el destino no contesta, vencido el timeout,
asterisk pasa a la siguiente prioridad
Si el destino se encuentra ocupado, asterisk pasa a
la extension n+101, si existe
exten => 123,1,Dial(SIP/201,10)
exten => 123,2,Playback(vm-nobodyavail)
exten => 123,3,Hangup( )
exten => 123,102,Playback(tt-allbusy)
exten => 123,103,Hangup( )
Uso de la aplicacion Dial( )
Dial(tech/user, timeout, opcion)
El tercer argumento en un carácter de opción, puede contener mas de uno y su función es modificar el comportamiento de la función Dial ( ) la opción mas popular es ( r ).
La letra r hará que el llamante escuche un tono de timbrado mientras el canal de destino es notificado de una llamada entrante.
Nótese que cualquiera de estos argumentos puede ser dejado en blanco. Por ejemplo si queremos especificar una opción pero no un timeout, simplemente dejamos el argumento en blanco así:
exten => 123,1,Dial(Zap/1, ,r)
Uso de la aplicacion Dial[incoming]exten => 555,1,Answer( )exten => 555,2,Background(enter-ext-of-person)exten => 201,1,Dial(SIP/201,10,r)exten => 201,2,Playback(vm-nobodyavail)exten => 201,3,Hangup( )exten => 201,102,Playback(tt-allbusy)exten => 201,103,Hangup( )exten => 202,1,Dial(SIP/johy,10,r)exten => 202,2,Playback(vm-nobodyavail)exten => 202,3,Hangup( )exten => 202,102,Playback(tt-allbusy)exten => 202,103,Hangup( )exten => i,1,Playback(pbx-invalid)exten => i,2,Goto(internal,555,1)exten => t,1,Playback(vm-goodbye)exten => t,2,Hangup( )
Vision de los Contextos
Vision de los Contextos
Contexto [incoming][incoming]exten => s,1,Answer( )exten => s,2,Background(enter-ext-of-person)
exten => 201,1,Dial(SIP/201,10)exten => 201,2,Playback(vm-nobodyavail)exten => 201,3,Hangup( )exten => 201,102,Playback(tt-allbusy)exten => 201,103,Hangup( )
exten => 202,1,Dial(SIP/202,10)exten => 202,2,Playback(vm-nobodyavail)exten => 202,3,Hangup( )exten => 202,102,Playback(tt-allbusy)exten => 202,103,Hangup( )
exten => i,1,Playback(pbx-invalid)exten => i,2,Goto(incoming,s,1)exten => t,1,Playback(vm-goodbye)exten => t,2,Hangup( )
Contexto [internal]
[internal]exten => 201,1,Dial(SIP/201,20,r)exten => 202,1,Dial(SIP/202,20,r)
Uso de variables
GABRIEL=SIP/201exten => 201,1,Dial(${GABRIEL},10,r)
Variables Globales
Como su nombre lo indica son variables que se aplican a todos las extensiones y en todos los contextos.
Pueden ser definidas de 2 formas:
[globals]GABRIEL=SIP/201
[internal]exten => 123,1,SetGlobalVar(JOHN=Zap/1))
Variables de Canal
Son variables que están asociadas únicamente a una llamada en particular.
A diferencia de las variables globales solo se definen durante la duración de la llamada y en el canal activo únicamente
exten => 123,1,Set(CONTADOR=4)exten => 123,2,Playback(digits/${CONTADOR})
Un claro ejemplo de una variable de canal es el callerid
Agregando Variables al dial plan[globals]GABRIEL=SIP/201JOHN=SIP/202
[incoming]exten => s,1,Answer( )exten => s,2,Background(enter-ext-of-person)exten => 201,1,Dial(${GABRIEL},10,r)exten => 201,2,Playback(vm-nobodyavail)exten => 201,3,Hangup( )exten => 201,102,Playback(tt-allbusy)exten => 201,103,Hangup( )exten => 202,1,Dial(${JOHN},10,r)exten => 202,2,Playback(vm-nobodyavail)exten => 202,3,Hangup( )exten => 202,102,Playback(tt-allbusy)exten => 202,103,Hangup( )
Agregando Variables al dial planexten => i,1,Playback(pbx-invalid)exten => i,2,Goto(incoming,s,1)exten => t,1,Playback(vm-goodbye)exten => t,2,Hangup( )
[internal]exten => 201,1,Dial(${GABRIEL},20,r)exten => 202,1,Dial(${JHON},20,r)
Coincidencia de Patrones
•Es útil para tener que evitar escribir una extensión
para cada uno de los números a los que tenemos
que marcar(sobretodo los números externos a la
organización)
Sintaxis
•Siempre empiezan con el underscore _
•Luego podemos usar uno o varios de los siguientes
caracteres:
• X Representa cualquier digito del 0 al 9• Z Representa cualquier digito del 1 al 9• N Representa cualquier digito del 2 al 9• [15-7] Representa cualquier digito o rango de
digitos en este caso representa al 1,5,6 o 7
Coincidencia de Patrones
Sintaxis
•El punto (.) representa uno o mas caracteres es
conocido como el wilcard.
•Para hacer uso del pattern matching simplemente
lo colocamos en el lugar del nombre de una
extension. Ejemplo:
exten => _NXX,1,Playback(auth-thankyou))
Coincidencia de Patrones
SintaxisSi un usuario digita una extensión de 3 digitos desde el 200 hasta el 999 escuchara el audio auth-thankyou
exten => _555XXXX,1,Playback(digits/1)exten => _55512XX,1,Playback(digits/2)
Pacifictel:exten => _2XXXXXX,1, Acción
Nacional:exten => _0NXXXXXXX,1, Acción
Movistar:exten => _08[45]XXXXXX,1,Accion
Coincidencia de Patrones
Sintaxis
Porta:
exten => _09[732]XXXXXX,1, Acción
exten => _08[567]XXXXXX,1, Acción
Internacional:
exten => _001. ,1, Acción
La pregunta es como asterisk se entera de cual es
el número que he marcado y que deberá pasar a la
función dial ?
Uso de la varible ${EXTEN}
Siempre que digitemos una extensión, Asterisk
guardara en la variable de canal EXTEN los dígitos
que hemos marcado
exten => _8XX,1,SayDigits(${EXTEN})
exten => _8XX,1,SayDigits(${EXTEN:1})
exten => _8XX,1,SayDigits(${EXTEN:-1))
Contextos para llamadas salientes[globals]GABRIEL=SIP/201JOHY=SIP/202PACIFICTEL=Zap/4
[salida-local]ignorepat => 9exten => _92XXXXXX,1,Dial(${PACIFTEL}/${EXTEN:1},10,r)exten => _92XXXXXX,2,Congestion( )exten => _92XXXXXX,102,Congestion( )exten => 911,1,Dial(${PACIFICTEL}/911)exten => 9911,1,Dial(${PACIFICTEL}/911)
Contextos para llamadas salientes[globals]GABRIEL=SIP/201JOHY=SIP/202PACIFICTEL=Zap/4PORTA=Zap/3
[salida-porta]ignorepat => 9exten => _9097XXXXXX,1,Dial(${PORTA}/${EXTEN:1},10,r)exten => _9097XXXXXX,2,Congestion( )exten => _9097XXXXXX,102,Congestion( )
Contextos para llamadas salientesinclude => context
[internal]include => salida-localinclude => salida-portaexten => 201,1,Dial(${GABRIEL},,r)exten => 202,1,Dial(${JOHY},,r)
[salida-local]ignorepat => 9exten => _92XXXXXX,1,Dial(${PACIFTEL}/${EXTEN:1},10,r)exten => _92XXXXXX,2,Congestion( )exten => _92XXXXXX,102,Congestion( )exten => 911,1,Dial(${PACIFICTEL}/911)exten => 9911,1,Dial(${PACIFICTEL}/911)
Contextos para llamadas salientesinclude => context
[salida-porta]ignorepat => 9exten => _9097XXXXXX,1,Dial(${PORTA}/${EXTEN:1},10,r)exten => _9097XXXXXX,2,Congestion( )exten => _9097XXXXXX,102,Congestion( )
Voicemail
Es una de las características mas populares de los sistemas de telefonía actual. En este sentido Asterisk es muy flexible por: (/etc/asterisk/voicemail.conf)
• Voicemail ilimitados con protección de password y con carpetas para organizar los voicemail.• Saludos diferentes para estados “ocupado” y “no disponible”• Saludos por defecto y personalizados• Habilidad para relacionar un teléfono con mas de un voicemail y voicemalis con mas de un usuario• Notificación al correo electrónico de la llegada de un voicemail y posibilidad de adjuntar el archivo de audio• Voicemail forwarding y broadcasts• Creacion de Directorio de la empresa basado en la informacion de los voicemail
Voicemail
Las configuraciones para el voicemail se hacen en el archivo /etc/asterisk/voicemail.conf
mailbox => password,name,email,pager_email,options
optionsEste campo permite ingresar opciones que se sobreponen a las configuraciones globales del mailbox
Se escriben de la forma option=value separados por el carácter pipe (|).
[default]language=es201 => 201,Gabriel Astudillo,[email protected],[email protected],tz=central|attach=yes
Voicemail
Dentro de [internals]
exten => 201,1,Dial(${GABRIEL},10,r)exten => 201,2,VoiceMail(u201@default)exten => 201,102,VoiceMail(b201@default)
Acceso al voicemail:
exten => 500,1,VoiceMailMain( )
Directorio Telefónico
Directory( ) necesita de 3 argumentos: el contexto del voicemail desde donde se leerán los nombres, el contexto del dialplan (extensions.conf) donde se puede ubicar al usuario y un carácter de opción.Por defecto Directory() busca en el directorio por el apellido , pero si le pasamos la opción f, buscará por nombres. Por ejemplo:
exten => 8,1,Directory(default,incoming,f)exten => 9,1,Directory(default,incoming)
Si el llamante presiona 8 obtendrá un directorio ordenado por nombres y si presiona 9 el llamante obtendrá un directorio ordenado por apellidos
Conferencias con MeetMe( )
Ventajas:•Posibilidad de crear conferencias con protección de password.•Administración de conferencias (silenciar, bloquear, kick)•La opción de silenciar a todos los participantes, menos a uno.•Creación estática o dinámica de conferencias
•En /etc/asterisk/meetme.conf editar:
[rooms]conf => 600
Conferencias con MeetMe( )
Para hacerlo disponible desde el dialplan usamos la funcion MeetMe( ), la cual recibe 3 parametros: el nombre del cuarto de conferencias tal como fue definido en meetme.confuna o mas opcionesel password para acceder a la conferencia
exten => 600,1,MeetMe(600,iMp,54321)
•i información de quien entra y quien sale•M música en espera si solo hay una persona en la
conferencia•p opción de presionar # para salir de la conferencia
Macros
Las Macros son construcciones muy útiles, diseñadas para evitar repeticiones en el plan de marcado. También permiten hacer cambios a grandes grupos de extensiones en una manera, rápida, ágil y ordenada.
Recordemos:
exten => 201,1,Dial(${GABRIEL},10,r)exten => 201,2,VoiceMail(u101@default)exten => 201,102,VoiceMail(b101@default)
Imaginen tener que hacer esto para una organización de 100 usuarios !!!!! O tener que agregar una nueva caracteristica a todos los usuarios
Como definir una Macro
La definición de una macro es similar a la de un contexto (de hecho es un contexto “limitado")
[macro-extensiones]exten => s,1,Dial(${GABRIEL},10,r)exten => s,2,VoiceMail(u201@default)exten => s,102,VoiceMail(b201@default)
Noten que esta definición aun no es practica pues solo define al usuario GABRIEL y nos direccionaría a todos los usuario a su voicemailLa única limitante es que para definir un macro siempre debemos utilizar la extensión especial s
Como llamar a una Macro
Macro(nombre,arg1,arg2...)
[internals]exten => 201,1,Macro(extensiones,arg1, arg2)
Al momento de llamar a la función Macro se definen 4 variables de canal que nos van a permitir generalizar su uso:
${MACRO_CONTEXT}${MACRO_EXTEN}${MACRO_PRIORITY}${ARGn}
Como llamar a una Macro
[macro-extensiones]exten => s,1,Dial(${GABRIEL},10,r)exten => s,2,VoiceMail(u${MACRO_EXTEN}@default)exten => s,102,VoiceMail(b${MACRO_EXTEN}@default)
[internals]exten => 201,1,Macro(extensiones,arg1)
Noten que ahora ya podemos pasar al voicemail de cada una de las extensiones, pero aun esta fijo el canal con el cual se establecerá la comunicación. Alguna idea ?
Aplicando la macro al dialplan
[macro-extensiones]exten => s,1,Dial(${ARG1},10,r)exten => s,2,VoiceMail(u${MACRO_EXTEN}@default)exten => s,102,VoiceMail(b${MACRO_EXTEN}@default)
[internal]exten => 101,1,Macro(extensiones,${GABRIEL})exten => 102,1,Macro(extensiones,${MARIA})exten => 103,1,Macro(extensiones,${JOSE})
Expresiones y Manejo de Variables
ExpresionesSe definen como un conjuto de varibales, operadores y valores que se colocan juntas para obtener un resultado.
$[expresion]
Ejemplos:
$[${CONT} + 1]$[${CONT} / 2]
Cuando Asterisk encuentra una expresion, reemplaza toda la expresion por el valor resultante. Es importante notar que antes de hacer esto primero evalua el valor de las varibles
Expresiones y Manejo de Variables
exten => 321,1,Set(CONT=3)exten => 321,2,Set(NEWCONT=$[${CONT} + 1])exten => 321,3,SayNumber(${NEWCONT})
exten => 321,2,Set(NEWCONT=$[3 + 1])exten => 321,2,Set(NEWCONT=4)
Finalmente el valor de 4 es asignado a la variables NEWCONT a través de la función Set( )
Ojo:exten => 123,1,Set(TEST=$[2+1])No es lo mismo que :exten => 234,1,Set(TEST=$[2 + 1])
Expresiones y Manejo de Variables
OperadoresBoleanos
Evalúan la verdad de una sentencia
or expr1 | expr2
and expr1 & expr2
Comparación expr1 {=, >, >=, <, <=, !=} expr2
Matemáticos:
expr1 {+, -} expr2
expr1 {*, /, %} expr2
Ramificación Condicional
Aplicación GotoIf()Esta aplicación es la calve para la ramificación condicional, tiene una sintaxis especial llamada la sintaxis condicional:
GotoIf(expression?destination1:destination2)
Si la expresion es verdadera salta al destino uno, si es falsa salta al destino 2 pero…Que es verdadero y que es falso ?•Un carácter en blanco o el numero cero (0) significan falso, cualquier otra cosa es verdaderoEl destino puede ser:•Una prioridad dentro de la misma extensión Ej: 3•Una extensión y prioridad dentro del mismo contexto (123,10)•Un contexto, extensión y prioridad Ej: incoming,123,10•Una prioridad nombrada dentro de la misma extensión
Ramificación Condicional
Aplicación GotoIf()
exten => 345,1,Set(TEST=1)
exten => 345,2,GotoIf($[${TEST} = 1]?10:20)
exten => 345,10,Playback(weasels-eaten-phonesys)
exten => 345,20,Playback(office-iguanas)
Ramificación Condicional
Aplicación GotoIf()
exten => 123,1,Set(COUNT=10)exten => 123,2,GotoIf($[${COUNT} > 0]?:10)exten => 123,3,SayNumber(${COUNT})exten => 123,4,Set(COUNT=$[${COUNT} - 1])exten => 123,5,Goto(2)exten => 123,10,Hangup( )
El caso de la Ex-enamorada
exten => 123,1,GotoIf($[${CALLERID(num)} = 2397815]?20:10)exten => 123,10,Dial(Zap/4)exten => 123,20,Playback(abandon-all-hope)exten => 123,21,Hangup( )
Ramificación Condicional basada en fechas
Aplicación GotoIfTime()
Similar a GotoIf() pero se diferencian en que GotoIfTime() toma la decisión de pasarle el control basado en la consulta al reloj del sistema )
GotoIfTime(times,days_of_week,days_of_month,months?label)
times: rangos de horas del día en formato 24h, el día comienza a las 00:00 y termina a las 23:59. Ej: 09:00-17:59days_of_week: días de la semana mon, tus, thu… Ej: mon-fridays_of_month: 7-12 (del 7 al 12) o 15,30 (15 y 30)months: jan, feb, mar, apr…
Para hacer coincidir todos los valores hay que poner un * en el lugar del parametro.
Ramificación Condicional basada en fechas
Aplicación GotoIfTime()
GotoIfTime(times,days_of_week,days_of_month,months?label)
El argumento label puede ser cualquiera de los siguientes:
•Una prioridad dentro de la misma extensión Ej: 3
•Una extensión y prioridad dentro del mismo contexto (123,10)
•Un contexto, extensión y prioridad Ej: incoming,123,10
•Una prioridad nombrada dentro de la misma extensión
Ramificación Condicional basada en fechas
Aplicación GotoIfTime()
GotoIfTime(times,days_of_week,days_of_month,months?label)[incoming]
; Si es cualquier hora del dia, en cualquier dia de la semana, ; durante el noveno dia del mes de octubre nuestra empresa esta ;cerrada exten => s,1,GotoIfTime(*,*,10,oct?cerrado,s,1); durante las horas de trabajo envie las llamadas al contexto ;abierto exten => s,2,GotoIfTime(09:00-17:59|mon-fri|*|*?abierto,s,1)exten => s,3,GotoIfTime(09:00-11:59|sat|*|*?abierto,s,1); en cualquier otro caso estamos cerradosexten => s,4,Goto(cerrado,s,1)
IAX Trunking
En el Servidor A configuramos:modificamos en el archivo iax.conf [general] register => amigo:hola@<dir IP del serverB>
[serverB] type=friend user=amigo secret=hola host=<dir IP del serverB > qualify=yes trunk=yes
extensions.conf exten => _7XXX,1,Dial(IAX2/serverB/${EXTEN:1},30,r) exten => _7XXX,2,Congestion( )
IAX Trunking
En el servidor B configuramos: modificamos en iax.conf
[serverA] type=friend user=amigo secret=hola host=direccion IP del serverA qualify=yes trunk=yes
extensions.conf exten => _8XXX,1,Dial(IAX2/serverA/${EXTEN:1},30,r) exten => _8XXX,2,Congestion