VoIP con Asterisk Marzo 2010

  • 4,884 views
Uploaded on

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

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

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,884
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
780
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Sistemas de VoIP con Asterisk: Modulo I Marzo 2010 Ing. Gabriel Astudillo
  • 2. ¿ 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
  • 3. 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
  • 4. Preparando un Sistema para Asterisk Selección de Hardware para el Servidor
  • 5. 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
  • 6. 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á
  • 7. 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
  • 8. Preparando un Sistema para Asterisk
    • Consideraciones respecto a rendimiento
    • Observar los puertos PCI
  • 9. Preparando un Sistema para Asterisk
    • Consideraciones adicionales:
    • Fuentes de poder
    • Switch PoE
    • Medio Ambiente
      • Humedad
      • Temperatura
    • Puesta a Tierra
    • Seguridad
  • 10. 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)
  • 11. Requerimientos de software
    • Primero debemos averiguar la versión exacta de nuestro kernel con el comando: uname -a deberíamos ver algo como: [root@asterisk ~]# uname -a Linux 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
  • 12. 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-devel kernel-devel-2.6.18-8.el5
    • Si no están instaladas podemos hacerlo con yum de la siguiente forma: yum install kernel-devel
  • 13. Requerimientos de software
    • Ahora si, debemos ejecutar los siguientes comandos para verificar si tenemos instalados los paquetes: yum install bison bison-devel ncurses ncurses-devel zlib zlib-devel openssl openssl-devel gnutls-devel gcc gcc-c++
  • 14. 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
  • 15. Asterisk add-ons
    • cd /usr/src/asterisk-addons
    • ./configure
    • make
    • make install
  • 16. 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
  • 17. 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
  • 18. 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
  • 19. 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( )
  • 20. 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.
  • 21. 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
  • 22. 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
  • 23. 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
  • 24. 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
  • 25. 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
    •  
    •  
  • 26. 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=internas ; el contexto internas controla el comportamiento de este canal
  • 27. 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
    •  
    •  
  • 28. 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
    •  
  • 29. 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
    •  
  • 30. Configuración del Cliente SIP
  • 31. Configuración de un canal IAX     En /etc/asterisk/iax.conf debemos tener: [general] jitterbuffer=yes bindport=4569 calltokenoptional = 0.0.0.0/0.0.0.0 requirecalltoken = auto maxcallnumbers = 512 ; http://tinyurl.com/iax2seg [X06] callerid=mi nombre secret=123 type=friend host=dynamic context=internal disallow=all allow=gsm CLI>originate IAX2/X06 application echo
  • 32. 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.
  • 33. 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]
  • 34. 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
  • 35. 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( )
  • 36. 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()
  • 37. 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
  • 38. [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
  • 39. 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) )
  • 40. 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
  • 41. Uso de la aplicacion Dial Dial(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)
  • 42. Uso de la aplicacion Dial Dial(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
  • 43. Uso de la aplicacion Dial Dial(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( )
  • 44. 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)
  • 45. 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
  • 46. Ejemplo Completo [general] autofallthrough=yes clearglobalvars=no [globals] GABRIEL=SIP/201 JOHN=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( )
  • 47. 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( )
  • 48. 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á”
  • 49. 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
  • 50. Voicemail Las configuraciones para el voicemail se hacen en el archivo /etc/asterisk/voicemail.conf mailbox => password, name, email, pager_email, options options Este 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, gastudillo@gmail.com, 84519925@im.movistar.com.ec, tz=central|attach=yes
  • 51. 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( )
  • 52. 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,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
  • 53. 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
  • 54. 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.conf
    • una o mas opciones
    • el 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
  • 55. Expresiones y Manejo de Variables Expresiones Se 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
  • 56. 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])
  • 57. Expresiones y Manejo de Variables Operadores Boleanos Evalúan la verdad de una sentencia or expr1 | expr2 and expr1 & expr2 Comparación expr1 {=, >, >=, <, <=, !=} expr2 Matemáticos: expr1 {+, -} expr2 expr1 {*, /, %} expr2
  • 58. 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
  • 59. 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 verdadero
    • El 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
  • 60. 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)
  • 61. 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 => 202,1,GotoIf($[${CALLERIDNUM} = 201]?20:10) exten => 202,10,Dial(SIP/201) exten => 202,20,Playback(abandon-all-hope) exten => 202,21,Hangup( )
  • 62. 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:59 days_of_week: días de la semana mon, tus, thu… Ej: mon-fri days_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.
  • 63. 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
  • 64. 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 cerrados exten => s,4,Goto(cerrado,s,1)
  • 65. 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
  • 66. Como definir una Macro La definición de una macro es similar a la de un contexto (de hecho es un contexto “limitado&quot;) [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 voicemail La única condicion es que para definir un macro siempre debemos utilizar la extensión especial s
  • 67. 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) [internals] exten => 101,1,Macro(extensiones,SIP/101) exten => _1XXX,1,Macro(extensiones,${EXTEN}) exten => 103,1,Macro(extensiones,${JOSE})
  • 68. 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} ${ARG n}
  • 69. 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 ?
  • 70. 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.
  • 71. 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 !!
  • 72. TDM410P PCI 2.2 Fuente de Voltaje FXO Ports FXS Ports Entradas RJ-11
  • 73. 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=4 echocanceller=mg2,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)
  • 74. 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.
  • 75. 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
  • 76. 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 .
  • 77. Configuración de un canal FXO Configuración del hardware en /etc/asterisk/chan_dahdi.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
  • 78. Configuración de un canal FXO
    • Configuració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 ID hidecallerid=no No se ocultará el caller ID para las llamadas salientes.
  • 79. Configuración de un canal FXO
    • Configuración del hardware en chan_dahdi
    • 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
  • 80. Configuración de un canal FXO
    • Configuración del hardware en chan_dahdi
    • 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 ?
  • 81. Configuración de un canal FXO
    • Configuració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=incoming .
    • Finalmente como un canal FXO usa señalización FXS, la definimos en la linea signalling=fxs_ks
  • 82. Configuración de un canal FXO CONFIGURACION DEL DIALPLAN [incoming] ;las llamadas que provienen del puerto FXO son ;direccionadas a este contexto desde chan_dahdi.conf exten => s,1,Answer() exten => s,2,Echo() Lab: Probar que al llamar al 2269261 contesta la PBX y se reproduce tu propia voz
  • 83. Configuración de un canal FXS
    • La configuración en muy similar a un canal FXO
    • Configuración del Hardware en system.conf
    • fxoks=1 fxsks=4 loadzone=us defaultzone=us dahdi_cfg –vvvvvv Zaptel Configuration ====================== Channel map: Channel 01: FXO Kewlstart (Default) (Slaves: 01) Channel 02: FXS Kewlstart (Default) (Slaves: 02) 2 channels configured.
  • 84. Configuración de un canal FXS
    • Configuració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 canales usecallerid=yes hidecallerid=no callwaiting=no threewaycalling=yes transfer=yes echocancel=yes echotraining=yes inmediate=no
  • 85. 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 el extensions.conf signalling=fxs_ks ; Use señalización FXS para un canal FXO channel => 4 ; PSTN se conecta al puerto 4
    •  
  • 86. Como recibir una llamada en un canal FXO
    • [incoming] 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”
  • 87. Las funciones Answer( ), Playback( ) y Hangup( )
    • [incoming] 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/
  • 88. Agregando lógica al Dialplan [incoming] exten => s,1,Answer( ) exten => s,2,Background(intro1) exten => s,3,WaitExten() exten => 1,1,Playback(digits/1) exten => 1,2,Goto(incoming,s,1) exten => 2,1,Playback(digits/2) exten => 2,2,Goto(incoming,s,1)
  • 89. 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
  • 90. 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
  • 91. Validando entradas y tiempos de espera [entrantes] exten => s,1,Answer( ) exten => s,2,Background(enter-ext-of-person) 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( )
  • 92. Uso de la aplicacion Dial [entrantes] exten => s,1,Answer( ) exten => s,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( )
  • 93. Vision de los Contextos
  • 94. Vision de los Contextos
  • 95. 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) 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( )
  • 96. 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
  • 97. 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) )
  • 98. Coincidencia de Patrones Sintaxis Si 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
  • 99. Coincidencia de Patrones Sintaxis 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 ?
  • 100. 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))
  • 101. Contextos para llamadas salientes [globals] GABRIEL=SIP/201 JOHY=SIP/202 PACIFICTEL=DAHDI/4 [salida-local] ignorepat => 9 exten => _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)
  • 102. Contextos para llamadas salientes [globals] GABRIEL=SIP/201 JOHY=SIP/202 PACIFICTEL=Zap/4 PORTA=Zap/3 [salida-porta] ignorepat => 9 exten => _9097XXXXXX,1,Dial(${PORTA}/${EXTEN:1},10,r) exten => _9097XXXXXX,2,Congestion( ) exten => _9097XXXXXX,102,Congestion( )
  • 103. Contextos para llamadas salientes include => context [internal] include => salida-local include => salida-porta exten => 201,1,Dial(${GABRIEL},,r) exten => 202,1,Dial(${JOHY},,r) [salida-local] ignorepat => 9 exten => _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)
  • 104. Contextos para llamadas salientes include => context [salida-porta] ignorepat => 9 exten => _9097XXXXXX,1,Dial(${PORTA}/${EXTEN:1},10,r) exten => _9097XXXXXX,2,Congestion( ) exten => _9097XXXXXX,102,Congestion( )
  • 105. 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( )
  • 106. 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