Sistemas de VoIP con Asterisk
¿ Que es Asterisk? Asterisk es una central telefónica IP (IPBX) de código abierto que corre sobre linux y que es compatible con la mayoría de tecnologías de VoIP (SiP, H323, MGCP, IAX, ) y de telefonía tradicional Análoga y Digital (TDM, ISDN, BRI, PRI)  Brinda todos los servicios de una PBX propietaria tradicional
Preparando un Sistema para Asterisk   Selección de Hardware para el Servidor En términos de requerimientos asterisk es similar a aquellas aplicaciones embebidas y de tiempo real  En diseños de grandes aplicaciones es común observar una distribución de de funcionalidades entre múltiples servidores La flexibilidad es una de las razones de peso por las cuales los negocios de rápido crecimiento toman la decisión de implementarlo
Preparando un Sistema para Asterisk   Selección de Hardware para el Servidor
Preparando un Sistema para Asterisk   Selección de Hardware para el Servidor La selección del hardware puede ser muy sencilla, como muy complicada al mismo tiempo: Sencilla porque cualquier plataforma x86 puede servir Complicada porque el rendimiento del sistema dependerá del cuidado que se tenga al momento de seleccionar el hardware Si estamos implementando un sistemas de hobbie o de aprendizaje podemos obviar este diseño, pero si se trata de una solución corporativa es importante tener en cuenta las siguientes diapositivas
Preparando un Sistema para Asterisk   Consideraciones respecto a rendimiento El máximo numero de conexiones simultaneas: Cada conexión incrementa carga al sistema El porcentaje del trafico que requiere un intensivo procesamiento DSP cuando se usa códecs de compresión El procesamiento DSP que asterisk hace por software tiene un impacto directo en el numero de llamadas concurrentes que se pueden soportar.  Ejem: 50 G.711 vs. 10 G.729 Que nivel de conferencia va a brindar el sistema y con que frecuencia se hará
Preparando un Sistema para Asterisk   Consideraciones respecto a rendimiento Cancelación de Eco : Se utiliza cuando se utilizan redes PSTN, es una función matemática por lo tanto aumenta los recursos de procesamiento Como alternativa existen las tarjetas para cancelación de ECO y traducción de códecs que ofrece digium
Preparando un Sistema para Asterisk   Consideraciones respecto a rendimiento Observar los puertos PCI
Preparando un Sistema para Asterisk   Consideraciones adicionales: Fuentes de poder Switch PoE Medio Ambiente Humedad Temperatura Puesta a Tierra Seguridad
Requerimientos de Hardware No indispensable:  Tarjeta de telefonía Analoga TDM400p (4 FXS & FXO), TDM2400p (24 FXS & FXO) Tarjeta de telefonía Digital TE205p (2 E1 En un ambiente netamente IP solo se necesita cargar el modulo ztdummy (USB timing)
Requerimientos de software Primero debemos averiguar la versión exacta de nuestro kernel con el comando: uname -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
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
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++
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
Requerimientos de software 5.- Un paso más antes de empezar con la instalación, CentOS no instala las fuentes del kernel en el directorio /usr/src/linux como esta escrito en los Makefile de Zaptel y Asterisk, para ello nos vamos a /usr/src/ y creamos un link llamado linux hacia el directorio con las fuentes del kernel el cual esta ubicado en /usr/src/kernels/mi_version_del_kernel (aqui utilizamos la información obtenida del paso 2) estos son los resultados que esperamos: [root@asterisk ~]# cd /usr/src/ [root@asterisk src]# ln -s kernels/2.6.18-8.el5-i686/  linux [root@asterisk src]# 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/
Asterisk add-ons cd /usr/src/asterisk-addons ./configure make make install
Opciones del inicio de asterisk asterisk –h muestra la ayuda  Esta es una lista de las opciones mas usadas: -c  Console, nos permite conectarnos a la consola de asterisk o  CLI. -v  Verbosity. Es usada para indicar el numero de lineas que queremos mostrar en el debug . -g Core dump. Si asterisk termina inesperdamente, crea un archivo de core en el que se puede determinar las causas de la falla -r  Remote. Esto es usado para reconectarnos remotamente a un proceso de Asterisk que este corriendo con aterioridad
Directorios usados por asterisk /etc/asterisk/ Contiene los archivos de configuración de Asterisk (.conf).  Sin embargo el archivo 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
Directorios usados por asterisk /usr/lib/asterisk/modules/ Este directorio contiene todos los módulos que asterisk puede llegar a cargar , dentro de este directorio se encuentran varias aplicaciones, codecs, formatos y canales usados por Asterisk. Por defecto Asterisk carga todos estos módulos al inicio. (modules.conf). /var/lib/asterisk/ Este directorio contiene el archivo astdb y una serie de subdirectorios. astdb contiene la información de la base de datos local de Asterisk, una especie de Registro de  Win
Directorios usados por asterisk Los subdirectorios dentro de /var/lib/asterisk son: agi-bin/ Contiene scripts personales firmware/ Contiene imágenes binarias de firmware de varios dispositivos compatibles con asterisk images/ Las aplicaciones que se comunican con canales que soportar imagenes, buscan en este directorio
Directorios usados por asterisk keys/ Aquí se guardan las llaves RSA que se utilizaran en las comunicaciones peer to peer (IAX2) mohmp3/ Las aplicaciones que usan music on hold buscaran por defecto los archivos de audio en este directorio  sounds/ Aquí se buscan por defecto los sonidos básicos de asterisk reproducios por playback( ) y background( )
Directorios usados por asterisk /var/log/asterisk Como el nombre lo indica en esta carpeta asterisk guarda los logs o archivos de eventos /var/log/asterisk/cdr-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.
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.  #ztcfg -vv
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
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
Grabación 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()
FXS y FXO para Asterisk Mas simple:  Un puerto FXO no genera tonos de marcado, por el contrario los recibe. Un puerto FXS genera un tono de marcado y el voltaje necesario para hacer indicar a la estación que hay una llamada entrante. Los puerto son definidos en los archivos de configuración de acuerdo a la señalización que usan y en sentido contrario al tipo de puerto que físicamente son. Es decir un puerto FXS se define en la configuración como FXO y viceversa.
FXS y FXO para Asterisk En tarjetas Digium y en general el modulo FXS es verde, el FXO es rojo IMPORTANTE:  Conectar la PSTN en un modulo verde puede destruir el modulo y hasta la tarjeta !!
TDM410P PCI 2.2 Fuente de Voltaje FXO Ports FXS Ports Entradas RJ-11
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)
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.
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
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 .
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
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.
Configuración de un canal FXO Configuración del hardware en zapata callwaiting=no La llamada en espera es desactivada para una linea FXO threewaycalling=yes Permite que una llamada activa pueda ser puesta en espera con un hook flash luego podemos llamar a un tercero e invitarlo a la conversación con otro hook flash. transfer=yes Permite transferir llamadas con un hook flash; requiere que three-way calling este activada
Configuración de un canal FXO Configuración del hardware en zapata echocancel=yes Habilita la cancelación de eco, se requiere especialmente en líneas análogas. echotraining=yes Le indica a asterisk que envíe un tono a  través de la línea al inicio de la llamada para medir el eco y luego aprender de el mas rápidamente.   Cuando una llamada ingresa a una interfaz FXO, Usted desearía que se realice alguna acción verdad ?
Configuración de un canal FXO Configuración del hardware en 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
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()
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.
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
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  
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”
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/
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
Agregando lógica al Dialplan Background(ruta_al_archivo/archivo) A diferencia de Playback( ), cuando el llamante presiona una tecla (o serie de teclas) en el pad del teléfono, este interrumpe la reproducción de audio y lo envía a la extensión que corresponda de acuerdo al digito(s) presionados.  Por ejemplo si el llamante presiona 5 asterisk deja de reproducir el audio y le pasa el control de la llamada a la  primera prioridad  de la  extensión 5  dentro del  mismo contexto  en que fue llamado
Agregando lógica al Dialplan [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)
Validando entradas y tiempos de espera Para no permitir el ingreso de extensiones invalidas(3 en nuestro ejemplo), usamos una extensión especial ( i ) En cambio para el caso en que el usuario no ingrese una extensión después de un tiempo determinado (10 seg.) usamos la extensión t. Las llamadas serán enviadas a la extensión t si el llamante toma mucho tiempo en ingresar una extensión después que Backgrund() ha terminado de reproducir el archivo de audio
Validando entradas y tiempos de espera [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( )
Vision de los Contextos
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( )
[general ] y [globals] [general] autofallthrougth=no clearglobalvars=no
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)
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( )
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)
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( )
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
Expresiones y Manejo de Variables exten => 321,1,Set(CONT=3) exten => 321,2,Set(NEWCONT=$[${CONT}  +  1]) exten => 321,3,SayNumber(${NEWCONT}) exten => 321,2,Set(NEWCONT=$[3  +  1]) exten => 321,2,Set(NEWCONT=4) Finalmente el valor de 4 es asignado a la variables NEWCONT a través de la función Set(  ) Ojo: exten => 123,1,Set(TEST=$[2+1]) No es lo mismo que  : exten => 234,1,Set(TEST=$[2  +  1])
Expresiones y Manejo de Variables 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
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 expresión 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
Ramificación Condicional Aplicación GotoIf() exten => 345,1,Set(TEST=1) exten => 345,2,GotoIf($[{$TEST}  =  1]?10:20) exten => 345,10,Playback(weasels-eaten-phonesys) exten => 345,20,Playback(office-iguanas)
Ramificación Condicional Aplicación GotoIf() exten => 123,1,Set(COUNT=10) exten => 123,2,GotoIf($[${COUNT}  >  0]?:10) exten => 123,3,SayNumber(${COUNT}) exten => 123,4,Set(COUNT=$[${COUNT}  -  1]) exten => 123,5,Goto(2) exten => 123,10,Hangup( ) El caso de la Ex-enamorada exten => 202,1,GotoIf($[${CALLERIDNUM}  =  201]?20:10) exten => 202,10,Dial(SIP/201) exten => 202,20,Playback(abandon-all-hope) exten => 202,21,Hangup( )

