62
Sistemas de VoIP con Asterisk

VoIP con Asterisk 2009

Embed Size (px)

DESCRIPTION

 

Citation preview

  • 1. Sistemas de VoIP con Asterisk
  • 2. Que es Asterisk?
    • Asterisk es una central telefnica IP (IPBX) de cdigo abierto que corre sobre linux y que es compatible con la mayora de tecnologas de VoIP (SiP, H323, MGCP, IAX, ) y de telefona tradicional Anloga y Digital (TDM, ISDN, BRI, PRI)
    • Brinda todos los servicios de una PBX propietaria tradicional
  • 3. Preparando un Sistema para Asterisk
    • Seleccin de Hardware para el Servidor
    • En trminos de requerimientos asterisk es similar a aquellas aplicaciones embebidas y de tiempo real
    • En diseos de grandes aplicaciones es comn observar una distribucin de de funcionalidades entre mltiples servidores
    • La flexibilidad es una de las razones de peso por las cuales los negocios de rpido crecimiento toman la decisin de implementarlo
  • 4. Preparando un Sistema para Asterisk Seleccin de Hardware para el Servidor
  • 5. Preparando un Sistema para Asterisk
    • Seleccin de Hardware para el Servidor
    • La seleccin 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 diseo, pero si se trata de una solucin corporativa es importante tener en cuenta las siguientes diapositivas
  • 6. Preparando un Sistema para Asterisk
    • Consideraciones respecto a rendimiento
    • El mximo numero de conexiones simultaneas:
      • Cada conexin incrementa carga al sistema
    • El porcentaje del trafico que requiere un intensivo procesamiento DSP cuando se usa cdecs de compresin
      • 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
    • Cancelacin de Eco :
      • Se utiliza cuando se utilizan redes PSTN, es una funcin matemtica por lo tanto aumenta los recursos de procesamiento
      • Como alternativa existen las tarjetas para cancelacin de ECO y traduccin de cdecs 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 telefona Analoga TDM400p (4 FXS & FXO), TDM2400p (24 FXS & FXO)
    • Tarjeta de telefona 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 versin exacta de nuestro kernel con el comando: uname -a deberamos 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 deberamos 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 estn 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. Requerimientos de software
    • 5.- Un paso ms antes de empezar con la instalacin, 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 informacin 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]# ll total 28 drwxr-xr-x 2 root root 4096 jun 13 08:43 asterisk drwxr-xr-x 3 root root 4096 jun 12 13:17 kernels lrwxrwxrwx 1 root root 26 jun 13 09:12 linux -> kernels/2.6.18-8.el5-i686/
  • 16. Asterisk add-ons
    • cd /usr/src/asterisk-addons
    • ./configure
    • make
    • make install
  • 17. 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
  • 18. Directorios usados por asterisk
    • /etc/asterisk/
    • Contiene los archivos de configuracin 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
  • 19. Directorios usados por asterisk
    • /usr/lib/asterisk/modules/
    • Este directorio contiene todos los mdulos 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 mdulos al inicio. (modules.conf).
    • /var/lib/asterisk/
    • Este directorio contiene el archivo astdb y una serie de subdirectorios. astdb contiene la informacin de la base de datos local de Asterisk, una especie de Registro de Win
  • 20. Directorios usados por asterisk
    • Los subdirectorios dentro de /var/lib/asterisk son:
    • agi-bin/
    • Contiene scripts personales
    • firmware/
    • Contiene imgenes binarias de firmware de varios dispositivos compatibles con asterisk
    • images/
    • Las aplicaciones que se comunican con canales que soportar imagenes, buscan en este directorio
  • 21. 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 bsicos de asterisk reproducios por playback( ) y background( )
  • 22. 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 informacin respecto a requerimiento de llamadas.
  • 23. Configuracin 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 configuracin de bajo nivel para la interfaz de hardware. Vamos a configurar un canal FXS y FXO. #ztcfg -vv
  • 24. Configuracin 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 analgicos. 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
  • 25. Configuracin 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
  • 26. Grabacin de audio con Record() Record( filename.format, silence, maxduration, options) Dentro de [internal] : exten => *282,1,Record(intro%d.gsm) exten => *282,2,Playback($ { RECORDED_FILE } ) exten => *282,3,Hangup()
  • 27. 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 estacin que hay una llamada entrante.
    • Los puerto son definidos en los archivos de configuracin de acuerdo a la sealizacin que usan y en sentido contrario al tipo de puerto que fsicamente son.
    • Es decir un puerto FXS se define en la configuracin como FXO y viceversa.
  • 28. 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 !!
  • 29. TDM410P PCI 2.2 Fuente de Voltaje FXO Ports FXS Ports Entradas RJ-11
  • 30. Configuracin de un canal FXO
    • Configuracin del hardware en /etc/dahdi/system.conf
    • La siguiente configuracin mnima define un canal fxo con sealizacin fxs:
    • fxsks=4 echocanceller=mg2,4 loadzone=us defaultzone=us
    • La primera lnea define el tipo de sealizacin y el protocolo para el canal 4:
    • Loopstart (ls) Groundstart (gs) Kewlstart (ks)
  • 31. Configuracin de un canal FXO
    • La diferencia est en la forma como el equipo remoto solicita el tono de marcado, en groundstart lo hace mandando momentneamente a tierra la lnea, loopstart lo hace en cambio usando un corto momentneo 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 lneas de nuestra localidad.
  • 32. Configuracin de un canal FXO
    • loadzone configura un grupo de indicaciones (determinadas en zonedata.c) relativas a los sonidos de la lnea en determinada regin o pas, 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
  • 33. Configuracin de un canal FXO
    • Configuracin del hardware en chan_dahdi
    • Asterisk usa la informacin en /etc/asterisk/chan_dahdi.conf para determinar las configuraciones del hardware de telefona instalado en el sistema.
    • El archivo chan_dahdi.conf tambin controla las caractersticas y funcionalidades asociadas con los canales fsicos: caller id, llamada en espera, cancelacin de eco y muchas mas .
  • 34. Configuracin de un canal FXO Configuracin del hardware en /etc/asterisk/chan_dahdi.conf [channels] ; canales fsicos: ; 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 sealizacion FXS para un canal FXO channel => 4 ; PSTN se conecta al puerto 4
  • 35. Configuracin de un canal FXO
    • Configuracin del hardware en chan_dahdi
    • La seccin [channels] determina el mtodo de sealizacin para los canales fsicos y sus opciones.
    • Cuando una opcin es definida esta es heredada hacia abajo al resto del archivo.
    • Un canal se define usando channel => , y cada definicin del canal hereda todas las opciones definidas por encima de esa lnea.
    • usecallerid=yes habilita el caller ID hidecallerid=no No se ocultar el caller ID para las llamadas salientes.
  • 36. Configuracin de un canal FXO
    • Configuracin 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 conversacin con otro hook flash.
    • transfer=yes Permite transferir llamadas con un hook flash; requiere que three-way calling este activada
  • 37. Configuracin de un canal FXO
    • Configuracin del hardware en zapata
    • echocancel=yes Habilita la cancelacin de eco, se requiere especialmente en lneas anlogas.
    • echotraining=yes Le indica a asterisk que enve un tono a travs de la lnea al inicio de la llamada para medir el eco y luego aprender de el mas rpidamente.
    • Cuando una llamada ingresa a una interfaz FXO, Usted deseara que se realice alguna accin verdad ?
  • 38. Configuracin de un canal FXO
    • Configuracin del hardware en chan_dahdi
    • La accin 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 lnea context=incoming .
    • Finalmente como un canal FXO usa sealizacin FXS, la definimos en la linea signalling=fxs_ks
  • 39. Configuracin 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()
  • 40. Configuracin de un canal FXS
    • La configuracin en muy similar a un canal FXO
    • Configuracin 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.
  • 41. Configuracin de un canal FXS
    • Configuracin del hardware en chan_dahdi.conf
    • La configuracin viene prcticamente a ser la misma con la adicin de la lnea inmediate=no y las lneas referentes al puerto fxs:
    • [channels] ; canales fsicos: ; opciones por defecto para todos los canales usecallerid=yes hidecallerid=no callwaiting=no threewaycalling=yes transfer=yes echocancel=yes echotraining=yes inmediate=no
  • 42. Configuracin de un canal FXS
    • ; definicin de canales:
    • context=internal ; Usaremos el contexto [internal] para las extensiones en el extensions.conf signalling=fxo_ks ; Use sealizacin FXO para un canal FXS channel => 1 ; telfono conectado al puerto 1
    • context=incoming ; Las llamadas entrantes se dirigen hacia [incoming] en el extensions.conf signalling=fxs_ks ; Use sealizacin FXS para un canal FXO channel => 4 ; PSTN se conecta al puerto 4
  • 43. Como recibir una llamada en un canal FXO
    • [incoming] exten => s,1, aplicacion( ) exten => s,2, aplicacion( ) exten => s,3, aplicacion( )
    • La extensin s
    • Cuando una llamada entra a un contexto sin una extensin especifica de destino (por ejemplo una llamada a un puerto fxo) deben ser recibidas por la extensin s start
  • 44. 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 atencin ni ejecuta accin alguna a los ingresos hachos por el dialpad, por defecto busca en /var/lib/asterisk/sounds/
  • 45. Agregando lgica al Dialplan
    • Goto(context, extension, prioridad)
    • Esta aplicacin hace fcil mover una llamada entre las distintas partes del dialplan.
    • La sintaxis de la aplicacin Goto() nos solicita que pasemos como argumentos: el contexto, extensin y prioridad del destino.
    • En conjunto con background permiten la interaccin con el usuario, su uso mas comn es el los llamados mens de voz, auto atendedores o arboles telefnicos
  • 46. Agregando lgica 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 telfono, este interrumpe la reproduccin de audio y lo enva a la extensin 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 extensin 5 dentro del mismo contexto en que fue llamado
  • 47. Agregando lgica al Dialplan [incoming] exten => s,1,Answer( ) exten => s,2,Background(tmp/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)
  • 48. Validando entradas y tiempos de espera
    • Para no permitir el ingreso de extensiones invalidas(3 en nuestro ejemplo), usamos una extensin especial ( i )
    • En cambio para el caso en que el usuario no ingrese una extensin despus de un tiempo determinado (10 seg.) usamos la extensin t.
    • Las llamadas sern enviadas a la extensin t si el llamante toma mucho tiempo en ingresar una extensin despus que Backgrund() ha terminado de reproducir el archivo de audio
  • 49. Validando entradas y tiempos de espera [incoming] exten => s,1,Answer( ) exten => s,2,Background(tmp/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) exten => i,1,Playback(pbx-invalid) exten => i,2,Goto(incoming,s,1) exten => t,1,Playback(vm-goodbye) exten => t,2,Hangup( )
  • 50. Vision de los Contextos
  • 51. Contexto [incoming] [incoming] exten => s,1,Answer( ) exten => s,2,Background(temp/intro1) exten => s,3,WaitExten() exten => 1,1,Dial(SIP/201,10,r) exten => 1,2,Voicemail(u201@default) exten => 1,3,Hangup( ) exten => 1,102,Voicemail(b201@default) exten => 1,103,Hangup( ) exten => 2,1,Dial(SIP/202,10,r) exten => 2,2,Voicemail(u202@default) exten => 2,3,Hangup( ) exten => 2,102,Voicemail(b202@default) exten => 2,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( )
  • 52. [general ] y [globals]
    • [general] autofallthrougth=no clearglobalvars=no
  • 53. Contextos para llamadas salientes [globals] GABRIEL=SIP/201 JOHY=SIP/202 PACIFICTEL=Zap/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)
  • 54. 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( )
  • 55. 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)
  • 56. 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( )
  • 57. 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 expresin, reemplaza toda la expresin por el valor resultante. Es importante notar que antes de hacer esto primero evala el valor de las variables
  • 58. 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 travs de la funcin Set( )
    • Ojo:
    • exten => 123,1,Set(TEST=$[2+1])
    • No es lo mismo que :
    • exten => 234,1,Set(TEST=$[2 + 1])
  • 59. Expresiones y Manejo de Variables Operadores Boleanos Evalan la verdad de una sentencia or expr1 | expr2 and expr1 & expr2 Comparacin expr1 {=, >, >=, 345,2,GotoIf($[{$TEST} = 1]?10:20) exten => 345,10,Playback(weasels-eaten-phonesys) exten => 345,20,Playback(office-iguanas)
  • 62. Ramificacin Condicional Aplicacin 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( )