voip con asterisk marzo 2010

104
Sistemas de VoIP con Asterisk: Modulo I Marzo 2010 Ing. Gabriel Astudillo

Upload: gabriel-astudillo

Post on 07-Dec-2014

6.720 views

Category:

Technology


0 download

DESCRIPTION

Diapositivas del curso de VoIP con Asterisk, dictado en Guayaquil - Ecuador en marzo del 2010

TRANSCRIPT

Page 1: VoIP con Asterisk Marzo 2010

Sistemas de VoIP con Asterisk: Modulo I

Marzo 2010Ing. Gabriel Astudillo

Page 2: VoIP con Asterisk Marzo 2010

¿ 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

Page 3: VoIP con Asterisk Marzo 2010

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

Page 4: VoIP con Asterisk Marzo 2010

Preparando un Sistema para Asterisk Selección de Hardware para el Servidor

Page 5: VoIP con Asterisk Marzo 2010

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

Page 6: VoIP con Asterisk Marzo 2010

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á

Page 7: VoIP con Asterisk Marzo 2010

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

Page 8: VoIP con Asterisk Marzo 2010

Preparando un Sistema para Asterisk Consideraciones respecto a rendimiento

Observar los puertos PCI

Page 9: VoIP con Asterisk Marzo 2010

Preparando un Sistema para Asterisk Consideraciones adicionales:

Fuentes de poder

Switch PoE

Medio Ambiente

Humedad

Temperatura

Puesta a Tierra

Seguridad

Page 10: VoIP con Asterisk Marzo 2010

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)

Page 11: VoIP con Asterisk Marzo 2010

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

Page 12: VoIP con Asterisk Marzo 2010

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

Page 13: VoIP con Asterisk Marzo 2010

Requerimientos de software Ahora si, debemos ejecutar los siguientes comandos para

verificar si tenemos instalados los paquetes:

yum install bisonbison-develncursesncurses-develzlibzlib-developensslopenssl-develgnutls-develgccgcc-c++

Page 14: VoIP con Asterisk Marzo 2010

Requerimientos de software Si alguno de estos paquetes falta, lo instalamos con

yum install nombre-del-paquete

ejemplo:

package gnutls-devel is not installed[root@asterisk ~]# yum install gnutls-devel

Page 15: VoIP con Asterisk Marzo 2010

Asterisk add-ons cd /usr/src/asterisk-addons

./configure

make

make install

Page 16: VoIP con Asterisk Marzo 2010

Directorios usados por asterisk

/etc/asterisk/ Contiene los archivos de configuración de Asterisk

(.conf). Sin embargo el archivo system.conf se encuentra ubicado en el directorio /etc/dahdi/

Cualquier otro software puede usar el hardware y el driver de dahdi, por lo tanto el archivo system.conf no esta ubicado directamente en el directorio /etc/asterisk

Page 17: VoIP con Asterisk Marzo 2010

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

Page 18: VoIP con Asterisk Marzo 2010

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

Page 19: VoIP con Asterisk Marzo 2010

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( )

Page 20: VoIP con Asterisk Marzo 2010

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-csv Este directorio es usado para guardar los CDRs en

un formato CSV 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.

Page 21: VoIP con Asterisk Marzo 2010

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

Page 22: VoIP con Asterisk Marzo 2010

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/dahdi/system.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. #dahdi_cfg -vv

Page 23: VoIP con Asterisk Marzo 2010

Configuración inicial de Asterisk

/etc/asterisk/chan_dahdi.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_dahdi.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

Page 24: VoIP con Asterisk Marzo 2010

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

Page 25: VoIP con Asterisk Marzo 2010

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

 

 

Page 26: VoIP con Asterisk Marzo 2010

Configuración de un canal SIP[general]context=defaultsrvlookup=yes

[201]type=friendsecret=201qualify=yes ; Qualify peer is no more than 2000 ms awaynat=no ; este usuario no esta a travez de nathost=dynamic ; este usuario se registrara con nosotroscanreinvite=no ; por defecto asterisk intentara hacer el reenviocontext=internas ; el contexto internas controla el comportamiento de

este canal

Page 27: VoIP con Asterisk Marzo 2010

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=friendLos 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 yfriend ambas.

secret=201Secret es el password usado para la autenticación

qualify=yesEsta linea le permite a asterisk monitorear la latencia entre el usuario y el

servidor por defecto hasta 2000 ms

 

 