VoIP con Asterisk 2009

  • 1.
    Sistemas de VoIPcon Asterisk
  • 2.
    ¿ Que esAsterisk? 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 Sistemapara 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 Sistemapara Asterisk Selección de Hardware para el Servidor
  • 5.
    Preparando un Sistemapara 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 Sistemapara 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 Sistemapara 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 Sistemapara Asterisk Consideraciones respecto a rendimiento Observar los puertos PCI
  • 9.
    Preparando un Sistemapara Asterisk Consideraciones adicionales: Fuentes de poder Switch PoE Medio Ambiente Humedad Temperatura Puesta a Tierra Seguridad
  • 10.
    Requerimientos de HardwareNo 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 softwarePrimero 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 softwareLuego 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 softwareAhora 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 softwareSi 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 software5.- Un paso más antes de empezar con la instalación, CentOS no instala las fuentes del kernel en el directorio /usr/src/linux como esta escrito en los Makefile de Zaptel y Asterisk, para ello nos vamos a /usr/src/ y creamos un link llamado linux hacia el directorio con las fuentes del kernel el cual esta ubicado en /usr/src/kernels/mi_version_del_kernel (aqui utilizamos la información obtenida del paso 2) estos son los resultados que esperamos: [root@asterisk ~]# cd /usr/src/ [root@asterisk src]# ln -s kernels/2.6.18-8.el5-i686/ linux [root@asterisk src]# 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 iniciode 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 porasterisk /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
  • 19.
    Directorios usados porasterisk /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
  • 20.
    Directorios usados porasterisk 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
  • 21.
    Directorios usados porasterisk 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( )
  • 22.
    Directorios usados porasterisk /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.
  • 23.
    Configuración inicial deAsterisk 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. #ztcfg -vv
  • 24.
    Configuración inicial deAsterisk /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
  • 25.
    Configuración inicial deAsterisk /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.
    Grabación de audiocon 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 FXOpara 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.
  • 28.
    FXS y FXOpara 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.2Fuente de Voltaje FXO Ports FXS Ports Entradas RJ-11
  • 30.
    Configuración de uncanal 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)
  • 31.
    Configuración de uncanal 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.
  • 32.
    Configuración de uncanal 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
  • 33.
    Configuración de uncanal 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 .
  • 34.
    Configuración de uncanal 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
  • 35.
    Configuración de uncanal 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.
  • 36.
    Configuración de uncanal FXO Configuración del hardware en zapata callwaiting=no La llamada en espera es desactivada para una linea FXO threewaycalling=yes Permite que una llamada activa pueda ser puesta en espera con un hook flash luego podemos llamar a un tercero e invitarlo a la conversación con otro hook flash. transfer=yes Permite transferir llamadas con un hook flash; requiere que three-way calling este activada
  • 37.
    Configuración de uncanal FXO Configuración del hardware en zapata echocancel=yes Habilita la cancelación de eco, se requiere especialmente en líneas análogas. echotraining=yes Le indica a asterisk que envíe un tono a través de la línea al inicio de la llamada para medir el eco y luego aprender de el mas rápidamente.   Cuando una llamada ingresa a una interfaz FXO, Usted desearía que se realice alguna acción verdad ?
  • 38.
    Configuración de uncanal 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
  • 39.
    Configuración de uncanal 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.
    Configuración de uncanal 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.
  • 41.
    Configuración de uncanal 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
  • 42.
    Configuración de uncanal 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  
  • 43.
    Como recibir unallamada 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”
  • 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 atención ni ejecuta acción alguna a los ingresos hachos por el dialpad, por defecto busca en /var/lib/asterisk/sounds/
  • 45.
    Agregando lógica alDialplan 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
  • 46.
    Agregando lógica alDialplan 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
  • 47.
    Agregando lógica alDialplan [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 ytiempos 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
  • 49.
    Validando entradas ytiempos 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 losContextos
  • 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 llamadassalientes [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 llamadassalientes [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 llamadassalientes 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 llamadassalientes 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 Manejode 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
  • 58.
    Expresiones y Manejode 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])
  • 59.
    Expresiones y Manejode 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
  • 60.
    Ramificación Condicional AplicaciónGotoIf() 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 expresión 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
  • 61.
    Ramificación Condicional AplicaciónGotoIf() 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)
  • 62.
    Ramificación Condicional AplicaciónGotoIf() 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( )