Page 28: VoIP con Asterisk Marzo 2010

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=dynamicRequerirá 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=noAsterisk forza a los usuarios a mantenerse en el flujo de media, no permitiendo que los usuarios intercambien mensajes RTP directamente

 

Page 29: VoIP con Asterisk Marzo 2010

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 + xtensoftphone

./xtensoftphone

Realizamos el wizard de configuración del audio

 

Page 30: VoIP con Asterisk Marzo 2010

Configuración del Cliente SIP

Page 31: VoIP con Asterisk Marzo 2010

Configuración de un canal IAX 

 

En /etc/asterisk/iax.conf debemos tener: [general]jitterbuffer=yesbindport=4569calltokenoptional = 0.0.0.0/0.0.0.0 requirecalltoken = auto maxcallnumbers = 512 ; http://tinyurl.com/iax2seg

[X06]callerid=mi nombresecret=123type=friendhost=dynamiccontext=internaldisallow=allallow=gsm

CLI>originate IAX2/X06 application echo

Page 32: VoIP con Asterisk Marzo 2010

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.

Page 33: VoIP con Asterisk Marzo 2010

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]

Page 34: VoIP con Asterisk Marzo 2010

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

Page 35: VoIP con Asterisk Marzo 2010

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( )

Page 36: VoIP con Asterisk Marzo 2010

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(contestar),Answer()

Page 37: VoIP con Asterisk Marzo 2010

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 CLI>module reload pbx_config.so

Page 38: VoIP con Asterisk Marzo 2010

[general ] y [globals] [general]

autofallthrough=yes clearglobalvars=no

autofallthrough sirve para que cuando en la ejecución del dialplan no hay nada más que hacer Asterisk termine la llamada de la mejor manera posible

http://tinyurl.com/autofall

Page 39: VoIP con Asterisk Marzo 2010

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=SIP/john))

Page 40: VoIP con Asterisk Marzo 2010

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

Page 41: VoIP con Asterisk Marzo 2010

Uso de la aplicacion DialDial(tech/user, timeout, opcion)

El primer parametro es el destino al cual queremos llamar conformado por la tecnologia (SIP,DAHDI,IAX) un slash (/) y la fuente remota(tipicamente un numero o un usuario)

exten => 123,1,Dial(DAHDI/1)exten => 123,1,Dial(SIP/201)exten => 123,1,Dial(DAHDI/1&DAHDI/2)

Page 42: VoIP con Asterisk Marzo 2010

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 establecer una conexion con el canal definido.

exten => 101,1,Dial(SIP/gabriel,10)

exten => 101,1,Dial(SIP/101,10)

Si el canal es contestado antes del timeout asterisk puentea ambos canales para permitir la comunicacion

Page 43: VoIP con Asterisk Marzo 2010

Uso de la aplicacion DialDial(tech/user, timeout, opcion)

Si el canal destino no contesta, vencido el timeout, asterisk pasa a la siguiente prioridad

Si el canal 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( )

Page 44: VoIP con Asterisk Marzo 2010

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(SIP/101, ,r)

Page 45: VoIP con Asterisk Marzo 2010

Uso de la aplicacion Playback( )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/

Cuando termina de reproducir el archivo de audio, pasa a la siguiente prioridad

Page 46: VoIP con Asterisk Marzo 2010

Ejemplo Completo[general]autofallthrough=yes clearglobalvars=no

[globals]GABRIEL=SIP/201JOHN=SIP/202

[internas]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/202,10,r)exten => 202,2,Playback(vm-nobodyavail)exten => 202,3,Hangup( )exten => 202,102,Playback(tt-allbusy)exten => 202,103,Hangup( )

Page 47: VoIP con Asterisk Marzo 2010

Agregando Variables al dial plan[internas]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( )

Page 48: VoIP con Asterisk Marzo 2010

Grabación de audio con Record()

Record(filename.format, silence, maxduration, options)

Dentro de [internas] :

exten => 282,1,Record(intro%d.gsm)exten => 282,2,Playback(${RECORDED_FILE})exten => 282,3,Hangup()

http://tinyurl.com/asteriskREC

“Usted se ha comunicado con la compañía ABC, si conoce el numero de la extensión digítelo ahora, caso contrario presione 1 para comunicarse con ventas, 2 para soporte técnico, 3 para contabilidad; o manténgase en la línea que una operadora le atenderá”

Page 49: VoIP con Asterisk Marzo 2010

VoicemailEs 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

Page 50: VoIP con Asterisk Marzo 2010

VoicemailLas 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]

201 => 201,Gabriel Astudillo, [email protected],[email protected], tz=central|attach=yes

Page 51: VoIP con Asterisk Marzo 2010

Voicemail

En extensions.conf:

;Dentro de [internas]

exten => 201,1,Dial(SIP/201,10,r)exten => 201,2,VoiceMail(201@default,u)exten => 201,3,Hangup()exten => 201,102,VoiceMail(201@default,b)exten => 201,103,Hangup()

;Acceso al voicemail:

exten => 500,1,VoiceMailMain( )

Page 52: VoIP con Asterisk Marzo 2010

Directorio TelefónicoDirectory( ) 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,internal,f)exten => 9,1,Directory(default,internal)

Si el llamante presiona 8 obtendrá un directorio ordenado por nombres y si presiona 9 el llamante obtendrá un directorio ordenado por apellidos

Page 53: VoIP con Asterisk Marzo 2010

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

Page 54: VoIP con Asterisk Marzo 2010

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,)

•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

Page 55: VoIP con Asterisk Marzo 2010

Expresiones y Manejo de VariablesExpresionesSe definen como un conjunto de variables, operadores y valores que se colocan juntas para obtener un resultado.

$[expresion]

Ejemplos:

$[${CONT} + 1]$[${CONT} / 2]

Cuando Asterisk encuentra una expresión, reemplaza toda la expresión por el valor resultante. Es importante notar que antes de hacer esto primero evalúa el valor de las variables

Page 56: VoIP con Asterisk Marzo 2010

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])

Page 57: VoIP con Asterisk Marzo 2010

Expresiones y Manejo de VariablesOperadoresBoleanos

Evalúan la verdad de una sentencia

or expr1 | expr2

and expr1 & expr2

Comparación expr1 {=, >, >=, <, <=, !=} expr2

Matemáticos:

expr1 {+, -} expr2

expr1 {*, /, %} expr2

Page 58: VoIP con Asterisk Marzo 2010

Agregando lógica al DialplanGoto(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

Page 59: VoIP con Asterisk Marzo 2010

Ramificación CondicionalAplicació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

Page 60: VoIP con Asterisk Marzo 2010

Ramificación CondicionalAplicació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)

Page 61: VoIP con Asterisk Marzo 2010

Ramificación CondicionalAplicación GotoIf()

exten => 123,1,Set(COUNT=10)exten => 123,2,GotoIf($[${COUNT} > 0]?3: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 => 202,1,GotoIf($[${CALLERID(num)} = 201]?20:10)exten => 202,10,Dial(SIP/201,10,r)exten => 202,20,Playback(abandon-all-hope)exten => 202,21,Hangup( )

Page 62: VoIP con Asterisk Marzo 2010

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.

Page 63: VoIP con Asterisk Marzo 2010

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

Page 64: VoIP con Asterisk Marzo 2010

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)

Page 65: VoIP con Asterisk Marzo 2010

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(SIP/201,10,r)exten => 201,2,VoiceMail(201@default,u)exten => 201,3,Hangup()exten => 201,102,VoiceMail(201@default,b)exten => 201,103,Hangup()

Imaginen tener que hacer esto para una organización de 100 usuarios !!!!! O tener que agregar una nueva caracteristica a todos los usuarios

Page 66: VoIP con Asterisk Marzo 2010

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(SIP/201,10,r)exten => s,2,VoiceMail(201@default,u)exten => s,3,Hangup()exten => s,102,VoiceMail(201@default,b)exten => s,103,Hangup()

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 voicemailEn la definición de una macro siempre debemos utilizar la extensión especial s

Page 67: VoIP con Asterisk Marzo 2010

Como llamar a una Macro

Macro(nombre,arg1,arg2...)

[internos]exten => 201,1,Macro(extensiones,arg1, arg2)

Al momento de llamar a la función Macro se definen al menos 4 variables de canal que nos van a permitir generalizar su uso:

${MACRO_CONTEXT}${MACRO_EXTEN}${MACRO_PRIORITY}${ARGn}

Page 68: VoIP con Asterisk Marzo 2010

Como llamar a una Macro

[macro-extensiones]exten => s,1,Dial(SIP/201,10,r)exten => s,2,VoiceMail(${MACRO_EXTEN}@default, u)exten => s,3,Hangup()exten => s,102,VoiceMail(${MACRO_EXTEN}@default, b)exten => s,103,Hangup()

[internos]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 ?

Page 69: VoIP con Asterisk Marzo 2010

Aplicando la macro al dialplan

[macro-extensiones]exten => s,1,Dial(${ARG1},10,r)exten => s,2,VoiceMail(${MACRO_EXTEN}@default, u)exten => s,3,Hangup()exten => s,102,VoiceMail(${MACRO_EXTEN}@default, b)exten => s,103,Hangup()

[internos]exten => 201,1,Macro(extensiones, SIP/201)exten => 202,1,Macro(extensiones,${JOSE})exten => 203,1,Macro(extensiones, SIP/203)

Page 70: VoIP con Asterisk Marzo 2010

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.

Page 71: VoIP con Asterisk Marzo 2010

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 !!

Page 72: VoIP con Asterisk Marzo 2010

TDM410P

PCI 2.2

Fuente de Voltaje

FXO PortsFXS Ports

Entradas RJ-11

Page 73: VoIP con Asterisk Marzo 2010

Configuración de un canal FXO

Configuración del hardware en /etc/dahdi/system.conf

La siguiente configuración mínima define un canal fxo con señalización fxs:

fxsks=4echocanceller=mg2,4loadzone=usdefaultzone=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)

Page 74: VoIP con Asterisk Marzo 2010

Configuración de un canal FXO

La diferencia está 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.

Page 75: VoIP con Asterisk Marzo 2010

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 ejecutamos en el shell [root@espol]# dahdi_cfg -vvv

Page 76: VoIP con Asterisk Marzo 2010

Configuración de un canal FXO

Configuración del hardware en chan_dahdi

Asterisk usa la información en /etc/asterisk/chan_dahdi.conf para determinar las configuraciones del hardware de telefonía instalado en el sistema.

El archivo chan_dahdi.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.

Page 77: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOConfiguración del hardware en /etc/asterisk/chan_dahdi.conf

[channels]; canales físicos:; opciones por defecto para todos los canalesusecallerid=yeshidecallerid=nocallwaiting=nothreewaycalling=yestransfer=yesechocancel=yesechotraining=yes ; definicion de canales:context=entrantes ; llamadas entrantes se dirigen a [entrantes] en extensions.confsignalling=fxs_ks ; Use señalizacion FXS para un canal FXOchannel => 4 ; PSTN se conecta al puerto 4

Page 78: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOConfiguración del hardware en chan_dahdi

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 IDhidecallerid=noNo se ocultará el caller ID para las llamadas salientes.

Page 79: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOConfiguración del hardware en chan_dahdi

callwaiting=noLa llamada en espera es desactivada para una linea FXO

threewaycalling=yesPermite 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=yesPermite transferir llamadas con un hook flash; requiere que three-way calling este activada

Page 80: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOConfiguración del hardware en chan_dahdi

echocancel=yesHabilita la cancelación de eco, se requiere

especialmente en líneas análogas.

echotraining=yesLe 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 ?

Page 81: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOConfiguración del hardware en chan_dahdi

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=entrantes.

Finalmente como un canal FXO usa señalización FXS, la definimos en la linea signalling=fxs_ks

Page 82: VoIP con Asterisk Marzo 2010

Configuración de un canal FXOCONFIGURACION DEL DIALPLAN

[entrantes];las llamadas que provienen del puerto FXO son ;direccionadas a este contexto desde chan_dahdi.confexten => s,1,Answer()exten => s,2,Echo()

Lab: Probar que al llamar al 2269261 contesta la PBX y se reproduce tu propia voz

Page 83: VoIP con Asterisk Marzo 2010

Configuración de un canal FXS La configuración en muy similar a un canal FXO

Configuración del Hardware en system.conf

fxoks=1fxsks=4loadzone=usdefaultzone=us

dahdi_cfg –vvvvvvZaptel Configuration======================Channel map:Channel 01: FXO Kewlstart (Default) (Slaves: 01)Channel 02: FXS Kewlstart (Default) (Slaves: 02)2 channels configured.

Page 84: VoIP con Asterisk Marzo 2010

Configuración de un canal FXSConfiguración del hardware en chan_dahdi.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 canalesusecallerid=yeshidecallerid=nocallwaiting=nothreewaycalling=yestransfer=yesechocancel=yesechotraining=yesinmediate=no

Page 85: VoIP con Asterisk Marzo 2010

Configuración de un canal FXS; definición de canales:

context=internos ; Usaremos el contexto [internos] para las extensiones en el extensions.conf

signalling=fxo_ks ; Use señalización FXO para un canal FXSchannel => 1 ; teléfono conectado al puerto 1

context=entrantes ; Las llamadas entrantes se dirigen hacia [entrantes] en el extensions.conf

signalling=fxs_ks ; Use señalización FXS para un canal FXOchannel => 4 ; PSTN se conecta al puerto 4

 

Page 86: VoIP con Asterisk Marzo 2010

Como recibir una llamada en un canal FXO

[entrantes]exten => s,1,aplicacion( )exten => s,2,aplicacion( )exten => s,3,aplicacion( )

La extensión s Cuando una llamada entra a un contexto sin una

extensión especifica de destino (por ejemplo una llamada a un puerto fxo) deben ser recibidas por la extensión s “start”

Page 87: VoIP con Asterisk Marzo 2010

Las funciones Answer( ), Playback( ) y Hangup( )

[entrantes]exten => s,1,Answer( )exten => s,2,Playback(hello-world)exten => s,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/

Page 88: VoIP con Asterisk Marzo 2010

Agregando lógica al DialplanBackground(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

Page 89: VoIP con Asterisk Marzo 2010

Agregando lógica al Dialplan [entrantes]

exten => s,1,Answer( )exten => s,2,Background(intro1)exten => s,3,WaitExten()

exten => 1,1,Playback(digits/1)exten => 1,2,Goto(entrantes,s,1)exten => 2,1,Playback(digits/2)exten => 2,2,Goto(entrantes,s,1)

Page 90: VoIP con Asterisk Marzo 2010

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

Page 91: VoIP con Asterisk Marzo 2010

Validando entradas y tiempos de espera

[entrantes]exten => s,1,Answer( )exten => s,2,Background(intro04)exten => 1,1,Playback(digits/1)exten => 1,2,Goto(entrantes,s,1)exten => 2,1,Playback(digits/2)exten => 2,2,Goto(entrantes,s,1) exten => i,1,Playback(pbx-invalid)exten => i,2,Goto(entrantes,s,1)exten => t,1,Playback(vm-goodbye)exten => t,2,Hangup( )

Page 92: VoIP con Asterisk Marzo 2010

Vision de los Contextos

Page 93: VoIP con Asterisk Marzo 2010

Contexto [incoming][incoming]exten => s,1,Answer( )exten => s,2,Background(enter-ext-of-person)exten => s,3,WaitExten()

exten => 201,1,Dial(SIP/201,10,r)exten => 201,2,VoiceMail(201@default,u)exten => 201,3,Hangup()exten => 201,102,VoiceMail(201@default,b)exten => 201,103,Hangup()

exten => 202,1,Dial(SIP/201,10,r)exten => 202,2,VoiceMail(202@default,u)exten => 202,3,Hangup()exten => 202,102,VoiceMail(202@default,b)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( )

Page 94: VoIP con Asterisk Marzo 2010

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

Page 95: VoIP con Asterisk Marzo 2010

Coincidencia de PatronesSintaxis•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))

Page 96: VoIP con Asterisk Marzo 2010

Coincidencia de PatronesSintaxisSi 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

Page 97: VoIP con Asterisk Marzo 2010

Coincidencia de PatronesSintaxis

Porta:

exten => _09[732]XXXXXX,1, Acción

exten => _08[567]XXXXXX,1, Acción

Internacional:

exten => _00. ,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 ?

Page 98: VoIP con Asterisk Marzo 2010

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 => _7XX,1,SayDigits(${EXTEN})

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

exten => _9XX,1,SayDigits(${EXTEN:-1))

Page 99: VoIP con Asterisk Marzo 2010

Contextos para llamadas salientes[globals]GABRIEL=SIP/201JOHY=SIP/202PACIFICTEL=DAHDI/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)

Page 100: VoIP con Asterisk Marzo 2010

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( )

Page 101: VoIP con Asterisk Marzo 2010

Contextos para llamadas salientesinclude => context

[internos]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)

Page 102: VoIP con Asterisk Marzo 2010

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( )

Page 103: VoIP con Asterisk Marzo 2010

IAX TrunkingEn 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( )

Page 104: VoIP con Asterisk Marzo 2010

IAX TrunkingEn 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