P. 1
Libro Asterisk - VozToVoice

Libro Asterisk - VozToVoice

|Views: 3,356|Likes:

More info:

Published by: George Andrews Benitez Piedrahita on Dec 02, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/01/2013

pdf

text

original

Curso Asterisk 1.6.0.X v. 1.

0
Enero 2010

By

VozToVoice

www.voztovoice.org

Convenciones tipográficas.
Negrita = comandos que el usuario tiene que teclear en la consola de Linux NegritaCursiva: Lineas que hay que añadir/modificar en los archivos de configuración Nombreprograma = Indica el nombre de un programa o librería Cursiva: respuesta del servidor Linux a los comandos CLI> indica que estamos trabajando en la consola de Asterisk mysql> indica que estamos trabajando en el cliente MySQL

Si encuentran alguna incorrección o errata pueden escribir al autor: asannucci@voztovoice.org.

i

Este documento se publica bajo la GNU Free Documentation License, versión 1.3 o sucesivas, publicadas por la Free Software Foundation. Está permitido copiar, distribuir y/o modificar este documento bajo los términos indicados en la licencia. Una copia integral de la licencia es presente en la apéndice D de este libro.

Copyright (C)

2010-2015

Andrea Sannucci

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

ii

INDICE
Capitulo I - Instalación de Asterisk ….......................................................................................... 1 1.1 Utilidades, librerías, dependencias 1.2 DAHDi 1.2.1 DAHDi en Linode 1.2.2 DAHDi en un servidor CentOS 1.3 FAX, GoogleTalk, Asterisk 1.4 Asterisk Addons – MySQL, MP3, Chan_mobile 1.4.1 Chan_mobile 1 6 6 8 9 12 15

Capitulo II - Configuración de Asterisk …................................................................................. 19 2.1 Instalar y configurar un cortafuego 2.2 Carpetas y archivos 2.3 Música en espera y MP3 2.4 Sip.conf (protocolo SIP) 2.5 Extensions.conf (plan de llamadas) 2.5.1 El contexto subscribe 2.5.2 X-lite y el plan de llamadas 2.5.3 Llamadas entre extensiones 2.5.4 Las Macros 2.6 Voicemail.conf – buzón de voz 2.7 Iax.conf – Protocolo IAX2 2.8 Features.conf 2.8.1 Integración de features.conf con la aplicación Dial 2.9 Logger.conf 2.10 Followme.conf (sigueme) 2.11 ENUM 2.12 Las conferencias (meetme.conf) 2.13 Asterisk GUI 2.14 La gestión de las colas 2.14.1 Los agentes 2.14.2 queues.conf 19 22 24 27 34 39 40 42 43 46 53 56 63 68 71 75 78 82 85 86 87

Capitulo III - Asterisk y la PSTN ….......................................................................................... 91 3.1 Instalación dispositivo X100P 3.2 Configuración X100P en Asterisk 92 93

Capitulo IV – IVR …................................................................................................................... 97 4.1 Grabación de las locuciones 4.2 Plan de llamadas y IVR 97 99 iii

........... 146 8.......Capitulo V ..3 AGI y despertador 10..................1 Voicemail y ODBC 6.........2 ODBC y CDR 6.............3 El Plugin Asterisk-IM 9................1 Asterisk con IAXmodem y Hylafax 5....1 Func_odbc........................... 121 6.......2 Asterisk y el protocolo T38 5..........................................4 Fail2ban Apéndice A – Asterisk Aplicaciones Apéndice B – Asterisk Funciones Apéndice C – Plan de llamadas Apéndice D – GNU Free Documentation License 192 194 198 199 202 213 221 227 iv ..1 Conectar dos servidores Asterisk con el protocolo SIP 8..ODBC y Base de datos 10.........2 Instalar el Plugin SIPPhone en Openfire 9...1 Instalacion de Openfire 9...................................... 102 5....... 140 7..1 Festival 7........................6 Openfire Connection Manager 162 170 176 182 185 188 Capitulo X ......Asterisk y FAX …........................... 192 10.....2 Asterisk y GoogleTalk 10..3 DUNDi 146 148 151 Capitulo IX ...5 Conectar dos servidores Openfire 9.................................3 Envío de FAX 102 112 118 Capitulo VI .....2 Conectar dos Servidor Asterisk con el protocolo IAX2 8...................................3 MeetMe Realtime 121 134 136 Capitulo VII ...............2 Cepstral 140 142 Capitulo VIII .............................................................conf ..Asterisk Realtime …...........................4 Asterisk como cliente en Openfire 9..........................Potpourri ….... 162 9..............Asterisk y TTS (text to speech) ….Openfire y Asterisk …................................Conexiones entre servidores Asterisk …......

La segunda empresa es Linode7 que con 19.1 Utilidades. utilizada y funcional para los fines de este manual. 1 Un PBX o PABX (siglas en inglés de Private Branch Exchange y Private Automatic Branch Exchange para PABX) cuya traducción al español sería Central secundaria privada automática.wikipedia. además de las llamadas internas.linode. 6 www.Capitulo I Instalación de Asterisk 1. librerías y dependencias Asterisk es el programa más usado y conocido para manejar una PBX 1. que permite conectar un teléfono analógico estándar. 10 Gigabyte de disco duro.95 dólares mensuales brinda una VPS de 360 Megabyte de memoria RAM. Con el VPS la ventaja es tener una PBX siempre activa. Hay empresas que ofrecen VPS a costos relativamente bajos.org/wiki/Telephone_Number_Mapping 4 FXO (Foreign Exchange Office) es un dispositivo de computador que permite conectar éste a la red telefónica conmutada y mediante un software especial.org . Entre ellas: • • • • • • • • Registro de llamadas Desvío de llamadas Trasferencia de llamadas Conferencias ENUM3 Música en espera Gestión de colas (call center) Soporte para tarjetas FXO4. independiente de la banda ancha disponible en la casa/oficina y evita tener una computadora dedicada y siempre encendida. La distribución Linux que se utilizará para la instalación de Asterisk es CentOS8.centos. realizar y recibir llamadas de teléfono. La primera es SliceHost6 que con 20 dólares mensuales brinda un VPS de 256 Megabyte de memoria RAM.asterisk. 16 Gigabyte de disco duro y 200 Gigabyte de trafico.com 8 www.slicehost. FXS5 y digitales Este manual abarca la instalación de Asterisk en un VPS (Servidor Virtual Privado) y es valida para cualquier Servidor Linux CentOS. 100 Gigabyte de trafico. las entrantes y/o salientes con autonomía sobre cualquier otra central telefónica. Entre todas hay dos que tienen una óptima relación calidad/precio. 5 FXS (Foreign Exchange Station) es el conector en una central telefónica o en la pared de nuestro hogar. Para una lista completa de las funcionalidades brindadas visiten la página de los desarrolladores2. es cualquier central telefónica conectada directamente a la red pública de teléfono por medio de líneas troncales para gestionar. (Wikipedia) 2 www. porque es la más conocida. de aquí el adjetivo privado a su denominación.org/features 3 http://en. Este dispositivo generalmente pertenece a la empresa que lo tiene instalado y no a la compañía telefónica.com 7 www.

se deja en Port el numero 22 y se presiona el botón Open. Aparecerá una nueva ventana: 9 Es un cliente SSH. Telnet.Para manejar el servidor Linux desde una computadora con sistema operativo Microsoft Windows se debe utilizar el programa Putty9. 2 . rlogin y TCP raw distribuido bajo una licencia libre. Aparecerá la siguiente ventana: Se coloca la dirección IP del VPS en la casilla “Host name. Se descarga y se abre dando clic dos veces en el icono del programa. or IPaddress”.

indispensable para modificar los archivos de configuración de Asterisk y en general para crear/modificar cualquier archivo de texto. Para instalar NANO el comando es: yum install nano YUM es un programa que permite gestionar todos los paquetes precompilados para la distribución Linux CentOS.Se introducen las credenciales para acceder al servidor remoto. Cuando el sistema lo pide. Para la conexión desde un servidor Linux el comando es: ssh root@ipservidorremoto Si no se usa el puerto estándar (22) habrá que indicarlo de la siguiente forma: ssh -p 20000 root@ipservidorremoto Una vez dentro del servidor Linux se puede empezar con la instalación de Asterisk. Antes que nada se necesita instalar un buen editor de textos como NANO. Se digita root y se presiona la tecla envío. Para una lista de las opciones disponibles se usa el siguiente comando: yum --help Una buena practica es actualizar el sistema: yum update Se continua con la instalación de Vorbis (un codificador/decodificador de archivos audio) y las relativas 3 . se digita la contraseña.

librerías: yum install libvorbis libvorbis-devel vorbis-tools libogg libogg-devel Para instalar la función CURL: yum install curl curl-devel libidn-devel Se sigue con unas cuantas utilidades y librerías necesarias para la compilación de las fuentes: yum install gcc ncurses ncurses-devel make gcc-c++ libtermcap libtermcap-devel zlib zlib-devel libtool bison bison-devel openssl-devel bzip2 bzip2-devel wget newt newt-devel Si se quiere utilizar MySQL10 como base de datos predefinida: yum install mysql mysql-server mysql-devel ODBC11 para crear conexiones a bases de datos: yum install unixODBC unixODBC-devel mysql-connector-odbc libtool-ltdl-devel Un sintetizador vocal (festival): yum install festival festival-devel Speex12 es un codificador decodificador específicamente diseñado para la compresión de la voz.org/ 4 .com/ 11 http://es.gz Se entra en la carpeta creada y se compila: cd speex-1.tar. (Wikipedia). multihilo y multiusuario.xiph./configure --prefix=/usr make make install 10 MySQL es un sistema de gestión de base de datos relacional. La pagina principal del programa: http://www.2rc1.mysql.2rc1.org/wiki/Open_Database_Connectivity 12 http://speex.wikipedia.2rc1 .gz Para descomprimirlo: tar -xf speex-1.tar. Se instalará partiendo de las fuentes: cd /usr/src wget http://downloads.org/releases/speex/speex-1.

sourceforge.1b.gz Se descomprime: tar -xf lame-398-2.Para terminar se actualizan las librerías: ldconfig -v Se continua con un decodificador/codificador MP3 .Lame.gz tar -xf libmad-0.tar. cd /usr/src wget http://ufpr.sourceforge.1b./configure --prefix=/usr make make install Se termina con el comando: ldconfig -v para actualizar las librerías.tar. Útil para usar música en espera en formato MP3.15.tar.gz Se entra en la capeta de Lame: cd lame-398-2 Se compilan las fuentes: .net/sourceforge/lame/lame-398-2.net/mad/libmad-0.tar.15.gz cd libmad-0.dl.15. Para instalarla: cd /usr/src wget http://prdownloads.1b . Para “manipular” los archivos MP3 (por ejemplo para bajar la calidad del sampling) antes de compilar SOX se necesita la librería libmad./configure --prefix=/usr make make install 5 .

gz Se Entra en la carpeta: cd sox-14.tar.Actualizar las librerías: ldconfig -v Para terminar esta primera parte se instalará el programa SOX13 (Sound eXchange) muy útil para convertir archivos audio de un formato a otro.sourceforge.0 y se compila: .0.gz se descomprime: tar -xf sox-14. cd /usr/src wget http://ufpr./configure --prefix=/usr make make install Se actualizan las librerías: ldconfig -v 1. digitales.net/Main/HomePage 14 http://xen. se apoya en DAHDI para la generación del “timing” indispensable para las conferencias y el trunking IAX2.0.3.org/ 6 . 1.dl.2.net/sourceforge/sox/sox-14. Por eso para una correcta instalación de DAHDI se tendrá que seguir el procedimiento que sigue. Primero se averigua la versión del kernel que se está usando: uname -r 13 http://sox. RDSI/ISDN.2 DAHDI El paquete DADHI (Digium Asterisk Hardware Device Interface) permite cargar los drivers y configurar distintos tipos de tarjetas en Asterisk (analógicas.tar.sourceforge. además. cancelador de ECHO).3. Asterisk.3.1 DAHDI en Linode Los VPS alquilados en Linode utilizan como sistema de virtualización XEN14.

tar.18.com/src/2.tar.18.18.linode.18.Un ejemplo del resultado del comando es: 2.gz tar -xf dahdi-linux-current.1 make make install 15 http://www.8-linode22 Se crea la carpeta donde se guardarán las fuentes del kernel: mkdir /usr/src/kernel se entra en la carpeta cd /usr/src/kernel Se descargan las fuentes desde la pagina dedicada de Linode15.2.tar.8-linode22/ ln -s /usr/src/kernel/2.6.18.6. Para el ejemplo arriba mencionado sería: wget http://www.org/pub/telephony/dahdi-linux/dahdi-linux-current.8-linode22.bz2 Se descomprime: tar -xf 2.18.8-linode22/ build Se preparan las fuentes para la instalación de DAHDI: cd /usr/src/kernel/2.gz cd dahdi-linux-2.8-linode22 make -f Makefile clean make -f Makefile oldconfig make -f Makefile scripts/genksyms/ make -f Makefile prepare Terminada esta operación empieza el proceso de instalación de DAHDI: cd /usr/src wget http://downloads.6.asterisk.6.6.linode.6.8-linode22.com/src 7 .tar.bz2 Se crea un link simbólico a las fuentes descargadas: cd /lib/modules/2.

gz cd dahdi-tools-2.2.asterisk.tar.org/pub/telephony/dahdi-tools/dahdi-tools-current.gz tar -xf dahdi-tools-current.DAHDI Tools: cd /usr/src wget http://downloads.asterisk.2.0.d/dahdi estas dos líneas: modprobe dahdi modprobe dahdi_dummy 2> /dev/null para que queden: modprobe -f dahdi modprobe -f dahdi_dummy 2> /dev/null 1.2.2.2 DAHDI en CentOS Server Si se está utilizando un servidor CentOS en lugar de un VPS (Linode) los pasos a seguir son: cd /usr/src yum install kernel-devel kernel-headers wget http://downloads.2.tar.2 make make install Se Sigue con dadhi-tools: cd /usr/src 8 .org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.1 .0.2.gz tar -xf dahdi-linux-2.gz cd dahdi-linux-2.2./configure make make install make config Se modifican dos parámetros en el script de arranque de DAHDI nano /etc/init.tar.tar.0.

tgz tar -xf spandsp-0.soft-switch.2.6 .3 FAX.asterisk.0 .org/ http://www.tar./configure make make install Para que arranque en automático: make config 1.org/wiki/Transport_Layer_Security 9 .2.0.0.com/talk/intl/es/ http://www.tar.0. En CentOS están disponibles los paquetes precompilados: 16 17 18 19 http://www.wget http://downloads. Gnutls permite crear conexiones basadas en el protocolo TLS19.6pre17. SpanDSP es un procesador de señales digitales y en Asterisk su función es permitir el envío y la recepción de faxes.0.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2./configure --prefix=/usr make make install Se termina actualizando las librerias: ldconfig -v Asterisk tiene la posibilidad de conectarse a GoogleTalk17 o a otro servidor de tipo Jabber18 como cliente.2.gz cd dahdi-tools-2.jabberes. Trabaja con archivos Tiff y para compilarlo hay que instalar esas librerías: yum install libtiff libtiff-devel Se puede continuar con la descarga y instalación de SpanDSP cd /usr/src wget http://www.google. Asterisk Para el soporte fax hay que instalar SpanDSP16.gz tar -xf dahdi-tools-2.6pre17. GoogleTalk.tgz cd spandsp-0.org/downloads/spandsp/spandsp-0.org/ http://es.soft-switch.0. Para que sea posible se debe instalar Gnutls y Iksemel.wikipedia.

Asterisk lo utiliza para enviar correos de notificación cada vez que llegue un correo de voz a las casillas configuradas en el buzón de voz. El comando ejecuta una serie de test y devuelve el resultado.4. Para completar la instalación: make install Se actualizan las librerías: ldconfig -v Instalamos Sendmail. Muchos programas implementan la posibilidad de conectarse a un servidor OpenLDAP y Asterisk.googlecode.tar. entre otras cosas. yum install sendmail sendmail-devel sendmail-cf OpenLDAP es la versión open source del protocolo Lightweight Directory Access./configure --prefix=/usr make make check Con make check se verifica que la compilación esté sin errores. presenta esta posibilidad: yum install compat-openldap openldap openldap-clients openldap-devel openldap-servers SNMP es el Protocolo Simple de Administración de Red y sirve para controlar y monitorear el desempeño de nuestro servidor Linux.4 .gz tar -xf iksemel-1. los canales y las llamadas.tar. desde la versión 1.gz cd iksemel-1. yum install net-snmp net-snmp-devel net-snmp-libs net-snmp-perl net-snmp-utils php-snmp 10 .4. un servidor de correo electrónico. En Asterisk permite monitorear. Normalmente se utiliza para crear un directorio de usuarios que puede ser consultado y/o modificado desde remoto.6.com/files/iksemel-1.X.yum install gnutls gnutls-devel gnutls-utils Ahora se puede instalar iksemel: cd /usr/src wget http://iksemel.

0-current. 11 .asterisk. Se averigua si el modulo Jabber está seleccionado.6.gz se descomprime: tar -xf asterisk-1.6. Bajar con los cursores del teclado hasta “Resource Modules” y averiguar que a lado de res_jabber haya un asterisco.X)./configure make menuselect Aparecerá: Desde este menú se pueden configurar todos los módulos que se quiere que Asterisk instale.tar.tar. Si no lo hay y aparecen tres XXX significa que no se puede instalar (hubo seguramente algún problema con la instalación de iksemel).6.org/pub/telephony/asterisk/asterisk-1.Ahora se puede empezar con la instalación de Asterisk (versión 1. Primero se descargan las fuentes: cd /usr/src wget http://downloads.gz Se entra en la carpeta: cd asterisk-1.0-current.25 Se compila: .6.0.

d/mysqld start Para que arranque cada vez que se inicia el servidor Linux: chkconfig mysqld on Se crea una contraseña para el usuario root: 20 MPEG-1 Audio Layer 3. 4. La posibilidad de tener un registro de las llamadas en una base de datos MySQL. más conocido como MP3.4 Asterisk Addons – MySQL. Chan_mobile Asterisk Addons es un paquete que añade cuatro funcionalidades principales a la centralita Asterisk: 1. Utilizar archivos MP320 para la música en espera Añadir el protocolo H32321 (versión propietaria) El canal chan_mobile que permite conectar. 21 H. Ahora se compila e instala Asterisk: make make install Para los archivos de configuración de muestra: make samples Para el arranque automático al boot de Linux: make config 1. Para guardar los cambios desde el menú principal hundir el botón “Save & Exit”. El mp3 estándar es de 44 kHz y un bitrate de 128 kbps por la relación de calidad/tamaño. que define los protocolos para proveer sesiones de comunicación audiovisual sobre paquetes de red. es un formato de audio digital comprimido con pérdida desarrollado por el Moving Picture Experts Group (MPEG) para formar parte de la versión 1 (y posteriormente ampliado en la versión 2) del formato de vídeo MPEG. 12 .Se puede navegar entre los varios menús para seleccionar/deseleccionar los módulos. MP3. Antes de empezar arrancar el servidor MySQL El comando es: /etc/init. si el celular lo soporta. envío de SMS. Su nombre es el acrónimo de MPEG-1 Audio Layer 3 y el término no se debe confundir con el de reproductor MP3. 2.323 es una recomendación del ITU-T (International Telecommunication Union). 3. via bluetooth. un celular a la centralita y usarlo como Gateway GSM y.

6.4 Se compila: .0-current.6. src varchar(80) NOT NULL default ''.tar. Crear una base de datos: mysqladmin create asteriskcdr -u root -psesamo Entrar en el cliente MySQL como usuario root y la contraseña que se ha creado anteriormente: mysql -u root -psesamo Crear la tabla para registrar las llamadas en la base de datos: mysql> use asteriskcdr mysql> CREATE TABLE cdr ( calldate datetime NOT NULL default '0000-00-00 00:00:00'. 13 .gz Se entra la carpeta recién creada: cd asterisk-addons-1.6.0-current.0. clid varchar(80) NOT NULL default ''.gz Se descomprime: tar -xf asterisk-addons-1./configure make make install Para los archivos de muestra: make samples Ahora para que la centralita tenga un registro de todas las llamadas en MySQL hay que seguir este procedimiento.org/pub/telephony/asterisk/asterisk-addons-1.asterisk.mysqladmin -u root password sesamo Si el servidor Linux tiene un dispositivo bluetooth hay que instalar estos paquetes: yum install bluez-utils bluez-libs bluez-libs-devel bluez-hcidump Se descarga el paquete de Asterisk addons en la carpeta /usr/src: cd /usr/src wget http://downloads.tar.

disposition varchar(45) NOT NULL default ''. dcontext varchar(80) NOT NULL default ''. channel varchar(80) NOT NULL default ''. mysql> quit Lo único que falta es añadir unas líneas en el archivo de configuración de Asterisk que se encarga de conectarse a la base de datos creada. mysql> flush privileges. Se abre el siguiente archivo de texto con nano: nano /etc/asterisk/cdr_mysql. 14 .* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'. accountcode varchar(20) NOT NULL default ''.dst varchar(80) NOT NULL default ''. lastapp varchar(80) NOT NULL default ''.sock Se guardan los cambios (CTRL-O CTRL-X). duration int(11) NOT NULL default '0'. Crear un nuevo usuario y darle todos los privilegios para manejar la base de datos desde local y remoto: mysql> GRANT ALL PRIVILEGES ON asteriskcdr. amaflags int(11) NOT NULL default '0'. billsec int(11) NOT NULL default '0'.conf y se modifican estas líneas: [global] hostname=localhost dbname=asteriskcdr table=cdr password=sesamo user=asterisk port=3306 sock=/var/lib/mysql/mysql. Ahora se vuelve a arrancar el servidor Linux. dstchannel varchar(80) NOT NULL default ''. mysql> GRANT ALL PRIVILEGES ON asteriskcdr. lastdata varchar(80) NOT NULL default ''. userfield varchar(255) NOT NULL default '' ). uniqueid varchar(32) NOT NULL default ''.* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'.

1 Chan_mobile Para conectar nuestro celular a Asterisk primero hay que modificar el archivo hcid. Para la base de datos: asterisk -rvvvvv CLI> cdr mysql status Debe aparecer: Connected to asteriskcdr@localhost. } # Default settings for HCI devices 15 .conf: mv /etc/bluetooth/hcid. Wrote 0 records since last restart. pairing multi. CLI> quit Executing last minute cleanups 1.conf.. # # HCId options options { autoinit yes.old nano /etc/bluetooth/hcid. port 3306 using table cdr for 45 seconds..conf Pegar las siguientes líneas: # # HCI daemon configuration file. passkey "1234".reboot Terminada la operación de arranque se entra en el servidor y se verifica que todo esté funcionando: Para Dahdi: /etc/init.4. security auto.d/dahdi status ### Span 1: DAHDI_DUMMY/1 "DAHDI_DUMMY/1 (source: Linux26) 1" (MASTER) Para Asterisk: asterisk (pid 2403) is running.conf hcid.

} Se guardan los cambios y se arranca el servicio: /etc/init.sniff. iscan enable. Ahora se busca el MACaddress22 del dispositivo bluetooth del computador: hcitool dev hci0 00:1F:E2:ED:5E:E9 Se abre el archivo de configuración de Asterisk para el chan_mobile y configura este dispositivo: nano /etc/asterisk/mobile.bluez.device { name "%h-%d".park. class 0x120104. lp rswitch. lm accept.conf Se copia el MAC address en esta línea: [adapter] id=blue address=00:1F:E2:ED:5E:E9 Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init.SetMode string:discoverable Desde el celular (dependiendo de la marca y modelo) se buscan otros dispositivos bluetooth y cuando aparece el nombre del computador se selecciona y se hacee el “pairing” (se asocia). cada dispositivo tiene su propia dirección MAC determinada y configurada por el IEEE (los últimos 24 bits) y el fabricante (los primeros 24 bits). Se deberá digitar “1234” y configurar esta asociación como automática.bluez /org/bluez/hci0 org. Es individual.d/bluetooth start Iniciando los servicios de Bluetooth: [ OK ] Una vez que el servicio esté activo se vuelve el computador visible a otros dispositivos bluetooth: dbus-send --system --type=method_call --print-reply --dest=org. A lo largo del procedo de asociacion preguntará por la clave.Adapter. pscan enable.d/asterisk restart 22 La dirección MAC (siglas en inglés de Media Access Control o control de acceso al medio) es un identificador de 48 bits (6 octetos) que corresponde de forma única a una ethernet de red. Wikipedia 16 .hold.

Ya se puede usar para hacer llamadas pero no para el envío de SMS.conf 17 . indicando si es utilizable en Asterisk y el puerto que hay que usar para la configuración.d/asterisk restart Desde la consola se mira si el celular está conectado: asterisk -rvvvvvvvvvvvvvvv CLI> mobile show devices ID Nokia E71 Address Group Adapter Connected State SMS 00:25:48:6F:F1:00 1 blue Yes Free No El Nokia E71 está conectado al servidor Asterisk.Desde la consola de Asterisk se busca el celular: asterisk -rvvvvvvvvvvvvvvvvvv CLI> mobile search El resultado será: Address Name 00:25:48:6F:F1:00 Nokia E71 Usable Type Port Yes Phone 1 El comando devuelve el MAC Address del celular. Se vuelve a entrar en el archivo chan_mobile: nano /etc/asterisk/mobile.conf Se añaden las siguientes líneas: [Nokia E71] address=00:25:48:6F:F1:00 port=1 context=incoming-celular adapter=blue group=1 Se guardan los cambios y se arranca Asterisk otra vez: /etc/init. Para efectuar llamadas usando como gateway el celular hay que modificar el Dialplan (plan de llamadas): nano /etc/asterisk/extensions.

18 .45) exten => _3XXXXXXXXX.n. Llamadas via Nokia E71 exten => _3XXXXXXXXX.En el contexto externas se ponen estas lineas: [externas] .Dial(Mobile/NokiaE71/${EXTEN}.Hangup Esta configuracion es para los celulares de Colombia que empiezan todos con el numero 3.1.

Para eso se utilizan tres tipos de tablas: • la tabla filter donde pasan todos los paquetes en entrada y salida.0/127.Capitulo II Configuración de Asterisk 2. Configurar una DMZ en el router y luego gestionar los puertos directamente con IPtables Para instalar iptables: yum install iptables Iptables se encarga de gestionar todos los paquetes que entren y salgan del servidor Linux.0.1 Instalar y configurar un cortafuegos Para proteger el servidor Linux de accesos no autorizados hay que instalar un firewall (cortafuegos 23) y abrir los puertos que Asterisk necesita para aceptar conexiones externas. Cuando no se especifica diversamente. En el caso del VPS Linode se instalará y Configurará IPtables. La tabla filter acepta tres tipos de opciones (cadenas) • INPUT para los paquetes en entrada • OUTPUT para los paquetes en salida • FORWARD para redireccionar los paquetes la tabla NAT se utiliza para rescribir las direcciones o los puertos de los paquetes la tabla MANGLE se utiliza para modificar algunos parámetros de los paquetes (un ejemplo es marcar los paquetes para que vengan procesados y enviados con una prioridad más alta) • • Las reglas se definen una por linea y serán procesadas por iptables siguiendo la misma secuencia.255. Si Asterisk se encuentra instalado en un computador conectado a Internet a través de un router hay dos opciones: • • Abrir los puertos desde la pagina de administración del router.255.255 menos que para la interfaz -lo iptables -A INPUT -i ! lo -d 127.0/8 -j REJECT 23 http://es. Esta es la parte más delicada de la configuración del servidor porque es donde se definen los puertos y los servicios que son accesibles desde Internet.0.wikipedia.org/wiki/Cortafuegos_%28inform%C3%A1tica%29 . todas las reglas se aplicarán a la tabla filter: Se acepta todo el trafico en entrada direccionado a la interfaz lookpack iptables -A INPUT -i lo -j ACCEPT Se rechaza (REJECT) todo el trafico entrante direccionado a las IP 127.0.0.

0/8 ACCEPT all -. que se han definido los puertos base que se necesitan abiertos.anywhere 127.RELATED -j ACCEPT Se deja pasar todos los paquetes salientes. iptables -A OUTPUT -j ACCEPT Se deja pasar todo el trafico en entrada para el protocolo SSH (puerto 22 tcp) iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto udp 4569 (protocolo IAX2) iptables -A INPUT -p udp --dport 4569 -j ACCEPT Se deja pasar todo el trafico en entrada destinado al puerto udp 5060 (protocolo SIP) iptables -A INPUT -p udp --dport 5060 -j ACCEPT Se deja pasar todo el trafico en entrada destinado a los puertos udp que van de 10000 a 20000 (protocolo RTP) iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT Se dejan pasar las solicitudes de ping iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT A este punto.anywhere anywhere REJECT all -. se bloquea todo el trafico restante.ESTABLISHED 20 .anywhere anywhere reject-with icmp-port-unreachable state RELATED. Véase protocolo TCP iptables -A INPUT -m state --state ESTABLISHED.Se aceptan todos los paquetes en entrada de conexiones ya establecidas. iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT Se averigua el estado de las reglas definidas con el comando: iptables -L Aparecerá: Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -.0.0. o relacionados con conexiones establecidas.

anywhere udp -.anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -.anywhere anywhere Para guardar los cambios: service iptables save Saving firewall rules to /etc/sysconfig/iptables: Se arranca el servicio: service iptables start Si aparece este error: reject-with icmp-port-unreachable [ OK ] Loading additional iptables modules: ip_conntrack_netbios_ns Se comenta esta linea: IPTABLES_MODULES="ip_conntrack_netbios_ns" en el archivo /etc/sysconfig/iptables-config Para que quede: #IPTABLES_MODULES="ip_conntrack_netbios_ns" Se vuelve a arrancar iptables: service iptables restart Para arrancar iptables automáticamente: chkconfig iptables on [FAILED] Para terminar hay que configurar Asterisk para que use los puertos UDP desde 10000 hasta 20000 para 21 .anywhere all -.anywhere icmp -.anywhere anywhere anywhere anywhere anywhere anywhere anywhere state NEW tcp dpt:ssh udp dpt:iax udp dpt:sip udp dpts:ndmp:dnp icmp echo-request reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -.ACCEPT ACCEPT ACCEPT ACCEPT ACCEPT REJECT tcp -.anywhere udp -.anywhere udp -.

d/asterisk restart 2. Se quita el punto y coma antes de [general] En rtpstart se pone 10000 y en rtpend 20000: rtpstart=10000 rtpend=20000 Se guardan los cambios efectuados y se recarga la configuración de Asterisk: /etc/init.2 Carpetas y archivos Al terminar la instalación de Asterisk unas cuantas carpetas nuevas serán creadas. images/ 24 http://es. /etc/asterisk Contiene todos los archivos de configuración de Asterisk. /usr/lib/asterisk/modules Contiene todos los módulos compilados y utilizables en Asterisk.conf En los archivos de configuración de Asterisk. del flujo audio/video) Se edita el archivo: nano /etc/asterisk/rtp. Si se quiere utilizarlos hay que quitar el punto y coma.wikipedia.el protocolo RTP24 (es el que se encarga. los parámetros pueden estar comentados con un punto y coma por delante. firmware/ Donde se guardan los firmware de las tarjetas en uso. /var/lib/asterisk Que a su vez contiene las siguientes carpetas: agi-bin/ donde poner los script AGI. una vez establecida la conexión entre dos canales.org/wiki/Real-time_Transport_Protocol 22 .

/var/spool/asterisk Que contiene: dictate/ Donde se guardarán los archivos audio creados con la aplicación Dictate(). keys/ Claves publicas y privadas que Asterisk necesita para autenticarse con otros servidores o servicios (Ej: DUNDi). moh/ La música en espera que viene con la instalación de Asterisk (no mp3). mohmp3/ Carpeta con archivos mp3 que se pueden usar como música en espera si se tienen instalados los asterisk-addons.txt en la carpeta doc de las fuentes de Asterisk para una explicación del funcionamiento de estos archivos. esta es la carpeta donde se guardarán los archivos audio. meetme/ Donde se guardarán las grabaciones de las conferencias. monitor/ Si se graba una llamada. sounds/ Contiene todas las locuciones que se pueden usar en el plan de llamadas (dialplan). licences/ Las licencias de uso que se han adquirido (Ej: para el codec audio g729). outgoing/ Donde hay que mover los archivo de llamadas (call files). system/ 23 .Donde las aplicaciones irán a buscar las imágenes cuando se comuniquen con teléfonos que suportan esta función. Véase el archivo callfiles.

3 Música en espera y MP3 Una de las funcionalidades de Asterisk es la música en espera. En muchos servicios de asistencia al cliente es típico escucharla mientras se espera que algún operador nos atienda. voicemail/ Donde se guardarán los archivos audio de los mensajes de voz dejados en el contestador y los mensajes audio personalizados de cada usuario. Desde Linux: Si lo hacemos desde un sistema con Linux utilizaremos el comando: scp archivo. En este párrafo se mostrará la configuración de la música en espera con archivos MP3. Si el puerto predefino para el protocolo SSH no es el 22. archivo. var/lib/asterisk/mohmp3 . /var/log/asterisk Donde se guardarán todos los registros de Asterisk (llamadas. Primero se crea.El comando que permite copiar archivos de un servidor Linux a otro. root@miodominio.com:/var/lib/asterisk/mohmp3 scp .El nombre de usuario y nombre de dominio del servidor remoto. sino existe. la carpeta donde guardar los archivos MP3: mkdir /var/lib/asterisk/mohmp3 Ahora hay que copiar un archivo mp3 en la carpeta creada. habrá que indicarlo en el comando.mp3 . De revisar cuando se tengan problemas con Asterisk.com . contestador).mp3 root@miodominio. En el caso 24 .Carpeta para archivos temporales creados por la aplicación System(). Al usar archivos MP3 hay que tener en cuenta los problemas relacionados con el derecho de autor.La carpeta donde se copiará el archivo en el servidor remoto. tmp/ Carpeta donde se guardan los archivos temporales creados por algunas aplicaciones (Ej.El nombre del archivo. 2. mensajes y eventos). /var/run Contiene la ID del proceso de Asterisk cuando esté corriendo.

Lo editamos de la siguiente manera: nano /etc/asterisk/musiconhold.conf. se configura para la conexión al servidor Linux y se abre la conexión.conf Se añaden las siguientes líneas al final del archivo: [mp3] mode=files directory=/var/lib/asterisk/mohmp3 random=yes 25 http://winscp.que sea. Esta es la ventana de trabajo de Winscp: Terminada la copia del fichero MP3. por ejemplo.mp3 root@miodominio:/var/lib/asterisk/mohmp3 Desde Windows: Se descarga el programa Winscp25. el paso que sigue es configurar el archivo musiconhold.net/eng/docs/lang:es 25 . el 25000: scp -P 25000 archivo. se instala.

el resultado del sampling.mp3 .mp3’ 26 .mp3 • • • -c 1 pasamos el archivo de estéreo a mono (un canal). El programa que permite este tipo de operación es SOX.mp3 -V -r 22050 -c 1 archivo1.Se accede a la consola de Asterisk: asterisk -rvvvvvvvvvvvvv Se escribe: CLI> moh reload Para recargar la configuración de la música en espera. Considerando que los teléfonos IP no tienen un sistema de audio de alta calidad se puede bajar la frecuencia de sampling de los archivos MP3 sin perder en calidad del audio escuchado. Aparecerá: Class: default localhosMode: files localhosDirectory: /var/lib/asterisk/moh Class: mp3 Mode: files Directory: /var/lib/asterisk/mohmp3 CLI> quit Usando archivos MP3 para la música de espera hay que tener en cuenta que el sistema necesitará utilizar bastante recursos de la CPU. CLI> moh show classes Para ver las clases de música en espera configuradas. archivo1.3. Esto porque los archivo MP3 tendrán que ser convertidos en el formato audio (codec) requerido por el canal que está accediendo al servicio. Ejemplo: cd /var/lib/asterisk/mohmp3 sox archivo. Usando la opción -V aparecerá en la pantalla todo el proceso: sox: SoX v14. -r 22050 frecuencia de sampling de 44100 H/z a 22050 Hz.0 Input File : ‘fichero.

38 = 6645429 samples ~ 22603.4 Sip. celulares.org/wiki/Session_Initiation_Protocol 27 . contestador automático. El archivo sip. II or III) Output File : ‘fichero1. Una parte general donde se define la configuración global del protocolo SIP.conf será cargado al 26 http://es. Hay que pensar en Asterisk como un conmutador que quizás algún día hemos visto en la recepción de un Hotel o una empresa.Channels :2 Sample Rate : 44100 Precision : 16-bit Duration : 00:05:01. Con las extensiones configuradas se podrán llamar una con otra. se podrán enrutar las llamadas a teléfonos fijos.38 = 13290858 samples = 22603.5 CDDA sectors File Size : 7. II or III) Comment : ‘Processed by SoX’ sox INFO sox: effects chain: input 44100Hz 2 channels sox INFO sox: effects chain: channels 44100Hz 1 channels sox INFO sox: effects chain: rate 22050Hz 1 channels sox INFO sox: effects chain: dither 22050Hz 1 channels sox INFO sox: effects chain: output 22050Hz 1 channels Para probar la nueva configuración se necesita crear una extensión en el archivo extensions.conf (protocolo SIP) El archivo sip.4: Importante: cada vez que se modifican o añaden nuevo archivos en la carpeta hay que recargar la configuración de la música en espera.5 CDDA sectors Sample Encoding: MPEG audio (layer I. Si delante del parámetro hay un punto y coma significa que el parámetro no será tomado en consideración al momento en que el sip. La configuración que sigue abarca los parámetros más importantes del sip. hacia nuestros proveedores SIP y utilizar los típicos servicios de estos como llamadas en espera. desvío de llamadas. cada línea del archivo viene acompañada de una breve explicación.conf está estructurado en tres bloques. en general. llamada a tres.conf.wikipedia.mp3’ Channels :1 Sample Rate : 22050 Precision : 16-bit Duration : 00:05:01. y la parte final donde se configuran las extensiones internas y externas.conf (el dialplan o plan de llamadas) que se presentará en el parrafo 2. el bloque central donde se configura el registro a los proveedores VoIP y/o otros servidores Asterisk. todo lo relacionado con el protocolo SIP26. 2.24M Bit Rate : 192k Sample Encoding: MPEG audio (layer I. Asterisk tiene las mismas funcionalidades y muchas más.conf es donde se definen las extensiones SIP. los proveedores SIP y.

com . bindaddr=0.0. bindport=5060 .0. Si está en yes cuando el estado de una extensión cambia. Si tenemos distintos dominios que apuntan a la misma dirección IP podemos especificarlos con este parámetro indicándolos uno por linea. etiqueta que introduce la parte general de la configuración.0.tcpenable=yes .0:5059 .voip-info. callevents=yes . domain=sip. El puerto utilizado para conectarse al servidor Asterisk (protocolo UDP). subscribecontext = subscribe . nano /etc/asterisk/sip. allowguest=no . Un parámetro que aumenta la seguridad de Asterisk. el Asterisk Manager genera el correspondiente evento27 (útil para programas externos tipo FOP).168. Si queremos conectarnos a Asterisk usando un segundo dominio (ejemplo una red local).miodominio. No permite llamadas entrantes de extensiones SIP remotas no autentificadas.1. La dirección IP para conectarse al servidor Asterisk (en este caso cualquier dirección IP de la computadora donde está instalado Asterisk sea tarjeta de red local o wan o VPN). Este parámetro define el contexto que se utilizará para permitir a las extensiones acceder al estado de otras. . el dominio local para el servidor Asterisk. Dirección y puerto para las conexiones SIP con protocolo TCP. 27 http://www.0 . . domain=192.0.org/wiki/view/Asterisk+manager+API 28 . context=default . Desde la versión 1.conf [general] . El contexto predefinido que todas las extensiones utilizarán si no viene especificado diversamente en cada extensión.32 .tcpbindaddr=0.6 es posible configurar el servidor para que permita también conexiones con protocolo TCP.arrancar Asterisk.

desde la misma versión es posible indicar directamente en la misma linea el tipo de corrección de error utilizado y el tamaño de los paquetes que contienen el fax. Permite el uso del protocolo T38 (fax sobre IP) pero solo en modo pasarela. disallow=all . se diferenciarán según sean salientes o entrantes. Desde la versión 1. Esto permite suscribirse desde una extensión a otra para tener acceso a su estado (disponible. Se usa también para crear las contraseñas de las extensiones usando algoritmo de reducción criptográfico MD5 t38pt_udptl=yes . En este modo nos presentamos como si fuéramos el softphone X-Lite. Habilita el codec alaw para todas las extensiones.6. entre dos extensiones que soporten el protocolo. Notifica si la extensión está en espera. Ademas. counteronpeer = yes . Asterisk “negocia” directamente los parámetros para la recepción de los faxes y ya no actúa solamente como pasarela. callcounter = yes .allowsubscribe=yes .voztovoice. realm=sip. es decir. La misma linea se puede escribir también de esta forma: 29 . Este parámetro representa el nombre que se utilizará para la “autenticación codificada” que es parte del proceso de autenticación de una extensión presente en las especificaciones del protocolo SIP. Notifica si la extensión está timbrando. Habilita el codec audio ulaw para todas las extensiones. si se ha definido un limite de 2 llamadas simultaneas. timbrando. allow=alaw .0. etc…).com . allow=ulaw . useragent=X-Lite . Cuenta el numero de llamadas simultaneas en las extensiones de tipo peer o en la parte peer de una extensión tipo friend (una extensión de tipo friend es al mismo tiempo user y peer). notifyringing=yes . Cuenta el numero de llamadas simultaneas que está efectuando una extensión. Deshabilita todos los codecs (audio y vídeo). De este modo en una extensión de tipo friend.21. Asterisk se presentará con este nombre al momento de comunicarse con otros servidores ó proveedores SIP. notifyhold=yes . A veces algunos proveedores SIP no permiten conexiones directas de servidores Asterisk. hablando.

register => fulano:contraseña@sip. srvlookup=yes .fec.com:5061 En los casos descritos arriba las llamadas entrantes llegaran a la extensión s y al contexto que se define en la configuración de la extension. tenemos que añadir al final de la linea el numero. Permite hacer búsquedas de registros DNS SRV basadas en los nombres de dominio para llamadas SIP salientes del tipo: SIP/usuario@dominio. Asterisk enviará siempre como respuesta que el usuario o la contraseña no son validas y no la razón verdadera del rechazo.com Para el registro con el proveedor el username será fulano.provider1.t38pt_udptl = yes. Siguen algunos ejemplos a modo de explicación. permite la detección de faxes en canales SIP. Permite diferenciar el tratamiento de las llamadas entrantes según sea un fax o una llamada de voz videosupport=yes . Si el proveedor usa un puerto que no es el 5060 hay que especificarlo al final de la línea de esta forma: register => fulano:sesamo@sip. Ahora viene la parte del registro con nuestros proveedores de llamadas. El código que aparecerá en el registro de llamadas para esta extensión.com. alwaysauthreject = yes . register => fulano:sesamo@sip.provider1. Si queremos que las llamadas entre a una extensión definida. accountcode=1000 . Este numero puede ser arbitrario siempre y cuando los proveedores SIP no especifiquen diversamente.provider1. Cuando un INVITE o REGISTER entrante es rechazado. Numero de la extensión. language=es . Si los vamos a usar solo para las llamadas salientes no hace falta configurar esta parte. Aumenta la seguridad.com/1234 La ultima parte es dedicada a la configuración de las extensiones: [1000] .provider1. Para permitir vídeo llamadas. Si hemos instalado las locuciones en más de un idioma. aquí se puede definir el idioma para la 30 .maxdatagram=400 faxdetect=yes . la contraseña sesamo y el dominio sip.

el sistema de marcación por tonos. de distinta frecuencia: uno por columna y otro por fila en la que esté la tecla.extension. canreinvite=no . éste controlará si hay mensajes de voz pendientes y en caso positivo se lo comunicará usando MWI = Message Waiting Indicator. también llamado sistema multifrecuencial o DTMF (Dual-Tone MultiFrequency). El contexto que usará la extensión. Friend: es a la vez user + peer. En los casos que la extensiones estén detrás de un NAT. La contraseña que la extensión usará para autenticarse al servidor Asterisk. se envían dos tonos. Existen rangos de direcciones privadas que pueden usarse libremente y en la cantidad que se quiera dentro de una red privada (Wikipedia) 29 En telefonía. Puede ser friend. secret=contraseña . que la central descodifica a través de filtros especiales.29 context=phones . Peer: una extensión que usamos para hacer y recibir llamadas y que reconocemos a través del campo Host. El protocolo para enviar los tonos DTMF. Con este parámetro en “no” este es el comportamiento normal. 30 El B2BUA es una aplicación para controlar llamadas entre usuarios SIP. cuando la extensión se conecte al servidor Asterisk. es una señal audio o vídeo que puede ser recibida por la mayoría de los teléfonos IP o Softphone. Normalmente Asterisk actúa como B2BUA30 entre las extensiones y esto permite usar toda una series de funcionalidades cuando Asterisk quede en el medio de las llamadas. detectando instantáneamente que dígito se marcó.. type=friend . • • • User: una extensión que se registra al servidor Asterisk usando el campo From para hacer llamadas. Si este parámetro es configurado. consiste en lo siguiente: Cuando el usuario pulsa en el teclado de su teléfono la tecla correspondiente al dígito que quiere marcar. qualify=yes . 31 . canreinvite=yes no 28 Su uso más común es permitir utilizar direcciones privadas (definidas en el RFC 1918) y aún así proveer conectividad con el resto de Internet. Tipo de extensión. En caso contrario se indica la dirección IP. host=dynamic . Este parámetro se utiliza para mantener activa la conexión de una extensión que se conecta al servidor Asterisk detrás de una NAT (Network Address Translation)28 mailbox=1000@default . Se pone “yes” si se quiere que flujo audio/video vaya directamente de una extensión a otra. Si la extensión se conecta remotamente cambiando continuamente su dirección IP se pone este parámetro a dynamic. dtmfmode=rfc2833 . user o peer.

allow=alaw . Habilita el codec audio ulaw. para limitar el numero de llamadas para una extensión. Habilita el codec vídeo h263. Con este parámetro definimos que la extensión puede usar solamente dos canales a la vez.X de Asterisk es “deprecated”. Habilita el codec audio GSM (el primero que se intentará utilizar durante la negociación de la llamada). Este parámetro desde la versión 1. allow=h263 . allow=gsm . allow=ulaw .X. eso significa que se puede utilizar pero que pronto será tachado de las nuevas versiones de Asterisk. callerid=Fulano <1000> . Deshabilitar todos los codecs. disallow=all . call-limit=2 . allow=g729 .6. El nombre y el numero de identificación de la extensión. En su lugar. Si la extensión se encuentra detrás de un NAT hay que poner “yes”. Habilita el codec audio alaw.funciona. se usan las funciónes GROUP y GROUP_COUNT Configuramos una segunda extensión: [1001] type=friend accountcode=1001 language=es secret=contraeña qualify=yes mailbox=1001@default host=dynamic dtmfmode=rfc2833 context=phones canreinvite=no nat=yes 32 . nat=yes . Habilita el codec audio g729.

call-limit=2 . type=peer . [justvoip] . Los datos que nos pide el proveedor para conectarnos (usuario y contraseña). language=es disallow=all allow=ulaw allow=alaw 33 .com . El nombre del dominio del proveedor.callerid=Sutano <1001> disallow=all allow=gsm . fromdomain=sip.justvoip. Numero de canales que brinda el proveedor. defaultuser=fulano secret=contraseña qualify=yes canreinvite=no dtmfmode=rfc2833 context=from-justvoip . El contexto de utilizar en extensions.com Este parametro permite definir el nombre de dominio que aparecerá en la campo From: de la cabecera SIP. Mucho proveedores lo exigen para autenticarse fromuser=fulano . Nombre que le asignamos al proveedor. host=sip. Lo vamos a utilizar solo para llamadas salientes (peer).justvoip. allow=ulaw allow=alaw allow=g729 allow=h263 call-limit=2 Ahora un ejemplo para un proveedor de llamadas SIP.conf si usamos el proveedor también para las llamadas entrantes.

Se entra en la consola de Asterisk: asterisk -rvvvvvvvvvv Se escribe el comando: CLI> sip reload Reloading SIP La lista de los comandos disponibles en la consola para las extensiones SIP se obtiene escribiendo: CLI> help sip sip notify Send a notify packet to a SIP peer sip prune realtime [peer|user| Prune cached Realtime users/peers sip reload Reload SIP configuration sip set debug {on|off|ip|peer} Enable/Disable SIP debugging sip set history {on|off} Enable/Disable SIP history sip show {channels|subscriptio List active SIP channels/subscriptions sip show channel Show detailed SIP channel info sip show domains List our local SIP domains sip show history Show SIP dialog history sip show inuse List all inuse/limits sip show objects List all SIP object allocations sip show peers List defined SIP peers sip show peer Show details on specific SIP peer sip show registry List SIP registration status sip show settings Show SIP global settings sip show tcp List TCP Connections sip show users List defined SIP users sip show user Show details on specific SIP user sip unregister Unregister (force expiration) a SIP peer from the registry Con el comando sip show settings se tendrá una vista más completa de todos los valores asignados a los parámetros presentes en el archivo de configuración sip.conf está dividido en tres bloques: 34 . 2.conf (plan de llamadas) El archivo de configuración estensions.conf hay que recargarla.5 Extensions. En él se define el plan de llamadas.conf es el más importante para la puesta en marcha de Asterisk. Cualquier número marcado desde una extensión será procesado dentro de este archivo.allow=g729 Cada vez que se modifica la configuración del sip. Al igual que el archivo sip.conf.

Si static es “yes” y writeprotect es “no”. nano /etc/asterisk/extensions. Para empezar.• • • La parte general donde se configuran algunos parámetros generales.conf La parte general: [general] static=yes . autofallthrough=yes . Algunas aplicaciones y/o funciones tienen la capacidad. En la tercera parte es donde se configura el verdadero dialplan o plan de marcado. en esta parte del archivo se puede hacer. para concluir si para las llamadas uso el proveedor SIP Justvoip se podrá usar la variable JUST. Si está en “yes” hará ese salto sino no. En caso contrario se actualizará automáticamente pero se perderán todos los comentarios presentes en el archivo. Las tres líneas muestran tres casos distintos. El dialplan se compone de contextos y dentro de cada contexto van las extensiones y prioridades. desde la consola de Asterisk habrá que escribir el comando dialplan reload. uno para las llamadas internas y otro para las llamadas externas. [globals] SOP = SIP/1000 FUL = SIP/0057310000000 JUST = SIP/justvoip En Globals se configuran las variables globales que queremos usar en el dialplan. [internas] 35 . para llamar el numero de celular de mi amigo fulano en vez de poner el numero por extenso podré indicar la variable FUL. Cada extensión y prioridad puede contener una aplicación o una función (para una lista completa de las aplicaciones y funciones disponibles véase el apéndice A y B). bajo algunas circunstancias. para guardar los cambios hechos en el plan de llamadas. Para llamar la extensión 1000 (configurada en sip. Una ultima parte donde queda toda las configuración del plan de llamada. de “saltar” desde la prioridad donde se encuentran a una prioridad que normalmente es n= +101 donde n es el numero de la prioridad que se está ejecutando. Si se efectúan llamadas frecuentes a un numero y se quiere configurar con una sigla o un nombre. Si es “yes” cuando alguna llamada se sale del plan de llamadas se terminará.conf) se podrá usar la variable SOP. se definirán dos contextos. La parte globals donde se definen las variables globales que se van a utilizar en Asterisk y que son validas para todos los canales. writeprotect=no . priorityjumping=yes .

[internas] exten => 123. la “n” significa next y sirve para no tener que escribir en cada línea el numero progresivo de la prioridad. • 123 es el numero de extensión (cuando se marcará este numero desde un teléfono IP.1. 2. Asterisk abrirá un canal para la llamada (Answer). • Answer es la aplicación que permite contestar la llamada. Si se efectúa una llamada al número 123.Playback(hello-world) exten => 123. Asterisk procesa las líneas secuencialmente. hardware o software. exten => 123.. [externas] exten => _0057. exten => 123.1.Hangup() Otra forma de es: [internas] exten => 123.3.Hangup() En la segunda y tercera línea en el numero de la prioridad aparece una “n”. exten => 123. escucharemos la locución Hello World y luego la llamada se terminará. en este caso el archivo audio es hello-world que hace parte de las voces que vienen con la instalación de Asterisk.Answer() exten => 123.Playback(hello-world) Esta es la segunda línea que será procesada. del numero más bajo al más alto.1.1. Playback es la aplicación que le permite a Asterisk usar las voces.2. Esto es muy cómodo cuando se modifica el dialplan porque al insertar una nueva línea no se tendrá que volver a numerar todas las demás. 2 es la prioridad (progresiva).Answer() exten => 123.Playback(hello-world) exten => 123. 123 la extensión. • 1 es la prioridad. Asterisk procesará la llamada empezando por esta línea).n. 3 la prioridad..3. 123 la misma extensión de la primera línea.Hangup Esta es la tercera línea. Esta etiqueta indica que todo lo que aparece a partir de esta línea se considerará perteneciente al contexto internas.n.Answer() Todas las líneas de configuración están estructuradas de la siguiente manera: • exten => en cada línea.Dial(${JUST}/${EXTEN}) 36 . Ahora se definirá un contexto muy sencillo para las llamadas externas. Hangup la aplicación que sirve para colgar una llamada.

conf bajo el contexto solo-internas tendrán acceso solo a la parte del dialplan contenido bajo la etiqueta [internas] [phones] include => internas include => externas Con estas líneas se define que todas las extensiones configuradas con el contexto phones tendrán acceso a los contextos del dialplan [internas] y [externas].Playback(all-outgoing-lines-unavailable) Si por algún motivo la llamada no tiene exito. ${EXTEN} es una variable interna de Asterisk donde se almacena el numero que se está marcando. El signo _ (guion bajo) se pone cuando no se indica el numero exacto sino solamente una parte. es decir grupos donde las extensiones solo se puedan llamarse entre ellas..n. Ahora se definirán dos contextos más.conf) para definir cuales extensiones tienes acceso a determinados contextos. [solo-internas] include => internas Con esto se define que todas las extensiones configuradas en sip.. Añadiendo las líneas para escuchar la música en espera en formato MP3 el dialplan será: [general] static=yes 37 . Por ahora es importante saber que $ {JUST} es la variable configurada en el bloque globals y corresponde a SIP/justvoip. A través de los contextos podemos crear grupos distintos de extensiones y hasta grupos cerrados de usuarios.La primera línea le dice a Asterisk que para todos los números marcados que empiecen por 0057 deberá usar esta parte del dialplan.8. (punto) indica que después del 0057 pueden haber cualquier numero de cifras.conf (parrafo 2. El . Dial es la aplicación que se utiliza para hacer una llamada.n. exten => _0057. Estos contextos hay que definirlos en la configuración de cada extensión (vease sip. se procesará la segunda línea donde se escuchará una voz que avisará que todas las líneas están ocupadas o no disponibles.4) las dos extensiones que se han configurado les hemos asignado el contexto phones. exten => _0057. En otro párrafo (2. es decir el proveedor de llamadas SIP. uno para las extensiones que tienen acceso a las líneas externas y uno para aquellas que solo pueden hacer llamadas internas.Hangup() Con la tercera línea la llamada se terminará. En la configuración del sip.1) se explicará de forma más detallada las variables y opciones que usa esta aplicación.

1.1.60) exten => 100.n.Hangup [externas] exten => _0057.n.Playback(hello-world) exten => 123.n.Hangup() exten => 100.2.Playback(all-outgoing-lines-unavailable) exten => _0057.writeprotect=no autofallthrough=yes priorityjumping=yes [globals] SUP = SIP/1000 FUL = SIP/0057310000000 JUST = SIP/justvoip [internas] exten => 123..3.MusicOnHold(mp3.Answer exten => 100.1..n.Dial(${JUST}/${EXTEN}) exten => _0057.Answer() exten => 123..Hangup() [solo-internas] include => internas [phones] include => internas include => externas Para actualizar la configuración desde la consola de Asterisk: asterisk -rvvvvvvvvvv Se escribe el comando: CLI> dialplan reload La lista de los comando relacionados con el dialplan se obtiene: CLI> help dialplan dialplan add extension Add new extension into context dialplan add ignorepat Add new ignore pattern dialplan add include Include context in other context dialplan reload Reload extensions and only extensions dialplan remove extension Remove a specified extension 38 .

5.SIP/1001 Ahora se incluye este contexto en los dos contextos que creados: [solo-internas] include => internas include => subscribe [phones] include => internas include => externas include => subscribe Se guardan los cambios y desde la consola de Asterisk se actualiza el plan de llamadas: asterisk -rvvvvvvvvvvvv CLI> dialplan reload Con el comando: CLI> core show hints -= Registered Asterisk Dial Plan Hints =1001@subscribe : SIP/1001 1000@subscribe : SIP/1000 State:Idle State:Idle Watchers 0 Watchers 0 39 .hint.hint.1 El contexto subscribe Como se ha indicado a lo largo de la configuración del archivo sip.SIP/1000 exten => 1001. Esto es posible configurando el contexto subscribe en el plan de llamadas: nano /etc/asterisk/extensions. dialplan set extenpatternmatch Use the New extension pattern matching algorithm. dialplan show Show dialplan 2.conf Se añaden las siguientes líneas (usando la prioridad hint): [subscribe] exten => 1000.dialplan remove ignorepat Remove ignore pattern from context dialplan remove include Remove a specified include from context dialplan set extenpatternmatch Use the Old extension pattern matching algorithm.conf hay la posibilidad de suscribirse a una extensión para conocer su estado.

2 X-Lite y el plan de llamadas Una vez configurado un plan de llamadas básico se puede empezar haciendo algunas pruebas.2. Una vez instalado se abre el programa y se configura (menu “Sip account settings”): Se usan los datos que de configuración puestos en el sip. 31 http://www.org/ 40 . El SoftPhone se registrará en nuestro Asterisk: Una vez finalizado con éxito el registro de nuestra extensión se puede hacer la primera llamada. Se descarga el Softphone X-Lite desde la página Web de la empresa que lo desarrolla31 y se instala. Se escuchará la locución hello-world y la llamada terminará. En domain se pone la dirección IP del servidor Asterisk.conf. Para Linux podemos usar el SoftPhone Ekiga32. se presiona el botón Aplicar y luego Aceptar. Primero se configurará un SoftPhone (X-Lite) para conectarlo a nuestro Asterisk para hacer las primeras llamadas.counterpath. Llamando la extensión 100 se escuchará la música en espera basada en el archivo mp3 que se ha cargado en el servidor Asterisk.com/ 32 http://ekiga.5. Cuando se ha terminado. Desde el teclado numérico del X-Lite marcamos la extensión 123.

y se añade la extensión 1001 en contactos de esta forma: Si la extensión se encuentra registrada al servidor Asterisk veremos su estado: 41 .Para subscribir la extensión configurada en el X-Lite al estado de otra extensión se abre el panel lateral derecho.

N: Puede ser un número de 2 a 9.: El punto representa cualquier numero de cifras.n.45) exten => _100X.3 Llamadas entre extensiones y aplicación Echo En Asterisk se han configurado dos extensiones (1000 y 1001). Para hacer llamadas de una a otra hay que modificar el plan de llamadas: nano /etc/asterisk/extensions.2. 42 . . Z: Puede ser un número de 1 a 9.conf Dentro del contexto internas se añaden las siguientes líneas: exten => _100X.Dial(SIP/${EXTEN}. _ : Si el numero de extensión que se indica no es exacto se pone delante del numero mismo este signo.5.1.Hangup Analizando las dos líneas: _100X estos caracteres indican el número de la extensión a llamar: El primer carácter y el último en Asterisk se llaman Pattern Matching y juntos a otros tienen este significado: • • • • • • X: Puede ser un número de 0 a 9. !: el punto exclamativo representa cualquier numero de cifras (incluyendo 0 cifras) Dial es la aplicación que se usa en Asterisk para iniciar una llamada.

La sintaxis de la aplicación Macro: asterisk -rvvvvvvvvvvvv CLI> core show application Macro -= Info about application ‘Macro’ =[Synopsis] Macro Implementation [Description] Macro(macroname.4 Las Macros Si en el plan de llamadas algunas acciones se repiten muy a menudo. es decir.arg1.${EXTEN} es el nombre de la variable de canal donde se almacena el numero que se marca.n.arg2. Si dentro de este tiempo nadie contesta.5. Asterisk procesará la siguiente línea. Ahora se añadirán otras líneas para configurar la aplicación Echo en el dialplan.): Executes a macro using the context ‘macro-<macroname>’. ${MACRO_CONTEXT} and ${MACRO_PRIORITY} respectively.Echo exten => 150. Arguments become ${ARG1}. Esta aplicación se usa para probar el audio de una extensión y averiguar si hay problemas de configuración.Playback(echo-test) exten => 150. and priority are stored in ${MACRO_EXTEN}.Hangup Se guardan los cambios en el plan de llamadas y se recarga la configuración: asterisk -rvvvvvvvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde el SoftPhone se marca el numero 150 y se procede con el test de Echo. Asterisk brinda la posibilidad de crear una Macro que permite simplificar estas operaciones. colgará la llamada (aplicación Hangup).1. jumping to the ‘s’ extension of that context and executing each step. ${ARG2}. 43 . Estas son las líneas que hay que añadir al contexto internas: exten => 150. 2.n.n.Answer exten => 150. The calling extension.. etc in the macro context. context. then returning when the steps end.. 45 es el número de segundos que timbrará la extensión llamada.

Macro will attempt to continue at priority MACRO_OFFSET + N + 1 if such a step exists. It is advised that if you need to deeply nest macro calls. and a fixed per-thread memory stack allowance. ${MACRO_PRIORITY} contendrá la prioridad de la línea de donde se ha llamado la Macro ${ARG1}. If ${MACRO_OFFSET} is set at termination. ${ARGN) son las variables que contienen los argumentos que se han enviado a la Macro. the Macro will terminate and control will be returned at the location of the Goto. macros are limited to 7 levels of nesting (macro calling macro calling macro. Please use the Read application in order to read DTMF from a channel currently executing a macro. ${MACRO_CONTEXT} contendrá el contexto de donde se ha llamado la Macro.argumentoN) ArgumentoN es un valor o una variable que se pasa a la macro al momento de llamarla desde el plan de llamadas.Gotoif($[${AVAILSTATUS} = 4]?4:3) 44 .). Se crearán las siguientes variables: • • • • ${MACRO_EXTEN} contendrá el numero marcado.argumento2. etc. and N + 1 otherwise. El comando seria: Macro(nombre_de_la_macro.1. WARNING: Because of the way Macro is implemented (it executes the priorities contained within it via sub-engine). Para empezar a utilizar la aplicación Macro se creará una muy sencilla que antes de marcar una extensión controle que ésta esté disponible: Primero hay que salir de la consola y modificar el plan de llamadas: CLI> quit nano /etc/asterisk/extensions. It may be possible that stack-intensive applications in deeply nested macros could cause Asterisk to crash earlier than this limit.n. argumento1. that you use the Gosub application (now allows arguments like a Macro) with explict Return() calls instead.ChanIsAvail(SIP/${MACRO_EXTEN}) exten => s.conf Al final del archivo se añaden estas líneas: [macro-disponible] exten => s. ${ARG2}.If you Goto out of the Macro context. Use of the application WaitExten within a macro will not function as expected.

5 AST_DEVICE_UNAVAILABLE .n.45) exten => _100X. 45 .Macro(disponible) exten => _100X.MacroExit exten => s. Para insertar la Macro en el plan de llamadas creado modificamos la parte utilizada para llamar una extensión: exten => _100X.Playback(all-circuits-busy-now) exten => s.n.1. 2 AST_DEVICE IN USE .Hangup Una explicación de las aplicaciones nueva que aparecen en las lineas de la Macro: ChanIsAvail: controla si una extensión está disponible y retorna la variable ${AVAILSTATUS} que puede contener estos valores: • • • • • • • 0 AST_DEVICE_UNKNOWN – El canal es valido pero su estado no es conocido”.“El canal está timbrando”.45) exten => _100X.Dial(SIP/${EXTEN}.n.Dial(SIP/${EXTEN}.n.“El canal no está disponible (no está registrado a Asterisk)”. MacroExit: sale de la macro y vuelve al mismo contexto.“El canal está ocupado”.Hangup Se guardan los cambios y se actualiza el plan de llamadas: asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload Ahora se marca de una extensión a otra y se controla lo que aparece en la consola de Asterisk para controlar el comportamiento de la Macro.n.“El canal es invalido”.n. 1 AST_DEVICE_NOT_INUSE . 6 AST_DEVICE_RINGING . de otra forma ve a otra prioridad. 3 AST_DEVICE_BUSY . 4 AST_DEVICE_INVALID .1.“El canal está en uso”.exten => s.“No se está usando”. extensión prioridad + 1 de donde se llamó.Hangup Para que quede: exten => _100X. Gotoif: literalmente es “ve a la prioridad indicada si se presenta una determinada condición”.

Se puede grabar un mensaje de bienvenida para nuestro buzón de voz personal. maxsilence=10 . nano /etc/asterisk/voicemail.conf se encuentra en la carpeta /etc/asterisk. Numero máximo de mensajes de voz para cada buzón de voz configurado.com . maxsecs=300 . siempre y cuando se configura el plan de llamadas oportunamente.conf es donde se configura todo lo relacionado con el buzón de voz.conf [general] .conf – Buzón de voz En el archivo voicemail. la llamada se termina y también la grabación. Numero máximo de segundos de durada de un mensaje de voz. con el 9 nos devolvemos de 3 segundos. Empieza la parte general. Si attach está en “yes” el mensaje de voz se enviará como anexo al correo electrónico. format=gsm|wav . silencethreshold=128 46 . attach=yes . minsecs=3 . El remitente del correo electrónico que avisa de una nuevo mensaje de voz. Si se recibe una llamada y no se contesta o la línea está ocupada. maxgreet=60 . maxmsg=100 . Ejemplo: presionando el número 8 se adelantará de 3000 milisegundos. si lo hemos configurado previamente. serveremail= fulano@miodominio.6 Voicemail. skipms=3000 . Es posible anexar el archivo audio al correo electrónico en distintos formatos audio. El voicemail. Este parámetro define la duración máxima del mensaje (en segundos). El codec audio utilizado para grabar los mensajes de voz dejados en el contestador.2. Numero mínimo de segundos para que un mensaje de voz sea reconocido como tal y sea enviado al buzón de voz del destinatario. entrará en función el contestador. podemos usar el teclado numérico del teléfono para adelantar o devolver el mensaje mismo. es decir 3 segundos. Si mientras se graba un mensaje de voz hay un silencio de 10 segundos. Cuando se escuchan los mensaje de voz. grabará el mensaje de voz dejado por quien llama y enviará un correo electrónico de aviso al llamado.

. Los mensajes de voz que se reciben se pueden reenviar a otros usuarios/extensiones del servidor Asterisk.externpassnotify=/usr/bin/myapp .conf hay que configurar este parámetro. Si cada vez que se recibe un mensaje de voz se quiere arrancar un programa hay que configurarlo usando este parámetro. . maxlogins=3 . Este numero representa el nivel de audio y sirve para definir que se considera silencio. directoryintro=dir-intro . Si se desea que un programa arranque cada vez que se cambia la contraseña de nuestro buzón de voz hay que configurarlo usando este parámetro. hay que hacerlo desde el menú del contestador. Una vez escuchados los mensajes de voz se mueven a la carpeta OLD (viejos) en automático si se configura en no. Si externpass está configurado y queremos que la contraseña se actualice también en voicemail. pbxskip=yes . El nombre que aparecerá como remitente del correo electrónico. userscontext=default . El contexto predefinido para los usuarios del buzón de voz. charset=ISO-8859-1 . Quitar la la abreviación [PBX] en el asunto del mensaje. Numero máximo de intentos permitidos cuando se marca la contraseña asociada al buzón de voz personal. fromstring=VozToVoice . usedirectory=yes . El estándar ISO para los mensajes de texto que se enviaran para notificar la llegada de un nuevo mensaje de voz. Este parámetro permite buscar en el directorio la persona a la que queremos dejar o reenviar el mensaje de voz. Más bajo el número. más sensible al ruido . El mensaje de introducción de la aplicación directory (para buscar las extensiones configuradas en Asterisk).externnotify=/usr/bin/myapp . También se pueden dejar directamente mensajes de voz en determinados buzones. .externpass=/usr/bin/myapp . moveheard=yes . .odbcstorage=asterisk 47 . .

if it is not null.imapgreetings=no 33 IMAP Wikipedia 48 . . emaildateformat=%A. mailcmd=/usr/sbin/sendmail -t . on ${VM_DATE}.emailbody=Dear ${VM_NAME}:\n\n\tjust wanted to let you know you were just left a ${VM_DUR} long message (number ${VM_MSGNUM})\nin mailbox ${VM_MAILBOX} from $ {VM_CALLERID}. Se puede modificar para adaptarlo a las exigencias especificas de cada instalación. . The following definition is very close to the default. Si se envía una notifica también a un localizador ó Pager esta línea define el remitente del mensaje. Thanks!\n\n\t\t\t\t—Asterisk\n Todo el bloque de arriba representa las variables y el texto del correo electrónico que se enviará para notificar la llegada de un nuevo mensaje de voz. Si en lugar ODBC se quiere usar el protocolo IMAP33 para guardar los mensajes de voz. El objeto del mensaje al Pager. variables: . El cuerpo del mensaje. Con este parámetro se configura la hora de llegada del correo en el formato 24H.emailsubject=[PBX]: New message ${VM_MSGNUM} in mailbox ${VM_MAILBOX} . VM_NAME. or “an unknown . El nombre de la tabla de la base de datos donde guardar los mensajes de voz. VM_DUR. otherwise just the CIDNUM. aquí va indicada su configuración.. . just the CIDNAME. . VM_DATE . %d %B %Y at %H:%M:%S . . so you might\nwant to check it when you get a chance. limitation in the Asterisk configuration subsystem. VM_CIDNAME. body and/or subject. Note: The emailbody config row can only be up to 512 characters due to a . if they are both null. . VM_CIDNUM. Se pueden guardar los mensajes de voz en un base de datos usando el conector ODBC. pagerbody=Nuevo mensaje de ${VM_DUR} de duración en la casilla ${VM_MAILBOX}\nde $ {VM_CALLERID}.odbctable=voicemessages . pagersubject=Nuevo VM . VM_MSGNUM. caller”. Aquí es donde hay que configurar el nombre de la base de datos. en ${VM_DATE} . . VM_MAILBOX. VM_CALLERID. pagerfromstring=VozToVoice . Sendmail es el programa predefinido para enviar los correos electrónicos. but the default shows . Change the from.

. callback=fromvm . exitcontext=fromvm . sendvoicemail=yes . Para guardar el mensaje de bienvenida en la carpeta de IMAP. Igual a no si no se usa IMAP. tz=central . 49 . Permitir o no de enviar un correo de voz a otra extensión [opción 5 del menú avanzado]. .imapparentfolder=INBOX . . dialout=phones . sayduration=no . Definir la duración mínima del correo de voz para que sea anunciada (en minutos). . Contexto donde enviar el usuario si mientras usa los menú del buzón presiona la tecla * o 0. Si se quiere crear una carpeta dentro de la carpeta INBOX para cada buzón de voz. saycid=yes . Si es a “yes” antes de escuchar el correo de voz se anunciará el identificativos (numero de teléfono o extensión) de quien lo dejó.greetingsfolder=INBOX . . saydurationm=2 . Uso horario predefinido para indicar la fecha y la hora del correo de voz recibido. . El formato audio definido para el envío del mensaje audio anexo al correo electrónico. review=yes . Contexto de utilizar para efectuar llamadas desde el menú del contestador [opción 4 del menú avanzado]. Si imapgreetings es igual a “yes” aquí es donde se define la carpeta donde guardar el mensaje audio de bienvenida. Si es “yes” permite a quien está dejando un correo de voz de escucharlo antes de enviarlo. attachfmt=wav . Permite a quien llama de presionar 0 (cero) antes/después/mientras está dejando un correo de voz para buscar una operadora. operator=yes . Anunciar o no la duración del correo de voz. attach=yes . Contexto para llamar desde el menú del buzón de voz al remitente de un mensaje de voz. Si es “yes” el mensaje de voz se anexará al correo electrónico de notifica.

. forcegreetings=no . . listen-control-forward-key=# . Si es “yes” una vez que se notifique la llegada de un correo de voz. vm-reenterpassword=custom_sound . vm-passchanged=custom_sound . . reproduce los datos del mensaje. envelope=no . locución alternativa para decir “Introduce nuevamente tu contraseña seguida del botón numeral o gato.0 . El usuario no aparecerá en el directorio. Para que se pueda utilizar se debe haber instalado SOX.. . locución alternativa para decir “Tu contraseña ha sido cambiada”. Un usuario se considera nuevo si su contraseña coincide con el número de su extensión. volgain=0. forcename=yes . . . 50 . tempgreetwarn=yes . Ir al correo de voz que sigue si se presiona las teclas 7 o 9 (borrar/guardar el mensaje que se esta escuchando). delete=yes . . locución alternativa de “la contraseña insertada y repetida no son iguales”. hidefromdir=no . vm-mismatch=custom_sound . Configurar una locución alternativa cuando se avisa de insertar una nueva contraseña para el buzón de voz. Si el correo de voz se grabó con un volumen muy bajo con esta opción podemos mejorar su calidad. éste se borrará del servidor. nextaftercmd=yes . Obliga el nuevo usuario a grabar un mensaje de bienvenida. Recuerda al usuario que el mensaje de bienvenida que esta usando es temporal. . Configurar una locución alternativa para pedir la contraseña del buzón. Obliga cada usuario con buzón de voz configurado a grabar su nombre la primera vez que accede. Antes de reproducir el mensaje audio. vm-newpassword=custom_sound . Tecla numérica para adelantar el mensaje que se está escuchando.vm-password=custom_sound .

1000 => 1000.Sutano. correo electrónico.. [zonemessages] colombia=America/Bogota|'vm-received' aebY 'digits/at' HM eastern=America/New_York|'vm-received' Q 'digits/at' IMp central=America/Chicago|'vm-received' Q 'digits/at' IMp central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours' military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p' european=Europe/Copenhagen|'vm-received' a d b 'digits/at' HM En el bloque de arriba se definen las zonas horarias que podemos usar en el contestador. Tecla numérica para volver a escuchar el mensaje desde el inicio.fulano@miodominio.maxmsg=50 .tz=Colombia 51 . listen-control-pause-key=0 . Sigue la configuración de los buzones de voz para la extensiones configuradas en el sip. . Cada buzón de voz sigue estas reglas Numero extensión => contraseña. backupdeleted=100 . correo pager. . Numero máximo de mensajes en la carpeta “borrados”. Aquí empieza la configuración de los buzones de voz para los usuarios pertenecientes al contexto default.com. listen-control-stop-key=13456789 .listen-control-reverse-key=* . listen-control-restart-key=2 . se pueden definir por cada uno de ellos su huso horario y de esta forma configurar la fecha y hora en que recibieron los mensajes de voz.com.opciones separadas por el signo coma. nombre apellido.sutano@miodominio. Define el numero máximo de correos de voz por cada carpeta de un determinado contexto (en este caso el contexto es default). Tecla numérica para poner en pausa el mensaje. Tecla numérica para ir atrás en el mensaje que se está escuchando. [default] . Si por ejemplo hay usuarios de distintos continentes.conf. Teclas numéricas para parar el mensaje y volver al menú del contestador.Fulano..tz=Colombia 1001 => 1001.

mensaje de bienvenida del directorio de la empresa 2 .45) exten => _100X.conf [internas] exten => 97.Company2 User. exten => 97.net .net.n. tercero contexto para otra empresa .n.u). Se añade otro bloque en el plan de llamadas de modo que si una extensión no está disponible o ocupada la llamada entre directamente al buzón de voz de la extensión llamada: exten => _100X.. .Jim Holmes. según si la extensión esté ocupada o nadie contesta se continuará en el dialplan en las prioridades definidas con las etiquetas unavail.4300 => 3456.1.com.Ben Rigas.1. o busy.root@localhost ..[acme] . exten => _100X.4073 => 1099.ben@american-computer.112 => 6262.Macro(disponible) exten => _100X.matt@marko.Tz=european [other] .com|tz=central|maxmsg=10 .Voicemail(${EXTEN}@default.111 => 7383.GotoIf($[“${DIALSTATUS}” = “BUSY”]?busy:unavail). se activará el buzón de voz 52 .Bianca Paige.jim@astricon.conf y añadir algunos bloques que permiten acceder al buzón de voz y dejar un mensaje en el mismo.net.Matt Brooks.ips.Mark Spencer.mypager@digium.Nancy.tz=eastern .sales@marko.tz=colombia .com.d/asterisk restart Una vez configurado el contestador hay que modificar el archivo extensions. nano /etc/asterisk/extensions.n.bianca@biancapaige.nancy@acme-widgets.4235 => 1234.4200 => 9855.Hangup.net .|tz=central|attach=yes|saycid=yes|operator=yes| moveheard=yes|sayduration=yes|saydurationm=1 .n(unavail).VoiceMailMain(${CALLERID(num)}@default). envía la llamada directamente al buzón de voz de la extensión que está llamando en el contexto default.Algunos ejemplos más: .n.Answer. termina la llamada.tz=central .4110 => 3443.Pete.net. (no disponible).rflynn@blueridge. 97 es el número que desde el teléfono IP o Softphone hay que marcar para acceder al buzón de voz personal..com Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init.directoryintro=dir-company2..4310 => -5432. abre el canal (contesta)..other es otro contexto con sus opciones y sus usuarios (por ejemplo si el mismo servidor está siendo utilizado por dos empresas distintas ).markster@linux-support.Rob Flynn.com.1234 => 5678.Dial(SIP/${EXTEN}. exten => 97. (ocupado).attach=no| serveremail=myaddy@digium.delete=1 .Sales.4069 => 6522.pete@acme-widgets.

0 para todos los IP del computador.0. srvlookup=yes .n. exten => _100X. se activará el buzón de voz anunciando que la extensión llamada está ocupada (opción b) y que después del tono se podrá dejar un mensaje. exten => _100X.0. nano /etc/asterisk/iax. bindaddr=0. El archivo que hay que modificar es el iax. 34 IAX (Inter-Asterisk eXchange protocol) es uno de los protocolos utilizado por Asterisk. Wikipedia 53 . Genera una cuenta general con la cual grabar las llamadas.0 . IP que Asterisk usará para “escuchar” los pedidos de conexiones. 2. Mejora la seguridad contra “brute force password attacks” retrasando el envío de los rechazos de autenticación.conf [general] bindport=4569 .VoiceMail(${EXTEN}@default. accountcode=lss0101 . se terminará la llamada.0. El puerto UDP usado por este protocolo.conf – protocolo IAX Ya se ha presentado la parte relacionada con la configuración de las extensiones SIP (párrafo 2. Se guardan los cambios y se actualiza el plan de llamadas: asterisk -rvvvvvvvvvvvvvv CLI> dialplan reload Ahora desde el X-lite se llama la extensión 97 para probar el menú del VoiceMail (buzón de voz). y entre servidores y clientes que también utilizan protocolo IAX. Permite hacer búsquedas de registros DNS SRV basadas en los nombres de dominio para llamadas IAX salientes del tipo IAX2/usuario@dominio. en la carpeta /etc/asterisk. exten => _100X. En este párrafo se verá como configurar otras extensiones usando el protocolo IAX2 34.n.Hangup.conf y se encuentra. Es utilizado para manejar conexiones VoIP entre servidores Asterisk. delayreject=yes . se terminará la llamada. 0.0.b).7 Iax.n(busy). un servidor PBX (central telefónica) de código abierto patrocinado por Digium. Este parámetro va configurado antes del bindaddr.Hangup.4).anunciando que la extensión llamada no está disponible (opción u) y después del tono se podrá dejar un mensaje.

[marko] . Puede solo recibir llamadas. . Registro con nombre usuario. Dejamos esta parte si queremos configurar un usuario huésped (sin contraseña). maxregexpire = 60 .register => marko:secretpass@tormenta.register => joe@remotehost:5656 .language=en .tiempo mínimo y máximo de expiración de la registración de las peers A partir de esta parte del archivo se definen los proveedores IAX2 u otros PBX Asterisk con los que nos queremos registrar. 54 . context=default . la cual se distribuye (en forma autenticada preferentemente). Registro con nombre.linux-support. 35 El sistema criptográfico con clave pública RSA es un algoritmo asimétrico cifrador de bloques. allow=alaw allow=gsm . .register => marko:[torkey]@tormenta. el identificador del usuario huésped. Registo con nombre. Se configura una extensión de prueba para luego usarla para una conexión desde desde un cliente IAX2. minregexpire = 60 . Nombre de la extensión. y otra privada.conf. disallow=all .net . la cual es guardada en secreto por su propietario.linux-support. . Ahora inicia la configuración de las extensiones IAX2 [guest] . El contexto que usará en extensions. type=user . que utiliza una clave pública. clave RSA35 (torkey) y dominio. callerid=”Guest IAX User” . Desactivamos todos los codecs (audio y video). Lenguaje predefinido para las locuciones (ingles). contraseña y dominio.net . dominio y puerto remoto (sin contraseña).

Para averiguar periódicamente con un NOTIFY si el usuario está conectado al servidor Asterisk. host=dynamic . Muchos Softphone y teléfonos IAX2 todavía no soportan los cambios. mailbox=1234@default . Contraseña. Si el cliente no se conecta siempre desde un IP determinado hay que indicar dynamic.zoiper. Se elige “Cuenta nueva de iax” y se pone el nombre de la cuenta.conf se utilizará el softphone Zoiper36. context=phones . Contexto asociado a este usuario en extensions. qualify=yes . requirecalltoken=auto .conf. Identificador de llamada del usuario. Buzón de los correo de voz del usuario. En septiembre del 2009 hubo una actualización del protocolo IAX2 para mejorar la seguridad. callerid = “marko” .com 55 . secret=password . 36 www. Una vez instalado se abre y se entra en la ventana de opciones.type=friend . En este caso para tener la certeza de que sea posible conectarlos a Asterisk hay que configurar este parámetro en NO o AUTO. Se guardan los cambios y se actualiza la configuración de Asterisk: asterisk -rvvvvvvvvvvvvvvv CLI> iax2 reload Para conectar a la extensión recién creada en el archivo iax. Tipo friend es peer y user a la vez.

conf. 2. es un protocolo destinado a crecer en los próximos años siempre y cuando resuelvan alguno bugs que parece padecer. Aunque todavía no haya muchos proveedores VoIP que brindan conexiones IAX2.En la siguiente pantalla se insertan los datos de la cuenta como definidos en iax. En la barra de la cuenta aparecerá: marko (Registrado) (IAX) Ahora se puede hacer llamadas a extensiones internas y números externos. Es aquí. lanzar una aplicación 56 .conf es donde se configura el parqueo de las llamadas y se asigna una función a una determinada combinación de teclas. grabarla.conf El archivo features. donde se definen cuales son las teclas que tenemos que presionar para transferir una llamada. por ejemplo.8 Features.

Features. Puede ser: • callee(llamado) • caller (llamante) • both (ambos) • no 57 .nano /etc/asterisk/features. extensión ‘s’. vuelve a la extensión que la parqueó.conf courtesytone = beep . Numero de segundos después de los cuales la llamada parqueada viene transferida a la extensión definida por el próximo parámetro comebacktoorigin = yes . . Puede ser: • • • parked(canal parqueado) caller(llamante) both(ambos) parkedcalltransfers = caller .prioridad ‘1’ que habrá que crear en extensions. si está en yes la llamada parqueada.conf . parkinghints = no . [general] parkext => 700 . si está en yes podemos controlar el estado de las extensiones donde se parquean las llamadas sino tenemos que añadir las extensiones reservadas para el parqueo de las llamadas en el dialplan. si está en no la llamada será transferida al contexto parkedcallstimeout. Define a quien enviar el beep cuando se llama la extensión parqueada. El sonido que será enviado a la llamada parqueada cuando alguien la llama o cuando empieza y termina la grabación de la misma parkedplay = both . contexto subscribe parkingtime => 45 . La extensión donde transferir las llamadas para parquearlas. después del parkingtime. El numero de extensiones reservadas para parquear las llamadas. parkpos => 701-710 . Habilita o deshabilita la secuencia de tonos para transferir la llamada cuando es una llamada parqueada.conf .

se puede contestar la llamada desde una de las extensiones que en pickupgroup tienen configurado el callgroup de la extension. Cuando dos o más extensiones pertenecen al mismo callgroup y una de ellas timbra. Numero de segundos de espera entre cada dígito cuando se esta transfiriendo una llamada xfersound = beep . Habilita o deshabilita la secuencia de tonos para parquear una llamada cuando era ya una llamada parqueada. Puede ser: • callee(llamado) • caller (llamante) • both(ambos) • no. Puede ser: • callee(llamado) • caller (llamante) • both(ambos) • no. . parkedmusicclass=default . La clase de música en espera que escuchará la extensión que ha sido parqueada transferdigittimeout => 5 .parkedcallreparking = caller . featuredigittimeout = 2000 . numero de milisegundos entre cada dígito cuando se activan le funcionalidades definidas más adelante 58 . Puede ser: • callee(llamado) • caller (llamante) • both(ambos) • no.parkedcallrecording = caller . El sonido que indicará que la transferencia de la llamada no se pudo completar pickupexten = *8 . En la configuración de las extensiones SIP se pueden configurar dos parámetros: callgroup y pickupgroup. . Habilita o deshabilita la secuencia de tonos para grabar una llamada cuando es una llamada parqueada. Habilita o deshabilita la secuencia de tonos para terminar una llamada cuando es una llamada parqueada.parkedcallhangup = caller . El sonido que indicará que la transferencia de la llamada “asistida” se completó xferfailsound = beeperr .

Hay que presionar la tecla # y luego el numero de la extensión. parkcall => *7 . la secuencia de teclas que hay que presionar para terminar la llamada automon => *1 . la tecla que hay que presionar para empezar la transferencia de una llamada disconnect => *0 . Numero de segundos de espera antes de devolver la llamada (si atxferdropcall = no) atxfercallbackretries = 2 . La secuencia de teclas que hay que presionar para grabar la llamada en un único archivo audio mezclando las voces de los dos interlocutores • blinxfer A lo largo de una conversación se quiere transferir la llamada a otra extensión. Si está en yes la llamada no se devuelve y se considera terminada. atxferloopdelay = 10 . La secuencia de teclas que hay que presionar para grabar la llamada (en dos archivos audio. La secuencia de teclas que hay que presionar para parquear la llamada.atxfernoanswertimeout = 15 . Podemos usar esta secuencia o transferir directamente la llamada a la extensión 700 automixmon => *3 . La secuencia de teclas que hay que presionar para una transferencia de llamada “asistida”. La llamada será transferida y nuestra llamada terminará 59 . Las veces que se intentará devolver la llamada La mapa de las funcionalidades que aparecen aquí abajo solo funcionan si Asterisk hace de puente entre las llamadas. uno para cada canal) atxfer => *2 . Si por ejemplo en la configuración de las extensiones en sip. Si quien transfiere una llamada con el método “asistido” cuelga antes que la llamada sea transferida completamente. Tiempo máximo disponible para contestar una llamada transferida con el método “asistido” (en segundos) atxferdropcall = no . Asterisk devuelve la llamada a quien la estaba transfiriendo.conf se configura canreinvite=yes es probable que estas funcionalidades no resulten [featuremap] blindxfer => # . ¿Que diferencia hay entre blindxfer y atxfer? Al terminar este bloque la explicación.

Las opciones son: caller (llamante). Se va a recoger la configuración del archivo así como se dejó en el párrafo 2. en esta parte del archivo se pueden añadir funcionalidades personalizadas que luego serán disponibles en el plan de llamadas.<Application>[. Presionando la secuencia *9 desde un canal. con peer para el otro canal ActivatedBy: Este parámetro define quien tiene acceso a la funcionalidad. Con self la funcionalidad se activa para quien la activa. Presionamos la secuencia *2 y luego el numero de la extensión donde se quiere transferir la llamada. nano /etc/asterisk/extensions. La sintaxis para estas funcionalidades es: <FeatureName> => <DTMF_sequence>.conf [general] static=yes writeprotect=no autofallthrough=yes priorityjumping=yes [globals] SUP = SIP/1000 FUL = SIP/0057310000000 JUST = SIP/justvoip DYNAMIC_FEATURES=test1#blindxfer#automon#disconnect#atxfer#parkcall#automixmon 60 . escuchará música en espera.tt-monkeys. DTMF_sequence: la secuencia de teclas para activar la funcionalidad.peer. Solamente cuando colgaremos las dos extensiones serán conectadas entre ellas. callee (llamado).Playback. both (ambos) Application: La aplicación que se va a ejecutar AppArguments: Las opciones asociadas a la aplicación MOH_Class: la clase de música en espera que escuchará el canal libre mientras se ejecuta la funcionalidad Ejemplo: test1 => *9. el otro escuchará la locución tt-monkeys mientras el canal que activó la funcionalidad.MOH_Class]] • • • • • • • FeatureName: El nombre de la funcionalidad. [applicationmap] .default .<AppArguments>[.• atxfer A lo largo de una conversación queremos transferir la llamada a otra extensión. Para volver disponibles estas funciones hay que modificar el plan de llamadas. Los valores son self y peer. ActivateOn: aquí se define para quien activar la funcionalidad. Se guardan los cambios. Se escuchará timbrar la extension y una vez que el interlocutor descuelgue se podrá hablar con él (por ejemplo para anunciar la llamada que se va a transferir).<ActivateOn>[/<ActivatedBy>].5 En negrita aparecen las partes que hay que añadir.

[internas] exten => 97,1,Answer() exten => 97,n,VoiceMailMain(${CALLERID(num)}@default) exten => 97,n,Hangup() exten => 123,1,Answer() exten => 123,2,Playback(hello-world) exten => 123,3,Hangup() exten => 100,1,Answer exten => 100,n,MusicOnHold(mp3,300) exten => 100,n,Hangup exten => 150,1,Answer exten => 150,n,Playback(echo-test) exten => 150,n,Echo(15) exten => 150,n,Hangup exten => _100X,1,Macro(disponible) exten => _100X,n,Dial(SIP/${EXTEN},45) exten => _100X,n,GotoIf($[${DIALSTATUS} = BUSY]?busy:unavail) exten => _100X,n(unavail),Voicemail(${EXTEN}@default,u) exten => _100X,n,Hangup exten => _100X,n(busy),VoiceMail(${EXTEN}@default,b) exten => _100X,n,Hangup [externas] exten => _3XXXXXXXXX,1,Dial(Mobile/NokiaE71/${EXTEN},45) exten => _3XXXXXXXXX,n,Hangup exten => _00573.,1,Dial(${JUST}/${EXTEN}) exten => _00573.,n,Playback(all-outgoing-lines-unavailable) exten => _00573.,n,Hangup() [subscribe] exten => 1000,hint,SIP/1000 exten => 1001,hint,SIP/1001 exten => 701,hint,park:701@parkedcalls exten => 702,hint,park:702@parkedcalls exten => 703,hint,park:703@parkedcalls exten => 704,hint,park:704@parkedcalls exten => 705,hint,park:705@parkedcalls exten => 706,hint,park:706@parkedcalls exten => 707,hint,park:707@parkedcalls exten => 708,hint,park:708@parkedcalls exten => 709,hint,park:709@parkedcalls 61

exten => 710,hint,park:710@parkedcalls [solo-internas] include => internas include => subscribe include => parkedcalls [phones] include => internas include => externas include => subscribe include => parkedcalls [macro-disponible] exten => s,1,ChanIsAvail(SIP/${MACRO_EXTEN}) exten => s,n,Gotoif($[${AVAILSTATUS} = 4]?4:3) exten => s,n,MacroExit exten => s,n,Playback(all-circuits-busy-now) exten => s,n,Hangup Para que las funcionalidades configuradas en features.conf sean activas hay que definir la variable DYNAMIC_FEAUTURES y añadirle todas las funcionalidades que se han configurado. Después de la etiqueta [subscribe] se han añadido diez líneas para poder controlar el estado de las extensiones usadas para parquear las llamadas. De esta forma siempre se podrá saber cuantas llamadas están parqueadas (en los teléfonos IP software y hardware que prevén esta posibilidad). Para terminar en las etiquetas [phones] y [solo-internas] se ha añadido el contexto parkedcalls. Todos la extensiones que tengan acceso al contexto phones, además de tener acceso al contexto internas, externas y subscribe, tendrán acceso al contexto parkedcalls es decir podrán llamar una extension parqueada. Hay tres aplicaciones relacionadas con el parqueo de llamadas que se pueden utilizar en el plan de llamadas: • • • Park ParkAndAnnounce ParkedCall

Se guardan los cambios y se reinicia Asterisk: /etc/init.d/asterisk restart Desde la consola de Asterisk podemos ver las funcionalidades activadas. asterisk -rvvvvvvvvvvvv CLI> features show 62

Builtin Feature Default Current --------------- ------- ------Pickup *8 *8 Blind Transfer # # Attended Transfer *2 One Touch Monitor *1 Disconnect Call * *0 Park Call *7 One Touch MixMonitor *3 Dynamic Feature Default Current --------------- ------- ------test1 no def *9 Call parking -----------Parking extension: 700 Parking context: parkedcalls Parked call extensions: 701-710 2.8.1 Integración de features.conf con la aplicación DIAL Ya se ha presentado (Párrafo 2.8) la configuración del archivo features conf y como se definen el parqueo de las llamadas y otras aplicaciones. En este párrafo se verá como integrar esas funcionalidades en el dialplan de Asterisk usando la aplicación Dial. La sintaxis de la aplicación Dial: Dial(Technology/resource[&Tech2/resource2...][,timeout][,options][,URL]): • • • • • • Dial: el nombre de la aplicación que nos permite en el dialplan hacer una llamada Technology: el protocolo o la tecnología usada para hacer la llamada (ej: SIP, IAX2) resource: el recurso usado para hacer la llamada o el numero de extensión a llamar timeout: define los segundos dentro de los cuales la llamada tiene que ser contestada. options: son las opciones que podemos añadir a la aplicación URL: para enviar una dirección Web a la extensión llamada (si dicha extensión tiene la capacidad para recibirla)

Algunos ejemplos: exten => 1000,1,Dial(SIP/1000,45) exten => 1000,2,Hangup Si se marca la extensión 1000 Asterisk llamará dicha extensión usando el protocolo SIP, esperará 30 segundos. Si la extensión 1000 no contesta dentro de los treinta segundos, Asterisk procesará la línea siguiente del dialplan, es decir terminará la llamada.

63

exten => 00573001000000,1,Dial(SIP/justvoip/00573001000000,45) exten => 00573001000000,2,Hangup En este caso si desde un SoftPhone o IP Phone conectados a la centralita se marca el numero 0057300100000, Asterisk llamará dicho numero usando un proveedor VoIP (en este caso especifico Justvoip). Esperará una respuesta por 45 segundos y si nadie contesta terminará la llamada. Como tecnología se ha indicado SIP porque justvoip usa solo este tipo de protocolo. En el caso de proveedores que utilicen el protocolo IAX2 sería: exten => 00573001000000,1,Dial(IAX2/justvoip/00573001000000,45) exten => 00573001000000,2,Hangup Para configurar las funcionalidades definidas en el archivo features.conf se tendrá que utilizar unas opciones de la aplicación Dial. exten => 1000,1,Dial(SIP/2000,30,hH) Las opciones presentes en la linea aquí presentada son dos: • • h: permite al llamado colgar la llamada usando la tecla *0 H: permite al llamante colgar la llamada usando la tecla *0

exten => 1000,1,Dial(SIP/2000,30,kK) • • k: permite al llamado parquear la llamada presionando la secuencia de teclas definida en features.conf K: permite al llamante parquear la llamada presionando la secuencia de teclas definida en features.conf

exten => 1000,1,Dial(SIP/2000,30,tT) • • t: permite al llamado transferir la llamada presionando la secuencia de teclas definida en features.conf T: permite al llamante transferir la llamada presionando la secuencia de teclas definida en features.conf

exten => 1000,1,Dial(SIP/2000,30,wW) • w: permite al llamado empezar la grabación de la llamada presionando la secuencia de teclas definida en features.conf. Asterisk, en este caso, creará dos archivos audio, uno por cada interlocutor. W: permite al llamante empezar la grabación de la llamada presionando la secuencia de teclas definida en features.conf. Asterisk, en este caso, creará dos archivos audio, uno por cada interlocutor.

exten => 1000,1,Dial(SIP/2000,30,xX) 64

c:2628 __ast_read: DTMF begin ‘7’ received on SIP/10000091d880 [Nov 6 10:44:30] DTMF[30238]: channel.1.c:2628 __ast_read: DTMF begin ‘#’ received on SIP/21000091d880 [Nov 6 10:44:28] DTMF[30238]: channel.c:2612 __ast_read: DTMF end passthrough ‘7’ on SIP/1000-0091d880 [Nov 6 10:44:31] DTMF[30238]: channel.c:2638 __ast_read: DTMF begin passthrough ‘#’ on SIP/2100-0091d880 [Nov 6 10:44:28] DTMF[30238]: channel.Dial(SIP/ ${EXTEN}. class ‘default’.c:2628 __ast_read: DTMF begin ‘0’ received on SIP/10000091d880 [Nov 6 10:44:31] DTMF[30238]: channel.c:2596 __ast_read: DTMF end accepted with begin ‘#’ on SIP/2100-0091d880 [Nov 6 10:44:28] DTMF[30238]: channel.c:2546 __ast_read: DTMF end ‘#’ received on SIP/21000091d880. la aplicación Dial aparecerá de esta forma: exten => _100X. activar todas estas opciones a la vez. por ejemplo.hHkKtTwWxX) A seguir se presentarán algunos registros como aparecen en la consola de Asterisk al activar o desactivar las funcionalidades descritas. duration 120 ms 65 . duration 100 ms [Nov 6 10:44:30] DTMF[30238]: channel. La diferencia con las opciones w y W es que en este caso los dos canales (llamante y llamado) se grabaran en un único archivo audio X: lo mismo de arriba pero para el llamante.45.Started music on hold. duration 100 ms [Nov 6 10:44:28] DTMF[30238]: channel.c:2632 __ast_read: DTMF begin ignored ‘0’ on SIP/10000091d880 [Nov 6 10:44:31] DTMF[30238]: channel.gsm’ (language ‘it’) [Nov 6 10:44:30] DTMF[30238]: channel.conf.c:2546 __ast_read: DTMF end ‘0’ received on SIP/10000091d880. asterisk -rvvvvvvvvvvvvvvv CLI> • SIP1000-0091d880 answered SIP1001-009292e0 -.c:2546 __ast_read: DTMF end ‘7’ received on SIP/10000091d880.Stopped music on hold on SIP/1001-009292e0 == Extension Changed 2100[internal] new state InUse for Notify User 1000 [Nov 6 10:44:28] DTMF[30238]: channel.<SIP/1000-0091d880> Playing ‘pbx-transfer.c:2632 __ast_read: DTMF begin ignored ‘7’ on SIP/10000091d880 [Nov 6 10:44:30] DTMF[30238]: channel. Si se quiere. on SIP/2300-009292e0 -.c:2612 __ast_read: DTMF end passthrough ‘#’ on SIP/2100-0091d880 -.• • x: permite al llamado empezar la grabación de la llamada presionando la secuencia de teclas definida en features.

c:2546 __ast_read: DTMF end ‘*’ received on SIP/1001009292e0.c:2546 __ast_read: DTMF end ‘0’ received on SIP/10000091d880.c:2628 __ast_read: DTMF begin ‘0’ received on SIP/10000091d880 [Nov 6 10:44:32] DTMF[30238]: channel. on SIP/1000-009292e0 == Parked SIP/1001-009292e0 on 701@parkedcalls.Started music on hold.<SIP/1000-0091d880> Playing ‘digits/1.gsm’ (language ‘it’) -.<SIP/1000-0091d880> Playing ‘digits/7.gsm’ (language ‘it’) -.c:2628 __ast_read: DTMF begin ‘2’ received on SIP/1001009292e0 [Nov 6 10:55:22] DTMF[30249]: channel.[Nov 6 10:44:31] DTMF[30238]: channel. dicha extensión.Added extension ‘701’ priority 1 to parkedcalls (0x8230a0) == Extension Changed 701[internal] new state InUse for Notify User 1001 == Extension Changed 701[internal] new state InUse for Notify User 1000 En este ejemplo la llamada de la extensión 1000 a la extensión 1001 viene contestada.gsm’ (language ‘it’) -. Como se puede ver en las dos ultimas líneas. Will timeout back to extension [phones] 1000. duration 120 ms [Nov 6 10:44:32] DTMF[30238]: channel.c:2628 __ast_read: DTMF begin ‘*’ received on SIP/1001009292e0 [Nov 6 10:55:22] DTMF[30249]: channel. duration 100 ms [Nov 6 10:55:22] DTMF[30249]: channel.c:2632 __ast_read: DTMF begin ignored ‘0’ on SIP/10000091d880 [Nov 6 10:44:32] DTMF[30238]: channel.c:2612 __ast_read: DTMF end passthrough ‘*’ on SIP/1001-009292e0 [Nov 6 10:55:22] DTMF[30249]: channel.<SIP/1000-0091d880> Playing ‘digits/0.Stopped music on hold on SIP/1001-009292e0 == Extension Changed 1000[internal] new state InUse for Notify User 1000 [Nov 6 10:55:22] DTMF[30249]: channel. class ‘default’. Asterisk notificará también a las extensiones 1000 y 1001 que la extensión 701 está en uso. Desde la extensión 1000 se presiona la tecla numeral # y luego se parquea la llamada presionando la secuencia 700 (como configurado en el archivo features. en la lista de contactos.c:2612 __ast_read: DTMF end passthrough ‘0’ on SIP/1000-0091d880 [Nov 6 10:44:32] DTMF[30238]: channel.conf. La llamada quedará en espera para 45 segundos y luego Asterisk devolverá la llamada a la extensión 1000. Esto porque en los softphone de estas dos extensiones se han añadido.Stopped music on hold on SIP/1001-009292e0 -. La locución de Asterisk nos dirá en que posición ha sido parqueada la llamada (en este caso la extensión 701).c:2612 __ast_read: DTMF end passthrough ‘0’ on SIP/1000-0091d880 -. • SIP/1000-008e3990 answered SIP/1001-009292e0 -.c:2638 __ast_read: DTMF begin passthrough ‘*’ on SIP/1001-009292e0 [Nov 6 10:55:22] DTMF[30249]: channel.c:2638 __ast_read: DTMF begin passthrough ‘2’ on SIP/1001-009292e0 66 .c:2596 __ast_read: DTMF end accepted with begin ‘*’ on SIP/2300-009292e0 [Nov 6 10:55:22] DTMF[30249]: channel. 1 in 45 seconds -.

Dial(SIP/${EXTEN}.n.User hit ‘*3’ to record call. Presionando *3 otra vez la grabación terminará.User hit ‘*3’ to stop recording call. Presionando la secuencia *3 desde la extensión 1001 se empezá a grabar la llamada en la modalidad MixMonitor.c:2638 __ast_read: DTMF begin passthrough ‘*’ on SIP/1001-009292e0 [Nov 6 10:55:26] DTMF[30249]: channel.c:2546 __ast_read: DTMF end ‘2’ received on SIP/1001009292e0. Para terminar se modificará el plan de llamadas para incluir estas funciones en las llamadas entre extensiones. filename: auto-1225986923-2300-2100 == Begin MixMonitor Recording SIP/1000-008e3990 [Nov 6 10:55:26] DTMF[30249]: channel.VoiceMail(${EXTEN}@default. La llamada viene contestada. (en negrita los cambios): exten => _100X.c:2628 __ast_read: DTMF begin ‘*’ received on SIP/1001009292e0 [Nov 6 10:55:26] DTMF[30249]: channel.<SIP/1001-009292e0> Playing ‘beep.Voicemail(${EXTEN}@default.b) exten => _100X.n.n. == End MixMonitor Recording SIP/1000-008e3990 En este ejemplo la extensión 1001 llama la extensión 1000.<SIP/1001-009292e0> Playing ‘beep.GotoIf($[${DIALSTATUS} = BUSY]?busy:unavail) exten => _100X.45.Hangup exten => _100X. es decir en un único archivo audio.c:2546 __ast_read: DTMF end ‘*’ received on SIP/1001009292e0.1.[Nov 6 10:55:23] DTMF[30249]: channel. duration 120 ms [Nov 6 10:55:27] DTMF[30249]: channel.u) exten => _100X.c:2612 __ast_read: DTMF end passthrough ‘2’ on SIP/1001-009292e0 -.c:2596 __ast_read: DTMF end accepted with begin ‘*’ on SIP/1001-009292e0 [Nov 6 10:55:26] DTMF[30249]: channel.n(busy).hHkKtTwWxX) exten => _100X.Hangup 67 .n.c:2546 __ast_read: DTMF end ‘2’ received on SIP/1001009292e0.c:2596 __ast_read: DTMF end accepted with begin ‘2’ on SIP/1001-009292e0 [Nov 6 10:55:27] DTMF[30249]: channel.ulaw’ (language ‘it’) -.Macro(disponible) exten => _100X.c:2596 __ast_read: DTMF end accepted with begin ‘2’ on SIP/1001-009292e0 [Nov 6 10:55:23] DTMF[30249]: channel.c:2612 __ast_read: DTMF end passthrough ‘2’ on SIP/1001-009292e0 -.c:2628 __ast_read: DTMF begin ‘2’ received on SIP/1001009292e0 [Nov 6 10:55:27] DTMF[30249]: channel.c:2638 __ast_read: DTMF begin passthrough ‘2’ on SIP/1001-009292e0 [Nov 6 10:55:27] DTMF[30249]: channel.ulaw’ (language ‘it’) -. duration 100 ms [Nov 6 10:55:23] DTMF[30249]: channel. duration 100 ms [Nov 6 10:55:26] DTMF[30249]: channel.n(unavail).c:2612 __ast_read: DTMF end passthrough ‘*’ on SIP/1001-009292e0 [Nov 6 10:55:27] DTMF[30249]: channel.

En esta parte del archivo se indica como se quiere “rotar” los archivos rotatestrategy = rotate . formato ISO 8601 para las fechas appendhostname = yes . Para evitar esto se puede usar el programa logrotate. dtmf . Se abre el archivo: nano /etc/asterisk/logger.aquí abajo empieza la parte dedicada a la definición de lo que se quiere registrar en cada archivo (incluida la consola) [logfiles] . error . event_log = yes . De manera predefinida asterisk registra en un archivo los eventos genéricos . .2. si se quiere que el nombre de cada archivo de registro termine con el nombre del dominio hay que activar este parametro queue_log = yes . warning . El nombre del archivo donde se guardará los registros de las colas en espera (predefinido queue_log) . Se puede registrar en cada archivo y consola los siguientes eventos: . verbose . Los archivos de registros se pueden volver de un tamaño bastante grande volviendo un poco incómoda su consulta.conf es donde se configuran todos los registros de las actividades de Asterisk.9 Logger.conf En el archivo logger. de este modo el archivo más viejo tendrá el numero secuencial más alto. 68 . debug .conf [general] dateformat=%F %T . notice . con queue_log se indica si se quiere tener un registro de las colas de espera (predefinido es yes) queue_log_name = queue_log .

El segundo bloque define la política de rotación del archivo de registro queue_log. el debug y los tonos dtmf presionados.warning. en la consola aparecerán las noticias. los errores. El más antiguo tendrá el numero secuencial más alto. en el archivo messages las noticias. yum install logrotate Una vez instalado se crea un nuevo archivo donde se van a definir la rotación de los archivos nano /etc/logrotate. los avisos.warning full => error .error. En este caso el archivo rotará cuando alcanzará un tamaño de 100 Kbyte y se creerán un máximo de 5 archivos secuenciales.2 . los avisos y el debug . en el archivo full solamente los errores Se guardan los cambios y se pasa a la definición de las política de rotación de los archivos de registro.conf en asterisk. Esta es una buena configuración: debug> debug console => notice. .debug messages => notice. 69 .1 messages. Para definir esta políticas hay que instalar el programa Logrotate que se encarga de este tipo de tarea.).dtmf.d/asterisk Se pegan las siguientes líneas: /var/log/asterisk/messages /var/log/asterisk/full { missingok rotate 7 daily postrotate /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null endscript } /var/log/asterisk/queue_log { missingok rotate 5 size=100k postrotate /usr/sbin/asterisk -rx 'logger reload'> /dev/null 2> /dev/null endscript } El primer bloque define la rotación para el archivo messages y el archivo full. Después de la rotación (postrotate) se actualiza la configuración del archivo logger. La rotación será diaria y se crearán un máximo de 7 archivos secuenciales (messages.. etc.

1 running postrotate script Para aplicar los cambios desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv 70 . old log /var/log/asterisk/queue_log. logstart 1.6 doesn’t exist—won’t try to dispose of it renaming /var/log/asterisk/queue_log to /var/log/asterisk/queue_log. i 3).2 to /var/log/asterisk/queue_log.d logrotate -fv asterisk La respuesta será: reading config file asterisk reading config info for /var/log/asterisk/messages /var/log/asterisk/full reading config info for /var/log/asterisk/queue_log Handling 2 logs rotating pattern: /var/log/asterisk/messages /var/log/asterisk/full forced from command line (7 rotations) empty log files are rotated.5 (rotatecount 5. i 5).4 to /var/log/asterisk/queue_log.3 (rotatecount 5.0 to /var/log/asterisk/queue_log. old logs are removed considering log /var/log/asterisk/queue_log log needs rotating rotating log /var/log/asterisk/queue_log.1 (rotatecount 5. i 4). old log /var/log/asterisk/queue_log.2 (rotatecount 5.5 to /var/log/asterisk/queue_log. logstart 1. since no logs were rotated not running postrotate script. i 0). old logs are removed considering log /var/log/asterisk/messages log /var/log/asterisk/messages does not exist—skipping considering log /var/log/asterisk/full log /var/log/asterisk/full does not exist—skipping not running postrotate script.1 to /var/log/asterisk/queue_log.4 (rotatecount 5.Para testar el archivo de configuración creado el procedimiento es: cd /etc/logrotate. old log /var/log/asterisk/queue_log.3 does not exist renaming /var/log/asterisk/queue_log. log->rotateCount is 5 renaming /var/log/asterisk/queue_log. logstart 1. renaming /var/log/asterisk/queue_log.2 does not exist renaming /var/log/asterisk/queue_log. logstart 1.4 does not exist renaming /var/log/asterisk/queue_log.6 (rotatecount 5. old log /var/log/asterisk/queue_log.3 to /var/log/asterisk/queue_log. i 2). i 1). since no logs were rotated rotating pattern: /var/log/asterisk/queue_log forced from command line (5 rotations) empty log files are rotated.5 does not exist renaming /var/log/asterisk/queue_log.0 does not exist log /var/log/asterisk/queue_log. logstart 1. logstart 1. old log /var/log/asterisk/queue_log.

esta locución anunciará al llamado que tendrá que digitar 1 para aceptar la llamada y dos para rechazarla pls-hold-prompt=>followme/pls-hold-while-try . el llamado.8).conf El archivo empieza con una parte general que es igual para todas las extensiones configuradas. Luego. después de descolgar. para aceptar la llamada. El llamante escuchará esta locución que le dirá que espere en línea mientras se intentará localizar el 71 . este es la locución predefinida que escuchará el llamado anunciándole quien lo está llamando norecording-prompt=>followme/no-recording . la locución predefinida si el llamante no ha registrado el propio nombre o si la opción para registrarlo no ha sido acticvada options-prompt=>followme/options . si se hace hacia números fijos y/o celulares para hacer la llamada habrá que utilizar proveedores VoIP y pagar la relativa tarifa. [general] featuredigittimeout=>5000 . numero de milisegundos disponibles para el llamado para aceptar o rechazar la llamada takecall=>1 . Como se ha visto para el desvío de llamada sencillo (párrafo 2. Si el desvío es hacia otras extensiones internas no tendrá ningún costo.10 Followme.se escribe: CLI> logger reload 2. se podrá activar y desactivar la aplicación según como se necesite.conf (sígueme) El archivo followme permite hacer una cosa muy sencilla: definir una serie de números (extensiones internas. para rechazarla la tecla 2 call-from-prompt=>followme/call-from . Se modifica el archivo de configuración: nano /etc/asterisk/followme. tendrá que hundir la tecla 1 del teléfono declinecall=>2 . fijos o celulares) donde desviar la llamada si en la extensión predefinida nadie contesta o si ha sido activada esta opción. se personaliza la configuración para cada extensión.

llamado status-prompt=>followme/status . si al numero fijo tampoco contestan se intentará llamar al celular takecall=>1 .15 .15 . esta locución anunciará al llamante que no se ha podido localizar la persona buscada Ahora empieza la configuración especifica de cada extensión que se quiere incluir en este archivo. Si se han incluido números fijos y celulares este contexto debe tener acceso a las llamadas externas. tipo de música en espera que escuchará el llamante mientras se intentará localizar el destinatario de la llamada context=>phones . si al final de todos los desvíos nadie contestará la llamada. el contexto que usará la aplicación followme para localizar el llamado. number=>1001. number=> 0057510000000. sorry-prompt=>followme/sorry . si a la extensión 1001 nadie contesta se intentará llamar el numero fijo que aparece en esta línea por otros 15 segundos number=> 0057310000000. Se pueden personalizar para cada extensión declinecall=>2 call-from-prompt=>followme/call-from followme-norecording-prompt=>followme/no-recording followme-options-prompt=>followme/options followme-pls-hold-prompt=>followme/pls-hold-while-try followme-status-prompt=>followme/status followme-sorry-prompt=>followme/sorry 72 . numero de la extensión a configurar musicclass=>default . Esta locución anunciará al llamante que la persona llamada no se encuentra al momento en su oficina/casa/etc. ahora siguen los mismo parámetros que se han configurado en la parte general. En este ejemplo si el destinatario no contesta a la extensión 1000 se llamará como segunda opción la extensión 1001 por 15 segundos. En este ejemplo se definirá los números que se llamarán si la extensión 1000 no contesta [1000] . Aquí empieza la lista de números que se intentará llamar para localizar el destinatario de la llamada.15 .

1.u) 73 .GotoIf($[${DIALSTATUS} = BUSY]?busy:unavail) exten => _100X.conf exten => _100X.Followme(${EXTEN}.n. [1001] …….n(unavail). execution will be returned to the dialplan and call execution will continue at the next priority.conf.Dial(SIP/${EXTEN}.Macro(disponible) exten => _100X.n. Desde la consola: asterisk -rvvvvvvvvvvvvvvvvvvvvv Se escribe el comando: CLI> core show application followme -= Info about application ‘FollowMe’ =[Synopsis] Find-Me/Follow-Me application [Description] FollowMe(followmeid[. En el plan de llamadas bajo el contexto internas se añaden la linea en negrita: CLI> quit nano /etc/asterisk/extensions.n.Playback the incoming status message prior to starting the follow-me step(s) a .san) exten => _100X.conf.Record the caller’s name so it can be announced to the callee on each step n . If the specified <followmeid> profile doesn’t exist in followme.d/asterisk reload Para más información se puede mirar la sintaxis de la aplicación followme.Playback the unreachable status message if we’ve run out of steps to reach the or the callee has elected not to be reachable. Returns -1 on hangup El uso de la aplicación es muy sencillo.hHkKtTwWxX) exten => _100X.45. Options: s .Voicemail(${EXTEN}@default.options]): This application performs Find-Me/Follow-Me functionality for the caller as defined in the profile matching the <followmeid> parameter in followme.Una vez terminada la configuración para la extensión 1000 se puede seguir con la 1001 y así siguiendo. Se guardan los cambios y se recarga la configuración de Asterisk: /etc/init.

asociamos a la variable ${CALLERID(num)}/FOLLOWME) el valor uno.n.GotoIf($["${FM}" = "1"]?followme:exit) exten => s.n.Set(DB(${CALLERID(num)}/FOLLOWME)=1) exten => 101.n.NoOp(${FM}) exten => s. añadimos: exten => 101.1. contexto internas. En el dialplan. ¿Como podemos hacer para que el Followme se active solamente cuando el “dueño” de la extensión 1000 quiere activarla? Con unas lineas que permitan al usuario decidir cuando activar el followme.Hangup Con estas tres líneas.n(busy). usando la base de datos internas de Asterisk.Macroexit Se añade la linea en negrita al siguiente bloque y se quita la linea exten => _100X.VoiceMail(${EXTEN}@default.Hangup Si alguien.n(exit).n.conf a – el llamante podrá grabar su propio nombre para que sea anunciado al llamado cuando conteste y de esta forma tenga la posibilidad de decidir si quiere o no aceptar la llamada n – Una vez que se hayan llamados todos los números y no se logre localizar la persona buscada.Followme(${MACRO_EXTEN}. contexto internas. llama la extensión 1000 y nadie contesta dentro de 45 segundos se activará la aplicación Followme que empezará a llamar todos los números configurados para la extensión 1000 para localizar el destinatario de la llamada.san) exten => s. por ejemplo.exten => _100X.Answer exten => 101. En el dialplan.Followme($ 74 .1.n. En el caso de la extensión 1000 seria: 1000/FOLLOWME=1 Luego cada vez que llamamos la extensión 1000 se controlará si esta variable tiene asociado el valor uno (es decir el followme activado) [macro-followme] exten => s.Set(FM=${DB(${MACRO_EXTEN}/FOLLOWME)}) exten => s.b) exten => _100X.n.n. Las tres opciones configuradas significan: • • • s – se anunciará al llamante el estado de la extensión 1000 antes de empezar los distintos pasos configurados en el archivo followme.n(followme). el llamante escuchará una locución que le dirá que no ha sido posible localizar el destinatario de la llamada.Hangup exten => _100X. añadimos: Con unas lineas que permitan al usuario decidir cuando activar el followme.

n.11 ENUM ENUM o mapeo de números telefónicos.).n.1.n.1. basta con ingresar el dominio para que el servidor DNS resuelva y establezca una conexión.{EXTEN}. Un ejemplo: Tenemos un número telefónico: +5712345678 Este se almacenará bajo la jerarquía e164.GotoIf($[${DIALSTATUS} = BUSY]?busy:unavail) exten => _100X.n.Dial(SIP/${EXTEN}.VoiceMail(${EXTEN}@default.Macro(disponible) exten => _100X.n(unavail).ARPA siguiendo un orden inverso y poniendo entre cada digito un punto: 37 Un servidor DNS permite conectarse con la máquina sin necesidad de usar su dirección IP.n.hHkKtTwWxX) exten => _100X.Macro(followme) exten => _100X. correo electrónico. etc.b) exten => _100X. pagina web. Wikipedia 75 .45. está constituido por una serie de protocolos que permiten crear una convergencia entre la red telefónica tradicional y Internet.Hangup Para desactivar el followme la extensión 1000 tendrá que llamar la extensión 102 exten => 102. 2.n(busy). Permite asociar (utilizando el protocolo DNS37) un numero telefónico a una serie de servicios típicos de la red internet (VoIP.Hangup Se actualiza el plan de llamadas: asterisk -rvvvvvvvvv CLI> dialplan reload Este es solamente un ejemplo.n.n.ARPA donde se almacenan los servicios asociados a un determinado numero telefónico.u) exten => _100X.Hangup exten => _100X.san) : exten => _100X.Voicemail(${EXTEN}@default. Hay distintas formas de configurar el followme según las necesidades.Set(DB(${CALLERID(num)}/FOLLOWME)=0) exten => 102. ¿Cómo funciona? Se ha creado una nueva jerarquía de dominios bajo el DNS e164.Answer exten => 102.

4.es/voip-sip/sip-uri.conf nano /etc/asterisk/enum.arpa search => e164.3.4.*$!sip:phoneme@example.2.3cx.1.7.php 76 .conf [general] search => e164. un directorio ENUM publico.8.5.6.5.5. al contrario de ENUMLOOKUP generará como resultado un ID que luego se podrá usar con la función ENUMRESULT 38 http://www.d/asterisk restart Esta es una lista de las funciones disponibles en Asterisk para hacer consultas ENUM: • • ENUMLOOKUP permite hacer una consulta de los registros NAPTR asociados a un determinado numero telefónico ENUMQUERY permite hacer una consulta de los registros NAPTR pero.net!” IN NAPTR 102 10 “u” “E2U+mailto” “!^.7.org Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init.php 39 https://www.org/index.6.5.2.e164.1. Para hacer una prueeba se registra un numero telefónico y se asocia a distintos servicios Internet a través de E164.arpa y e164.3.arpa. IN NAPTR 100 10 “u” “E2U+sip” “!^.com!” En este caso dos: • • una SIP URI38 un correo electrónico Queda claro que una vez que se tengan estos datos será posible usarlos en Asterisk.e164. llamando directamente la SIP URI en lugar del número telefónico (ahorrando los costos de llamadas) o enviar un correo electrónico.org39.7.arpa Este número estará asociado a unos registros DNS específicos (Name Authority Pointer o NAPTR) que podrán conocerse a través de una consulta: $ORIGIN 8. ENUM y Asterisk Primero tenemos que modificar el fichero enum.*$!mailto:myemail@example.e164.org h323driver => H323 Se ponen estas líneas que nos permitirán hacer búsqueda en la jerarquía DNS e164.7.

Set(Enum1=${ENUMLOOKUP(+${EXTEN:2}.e164.org El resultado de la consulta será un número entero que indicará cuantos SIP URI están asociados al número telefónico indicado exten => _00.e164.e164.org)}) El ejemplo funciona si para marcar un numero se usa el formato internacional: 00 + código país + código ciudad + numero..ALL.Set(Enum1=${ENUMQUERY(+${EXTEN:2}.1. • • • • • • Se asigna el resultado de la consulta a la variable Enum1 ENUMLOOKUP el nombre de la función de Asterisk +${EXTEN:2} se quitan del numero marcado los primeros dos dígitos (00) y se pone al frente un + (el resultado será: +5712345678 que es el formato requerido para hacer consultas ENUM) SIP los resultados serán solamente SIP URI c: con esta opción se recibirá como respuesta el numero de SIP URI asociadas al numero telefónico indicado Hacemos la consulta en la jerarquía DNS e164.record#[.• ENUMRESULT permite consultar los resultados generados por ENUMQUERY usando el ID creado por ENUMQUERY ENUMLOOKUP Sintaxis: ENUMLOOKUP(number[.Set(Enum1=${ENUMLOOKUP(+${EXTEN:2}.1. ENUMQUERY Sintaxis: ENUMQUERY(number[.1.SIP.Method-type[.c.org)}) parecido al ejemplo precedente con la única diferencia que la consulta restituirá todos los NAPTRs asociados al numero telefónico indicado.org)}) El resultado de la consulta será un numero (ID) que se utilizará con la función ENUMRESULT ENUMRESULT 77 .c..zone-suffix]]]]) Ejemplos: exten => _00.SIP..zone-suffix]]) Ejemplos: exten => _00..options[..Method-type[.

Dial(SIP/MyproveedorVoIP/${EXTEN}) exten => _00..Hangup Lo mismo se puede hacer para el protocolo IAX: exten => _00..${counter})}) exten => _00.4.1)}) Con esta línea se mira el primer NAPTR resultado de la consulta hecha con ENUMQUERY.sip.conf) Quizás una de las características más interesantes de Asterisk es la posibilidad de crear conferencias audio.GotoIf($[”${counter}”<”${Enum1}”]?3:6) exten => _00.Dial(SIP/MyproveedorVoIP/${EXTEN}) exten => _00.2..GotoIf($[”${counter}”<”${sipcount}”]?3:6) exten => _00.....12 Las conferencias (Meetme.3..7.Hangup Se puede construir una macro que se ocupe de las consultas ENUM y si no hubiera resultados volver al dialplan y efectuar la llamada vía proveedor SIP o a través de la línea telefónica tradicional..1.3.6. 78 .GotoIf($[”${counter}”<”${sipcount}”]?3:6) exten => _00... En este párrafo se verá como configurar el archivo meetme..1.Set(counter=$[${counter}+1]) exten => _00.2....5.GotoIf($[”${counter}”<”${Enum1}”]?3:6) exten => _00.iax2.Set(Enum1=${ENUMLOOKUP(+${EXTEN:2}.Sintaxis: ENUMRESULT(id. La variable ${Enum1} es la que contiene el ID de la consulta y es la misma que hay que indicar como ID en la función ENUMRESULT DIALPLAN (Plan de llamadas) A continuación se presenta como construir el plan de llamadas de modo que antes de llamar cualquier número (nacional o internacional) haga una consulta en ENUM para ver si es posible usar una SIP URI en lugar del número telefónico: exten => _00.Set(Enum1=${ENUMLOOKUP(+${EXTEN:2}.1..Set(counter=$[${counter}+1]) exten => _00..Dial(SIP/${ENUMLOOKUP(+${EXTEN:2}.c)}|counter=0) exten => _00.Dial(IAX2/${ENUMLOOKUP(+${EXTEN:2}.6.4.Set(NUM=${ENUMRESULT(${Enum1}.sip.sip.${counter})}) exten => _00. 2.5.c)}|counter=0) exten => _00.resultnum) Ejemplos: exten => _00.conf y algunos ejemplos de como usar una conferencia.7.

Este parámetro se utiliza para definir si un usuario puede o no entrar en la conferencia si esta no ha empezado. En caso contrario hay que dejarlo en no logmembercount=yes . Si entra a las 7:50 será rechazado.1234 conf => 3502.conf: nano /etc/asterisk/meetme. Si entra más de una hora antes se le anunciará que la conferencia no existe. cuando faltarán 120 segundos para terminar la conferencia programada. Hay una conferencia programada a las 8 de la mañana. endalert=120 . este parámetro se utiliza para tener una cuenta de los usuarios presenten en una conferencia actualizando la base de datos usada (realtime) fuzzystart=300 . Si el usuario entra a la 7:55 será aceptado porque puede entrar hasta 5 minutos (300 segundos) antes del comienzo de la conferencia. Puede ser un valor entre 2 y 32 schedule=yes . Ejemplo. earlyalert=3600 . conf => 3500 conf => 3501.Hay que empezar con la configuración del archivo meetme.pin][. este parámetro va configurado con yes solamente si se usan las conferencias en realtime40. Si entra cuando falta menos de una hora recibirá este aviso. Numero de paquetes audio de 20ms que serán guardados en un buffer de memoria cuando pertenecen a canales que no son DADHI. la sintaxis es conf => confno[. [rooms] . Este valor (siempre en segundos) define si al usuario que intenta entrar en una conferencia programada le será anunciado o no que la conferencia todavía no ha empezado. 40Asterisk Realtime 79 . se le anunciará a todos los participantes.5678 Una explicación de los tres ejemplos. desde esta etiqueta empieza la configuración de las conferencias . 300 es el número de segundos. .1234. Esto permite sincronizar el audio de los distintos participantes y evitar retrasos.conf [general] audiobuffers=32 .adminpin] .

Al entrar en un cuarto de conferencia se le anunciará al usuario el número de personas presentes.Meetme(${EXTEN}. 80 .conf) Las tres opciones: • • s .En el primero se define un cuarto de conferencias cuya extensión es 3500 y todos los usuarios tienen el permiso para entrar.scM(default)) exten => _350[012]. Se define un contexto dedicado a las conferencias y ahí se configuran los cuartos nano /etc/asterisk/extensions. Desde la consola: asterisk -rvvvvvvvvvvvvvvv Se escribe CLI> core show application meetme (más la tecla tab) MeetMe MeetMeAdmin MeetMeChannelAdmin MeetMeCount Las aplicaciones disponibles son cuatro. la tercera es para controlar un canal de la conferencia y la tercera para conocer el numero de usuarios presentes en una conferencia. Se sigue con la configuración del plan de llamadas. c .d/asterisk restart Una lista de las aplicaciones disponibles para gestionar las conferencias. Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init. Marcando la tecla asterisco se escuchará el menú.1.n.conf [conferencias] exten => _350[012]. Los usuarios tendrán que usar el PIN 1234 y los administradores el PIN 5678. En la tercero la extensión es la 3502. la segunda para administrarla. La primera es para entrar en una conferencia.Hangup Llamando la extensión 3500 se entrará en el cuarto de conferencia 3500 (como configurado en meetme. En el segundo la extensión es la 3501 y para entrar los usuarios tendrán que digitar el PIN 1234.Con esta opción se activa el menú del cuarto de conferencias para usuarios y administradores.

Con la primera línea de la macro controlamos cuantos usuarios están en la conferencia 3520 y se asocia ese número a la variable count.Hangup exten => s. 81 . Si en lugar de la opción D se pone la opción d no se necesitará definir un PIN para el cuarto de conferencia.n.3.103.DM(default)) exten => 3510.4.2.Cuando en el cuarto está solamente una persona.1.conf).MeetMe(${MACRO_EXTEN}.Gotoif($[${count} > ${confmax}]?103) exten => s.• M(default) .1.104. Para tener una lista completa de las opciones disponibles desde la consola de Asterisk: CLI> core show application MeetMe Si se quiere definir un número máximo de usuarios que pueden participar en una conferencia podemos usar esta macro (con la aplicación MeetMeCount): exten => 3520.Hangup Primero no se indica el número del cuarto de conferencias y se usa la opción D que permite definir la extensión 3510 como cuarto de la conferencia y un PIN para entrar a ella. para hacerlo hay que crear estas líneas en el extensions.Meetme(. ésta escuchara la música en espera de la clase default” Existe la posibilidad de crear cuartos de conferencias de forma dinámica (sin tener que configurarlos en el archivo meetme.count) exten => s.2.3.1.Hangup [macro-meetme] exten => s.Playback(conf-invalid) exten => s. Con este comando: CLI> help meetme Usage: meetme (un)lock|(un)mute|kick|list [concise] <confno> <usernumber> Executes a command for the conference or on a conference se maneja desde la consola de Asterisk muchas de las opciones disponibles para una conferencia.Hangup Primero se asocia a la variable confmax el numero 10 (el numero máximo de participantes permitidos en la conferencia) y luego se llama la macro meetme. si es menor el usuario entrará al cuarto de conferencias. Si el numero contenido en la variable count es mayor del numero contenido en la variable confmax (10) vamos a la línea con prioridad 103 donde se comunicará que la conferencia no es valida y se colgará la llamada.Set(confmax=10) exten => 3520.D) exten => s.conf exten => 3510.MeetMeCount(${MACRO_EXTEN}.Macro(meetme) exten => 3520.

n. Al arrancar la GUI.Meetme(${EXTEN}.n.d/asterisk reload La lineas modificadas en el dialplan (en negrita los cambios): [conferencias] exten => _350[012].Meetme(. para evitar de perder el trabajo que se ha hecho es buena practica hacer una copia de todos los archivo de configuración de Asterisk presentes en la carpeta /etc/asterisk: mkdir /tmp/asterisk cp /etc/asterisk/* /tmp/asterisk 82 . ésta añade macros y extensiones al plan de llamadas.scM(default)) exten => _350[012].CLI> meetme list 3500 meetme list 3500 User #: 01 1000 Fulano Channel: SIP/1100-b7835e20 (unmonitored) 00:00:33 User #: 02 1001 Sutano Channel: SIP/1000-b7847ce0 (unmonitored) 00:00:22 Aparecerá la lista de usuarios presentes en el cuarto de conferencia 3500.13 Asterisk GUI Asterisk GUI es una interfaz gráfica desarrollada para la gestión y la configuración de Asterisk desde un navegador Web. Simplifica el manejo de Asterisk siempre y cuando se tenga un conocimiento básico del funcionamiento de la PBX.Hangup [phones] include => internas include => externas include => subscribe include => parkedcalls include => conferencias Desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvv Se actualiza el dialplan: CLI> dialplan reload 2.Hangup exten => 3510.DM(default)) exten => 3510. Se recarga la configuración de Asterisk: /etc/init.1.1.

dialplan write = system.verbose.user. Primero el manager.dtmf./configure make make install Para terminar con la instalación hay que modificar dos archivos de configuración de Asterisk.0.asterisk.config.conf nano /etc/asterisk/manager.org/svn/asterisk-gui/branches/2.call.user.call.log. yum install subversion cd /usr/src Se descargan los archivos de la GUI svn co http://svn.agent.originate Se guardan los cambios y se sigue con el archivo http.reporting.conf nano /etc/asterisk/http.0 displayconnects = yes Se crea un usuario que sera él que se usará para entrar en la pagina de administración de la GUI de Asterisk [admin] secret = sesamo read = system.0/ Se compila y instala: .conf [general] 83 .Para descargar la ultima versión disponible hay que instalar el programa Subversion.config.reporting.cdr.0 Se entra en la carpeta: cd 2.0.agent.command.conf [general] enabled = yes webenabled = yes port = 5038 httptimeout = 60 bindaddr = 0.

0 bindport=8088 Se guardan los cambios y se reinicia Asterisk /etc/init.0.com:8088/asterisk/static/config/cfgbasic.conf: OK * Checking for manager.d/asterisk restart Ahora hay que abrir los puertos 5038 TCP y 8088 TCP en el cortafuegos nano /etc/sysconfig/iptables Se añaden estas líneas en la sección *filter: # Asterisk Manager -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT # Asterisk http -A INPUT -p tcp -m tcp --dport 8088 -j ACCEPT Se reinicia el cortafuegos: service iptables restart Ahora se averigua que todo esté bien configurado make checkconfig --.example.Everything looks good --• GUI should be available at http://www.html Si esta no funciona prueben: 84 .html • Desde un navegador Web se visita la pagina de configuración de la GUI de Asterisk (cambiar example.0.example.Checking Asterisk configuration to see if it will support the GUI --* Checking for http.conf: OK * Checking if HTTP is enabled: OK * Checking if HTTP static support is enabled: OK * Checking if manager is enabled: OK * Checking if manager over HTTP is enabled: OK --.com:8088/static/config/cfgbasic.com con la dirección IP del servidor asterisk). http://www.enabled = yes enablestatic = yes bindaddr=0.

Normalmente este tipo de configuración se usa en los call center y permite redirigir las llamadas entrantes a los agentes que se encargarán de atenderlas. ¿Como se configura en Asterisk la gestión de las colas? A través de dos archivos: • • agents. entre sus funcionalidades. permite crear y administrar colas de espera.conf 85 .Aquí van algunas imágenes de la interfaz gráfica 2.14 La gestión de las colas Asterisk.conf queues.

los agentes que atenderán las colas. definiendo algunas variables y parámetros. la clase de musica en espera que escuchará el agente cuando esté conectado Se define un grupo para los agentes que se configurarán: group=1 La última parte es dedicada a la configuración de los agentes siguiendo la sintaxis: 86 . En el queues.conf se configuran las colas (pueden ser una o más). empieza la parte general persistentagents=yes . define si el callbacklogin tiene que ser almacenado en la base de datos interna de Asterisk.conf nano /etc/asterisk/agents. si un agente no contesta una llamada dentro de 15 segundos será automáticamente desconectado autologoffunavail=yes . un agente puede terminar una llamada presionando la tecla * musiconhold => default .1 Los Agentes Para configurar los agentes que atenderán las llamadas entrantes a las distintas colas hay que modificar el archivo agents. define si está permitido a una misma extensión conectarse como agente múltiple [agents] . automáticamente el agente será desconectado endcall=yes . De esta forma cuando se vuelve a arrancar Asterisk estos datos serán recargados multiplelogin=yes . si la extensión desde la cual el agente se conecta se vuelve no disponible. numero máximo de intentos que tiene un agente para conectarse autologoff=15 . desde aquí comienza la configuración de los agentes maxlogintries=3 .conf [general] .En el primero configuramos. cuales agentes y/o grupos son miembros de una determinada cola y que tipo de estrategia se utilizarán para enrutar las llamadas a los distintos agentes.14. 2.

n.Agentlogin(${EXTEN}) exten => _200[01].14.agent => IDagente. si se usan agentes dinámicos su configuración se guardará en la base de datos de Asterisk. 2 offline] Los dos agentes están configurados pero no conectados. empieza la parte general persistentmembers = yes .Fulano agent => 2001.2 Queues. cada agente será enrutado a su correspondiente cola.d/asterisk reload Desde la consola asterisk -rvvvvvvvvvvvvv CLI> agent show 2000 (Fulano) not logged in (musiconhold is ‘default’) 2001 (Sutano) not logged in (musiconhold is ‘default’) 2 agents configured [0 online .conf Para terminar la configuración dedicada a las colas hay que modificar el archivo queues.conf exten => _200[01].conf [general] . 2. Para que un agente se pueda loguear hay que escribir estas líneas en el plan de llamadas (contexto internas): nano /etc/asterisk/extensions.contraseñaagente.Sutano Se guardan los cambios.Hangup Se recarga la configuración de Asterisk: /etc/init.1234.2345.nombre Dos ejemplos: agent => 2000. 87 .1. De esta forma si Asterisk se vuelve a arrancar.conf nano /etc/asterisk/queues.

Ringall: Llama a todos los agentes a la vez y el primero que descuelgue será quien atienda la llamada. monitor-type = MixMonitor . strategy = ringall .announce = queue-ventas . Con este parámetro definimos otro tipo de comportamiento. Los usuarios serán atendidos de manera paralela hasta que haya agentes disponibles.keepstats = no . Desde esta línea empieza su configuración musicclass = default . se puede crear un anuncio para indicar a los agentes (cuando contestan una llamada) a que cola pertenece el usuario que están atendiendo (útil en el caso de agentes que atienden más de una cola a la vez). RRMemory: Distribuye las llamadas “por turnos” entre los agentes disponibles y “recuerda” el último agente al que intentó llamar. el nombre de una cola de espera. Hay unos cuantos usuarios esperando por ser atendidos por los agentes. con este parámetro los archivos audios de los dos canales serán mezclados en uno solo shared_lastcall=yes . Posibles opciones son: • • • • • • Leastrecent: Asigna la siguiente llamada al agente que más tiempo lleve sin atender una llamada. con strategy se define que tipo de estrategia hay que utilizar para atender las colas. Random: Asigna la siguiente llamada aleatoriamente a cualquier agente disponible. 88 . Cuando el usuario que está de primero en la cola viene atendido el segundo se vuelve primero e será atendido por el primer agente disponible. De esta forma se reducen considerablemente los tiempos de espera. Linear: contacto los agentes siguiendo el orden definido en este archivo de configuración. normalmente una cola funciona de la siguiente manera. en el caso de agentes que pertenecen a más de una cola poniendo a yes este parámetro se respetarán los tiempos de espera entre las distintas colas [ventas] . la clase de la música en espera . Este comportamiento no tiene en cuenta que pueden haber muchos agentes disponibles pero que cada usuario tendrá que esperar de volverse el primero de la lista para ser atendido. mantiene las estadísticas de la cola durante un “reload” de asterisk autofill = yes . si se elige grabar las conversaciones. Fewestcalls: Asigna la siguiente llamada al agente que menos llamadas haya atendido.

periódicamente se le anunciará al usuario en la cola. en segundos. Antes que el agente conteste una llamada se le anunciará el tiempo de espera del usuario que va a atender joinempty = yes . este parámetro representa cada cuantos segundos a un usuarios en la cola se le presentará un anuncio (por ejemplo relacionado con algún producto de la empresa). pasado el cual la llamada se considerará no contestada por el agente. cada cola puede tener un peso. para evitar que cada vez que la posición y/o el tiempo estimado de un usuario cambie se le presente un anuncio. este parámetro define un tiempo (en segundos) que se esperará antes de comunicarle su nueva posición/tiempo estimado. con este parámetro se define el numero máximo de usuarios que pueden entrar en la cola de espera (0 = ningún limite) announce-frequency = 90 . Las colas con un valor alto tendrán prioridad respecto a aquellas con un peso más bajo autopause=no . su posición en la misma announce-round-seconds = 10 . si un agente non contesta una llamada será puesto en pausa maxlen = 0 . antes de volver a llamar todos los agentes weight=0 . este el tiempo. Puede ser yes. Cada cuantos segundos se anunciará al usuario en la cola su posición y/o tiempo estimado de espera min-announce-frequency = 15 . tiempo. anunciar junto a la posición en la cola el tiempo estimado de espera. u once (una sola vez) announce-position = yes .• Wrandom: asigna la llamada aleatoriamente usando una métrica basada en penalidades. announce-holdtime = once . retry = 5 . no. en segundos. permite a los usuarios acceder a la cola aunque no haya agentes disponibles 89 . . timeout = 15 . el tiempo de espera estimado será redondeado a las decenas reportholdtime = yes .periodic-announce-frequency=60 .

Hangup Se guardan los cambios y se actualiza la configuración de Asterisk: /etc/init.ringinuse = no .n.Queue(ventas) exten => 3000. se guardan los cambios y se añaden unas líneas al archivo extensions. no se timbrarán las extensiones de los agentes que están en uso (solo protocolo SIP) Para terminar la configuración de esta cola se definen los agentes que son parte de ella.d/asterisk reload Desde un SoftPhone conectado a Asterisk. con este parámetro en no.1. member => Agent/@1 Una vez terminada la configuración del archivo.conf En el contexto internas se pone: exten => 3000. Se puede hacer de dos formas: • • Indicando un agente por línea Indicando un grupo de agentes Un agente por línea: member => Agent/2000 member => Agent/2001 Un grupo de agentes: .conf para configurar la cola en el plan de llamadas: nano /etc/asterisk/extensions. se marca la extensión 3000 para ver el resultado de la configuración de la cola en espera. 90 .

J1) FXO (Foreign Exchange Office) es un dispositivo de computador que permite conectar éste a la RTB. y mediante un software especial. realizar y recibir llamadas de teléfono. Los dispositivos Mixtos FXO/FXS combinan los dos tipos de conexiones según las necesidades del adquirente. que también se pueden denominar primarios. FXS (Foreign Exchange Station) es el conector en una central telefónica o en la pared de nuestro hogar. T1.Capitulo III Asterisk y la PSTN Una de las posibilidades brindadas por Asterisk es la de conectarlo. 41 Red Telefónica Conmutada 42 Digium . Los dispositivos pueden ser de distintos tipos: • • • • • Dispositivos FXO Dispositivos FXS Dispositivos Mixtas (FXO/FXS) Dispositivos BRI (ISDN) Dispositivos PRI (E1. Los dispositivos BRI (Basic rate interface) permiten conectar una linea ISDN (Integrated Services Digital Network) al servidor Linux. Las lineas ISDN están compuestas de dos canales audio (de 64Kbit/s cada uno) y un canal D que se utiliza para la señalizacion con la central telefónica (de 16 Kbit/s). sean FXO o FXS. La diversa nomenclatura de estas lineas está relacionada con los países donde se usan. T1 son la lineas disponibles en Estados Unidos. son lineas digitales que según el tipo brindan de 24 (T1) a 34 (E1) canales de voz. que permite conectar un teléfono analógico estándar. a la red telefónica conmutada (RTB)41. Los dispositivos E1. J1. a través de dispositivos Hardware. T1. Un ejemplo de dispositivo FXO/FXS es la tarjeta Digium42 TDM400P que permite instalar un total 4 módulos. E1 en Europa y J1 en Japón.

) En este capitulo se verá como instalar un dispositivo FXO en el computador y como configurarlo en Asterisk para efectuar y recibir llamadas. etc. 8.1 Instalación dispositivo X100P El dispositivo X100P es una tarjeta PCI43 con un canal FXO disponible. 3. distribución CentOS estos son los pasos a seguir: 1. medium devsel. 6. latency 64. IRQ 201 43 PCI 44 IRQ 92 . pequeña empresa. Apagar el computador Desconectar el cable de alimentación Abrir el chasis del Computador Insertar la tarjeta en una ranura PCI disponible Volver a poner el chasis del computador Conectar el cable de alimentación al computador Conectar la linea telefónica al puerto FXO de la tarjeta a través de un normal cable telefónico Prender el computador Normalmente CentOS reconoce automáticamente la nueva tarjeta instalada y le asigna un IRQ 44 para que pueda comunicarse con el procesador del computador. 4. Para la instalación de la tarjeta en un servidor Linux. Una vez arrancado el sistema comprobamos que efectivamente la tarjeta ha sido reconocida por el sistema: lspci -v Según el modelo y marca en la pantalla tendremos una salida de este tipo: 02:08. 3.0 Communication controller: Tiger Jet Network Inc. 7. Tiger3XX Modem/ISDN interface Subsystem: Intel Corporation Digium X100P/X101P analogue PSTN FXO interface Flags: bus master.El tipo de dispositivos a utilizar estará relacionado con el tipo de instalación que se está haciendo (casa. 2. oficina. 5.

conf Ahora se abren los dos archivos para ver que cambios hizo esta utilidad: nano /etc/dahdi/system.conf dahdi_genconf -v El resultado: Default parameters from /etc/dahdi/genconf_parameters Generating /etc/dahdi/system.conf Generating /etc/asterisk/dahdi-channels.el tipo de señalizacion utilizada por el canal. La primera utilidad que se usará es dahdi_genconf que reconoce el tipo de tarjeta instalado y crea/modifica dos archivos: /etc/dahdi/system. DAHDI trabaja “encima” de Asterisk y por eso hay que arrancarlo siempre antes de Asterisk. dahdi_cfg # # Span 1: WCFXO/0 "Generic Clone Board 1" (MASTER) RED fxsks=1 . # Dahdi Configuration File # # This file is parsed by the Dahdi Configurator. non-prefetchable) [size=4K] Capabilities: [40] Power Management version 2 Se comprueba el IRQ cat /proc/interrrupts 201: 330596875 IO-APIC-level wcfxo 3.2 Configuración X100P en Asterisk El programa/librería que se encarga de detectar y configurar el puerto FXO en Asterisk es DAHDI. En este caso protocolo FXS Koolstart 93 .conf /etc/asterisk/dahdi-channels. # your manual changes will be LOST.conf # Autogenerated by /usr/sbin/dahdi_genconf on Mon Nov 30 09:19:08 2009 # If you edit this file and execute /usr/sbin/dahdi_genconf again.I/O ports at d800 [size=256] Memory at fdc00000 (32-bit. Para la configuración de la tarjeta se usarán algunas utilidades presentes en el paquete DAHDI-tools.

conf el fondo del archivo se añade la linea: #include dahdi-channels. zona predefinida para la señalizacion (tono de llamada.. numero de canales disponibles en la tarjeta (en este caso 1) Para que el archivo dahdi-channels sea leído por Asterisk tenemos que poner un include en el archivo chan_dahdi. Span 1: WCFXO/0 "Generic Clone Board 1" (MASTER) RED . siempre y cuando los parámetro de señalización estén presentes en el archivo indications.echocanceller=mg2. Si se deja el parámetro en “asreceived” se presentará al llamante el numero telefónico asignado a la linea por la compañía telefónica. tono de ocupado. Este tipo de parámetro será útil al momento de configurar el dialplan context=from-pstn .el tipo de cancelación del echo software (mg2) y el canal (en este caso existe solamente el 1) loadzone =us defaultzone=us . El segundo archivo: nano /etc/asterisk/dahdi-channels. es el contexto en donde entrarán las llamadas procedentes de la linea telefónica. channel => 1 . Si el puerto es FXO la señalizacion es FXS y viceversa.conf .conf 94 . Normalmente es el contrario del puerto instalado.1 .. si se disponen de muchos canales se pueden crear grupos. aquí se puede configurar el callerid completo para la linea telefónica conectada al puerto FXO.) El único cambio que hay que hacer es modificar los dos últimos parámetros con el código de su propio país.conf nano /etc/asterisk/chan_dahdi. el tipo de señalizacion del canal. etc.conf Se guardan los cambios. callerid=asreceived . group=1 .. line="1 WCFXO/0/0 FXSKS (In use) (SWEC: MG2)" signalling=fxs_ks .

Desde la consola de Asterisk recargamos la configuración de DAHDI asterisk -rvvvvvvvvvvvvvvvvvvv CLI> dahdi restart Si no sale ningún error significa que la configuración es correcta.Se guardan los cambios. El estado de los canales DAHDI CLI> dahdi show status Description Generic Clone Board 1 Alarms IRQ bpviol CRC4 Fra Codi Options LBO OK 0 0 0 CAS Unk YEL 0 db (CSU)/0-133 feet (DSX-1) Una serie de informaciones acerca del canal configurado: CLI> dahdi show channel 1 Channel: 1 File Descriptor: 15 Span: 1st Extension: Dialing: no Context: from-pstn Caller ID: Calling TON: 0 Caller ID name: Mailbox: none> Destroy: 0 InAlarm: 0 Signalling Type: FXS Kewlstart Radio: 0t Owner: <None>> Real: <None> Callwait: <None> Threeway: <None> Confno: -1 Propagated Conference: -1 Real in conference: 0 DSP: nost Busy Detection: no TDD: nost Relax DTMF: no Dialing/CallwaitCAS: 0/0 95 .

.Hangup Para todas las llamadas locales y nacionales se usará la linea telefónica..Dial(SIP/1000.d/asterisk restart Para más puertos FXO el procedimiento es casi idéntico. Con g1 se indica el grupo (el puerto FXO pertenece al grupo 1).Dial(DAHDI/1/${EXTEN:1}.n..1. 96 .Hangup Todas las llamadas que entran a través de la linea telefónica se desvían a la extensión 1000.45) exten => _9.Hangup En lugar de g1 se pone 1 que es el canal del puerto FXO Para las llamadas en entrada desde la linea telefónica: [from-pstn] exten => s.n.n.Dial(DAHDI/g1/${EXTEN:1}. Otra forma puede ser: exten => _9. Se guardan los cambios y se reinicia Asterisk /etc/init.45) exten => s.1.Default law: ulaw Fax Handled: no Pulse phone: no DND: nost Echo Cancellation: localhos128 taps localhoscurrently OFF Actual Confinfo: Num/0.1.45) exten => _9. Mode/0x0000 Actual Confmute: No Hookstate (FXS only): Onhook Ultima parte de la configuración es crear en el plan de llamadas un contexto para las llamadas entrantes de la linea telefónica y unas lineas en el contexto externas: • Para hacer llamadas desde una extensión conectada a Asterisk en el contexto externas se pone: exten => _9.. Para diferenciar estas llamadas de las internacionales se ha puesto el numero 9 que representa el valor a marcar antes de cualquier numero local o nacional.

Capitulo IV IVR IVR es la sigla de Interactive Voice Response.1 Grabación de las locuciones: En Asterisk existe la aplicación Record que nos permite grabar archivos audios para luego utilizarlos en la creación de un IVR.Answer() exten => _66XX. Se actualiza el dialplan y se graban las locuciones: . Es un sistema automatizado de respuesta interactiva. Ej. orientado a entregar y/o capturar información a través del teléfono.Wait(2) exten => _66XX.conf En el contexto internas se pone: exten => _66XX. Para implementarla hay que modificar el plan de llamadas.Playback(/tmp/prompt${EXTEN:2}) exten => _66XX.n. 4.Wait(2) exten => _66XX. que se traduce del inglés como Respuesta de Voz Interactiva.Record(/tmp/prompt${EXTEN:2}:wav) exten => _66XX.n. se vuelve a grabar marcando el mismo numero.n. permitiendo el acceso a servicios de información u otras operaciones.n.1.n. La nueva grabación remplazará la vieja.Wait(2) exten => _66XX. Si llamamos la extensión 6650 el archivo audio tendrá el nombre prompt50.Hangup() • • • Línea 1: contesta la llamada Línea 2: espera 2 segundos Línea 3: Graba el archivo audio en la carpeta /tmp con nombre promptXX donde XX son los últimos dos dígitos de la extensión que hemos llamado desde nuestro softphone.waw Línea 4: espera 2 segundos Línea 5: devuelve el archivo recién grabado Línea 6: espera 2 segundos Línea 7: cuelga la llamada • • • • Si la grabación no nos satisface. Consiste en un sistema telefónico que es capaz de recibir una llamada e interactuar con el usuario a través de grabaciones de voz y el reconocimiento de respuestas a través del uso de la tecla del teléfono. Asterisk permite configurar cualquier tipo de IVR y en este capitulo se mostrará come crear un IVR básico.n. nano /etc/asterisk/extensions.

. Una vez que se tengan los archivos listos vamos a copiarlos en la carpeta de las locuciones de Asterisk. If the user should hangup during a recording. A channel variable named RECORDED_FILE will also be set. If the file exists it will be overwritten. but record anyway if line not yet answered ‘q’ : quiet (do not play a beep tone) ‘s’ : skip recording if the line is not yet answered ‘t’ : use alternate ‘*’ terminator key (DTMF) instead of default ‘#’ ‘x’ : ignore all terminator keys (DTMF) and keep recording until hangup If filename contains ‘%d’.asterisk -rvvvvvvvvvvvvvvvv CLI> dialplan reload CLI> quit Esta solución permite grabar hasta 99 archivos audio.‘format’ is the format of the file type to be recorded (wav. gsm. all data will be lost and the application will teminate. . mkdir /var/lib/asterisk/sounds/custom cd /tmp mv prompt* /var/lib/asterisk/sounds/custom La sinopsis de la aplicación: -= Info about application ‘Record’ =[Synopsis] Record to a file [Description] Record(filename.‘maxduration’ is the maximum recording duration in seconds.options]) Records from the channel into a given filename. which contains the final filemname.‘options’ may contain any of the following letters: ‘a’ : append to existing recording rather than replacing ‘n’ : do not answer. these characters will be replaced with a number incremented by one each time the file is recorded. Use ‘core show file formats’ to see the available formats on your system User can press ‘#’ to terminate the recording and continue to the next priority. If missing or 0 there is no maximum. etc). .silence[.format. .maxduration][.‘silence’ is the number of seconds of silence to allow before returning. 98 .

define como idioma predefinido el ingles y usas las locuciones en este idioma exten => s. 10 segundos es el tiempo que espera para que el llamante presione una tecla exten => s. si presiona 2 va al contexto IVR2.1. for sales office.“for english press one. Si presiona 2 escuchará la música en espera predefinida exten => 3. Espera que el llamante presione una tecla exten => 1.Set(TIMEOUT(response)=10) .s. extensión s.espera un segundo exten => s.BackGround(custom/engmenu) .4. prioridad 1 exten => i. si el llamante cuelga ejecuta la extensión h [IVR1] exten => s.Set(TIMEOUT(digit)=7) .Set(TIMEOUT(response)=10) exten => s.1) . press 3) Lo archivos se han copiado en la carpeta /var/lib/asterisk/sounds/custom. exten => s.2 Plan de llamadas e IVR En el párrafo precedente se ha mostrado como grabar los archivos audio para la creación de un IVR.Set(CHANNEL(language)=en) .2.wav .1.Playback(goodbye) .1.1.BackGround(custom/espeng) .5. extensión s.1.1.WaitExten() . se despide exten => i. prioridad 1 exten => 2. Si presiona 3 lo pone en comunicación con la oficina de ventas (extensión 3000) 99 .4.“for echo test press 1. pone como predefinidas las locuciones en español exten => s.goto(IVR2. para español marque dos” espmenu.3.2. Para el ejemplo a seguir se han registrados tres archivos que contienen las siguientes frases: • • • espeng.5. si dentro de 10 segundo el llamante no presiona ninguna tecla vuelve a presentar el menu vocal exten => h.goto(IVR1.Echo() exten => 2.Set(CHANNEL(language)=es) . para escuchar la música en espera marque 2. si el numero digitado no es valido (ni 1 ni 2) comunica el error exten => i.1) .2.wav .3. espera que el llamante presione alguna tecla exten => 1. cuelga la llamada exten => t. Si presiona 1 efectuá el test de echo exten => 1.2.goto(IVR. Ahora se puede empezar con la construcción del dialplan para la creación del IVR: nano /etc/asterisk/IVR [IVR] exten => s.1.Playback(invalid) . presenta el menú vocal y al mismo tiempo escucha si el llamante presiona alguna tecla exten => s.WaitExten() .4.“para efectuar un test de echo marque 1.s.Wait(1) .Playback(demo-echotest) .1. si presiona 1 va al contexto IVR1.s.Hangup .Set(TIMEOUT(digit)=7) . 7 segundos es el tiempo que espera entre el primer dígito y los sucesivos exten => s. for music on hold press 2.MusicOnHold .3. presenta en menú en ingles exten => s.Hangup .wav .1.2) . para la oficina de ventas marque 3) engmenu.1.Playback(pls-wait-connect-call) .6.

1) exten => h.3.WaitExten() exten => 1.5.Wait(1) exten => s.Goto(internas.Wait(1) exten => 50.1.2.1) y al final del archivo añadimos #include "IVR" 100 .1.Playback(demo-echotest) exten => 1.n.Hangup El menú IVR2 es totalmente igual al IVR1 solamente que es en español.3.s.Playback(goodbye) exten => i.Set(TIMEOUT(response)=10) exten => s.1) exten => i.Goto(IVR.Set(TIMEOUT(digit)=7) exten => s.MusicOnHold exten => 3.s.Hangup [IVR2] exten => s.2.4.hangup exten => t.1.3000.1.n.n.Answer exten => 50.conf Si se quieres que todas las llamadas externas sean atendidas por el IVR.s.Playback(goodbye) exten => i.1) exten => i.Echo() exten => 2.2.Playback(invalid) exten => i.goto(IVR1.BackGround(custom/espmenu) exten => s.s.1.1.n.1.1) exten => h.Playback(invalid) exten => i. Para incluir este archivo en el diaplan (plan de llamadas): nano /etc/asterisk/extensions.Goto(internas.3000.2. en el contexto donde entran las llamadas externas se pone: [from-PSTN] exten => s.Answer exten => s.1.1) Para probarlo se añaden estas lineas en el contexto internas: exten => 50.exten => 3.Playback(pls-wait-connect-call) exten => 3.2.hangup exten => t.Set(CHANNEL(language)=es) exten => s.1.1.goto(IVR1.Goto(IVR.2.1.1.3.

Ejemplos: • • un IVR que gestione colas de espera diferenciadas por departamento (ventas. etc. asistencia técnica. Se guardan los cambios y desde la consola de Asterisk: CLI> dialplan reload Al momento de crear un IVR.) un IVR que permita marcar directamente una extensión o. compras. en el caso que no se marque ninguna. envíe la llamada a una operadora. las posibilidades son prácticamente infinitas. 101 .El comando #include en el archivo extensions.conf toma un archivo de texto y lo engloba al plan de llamadas.

Capitulo V Asterisk y FAX Desde la versión 1.net/sourceforge/iaxmodem/iaxmodem-1.2. IAXmodem IAXmodem es un modem software.dl. En este capitulo se presentará una solución basada en el modulo app_fax y una basada en la combinación del programa IAXmodem con el servidor de FAX Hylafax. Este modulo se apoya en las librerías SpanDSP que hay que instalar antes de compilar Asterisk./configure make Se copia el programa compilado en la siguiente carpeta: cp iaxmodem /usr/local/sbin Se crean algunas carpetas y archivos para IAXmodem: mkdir /etc/iaxmodem mkdir /var/log/iaxmodem 45 DSP Wikipedia .0.tar. 5.gz Se entra en la carpeta: cd iaxmodem-1.2. Se descargan las fuentes de IAXmodem: cd /usr/src wget http://switch.gz Se descomprime el archivo tar -xf iaxmodem-1.0.0 Se compila: .1 Asterisk con IAXmodem y Hylafax Esta solución se basa en el uso de IAXmodem como extensión IAX2 y Hylafax como servidor de FAX.tar. Asterisk soporta la recepción y trasmisión de FAX a través del modulo app_fax.sourceforge.6.X. escrito en lenguaje C que utiliza un canal IAX2 (uno de los protocolos presentes en Asterisk) en lugar de una línea telefónica y utiliza un DSP software en lugar de un chip DSP (Digital Signal Processing)45.2.

En el caso de dos computadores distintos hay que indicar en la línea server la dirección IP del servidor Asterisk.conf [iaxmodem] type=friend context=fax disallow=all allow=ulaw username=iaxmodem secret=password qualify=yes notransfer=yes host=dynamic 103 . Se pueden configurar cuantos IAXmodem se quieran cambiando en la primera línea el nombre del device. Pongan la contraseña en secret y en cidname y cidnumber nombre y numero telefónico que usará IAXmodem para presentarse a Asterisk. ttyIAX2 ttyIAX3. etc.0.0. en port el puerto y en peername el nombre. Se guardan los cambios y se copia el archivo en la carpeta /etc/iaxmodem que se ha creado: cp iaxmodem-cfg. Cada archivo tendrá un nombre distinto.touch /var/log/iaxmodem/ttyIAX touch /var/log/iaxmodem/iaxmodem Se modifica el archivo de configuración predefinido que viene con las fuentes: nano iaxmodem-cfg.1 peername iaxmodem secret password cidname VozToVoice cidnumber XXXXXXXXXX codec ulaw Esta configuración es valida si IAXmodem está instalado en el mismo computador donde se instaló Asterisk.ttyIAX /etc/iaxmodem/ttyIAX Ahora se modifica la configuración de Asterisk para insertar la nueva extensión IAX: nano /etc/asterisk/iax.ttyIAX Este es un ejemplo de configuración: device /dev/ttyIAX owner uucp:uucp mode 660 port 4570 refresh 300 server 127.

1' [2009-06-08 12:03:39] Setting peername = 'iaxmodem' [2009-06-08 12:03:39] Setting secret = 'password' [2009-06-08 12:03:39] Setting cidname = 'VozToVoice’ [2009-06-08 12:03:39] Setting cidnumber = 'XXXXXXXXX' [2009-06-08 12:03:39] Setting codec = ulaw [2009-06-08 12:03:39] Opened pty. slave device: /dev/pts/4 [2009-06-08 12:03:39] Created /dev/ttyIAX symbolic link Per salir presionamos CTRL-C [2009-06-08 12:03:45] Terminating on signal 2.0..0. Antes de hacerlo se controla que en la consola de Asterisk aparezca la conexión de IAXmodem (en otra ventana Terminal) 104 ../iaxmodem ttyIAX debería aparecer: [2009-06-08 12:03:39] Modem started [2009-06-08 12:03:39] Setting device = '/dev/ttyIAX' [2009-06-08 12:03:39] Setting owner = 'uucp:uucp' [2009-06-08 12:03:39] Setting mode = '660' [2009-06-08 12:03:39] Setting port = 4570 [2009-06-08 12:03:39] Setting refresh = 300 [2009-06-08 12:03:39] Setting server = '127.requirecalltoken=auto Se guardan los cambios y se actualiza la configuración de IAX2 en Asterisk asterisk -rvvvvvvvvvvvvvvvvvvv Se escribe CLI> iax2 reload Se sale de la consola CLI> quit Ahora se puede hacer una prueba para ver si la conexión entre IAXmodem y Asterisk funciona: cd /usr/local/sbin .

Un cliente (FAX) se conecta al servidor (Hylafax) y a través de el envía el FAX Hay que empezar instalando algunas (dependencias) requeridas por Hylafax: yum install ghostscript ghostscript-devel sharutils ghostscript-fonts En la pagina de Hylafax están presentes los paquetes para las distintas distribuciones de Linux: Se descargan los paquetes para Centos 5 (cliente y servidor): cd /usr/src wget ftp://ftp.0.hylafax.d/iaxmodem e se configura para el arranque automático: chkconfig --add iaxmodem chkconfig iaxmodem on Se arranca el programa: /etc/init.fedora /etc/init.2.d/iaxmodem se vuelve ejecutable: chmod +x /etc/init.0 mv iaxmodem.0.4-1rhel5.rpm Se instalan: rpm -iv hylafax*.rpm wget ftp://ftp.4/hylafax-server-6.d/iaxmodem start Hylafax Hylafax es un servidor FAX diseñado para sistemas Linux que usa un sistema cliente-servidor.init.0.hylafax.0.Para arrancar IAXmodem en automático se instala el script presente en la carpeta de las fuentes de IAXmodem: cd /usr/src/iaxmodem-1.org/binary/linux/redhat/6.rpm Se añade el faxgetty (faxgetty es el programa que realmente contesta las llamadas) al inittab (El fichero inittab describe que procesos se inician al arrancar el Servidor Linux) 105 .i386.4/hylafax-client-6.i386.4-1rhel5.org/binary/linux/redhat/6.

Configuration parameters written to /var/spool/hylafax/etc/setup.nano /etc/inittab Se añade esta línea: fax:2345:respawn:/usr/sbin/faxgetty ttyIAX Se guardan los cambios y se vuelve a a arrancar inittab: init q Se empieza con la configuración de Hylafax: faxsetup Update /var/spool/hylafax/status/any. Country code [1]? 57 Area code []? 1 Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) ["etc/dialrules"]? Tracing during normal server operation [1]? Default tracing during send and receive sessions [0xffffffff]? Continuation cover page (relative to /var/spool/hylafax) []? Timeout when converting PostScript documents (secs) [180]? Maximum number of concurrent jobs to a destination [1]? Define a group of modems []? Time of day restrictions for outbound jobs ["Any"]? Pathname of destination controls file (relative to /var/spool/hylafax) []? Timeout before purging a stale UUCP lock file (secs) [30]? Max number of pages to permit in an outbound job [0xffffffff]? Syslog facility name for ServerTracing messages [daemon]? The non-default scheduler parameters are: 106 .cache. creating one from scratch. HylaFAX configuration parameters are: [1] Init script starts faxq: yes [2] Init script starts hfaxd yes [3] Start old protocol: no [4] Start paging protocol: no Are these ok [yes]? Se contesta yes Modem support functions written to /var/spool/hylafax/etc/setup.info.modem. No scheduler config file exists.

Also be aware that at any time you can safely interrupt this procedure.CountryCode: 57 AreaCode: 1 LongDistancePrefix: 0 InternationalPrefix: 00 Are these ok [yes]? yes Creating new configuration file /var/spool/hylafax/etc/config.. No existing configuration. time to setup a configuration file for the modem. Reading scheduler config file /var/spool/hylafax/etc/config.. The manual page config(5F) may be useful during this process.999.d/init.1212]? +571XXXXXXXX Local identification string (for TSI/CIG) ["NothingSetup"]? VozToVoice Long distance dialing prefix [1]? 0 International dialing prefix [011]? 00 Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]? Tracing during normal server operation [1]? Tracing during send and receive sessions [11]? Protection mode for received facsimile [0600]? Protection mode for session logs [0600]? Protection mode for ttyIAX [0600]? Rings to wait before answering [1]? 2 Modem speaker volume [off]? Command line arguments to getty program ["-h %l dx_%s"]? Pathname of TSI access control list file (relative to /var/spool/hylafax) [""]? Pathname of Caller-ID access control list file (relative to /var/spool/hylafax) [""]? Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.d/hylafax start Starting HylaFAX queue manager (faxq): [ OK ] Starting HylaFAX server (hfaxd): [ OK ] Restarting HylaFAX modem manager (faxgetty): [ OK ] Do you want to run faxaddmodem to configure a modem [yes]? Serial port that modem is connected to []? ttyIAX Ok. Should I restart the HylaFAX server processes [yes]? /etc/rc.pcf]? Tag line format string ["From %%l|%c|Page %%P of %%T"]? Time before purging a stale UUCP lock file (secs) [30]? Hold UUCP lockfile during inbound data calls [Yes]? Hold UUCP lockfile during inbound voice calls [Yes]? 107 . let's do this from scratch. Restarting HylaFAX server processes.555. Country code [1]? 57 Area code [415]? 1 Phone number of fax modem [+1.

pcf TagLineFormat: "From %%l|%c|Page %%P of %%T" MaxRecvPages: 25 Are these ok [yes]? Now we are going to probe the tty port to figure out the type of modem that is attached. Class 1 relies on HylaFAX to perform the bulk of the fax protocol.1 will require the modem manufacturer to resolve it.1 is similar to Class 2.34-fax capability. Note that if you do not have the modem cabled to the port.0 implementations.0 is similar to Class 2 but may include more features. so be patient.0 but adds V.0 is similar to Class 1 but may add V. but usually any problems encountered in Class 2/2. This takes a few seconds.0 can be resolved by modifications to HylaFAX.0/2. About fax classes: The difference between fax classes has to do with how HylaFAX interacts with the modem and the fax protocol features that are used when sending or receiving faxes.34-fax capability. one probably will suit a user's needs better than others. this may hang (just go and cable up the modem or turn it on. Class 1. Generally any problems encountered in Class 1/1.0 than when using most modems' Class 2 or Class 2. Class 2. Class 2. HylaFAX generally will have more features when using Class 1/1. One class isn't inherently better than another. or the modem is turned off. however. Class 2 relies on the modem to perform the bulk of the fax protocol. or whatever). Probing for best speed to talk to modem: 38400 OK. 108 .Percent good lines to accept during copy quality checking [95]? Max consecutive bad lines to accept during copy quality checking [5]? Max number of pages to accept in a received facsimile [25]? Syslog facility name for ServerTracing messages [daemon]? Set UID to 0 to manipulate CLOCAL [""]? Use available priority job scheduling mechanism [""]? CountryCode: 57 AreaCode: 1 FAXNumber: +571XXXXXXXX LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules SessionTracing: 11 RingsBeforeAnswer: 2 SpeakerVolume: off GettyArgs: "-h %l dx_%s" LocalIdentifier: "VozToVoice" TagLineFont: etc/lutRS18.

The modem configuration parameters are: ModemResetCmds: "ATH1\nAT+VCID=1" Are these ok [yes]? Creating new configuration file /var/spool/hylafax/etc/config.. Do you want to run faxaddmodem to configure another modem [yes]? no Looks like you have some faxgetty processes running (PIDs are): 13236 It is usually a good idea to restart these processes after running faxsetup. Checking /var/spool/hylafax/etc/config for consistency... this looks like a Class 1 modem.Use Class 1 unless you have a good reason not to. How should it be configured [1]? Hmm.sav.... especially if have just installed new software.org"..0.. .. Using prototype configuration file iaxmodem.. Don't forget to run faxmodem(8C) (if you have a send-only environment) or configure init to run faxgetty on ttyIAX. This modem looks to have support for Class 1 and 1.some parameters are different. The non-default scheduler parameters are: CountryCode: 57 AreaCode: 1 LongDistancePrefix: 0 InternationalPrefix: 00 DialStringRules: etc/dialrules Are these ok [yes]? Creating new configuration file /var/spool/hylafax/etc/config.ttyIAX. Other information (ATI3) is "www. Done setting up the modem configuration.soft-switch. .saving current file as /var/spool/hylafax/etc/config. If these processes are being started by init(8C) then sending each of them a QUIT message with the faxquit command should cause them to be restarted. Product code (ATI0) is "spandsp". DTE-DCE flow control scheme [default]? Modem manufacturer is "spandsp".. Is it ok to send a QUIT command to each process [yes]? /usr/sbin/faxquit ttyIAX Se vuelve a arrancar Hylafax 109 . Modem model is "IAXmodem"..

Lado Asterisk: 110 .n.Hangup Si Asterisk reconoce que está llamando un fax saltará a la extensión fax sino llamará la extensión SIP/1000.n.1.Dial(IAX2/iaxmodem) exten => fax.Wait(3) exten => s.n.d/asterisk restart Desde la pagina web de un proveedor que permita enviar fax se envía un fax al numero geográfico configurado de EuteliaVoIP./etc/init.Answer exten => s.n.Dial(SIP/1000.45) exten => s.Hangup exten => fax.conf para este contexto se han añadido estas líneas: [from-eutelia] exten => s. El trunk Eutelia para las llamadas entrantes está configurado con el contexto from-eutelia En la configuración del extensions.NoOp( Call from Eutelia ) exten => s. Este es el resultado del envío.1. Se guardan los cambios y se reinicia Asterisk /etc/init.n.d/hylafax restart Shutting down HylaFAX queue manager (faxq): [ OK ] Shutting down HylaFAX server (hfaxd): [ OK ] Starting HylaFAX queue manager (faxq): [ OK ] Starting HylaFAX server (hfaxd): [ OK ] Restarting HylaFAX modem manager (faxgetty): [ OK ] Todos los archivos de configuración que se crearan a lo largo del proceso de configuración de Hylafax se guardaran en la carpeta /var/spool/hylafax/etc Prueba Se tiene un numero geográfico de EuteliaVoIP y la posibilidad de enviar faxes desde internet con otro operador.

se puede cambiar modificando el archivo FaxDispatch que se encuentra en la carpeta /var/spool/hylafax/etc Si se quiere recibir el correo electrónico con el texto en español siempre en el mismo archivo se añade esta línea: TEMPLATE=es Para el envío de los faxes se crea en extension. Si se quiere.Correo electrónico recibido: FaxMaster es el usuario predefinido que Hylafax usa para enviar el fax a un correo electrónico.conf) con las siguientes líneas: 111 .conf un contesto [fax] (El mismo que se ha configurado para la extension iaxmodem en iax.

¿Cómo funciona el protocolo T. El caso que se utilice un cliente remoto en el cortafuegos hay que abrir el puerto 4559 TCP (usado por Hylafax) y los puertos desde el 30000 hasta el 65000 TCP para los datos. La sigla de este protocolo es T.[fax] exten => _X. Este protocolo ha sido definido por la “International Telecommunication Union” y tomó como sigla T. se marca el numero de teléfono de destino y se espera que salga un OK por algún lado. Todo lo que pasa en el “mientras” es totalmente transparente.txt> Ejemplo: sendfax -n -d 0057XXXXXXXX /tmp/fulano..1. una buena solucion es YajHFC46 (Yet another Java HylaFAX Client) que siendo escrito completamente en JAVA funciona en sistemas operativos Linux y Windows.2 Asterisk y el protocolo T38 Se pone una hoja en la “maquina”.pdf Si se quieres usar un cliente con interfaz gráfica para el envío de fax. 5.Hangup Se Actualiza el dialplan: /etc/init..n.d/asterisk reload Desde el terminal de Linux se escribe: sendfax -n -d <faxnumber> <file.30 En 1998 la misma organización define un nuevo protocolo que permite recibir y enviar faxes usando una red a paquetes (Internet). Esta sencilla operación es la que se hace cuando se quiere enviar un FAX.38? Quizás la imagen que sigue ayuda para entender: 46 YajHFC 112 .Dial(SIP/justvoip/${EXTEN}) exten => _X.38. Los dos Faxes negocian todos los pasajes y para hacer eso usan un protocolo.

TCP o RTP.30 vienen analizados y manipulados para luego ser transformados en paquetes (IFP).38 clásico funciona como se muestra en la imagen que sigue: Los datos del FAX T. Este Gateway se encarga de transformar el FAX en el formato requerido para luego ser enviado a través de la red Internet. conectado a la línea telefónica está también conectado a un Gateway con soporte T.El FAX. Un Gateway T. En el caso de Asterisk el único protocolo de trasporte permitido es UDPTL que funciona de la siguiente forma: 113 .38 negociar el protocolo de trasporte.38 se encarga de “decodificar” los paquetes que lleguen para luego pasar el resultado al fax de destinación. En el lado opuesto otro Gateway T. Será tarea de los Gateway T.38. Se pueden enviar usando tres protocolos de transporte: UDPTL.

Desde la consola asterisk –rvvvvvvvvvvvvvvvv Se controla la sintaxis de las dos aplicaciones contenidas en el modulo app_fax CLI> core show application ReceiveFax -= Info about application 'ReceiveFAX' =[Synopsis] Receive a FAX [Description] 114 . En Asterisk el envío y recepción de faxes es posible a través de la librería SpanDSP y el modulo app_fax.38 que se hagan cargo de la tarea de enviar/recibir el fax.38 solamente como pasarela. El paquete UDPTL está encapsulado en un paquete UDP (protocolo de trasporte) que a su vez está encapsulado en un paquete IP (protocolo que permite al paquete llegar a destinación). Asterisk soporta el protocolo T. es decir que no está “en el medio” a lo largo del envío del fax.Cada paquete UDPTL contiene encapsulado el paquete IFP (que contiene los datos del fax que se está enviando y un sistema de corrección de errores – FEC [forward error correction]). A un lado y al otro de la trasmisión deberán estar dos Gateway T. Para repetir los paquetes perdidos y controlar que lleguen en el justo orden hay a disposición dos sistemas: • • Con el primero se repite el ultimo paquete enviado como FEC para el paquete que se está enviando Con el segundo se crea un paquete de paridad para un numero determinado de paquetes IFP y se incluye esta información en el paquete UDPTL corriente.

This application sets the following channel variables upon completion: FAXSTATUS . Returns -1 in case of user hang up or any channel error.CSID of the remote side. FAXRESOLUTION . Returns 0 on success.Error when FAILED FAXMODE .ReceiveFAX(filename[|options]): Receives a fax from the channel into the given filename overwriting the file if it already exists. LOCALHEADERINFO to generate a header line on each page. LOCALHEADERINFO to generate a header line on each page.Error when FAILED 115 . FAXPAGES .transmition rate. This application uses following variables: LOCALSTATIONID to identify itself to the remote end.makes the application behave as an answering machine The default behaviour is to behave as a calling machine.Mode used: audio | T38 REMOTESTATIONID . This application uses following variables: LOCALSTATIONID to identify itself to the remote end.number of pages sent. This application sets the following channel variables upon completion: FAXSTATUS . The option string may contain zero or more of the following characters: 'a' .status of operation: SUCCESS | FAILED FAXERROR .makes the application behave as a calling machine The default behaviour is to behave as an answering machine. CLI> core show application SendFax -= Info about application 'SendFAX' =[Synopsis] Send a FAX [Description] SendFAX(filename[|options]): Send a given TIFF file to the channel as a FAX. FAXBITRATE .status of operation: SUCCESS | FAILED FAXERROR . The option string may contain zero or more of the following characters: 'c' -. File created will have TIFF format.resolution.

38 a través de un Gateway Server Cisco) y se ha modificado el plan de llamadas de la siguiente forma nano /etc/asterisk/extensions.FEC.conf 47 Asterisk T38 116 .resolution.38. Algunos ATA comercializados soportan el protocolo T. Para el soporte T.conf en la parte general se busca la línea que sigue y si está comentada se quita el punto y coma por delante: t38pt_udptl = yes. En Voip-info47 aparece una lista (aunque no muy actualizada). FAXBITRATE .FAXMODE . Returns -1 in case of user hang up or any channel error.d/asterisk restart Para el test que se va a presentar se ha configurado un numero geográfico de Eutelia VoIP (que soporta el protocolo T.number of pages sent. Returns 0 on success.Mode used: audio | T38 REMOTESTATIONID .transmition rate. FAXRESOLUTION . FAXPAGES .maxdatagram=400 Se guardan los cambios y se continua con el segundo archivo: nano /etc/asterisk/udptl.conf Se pone: [general] udptlstart=4000 udptlend=4099 udptlchecksums=yes udptlfecentries = 3 udptlfecspan = 3 use_even_ports = no Se guardan los cambios y se vuelve a arrancar Asterisk: /etc/init.38 en Asterisk hay que modificar dos archivos: nano /etc/asterisk/sip.CSID of the remote side.

Hungup 'IAX2/iaxmodem2-901' Como se puede notar el fax ha llegado sin problemas y se ha usado el protocolo T.[from-eutelia] exten => s. "") in new stack -.38 En la segundo test se ha usado para la llamada justvoip con Hylafax/IAXmodem y como numero geográfico en recepción un DID de Cheapnet Executing [6554451618@from-cheapnet:1] Answer("SIP/cheapnet-b5a268e0".Called justvoip/003907331870559 -. FAXERROR . "") in new stack == Spawn extension (from-eutelia.129.n.tif) exten => s.Executing [07331870559@from-eutelia:2] Wait("SIP/eutelia3-b6156d00". FAXERROR ${FAXERROR}.Executing [07331870559@from-eutelia:3] ReceiveFAX("SIP/eutelia3-b6156d00". "/tmp/1255656629. FAXMODE $ {FAXMODE}) exten => s. "2") in new stack [Oct 17 00:17:55] NOTICE[26474]: channel.tif") in new stack -.1. "") in new stack -.n. 07331870559. "2") in new stack -.Executing [07331870559@from-eutelia:5] Hangup("SIP/eutelia3-b6156d00".n.SIP/justvoip-082f2838 answered IAX2/iaxmodem2-293 -.38 117 . 5) exited non-zero on 'SIP/eutelia3-b6156d00' == Spawn extension (fax-out.Wait(2) exten => s.tif") in new stack [Oct 17 00:17:57] WARNING[26474]: app_fax.101. "SIP/justvoip/003907331870559") in new stack -.REMOTESTATIONID VozToVoice") in new stack -. "FAXSTATUS SUCCESS.SIP/justvoip-082e0b38 answered IAX2/iaxmodem2-901 -.Answer exten => s. "/tmp/1255756675. 1) exited non-zero on 'IAX2/iaxmodem2-901' -.Noop(FAXSTATUS ${FAXSTATUS}.Executing [6554451618@from-cheapnet:3] ReceiveFAX("SIP/cheapnet-b5a268e0". 003907331870559. FAXMODE T38.SIP/justvoip-082e0b38 is making progress passing it to IAX2/iaxmodem2-901 -.c:383 transmit_audio: channel 'SIP/cheapnetb5a268e0' refused to negotiate T.Hangup Se guardan los cambios y se actualiza el dialplan: asterisk –rvvvvvvvvvvvvvv CLI> dialplan reload En el primer test se ha usado para la llamada saliente Justvoip y se ha enviado el fax a través de la combinación Hylafax/IAXmodem: Executing [003907331870559@fax-out:1] Dial("IAX2/iaxmodem2-901".Executing [07331870559@from-eutelia:4] NoOp("SIP/eutelia3-b6156d00".n.Receivefax(/tmp/${UNIQUEID}.Executing [07331870559@from-eutelia:1] Answer("SIP/eutelia3-b6156d00".Executing [6554451618@from-cheapnet:2] Wait("SIP/cheapnet-b5a268e0".c:2926 __ast_read: Dropping incompatible voice frame on SIP/cheapnet-b5a268e0 of format ulaw since our native format has changed to 0x8 (alaw) -.

Para solucionar el problema hay que hacer uso de un callfile.38 La misma aplicación Receivefax sirve también para un escenario de este tipo: T.30 (hylafax) –> Asterisk –> Cheapnet T.30 (hylafax) –> Asterisk –> Eutelia T._UDP.it. el identificativo del llamante WaitTime: 30 118 . una vez que esté completado se mueve en la carpeta /var/spool/asterisk/outgoing.Executing [6554451618@from-cheapnet:5] Hangup("SIP/cheapnet-b5a268e0".tif (solo funciona con archivos tiff) presente en la carpeta /tmp.Executing [6554451618@from-cheapnet:4] NoOp("SIP/cheapnet-b5a268e0".ast_get_srv: SRV lookup for '_sip. es decir T.2 la aplicación para enviar FAX en Asterisk es SendFax.sip.cheapnet.it' mapped to host sip.el canal que se va a usar para efectuar la llamada Callerid: "FAX" . Una vez que el destinatario conteste se enviará el archivo prueba. FAXMODE audio.30 5.3 Envío de FAX Como se ha visto en el párrafo 8. Asterisk controla periódicamente esta carpeta y si hay un archivo de este tipo lo procesa. "FAXSTATUS SUCCESS.cheapnet. En el escenario que se va a presentar se llamará el numero de destino (un servicio que permite recibir FAX y luego los envía a un correo electrónico definido) usando come proveedor para la llamada justvoip. "") in new stack En este caso el “modo” ha sido audio.30 Los dos test indican que en Asterisk es posible enviar faxes T.[Oct 17 00:18:02] NOTICE[2684]: chan_iax2. cd /tmp nano enviofax Se añaden las siguientes lineas: Channel: SIP/justvoip/0039XXXXXXXXXXX . La sintaxis es muy sencilla: SendFAX(filename[|options]): El problema es que con esta aplicación no podemos llamar directamente un FAX en cuanto no hay posibilidad de indicar el numero a marcar. Un callfile es un archivo de texto donde se definen unas cuantas acciones que Asterisk tiene que ejecutar. FAXERROR .REMOTESTATIONID VozToVoice") in new stack -. port 5060 -.38 y no se necesita tener en ambos lados un Gateway T.c:10099 socket_process: Peer 'iaxmodem2' is now REACHABLE! Time: 3 -.

en el registro de las llamadas (CDR) cobramos la llamada a la extensión 1000 Application: SendFax .Se espera un respuesta por 30 segundos Maxretries:3 :se intentará llamar el numero per tres veces RetryTime: 300 . > Launching SendFax(/tmp/prueba.c:357 attempt_thread: Call completed to SIP/justvoip2/003907334445023 Este es el correo electrónico recibido: 119 .el nombre del archivo que se enviará El resultado del archivo sin los comentarios será: Channel: SIP/justvoip/0039XXXXXXXXXXX Callerid: "FAX" WaitTime: 30 Maxretries:3 RetryTime: 300 Account: 1000 Application: SendFax Data: /tmp/prueba.tif) (Retry 1) > Channel SIP/justvoip-084c82d0 was answered.tif Se guardan los cambios y se mueve el archivo en la carpeta /var/spool/asteisk/outgoning mv enviofax /var/spool/asterisk/outgoing Este es el resultado en la consola de Asterisk: Attempting call on SIP/justvoip/003907334445023 for application SendFax(/tmp/prueba.tif) on SIP/justvoip2-084c82d0 [Nov 26 15:45:32] NOTICE[7630]: pbx_spool.tif . entre un intento y otro se esperarán 300 segundos Account: 1000 .. una vez que el destinatario conteste se ejecuta la aplicación sendfax Data: /tmp/prueba.

120 .

so Adaptive ODBC CDR backend 0 cdr_odbc. Existen dos tipos de realtime: • • Estático.Capitulo VI Asterisk Realtime ARA (The Asterisk Realtime Architecture) es un método para almacenar los archivos de configuración de Asterisk en una base de datos. Para averiguar si los módulos estén compilados y cargados en Asterisk desde la consola: asterisk -rvvvvvvvvvvvvv CLI> module show like odbc Module Description Use Count res_config_odbc.1 Voicemail y ODBC En Asterisk es posible almacenar los mensajes de voz en realtime dinámico usando una base de datos MySQL y el conector ODBC.so ODBC resource 0 func_odbc. En la primera si se modifican los datos hay que recargar la configuración de Asterisk. Si no fuera así hay que seguir este procedimiento: Parar Asterisk y volver a compilarlo con el soporte ODBC de Voicemail . Los cambios se actualizarán en tiempo real en la base de datos y esta es la gran diferencia entre la versión estática y la dinámica.so ODBC lookups 0 cdr_adaptive_odbc. Una vez configurada la base de datos se podrán hacer consulta desde cualquier tipo de programa que soporte ODBC. Dinámico. las colas de espera y los agentes. en la segunda se leen. El realtime estático se usa para guardar los archivos de configuración de Asterisk en una base de datos que Asterisk leerá al momento de iniciarse. 6. “objetos” que se necesitan modificar y actualizar al instante: usuarios SIP o IAX2. El realtime dinámico se utiliza para guardar en la base de datos. se escriben y se actualizan en tiempo real.so ODBC CDR Backend 0 5 modules loaded CLI> quit La respuesta de Asterisk indica que todos los módulos están instalados. los correo de voz. En este capitulo se presentarán algunos ejemplos de utilización del realtime en Asterisk.so Realtime ODBC configuration 0 res_odbc.

/configure make menuselect Seleccionar la opción ODBC_STORAGE en el menú Voicemail salir presionando la tecla X para guardar la configuración.22 make distclean . a través de la consola. make make install Volver a arrancar Asterisk y averiguar./etc/init. que aparezcan los módulos como mostrado arriba /etc/init.d/asterisk stop Volver a compilar e instalar Asterisk cd /usr/src/asterisk-1.d/asterisk start Se crea la base de datos en MySQL y la tabla para guardar los mensajes de voz.0.6. Commands end with . or \g. Your MySQL connection id is 81 122 . Se crea la base de datos: mysqladmin -u root -p create asteriskvoice la tabla voicemessages: mysql -u root -psesamo Welcome to the MySQL monitor.

Type ‘\c’ to clear the buffer. PRIMARY KEY (`id`).00 sec) mysql> flush privileges.* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'. 0 rows affected (0. `origtime` varchar(40) default ''. `mailboxcontext` varchar(80) default''. `mailboxuser` varchar(80) default ''. Para este efecto hay que crear dos archivo en la carpeta /etc: nano /etc/odbcinst. `recording` longblob. `macrocontext` varchar(80) default ''. Query OK.00 sec) mysql> GRANT ALL PRIVILEGES ON asteriskvoice. 0 rows affected (0. 0 rows affected (0. mysql> quit Bye Una vez creada la base de datos. Desde local: Mysql> GRANT ALL PRIVILEGES ON asteriskvoice.45 Source distribution Type ‘help.13 sec) Se crea un nuevo usuario y se le otorgan todos los privilegios para manejar la base de datos voicemail. `dir` varchar(80) default ''. KEY `dir` (`dir`) ).0. `context` varchar(80) default ''. `msgnum` int(11) NOT NULL default '0'. hay que configurar ODBC para que pueda conectarse a MySQL y a la base de datos recién creada. Query OK. Query OK. `callerid` varchar(40) default ''.* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'.’ or ‘\h’ for help.ini 123 . mysql> use asteriskvoice Database changed mysql> CREATE TABLE `voicemessages` ( `id` int(11) NOT NULL auto_increment.Server version: 5. la tabla y el usuario que tiene los privilegios para administrarla. `duration` varchar(20) default ''.

ini [asteriskvoice] Description = MySQL voicemail Driver = MySQL Database = asteriskvoice Server = localhost User = asterisk Password = sesamo Port = 3306 Option = 3 El archivo extconfig. Hay que modificarlo para indicar que los mensajes de voz se guardarán en una base de datos: nano /etc/asterisk/extconfig.voicemessages Se guardan los cambios y se sigue con la modifica del archivo voicemail.conf 124 .conf y voicemessages es la tabla de la base de datos donde se guardarán los mensajes de voz.y se añaden estas líneas: [MySQL] Description = ODBC for MySQL Driver = /usr/lib/libmyodbc3.so Setup = /usr/lib/libodbcmyS.conf es donde se configura el Realtime en Asterisk (estático y dinámico).conf nano /etc/asterisk/voicemail. Se guardan los cambios y se termina momificando el archivo res_odbc.conf Se añade en la parte final del archivo esta línea: voicemail => odbc.conf Hay que buscar las dos líneas que aparecen abajo y quitar el punto y coma que tienen por delante: odbcstorage=asterisk odbctable=voicemessages El valor del parámetros odbcstorace es el que se ha indicado en extconfig.conf que es el que se encarga de hacer la conexión entre Asterisk y ODBC: nano /etc/asterisk/res_odbc.asterisk.so FileUsage = 1 nano /etc/odbc.

Se descarga. Ahora en un computador con Windows XP/2000/Vista y Microsoft Excel o Microsoft Access se va a crear una conexión a la base de datos. Primero hay que abrir el puerto 3306 TCP en el cortafuego de Linux añadiendo la siguiente linea en la seccion *filter: nano /etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT Se reinicia iptables: service iptables restart Luego hay que instalar el conector mysql para ODBC versión Windows. Se vuelve a arrancar Asterisk: /etc/init.Se añaden las siguientes lineas: [asterisk] enabled => yes dsn => asteriskvoice username => asterisk password => sesamo pre-connect => yes En dsn aparece la etiqueta que se ha configurado en el archivo odbc. según la versión de Windows.ini.d/asterisk restart y se averigua que la conexión esté funcionando: asterisk -rvvvvvvvvvvvvvvvv CLI> odbc show ODBC DSN Settings ----------------Name: asterisk DSN: asteriskvoice Pooled: No Connected: Yes Para probar configuración se llama una extensión y se deja un mensaje en el contestador. desde esta pagina: 125 .

com/downloads/connector/odbc/3.http://dev.51. Microsoft Excel Se abre el Excel y en el menú datos se selecciona Obtener datos externos > Nueva consulta de base de datos: Se selecciona <Nuevo origen de datos> y se presiona el botón Aceptar: Se escoge un nombre para la origen de datos y se escoge el tipo: 126 .html Terminada la descarga se instala.mysql.

Se indican los datos necesarios (host del servidor Mysql .usuario. contraseña y nombre de la base de datos) 127 .

Se regresa a la ventana precedente y se selecciona la tabla > voicemessages y Aceptar En la ventana que aparece se escoge Asterisk-voicemail y se presiona Aceptar Se escogen las columnas que se quieren incluir en la consulta: 128 .

y si se quiere se puede filtrar los datos: Se ordenan los datos: 129 .

Se devuelven a Microsoft Excel: Ahora los registros de la base de datos aparecerán en Excel: 130 .

Microsoft Access Se arranca Microsoft Access y se crea un nuevo archivo > base de datos en blanco Obtener datos externos > Importar 131 .

Se escoge en la lista “base de datos ODBC” 132 .

Asterisk-Voicemal.dsn (que encontramos ahí porque ya la hemos creada con Excel) Se ponen los mismos datos de conexión usados por Excel: 133 .

No es propiamente una configuración realtime pero puede ser útil para luego consultar los datos desde otras aplicaciones.2 ODBC y CDR En este párrafo se mostrará como guardar los registros de las llamadas (que ya hemos almacenado en una base de datos MySQL) utilizando ODBC.ini: 134 . Se modifica el archivo odbc.Se escoge la tabla voicemessages: Este es el resultado: 6.

d/asterisk restart En el archivo de registro se encontrarán estas líneas: [Dec 9 15:09:09] NOTICE[3976] res_odbc.c: Connecting asterisk2 [Dec 9 15:09:09] NOTICE[3976] res_odbc.conf [asterisk2] enabled = yes dsn = asteriskcdr username = asterisk password = sesamo loguniqueid = yes pre-connect = yes Se termina con: nano /etc/asterisk/cdr_odbc.conf: nano /etc/asterisk/res_odbc.ini y se añaden estas líneas: [asteriskcdr] Description = MySQL ODBC Driver Testing Driver = MySQL Database = asteriskcdr Server = localhost User = asterisk Password = sesamo Option = 3 Port = 3306 Se guardan los cambios y se continua con el archivo res_odbc.c: res_odbc: Connected to asterisk2 [asterisk-cdr] 135 .nano /etc/odbc.conf [global] dsn=asterisk2 username=asterisk password=sesamo loguniqueid=yes table=cdr usegmtime=no Se guardan los cambios y se reinicia Asterisk /etc/init.

[Dec 9 15:09:09] NOTICE[3976] res_odbc.c: Registered ODBC class ‘asterisk2’ dsn->[asterisk-cdr] y desde la consola de Asterisk se averigua que haya conexión asterisk -rvvvvvvvvvvvvvvvvvvv CLI> odbc show ODBC DSN Settings ----------------Name: asterisk2 DSN: asteriskcdr Pooled: No Connected: Yes Name: asterisk DSN: asteriskvoice Pooled: No Connected: Yes Ahora se pueden hacer consultas a la base de datos (desde microsoft access, por ejemplo) y sacar todas las estadísticas y/o reportes que queramos. 6.3 MeetME Realtime Para la configuración de las conferencias se puede usar el archivo de configuración que se ha visto en el parrafo 2.12 o se puede optar para la solución en Realtime. En Realtime la ventaja es poder programar las conferencias con fecha y hora directamente en la base de datos. En el caso del Realtime hay que crear una base de datos: mysqladmin create asteriskmeetme -u root -psesamo Desde en el cliente mysql: mysql -u root -psesamo Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 47897 Server version: 5.1.37 MySQL Community Server (GPL) by Remi Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement. mysql> use asteriskmeetme Database changed Se crea la tabla meetme: 136

mysql> CREATE TABLE `meetme` ( `confno` char(80) NOT NULL default '0', `starttime` datetime NOT NULL default '0000-00-00 00:00:00', `endtime` datetime default NULL, `pin` char(20) default NULL, `opts` char(100) default NULL, `adminpin` char(20) default NULL, `adminopts` char(100) default NULL, `members` int(11) NOT NULL default '0', `maxusers` int(11) NOT NULL default '0', PRIMARY KEY (`confno`,`starttime`) ); Query OK, 0 rows affected (0.01 sec) Se configuran los privilegios para la base de datos asteriskmeetme: mysql> GRANT ALL PRIVILEGES ON asteriskmeetme.* TO 'asterisk'@'localhost' IDENTIFIED BY 'sesamo'; mysql> GRANT ALL PRIVILEGES ON asteriskmeetme.* TO 'asterisk'@'%' IDENTIFIED BY 'sesamo'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Se introducen algunos datos de prueba en la tabla: mysql> INSERT INTO meetme (confno,pin,adminpin,members,starttime,endtime) VALUES ("5000","1234","2345","0","2009-09-24 19:00","2009-09-24 20:00"); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO meetme (confno,pin,adminpin,members,starttime,endtime) VALUES ("5001","1234","2345","0","2009-09-25 19:00","2009-09-25 20:00"); Query OK, 1 row affected (0.00 sec) y se sale del cliente MySQL mysql> quit Bye Con estos datos se han programado dos conferencias: 137

• la 5000 que iniciará a las 7 de la tarde del 24 de septiembre del 2009 y terminará a las 8 de la tarde del mismo día; • la 5000 que iniciará a las 7 de la tarde del 25 de septiembre del 2009 y terminará a las 8 de la tarde del mismo día; Ahora la configuración de ODBC y Asterisk nano /etc/odbc.ini se añaden estas líneas: [asteriskmeetme] Description = MySQL connection to ‘asteriskmeetme’ database Driver = MySQL Database = asteriskmeetme Server = localhost User =asterisk Password = sesamo Port = 3306 Option = 3 Se guardan los cambios y se modifica el archivo res_odbc.conf nano /etc/asterisk/res_odbc.conf [asterisk3] enabled = yes dsn = asteriskmeetme username = asterisk password = sesamo loguniqueid = yes pre-connect = yes Se guardan los cambios y se pasa al archivo extconfig.conf nano /etc/asterisk/extconfig.conf se añade esta línea en el bloque realtime: meetme => odbc,asterisk3,meetme Se modifica el dialplan para dar acceso a las dos conferencias creadas en la base de datos: nano /etc/asterisk/extensions.conf en el contexto conferencias ponemos: 138

exten => _500[01],1,Meetme(${EXTEN},M) exten => _500[01],n,Hangup Para usar las conferencias en realtime hay que modificar el archivo meetme.conf nano /etc/asterisk/meetme.conf modificar este parámetro: shedule= no para ponerlo en yes schedule=yes Se guardan los cambios y reinicia Asterisk: /etc/init.d/asterisk restart Algunas locuciones relacionadas con las conferencias programadas no están disponibles con la instalación de Asterisk. Hay que descargarlas (en inglés) de este enlace: http://www.voztovoice.org/tmp/confprompts.tar Se descomprime el archivo y se copian las locuciones en la carpeta /var/lib/asterisk/sounds/en En el campo “members” de la tabla meetme se almacenarán dinámicamente los usuarios presentes en la conferencia.

139

Capitulo VII
Asterisk y TTS (text to speech)
7.1 Festival Festival en un TTS48, es decir un sistema de síntesis de voz. ¿Para que lo necesitamos en Asterisk? Si se quiere crear un menú de voz usando lineas de texto, leer archivos de texto, Festival es la solución. Para averiguar que el modulo de festival esté correctamente cargado en Asterisk, desde la consola de la centralita: asterisk -rvvvvvvvvvvvvvvv CLI> module unload app_festival == Unregistered application ‘Festival’ CLI> module load app_festival == Parsing ‘/etc/asterisk/festival.conf’: == Found == Registered application ‘Festival’ Loaded app_festival => (Simple Festival Interface) CLI> quit Si aparece algún tipo de error significa que el modulo no ha sido compilado y hay que volver a la compilación de Asterisk. Festival tiene como idioma predefinido el inglés. Para agregarle el idioma español hay que seguir estos pasos: cd /usr/share/festival/voices wget http://www.voztovoice.org/tmp/festival-spanish.zip yum install unzip unzip festival-spanish.zip Ahora se modifica el archivo de configuración de festival nano /usr/share/festival/festival.scm
48 Festival es un sistema de síntesis de voz de propósito general para múltiples lenguajes desarrollado originalmente por el Centro de Investigación de Tecnologías del Lenguaje de la Universidad de Edinburgo, la Universidad Carnegie Mellon así como otros centros de enseñanza han realizado contribuciones substanciales al proyecto.

se añaden estas líneas antes de la ultima linea del archivo ;(language__spanish) (set! voice_default 'voice_el_diphone) (define (tts_textasterisk string mode) "(tts_textasterisk STRING MODE) Apply tts to STRING. This function is specifically designed for use in server mode so a single function call may synthesize the string. This function name may be added to the server safe functions." (let ((wholeutt (utt.synth (eval (list 'Utterance 'Text string))))) (utt.wave.resample wholeutt 8000) (utt.wave.rescale wholeutt 5) (utt.send.wave.client wholeutt))) Se guardan los cambios en el archivo y se modifica el archivo de configuración de festival en Asterisk: nano /etc/asterisk/festival.conf estas son la líneas que hay que modificar/activar [general] host=localhost port=1314 festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n Se guarda el archivo con Ctrl-O Ctrl-X Se reinicia Asterisk /etc/init.d/asterisk reload Para arrancar el servidor de Festival en automático se pone esta línea en el archivo rc.local: nano /etc/rc.local /usr/bin/festival_server > /dev/null & Se inicia el servidor festival; /usr/bin/festival_server > /dev/null & Se controla que esté corriendo: ps aux | grep festival

141

Se modifica el Dialplan para crear una extensión que permita hacer una prueba del servidor Festival (en el contexto internas): nano /etc/asterisk/extensions.conf exten => 650,1,Answer() exten => 650,n,Festival(Asterisk y Festival trabajan junto. Chevere!!!) exten => 650,n,Hangup() Se actualiza el dialplan desde la consola asterisk -rvvvvvvvvvvvvvvvvv CLI> dialplan reload Desde un softphone conectado a Asterisk se marca la extensión 650 para escuchar la frase que se acaba de configurar en el dialplan. 7.2 Cepstral Cepstral49 es otro sistema TTS que se puede integrar en Asterisk (versión 1.4.X y 1.6.X) gracias a un modulo dedicado. Cepstral no es un programa gratuito y cada voz cuesta 29,99 dólares por canal. Se descarga una voz de prueba desde el sitio de Cepstral cd /opt wget http://downloads.cepstral.com/cepstral/i386-linux/Cepstral_Marta-8kHz_i386linux_5.1.0.tar.gz Se descomprime tar -xf Cepstral_Marta-8kHz_i386-linux_5.1.0.tar.gz y se instala cd Cepstral_Marta-8kHz_i386-linux_5.1.0 ./install.sh Se aceptan los términos de la licencia, se escoge la carpeta /opt/swift para la instalación y se confirman los datos. Para que Linux sepa donde ir a buscar las librerías de Cepstral hay que indicarselo modificando el
49 Cepstral

142

archivo ld.so.conf nano /etc/ld.so.conf se añade esta línea: /opt/swift/lib Se guardan los cambios y se actualizan las librerías: ldconfig -v Una vez instalada la voz de Cepstral hay que compilar y instalar el modulo para Asterisk: cd /usr/src wget http://www.voztovoice.org/tmp/app_swift-1.6.2.tar.gz se descomprime: tar -xf app_swift-1.6.2.tar.gz Se entra en la carpeta: cd app_swift-1.6.2 Se compila e instala: make make install Se reinicia Asterisk: /etc/init.d/asterisk restart y se averiguas que el modulo esté cargado: asterisk -rvvvvvvvvvvv CLI> module show like app_swift Module Description Use Count app_swift.so Cepstral Swift TTS Application 0 1 module loaded La sinopsis del comando

143

[Description] Syntax: Swift(text[|timeout in ms|maximum digits]) Example: Swift(Hello World|5000|5) = 5 second delay between 5 digits This application operates in two modes.n.n. Se sale de la consola de Asterisk: CLI> quit En la carpeta donde están los archivos de configuración de Asterisk se habrá creado un nuevo archivo: swift. One is processing text-to-speech while listening for DTMF and the other just processes the text-to-speech while ignoring DTMF entirely.conf [general] buffer_size=65535 goto_exten=yes voice=Marta-8kHz Se guardan los cambios y se actualiza Asterisk: /etc/init.conf exten => 660.n.Answer() exten => 660.Hangup Se actualiza el dialplan: 144 . Unless the timeout and maximum digits options are BOTH specified.conf.Wait(2) exten => 660.n. contexto internas: nano /etc/asterisk/extensions.d/asterisk restart Para probar la instalación. hay que crear algunas lineas en en el dialplan. the application will automatically ignore DTMF.Swift(En el centro de comunicaciones de VoztoVoice. Returns -1 on hangup or 0 otherwise.1.Playback(welcome) exten => 660.CLI> core show application swift -= Info about application ‘Swift’ =[Synopsis] Speak text through Swift text-to-speech engine. Espere mientras lo conectamos con una operadora) exten => 660. Hay que modificarlo para terminar la integración de Cepstral en Asterisk: nano /etc/asterisk/swift.

asterisk -rvvvvvvvv CLI> dialplan reload Desde un softphone se marca el numero 660. 145 .

Capitulo VIII Conexiones entre servidores Asterisk 8.voztovoice. en el servidor B son de 4 cifras y empiezan por 4. además en el servidor A está configurado un proveedor de llamadas VoIP para Colombia y desde B se quiere redirigir todas las llamadas para Colombia hacia ese proveedor. y se quieren conectar entre ellos usando el protocolo SIP para llamar desde A las extensiones de B y desde B las extensiones de A.1 Conectar dos servidores Asterisk con el protocolo SIP Hay dos servidores Asterisk. se conecta el servidor vozcom al servidor voznet.conf Se añade: register => vozcom:contrasena@sip.conf Se añade:: register => voznet:contrasena@sip.voztovoice. A y B. Con las líneas que están después de la etiqueta [voznet] se define una extensión SIP que será aquella usada por el servidor B para conectarse al servidor A.net/voznet [voznet] type=friend secret=contraseña context=phones qualify=yes host=dynamic language=es disallow=all allow=gsm allow=ulaw allow=alaw Con la línea de register. En este escenario en el servidor A las extensiones son de 4 cifras y empiezan por 1. Las extensiones del servidor A y del servidor B no pueden ser iguales porque sino no sería posible transferir las llamadas de un servidor a otro. Servidor B (voznet) nano /etc/asterisk/sip.com/vozcom [vozcom] . Servidor A (vozcom) nano /etc/asterisk/sip.

conf de ambos servidores.Hangup() Con estas líneas se configura Asterisk para que todas las llamadas con destino las extensiones cuyo 147 .20.202 D 5060 OK (34 ms) para el servidor B (voznet) CLI> sip show registry sip.171 D 5060 OK (34 ms) Ahora lo único que hace falta es modificar el archivo extensions.186.Dial(SIP/voznet/${EXTEN}.com:5060 Y voznet 105 Registered Mon.n.d/asterisk restart Desde la consola se averigua que haya conexión entre los dos servidores: para el servidor A (vozcom): CLI> sip show registry sip.voztovoice.72. 15 Dec 2008 09:57:39 CLI> sip show peers voznet/vozcom 67.18. En los dos se escribe el comando: /etc/init.30) exten => _4XXX.1.type=friend secret=contraseña context=phones host=dynamic language=es qualify=yes disallow=all allow=gsm allow=ulaw allow=alaw Ahora que los dos servidores están configurados hay que reiniciarlos.NoOp() exten => _4XXX.net:5060 vozcom 105 Registered Mon. 15 Dec 2008 10:00:32 CLI> sip show peers vozcom/voznet 209.voztovoice. Servidor A En el contexto internas (para las llamadas a extensiones del servidor B) se añade: exten => _4XXX.n.

Hangup() Para las llamadas a Colombia (en el contexto externas) se pone: exten => _0057.n. hay un notable ahorro de banda.30) exten => _0057.Hangup Con estas dos línea se define que todas las llamadas para Colombia sean direccionadas hacia al servidor A Actualizamos la configuración en los dos servidores: asterisk -rvvvvvvvvvvvvvvv CLI> dialplan reload Esta configuración es una buena solución si no tenemos muchos servidores Asterisk que conectar entre ellos.NoOp() exten => _1XXX.2 Conectar dos Servidor Asterisk con el protocolo IAX2 En este párrafo se mostrará como conectar dos servidor Asterisk a través del protocolo IAX2. Los datos que pasan a través de la LAN no vienen contabilizados para el calculo del consumo de banda.Dial(SIP/vozcom/${EXTEN}. que utiliza el mismo encabezado (header) para el envío del audio de todas las llamadas. llamada trunking. Desde la pagina de administración de Linode se verán los VPS alquilados: 148 . En caso contrario es más conveniente usar el protocolo DUNDi que se verá en el párrafo 8.. Se usarán dos VPS alquilados con la empresa Linode.3 8. anulando en la practica los típicos problemas de NAT que “padece” el protocolo SIP.30) exten => _1XXX.n.Dial(SIP/vozcom/${EXTEN}.. Otra ventaja es que la señalización y los datos audio/video pasan por el mismo puerto (UDP 4569). La ventaja de IAX2 está en su característica.1.numero empiece por 4 y sea de 4 cifras sean redirigidas hacia voznet (servidor B) Servidor B En el contexto internas (para las llamadas a extensiones del servidor A) se añade: exten => _1XXX.1. De esta forma cuando hay un numero considerable de llamadas que estén pasando por el trunk.n. Es importante que los dos estén en el mismo centro de datos porque de esta forma hay la posibilidad de conectarlos como si estuvieran en la misma red local.

0 Se guardan los cambios y se vuelve a arrancar la red: service network restart Con el comando ifconfig debe aparecer: Ahora se sigue el mismo procedimiento para el segundo VPS.248 usuario: vozcom Extensiones: 3000-3099 149 .142. En private IP settings se activa la dirección IP de la red local.142.17 IP: 192.255. Servidor A: Version Asterisk: 1. Se selecciona el primer VPS y se va al menú Network.142.128.246 NETMASK=255.Es importante que en “location” aparezca el mismo centro de datos (en este ejemplo Dallas).168.168. Ahora hay que crear una tarjeta de red virtual para la dirección IP asignada (192. Se abre una conexión ssh con el VPS y se siguen estos pasos: nano /etc/sysconfig/network-scripts/ifcfg-eth0:1 Se añaden estas lineas: DEVICE=eth0:1 BOOTPROTO=none ONBOOT=yes IPADDR=192.168.0. Al terminar se empieza con la configuración de los dos servidores Asterisk.6.246).

0.Hangup asterisk –rvvvvvvvvvvvvvvv CLI> iax2 reload CLI> dialplan reload Servidor B: nano /etc/asterisk/iax.Servidor B: Version Asterisk: 1.1.246 usuario: vozorg Extensiones: 6000-6099 Configuración del servidor A nano /etc/asterisk/iax.168.248 150 .246/255.conf En el bloque register: register => vozcom:passwordA@192.26.conf En el bloque register: register => vozorg:passwordB@192.4.0.246 El usuario: [vozorg] type=friend host=dynamic trunk=yes secret=passwordB context=phones deny=0.255 qualify=yes nano /etc/asterisk/extensions.142.142.142.2 IP: 192.0.Dial(IAX2/vozorg/${EXTEN}) exten => _60XX.168.168.conf en el contexto internas: [internas] exten => _60XX.n.142.255.0/0.0.255.0 permit=192.168.

255. la solución más funcional es el protocolo DUNDi.168.142. DUNDi (Distributed Universal Number Discovery) es un protocolo que permite buscar y compartir plan de llamadas entre servidores Asterisk.0.3 DUNDi Cuando hay que conectar un numero considerable de servidores Asterisk y compartir las rutas y las extensiones configuradas en cada uno de ellos.255. El puerto predefido para el protocolo DUNDi es el 4520 UDP. Hay que abrirlo en el cortafuegos: nano /etc/sysconfig/iptables 151 . Aunque la configuración y puesta en marcha pueda parecer algo complicado.1.n.Hangup asterisk –rvvvvvvvvvvvvvvv CLI> iax2 reload CLI> dialplan reload Ya se pueden hacer pruebas llamando del servidor A las extensiones del servidor B y viceversa.0. sino que los servidores pueden asumir uno u otro rol según el contexto.0. con un poco de practica se irán aclarando las ideas y los conceptos claves.Dial(IAX2/vozcom/${EXTEN}) exten => _30XX. A lo largo de la configuración se puede decidir si compartir contextos ya configurados en el Dialplan (plan de llamadas) o crear contextos nuevos donde se indican las rutas que se quieren compartir.El usuario: [vozcom] type=friend host=dynamic trunk=yes secret=passwordA context=phones deny=0.255 qualify=yes nano /etc/asterisk/extensions.0.conf en nuestro contexto internas: [internas] exten => _30XX.0 permit=192. 8. Esto por medio de una red Peer-to-peer (punto-a-punto) en la cual no existen roles fijos de clientes y servidores.0/0.248/255.

desde esta etiqueta empieza la configuración general de DUNDi department=VozCom organization=VozCom locality=Santa Marta stateprov=Magdalena country=Colombia email=admin@servidorA.com phone=+57XXXXXXXXXX .conf. cuales son las rutas o contextos que se quiere compartir.2 IP: 192.0 152 .conf se definen los parámetros de conexión entre los servidores Asterisk y los contextos que se van a compartir. SIP o H323).6. Con la configuración del archivo dundi.142.168.248 usuario: vozcom Extensiones: 2000-2999 Servidor B: Version Asterisk: 1.26. Servidor A nano /etc/asterisk/dundi.conf [general] .168.17 IP: 192.0. En el mismo archivo se define el tipo de protocolo que los dos servidores usarán para efectuar y recibir llamadas una vez que se haya encontrado la ruta (puede ser IAX2. Por ultimo se modifica el Dialplan (plan de llamadas) para definir en los contextos configurados en dundi.0.246 usuario: vozorg Extensiones: 6000-6099 Los dos servidores están en la misma LAN pero pueden estar ubicados en cualquier parte del mundo.0. se indican los datos de la empresa y de contacto bindaddr=0.4.en la seccion *filter -A INPUT -p udp -m udp --dport 4520 -j ACCEPT Se guardan los cambios y se reinicia Iptables: service iptables restart En el escenario que se presenta en este párrafo hay dos servidores Asterisk con estas características: Servidor A: Version Asterisk: 1.142.

se escogerá la ruta con menor peso tech – protocolo usado para la conexión entre servidores Asterisk (se usará IAX2) dest – cuando se hace una solicitud desde el servidor B y se encuentra una ruta en el Servidor A. el Servidor A usará esta destinación para recibir la llamada. secretpath=dundi .0. desde esta etiqueta empieza el mapeo de los contextos DUNDi con los contextos presentes en el servidor Asterisk. ttl=32 . Simplificando: se crea un user en 153 • • . Más alto el numero más nodos se alcanzará a consultar.weight.0. Si son extensiones locales se pone 0. puerto predefinido usado por el protocolo DUNDi. el modulo pbx_dundi crea una clave que rotará de manera automática y que se guardará en la base de datos interna de Asterisk. entityid=FE:FD:45:A4:C5:68 . el resultado se guardará por el tiempo definido en este parámetro (en segundos) en la base de datos interna de Asterisk. mantiene un registro de las ultimas solicitudes efectuadas con los tiempos de respuesta de cada una. si son rutas por la cuales no tenemos una conexión directa o de alta calidad ponemos un numero más alto.. si no se recibe una respuesta dentro de 2000 ms de un servidor conectado a la red DUNDi se anulará la solicitud. autokill=yes . Al momento de hacer una solicitud si para el mismo numero requerido existen distintas rutas.options]] • • • dundi_context – el contexto DUNDi que se quiere compartir con los demás nodos de la red DUNDi local_context – el contexto local definido en el plan de llamadas donde se configuran las rutas o extensiones que se quieren compartir weight – el peso que damos a las rutas que compartimos. De esta forma es posible averiguar cuales son los nodos lentos dentro de la red DUNDi [mappings] . direccion IP del servidor Asterisk o si se deja en 0.dest[. cuando se envía un solicitud para conocer la disponibilidad de una ruta y se encuentra una disponible. Las sintaxis para definir los contextos es: . storehistory=yes . el MAC address de la tarjeta de red que se va a usar para la conexión cachetime=3600 . dundi_context => local_context.0 todos los IP disponibles en el servidor port=4520 .tech.Time to Live es un numero que representa el tiempo de vida de la solicitud. Esto permite evitar que las solicitudes queden colgadas en algún punto de la red.

142.IAX2.conf ${SECRET}: es la variable que contiene la clave que el modulo DUNDi crea en automático y que se usará para autenticar el usuario vozcom 192.conf del servidor Asterisk A y dest representa los paramentos para conectarse a ese user y a través de la conexión recibir las llamadas del servidor B options – son las distintas opciones que se pueden añadir por cada contexto DUNDi • • • • • • nounsolicited – llamadas de cualquier tipo que no sean solicitadas no son permitidas en esta ruta nocomunsolicit – llamadas comerciales no solicitadas no son permitidas en esta ruta residential – el numero es de una residencia commercial – el numero es de una empresa mobile – el numero es un celular nopartial – no se harán búsquedas por números que no sean completos la ruta definida para el servidor A será: vozcom => vozcom-local.142.168.168.142. Para terminar con la configuración del archivo dundi.248: dirección IP del Servidor A ${NUMBER}: la variable que contendrá el numero que ha sido solicitado.0.168.• el iax.conf se definen los servidores Asterisk con los se va a tener una conexión directa: [FE:FD:45:A4:C4:49] model = symmetric host = 192.vozcom:${SECRET}@192.246 inkey = vozorg outkey = vozcom include = all permit = vozcom qualify = yes • • FE:FD:45:A4:C4:48: MAC address de la tarjeta de red de Servidor Asterisk B con el que se crea la conexión model: puede ser: • inbound: recibe solamente solicitudes • outbound: solo efectúa solicitudes pero no las recibe • symmetric: recibe y efectúa solicitudes host: direccion IP o nombre de dominio del servidor Asterisk B 154 • .248/${NUMBER} • • • • • • • vozcom: el contexto DUNDi que se va a compartir vozcom-local: el contexto definido en el plan de llamadas que contendrá todas las rutas que se van a compartir IAX2: la tecnología usada (protocolo) para las llamadas vozcom: usuario que se configurará en el el archivo iax.

.• • • • • inkey: clave RSA usada para autenticarse con el servidor Asterisk B outkey: clave RSA usada por el Servidor Asterisk B para autenticarse con el Servidor Asterisk A include: incluye esta conexión para todas las solicitudes efectuadas en Servidor Asterisk A permit: se definen los contextos DUNDi a los que tendrá acceso este nodo qualify: se controlará periódicamente que la conexión con el nodo esté activa Se guardan los cambios y se crea la clave RSA para autenticar el Servidor Asterisk B. and any private keys (.....++++++ ..246:/var/lib/asterisk/keys Ahora se puede añadir el usuario vozcom al archivo iax.key files) will need to be initialized at runtime either by running Asterisk with the '-i' option.....pub root@192...............key Se crearán dos claves.168.... Press ENTER to continue or ^C to cancel. You will be asked to enter a passcode for your key multiple times. Para crear la clave se usará una utilidad que viene con la instalación de asterisk..... The resulting files will need to be moved to /var/lib/asterisk/keys if you want to use them. or with the 'init keys' command once Asterisk is running.. Primero entramos en la carpeta donde se guardan las claves: cd /var/lib/asterisk/keys Se crea la clave: astgenkey -n vozcom This script generates an RSA private and public key pair in PEM format for use by Asterisk.... La publica se copia en el Servidor Asterisk B: scp vozcom. Presionamos la tecla envío: Generating SSL key 'vozcom': Generating RSA private key.. una publica y una privada..pub Private key: vozcom.142.... 1024 bit long modulus .... Please enter the same code each time. Public key: vozcom.++++++ e is 65537 (0x10001) writing RSA key Key creation successful......conf 155 .

n..Hangup exten => _2XXX.conf Se añaden las siguientes lineas en el bloque dedicado a la configuración de las extensiones: [vozcom] type=user dbsecret=dundi/secret context=vozcom-local qualify=yes disallow=all allow=ulaw allow=alaw Importante definir el parámetro context con el valor del contexto que hemos definido en nuestra ruta (vozcom-local) El ultimo archivo que hay que modificar es el plan de llamadas: nano /etc/asterisk/extensions.15) exten => _2XXX.u) exten => _2XXX.Dial(SIP/justvoip/${EXTEN}) exten => _2XXX.Dial(SIP/${EXTEN}.Voicemail(${EXTEN}@default.GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => _2XXX.b) exten => _2XXX.nano /etc/asterisk/iax.n(unavail).Hangup Para las solicitudes remotas creamos otro contexto: [dundi-remoto] switch => DUNDi/vozorg el nombre vozorg es el contexto DUNDi que luego se creará en el Servidor Asterisk B Añadimos el contexto dundi-remoto a la lista de contextos disponibles para la extensiones configuradas en el Servidor Asterisk A: [phones] include => internas include => externas include => subscribe 156 .conf Se crea el contexto vozcom-local y se incluyen en él las rutas que se quieren compartir (las extensiones locales y una ruta para las llamadas a Colombia) [vozcom-local] exten => _0057.Voicemail(${EXTEN}@default.1.n.n.n(busy).1.

include => parkedcalls include => conferencias include => dundi-remoto Se guardan los cambios y se continúa con la configuración del Servidor Asterisk B Servidor B nano /etc/asterisk/dundi.0.168.conf [general] department=VozOrg organization=VozOrg locality=Santa Marta stateprov=Magdalena country=Colombia email=admin@servidorB.com phone=+57XXXXXXXX bindaddr=0.142.IAX2.0 port=4520 entityid=FE:FD:45:A4:C4:48 cachetime=3600 ttl=32 autokill=yes secretpath=dundi storehistory=yes [mappings] vozorg => vozorg-local.0.vozorg:${SECRET}@192.246/${NUMBER} [FE:FD:45:A4:C5:68] model = symmetric host = 192.0.248 inkey = vozcom outkey = vozorg include = all permit = vozorg qualify = yes Se crea la clave RSA: cd /var/lib/asterisk/keys astgenkey -n vozorg This script generates an RSA private and public key pair 157 .142.168.

.. Press ENTER to continue or ^C to cancel...Dial(SIP/${EXTEN}) [dundi-remoto] switch => DUNDi/vozcom 158 ....248:/var/lib/asterisk/keys nano /etc/asterisk/iax..... The resulting files will need to be moved to /var/lib/asterisk/keys if you want to use them.pub Private key: vozorg........ You will be asked to enter a passcode for your key multiple times.....conf [vozorg] type=user qualify=yes dbsecret=dundi/secret context=vozorg-local disallow=all allow=ulaw allow=alaw Para terminar se modifica el plan de llamadas: nano /etc/asterisk/extensions. Presionamos la tecla envío: Generating SSL key 'vozorg': Generating RSA private key.. Please enter the same code each time...++++++ e is 65537 (0x10001) writing RSA key Key creation successful.pub root@192.key files) will need to be initialized at runtime either by running Asterisk with the '-i' option. 1024 bit long modulus ....conf [vozorg-local] exten => _60XX......... Public key: vozorg..1.142..key Se copia en el Servidor Asterisk A scp vozorg.. or with the 'init keys' command once Asterisk is running..in PEM format for use by Asterisk.....++++++ ..168... and any private keys (..

3obGb1QtvkUeciZs7rH5CA== : 1259212403 Host Model AvgTime Status 192.168.Se incluye el contexto dundi-remoto de forma que sea accesible a las extensiones Una vez terminada la configuración del Servidor Asterisk B en ambos se reinicia la PBX: /etc/init.246 (S) Symmetric Unavail OK (1 ms) aparecerá la clave creada por el modulo pbx_dundi y el tiempo que falta para que caduque.142. Ahora se puede hacer la primera consulta para controlar que efectivamente las rutas se están compartiendo: 159 .d/asterisk restart Se entra en la consola del servidor Asterisk A: asterisk -rvvvvvvvvvvvv miramos la lista de comandos disponibles para DUNDi CLI> help dundi dundi flush [stats] Flush DUNDi cache dundi lookup Lookup a number in DUNDi dundi precache Precache a number in DUNDi dundi query Query a DUNDi EID dundi set debug {on|off} Enable/Disable DUNDi debugging dundi show entityid Display Global Entity ID dundi show mappings Show DUNDi mappings dundi show peers [registered|i Show defined DUNDi peers dundi show peer Show info on a specific DUNDi peer dundi show precache Show DUNDi precache dundi show requests Show DUNDi requests dundi show trans Show active DUNDi transactions dundi store history {on|off} Enable/Disable DUNDi historic records Primero se controla que haya conexión entre los dos servidores: CLI> dundi show peers EID fe:fd:45:a4:c4:48 Con el comando: CLI> database show /dundi/secret /dundi/secretexpiry : qotQe+Vp1B2G7S9yoizlPA==.

246/6099 (EXISTS|CANMATCH) from fe:fd:45:a4:c4:49.168.248/2100 (EXISTS) from fe:fd:45:a4:c5:69.15") in new stack == Using SIP RTP TOS bits 184 160 1. 0 IAX2/vozorg:c0vuYb1EYDRo2QVnM8D3Fg==@192. expires in 3600 s DUNDi lookup completed in 39 ms Para terminar las pruebas se conecta un softphone al servidor Asterisk B y se intenta llamar la extesion 2100 (que es presente en el servidor Asterisk A) Esto es lo que aparece en la consola de Asterisk del servidor A: Accepting AUTHENTICATED call from 192. DUNDi lookup completed in 2 ms Se hace otra solicitud de prueba desde el Servidor Asterisk B CLI> dundi lookup 2100@vozcom 0 IAX2/vozcom:3obGb1QtvkUeciZs7rH5CA==@192.conf del servidor Asterisk B.168. 0 IAX2/vozcom:3obGb1QtvkUeciZs7rH5CA==@192. expires in 2624 s DUNDi lookup completed in 0 ms Solicitud para un numero colombiano: CLI> dundi lookup 0057123456789@vozcom 1. "SIP/2100. > actual format = ulaw.168. En el comando ademas de la extensión va indicado el contexto como lo hemos definido en el bloque mappings del dundi.168. Si se envía una solicitud para una ruta que no existe la respuesta será: CLI> dundi lookup 6100@vozorg DUNDi lookup returned no results. > requested prefs = (ulaw|alaw).142.142. expires in 2982 s DUNDi lookup completed in 0 ms En el servidor Asterisk B las extensiones compartidas van de 6000 a 6099 y efectivamente enviando la solicitud la respuesta es que la extensión existe. > host prefs = (ulaw|alaw).142. .248/0057123456789 (EXISTS| MATCHMORE|CANMATCH) from fe:fd:45:a4:c5:69.Executing [2100@vozcom-local:1] Dial("IAX2/vozcom-1213".142.246: > requested format = ulaw. > priority = mine -.CLI> dundi lookup 6099@vozorg 1.

"0?busy:unavail") in new stack -.Executing [2100@vozcom-local:5] VoiceMail("IAX2/vozcom-1213".Executing [2100@vozcom-local:2] GotoIf("IAX2/vozcom-1213".2100.5) -. 161 .Goto (vozcom-local.c:1499 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 .== Using SIP RTP CoS mark 5 == Using SIP VRTP TOS bits 136 == Using SIP VRTP CoS mark 4 == Using UDPTL TOS bits 184 == Using UDPTL CoS mark 5 [Nov 26 00:06:39] WARNING[6087]: app_dial.Unknown) == Everyone is busy/congested at this time (1:0/0/1) -. Las potencialidades del protocolo DUNDi son prácticamente infinitas y este párrafo se han presentado las herramientas básicas para empezar a utilizar.u") in new stack La llamada llega desde la IP del servidor Asterisk B y va al contexto vozcom-local (las rutas compartidas). "2100@default. Como la extensión 2100 no está disponible la llamada entra el contestador.

basado en el estándar XML y gestionado por XMPP Standards Foundation. su multiplicidad de funciones y la posibilidad de ser integrado con Asterisk.gz Se entra en la carpeta bin cd /opt/openfire/bin Se modifica el script de inicio modificando esta linea: INSTALL4J_JAVA_HOME_OVERRIDE= 50 Jabber es un protocolo libre para mensajería instantánea.0-openjdk* Terminada la instalación se controla la versión instalada: java -version java version "1.6. para que funcione. fácilmente manejable y segura gracias al uso del protocolo TLS 51. (Wikipedia) 51 Secure Sockets Layer -Protocolo de Capa de Conexión Segura.6. la administración desde una página Web.0" OpenJDK Runtime Environment (build 1.0-b09) OpenJDK Client VM (build 1. Con Openfire instalado se tendrá un nuestro servidor de mensajería instantánea sin tener que acudir a servicios de terceros. son protocolos criptográficos que proporcionan comunicaciones seguras por una red. ¿Porque Openfire?. su sucesor. Esto implica tener una red de mensajería instantánea segura.1 Instalación de Openfire Openfire es un servidor jabber50.Capitulo IX Openfire y Asterisk 9.6.tar.tar.6. (Wikipedia) .org/downloadServlet?filename=openfire/openfire_3_6_4.gz se descomprime tar -xf openfire_3_6_4. Entre tantos servidores con protocolo XMMP Openfire se destaca por la sencillez de la instalación.(SSL) y Transport Layer Security -Seguridad de la Capa de Transporte. mixed mode) Se descarga el servidor jabber Openfire: cd /opt wget http://www.0-b09.(TLS).igniterealtime. comúnmente Internet. Openfire es escrito en java y. hay que instalar la JDK (Java SE Development Kit) o instalar (la opción que se usará) la versión OpenSource del java development Kit yum install java-1.

En este caso se usará MySQL.para que quede: INSTALL4J_JAVA_HOME_OVERRIDE=/usr/lib/jvm/java-1.0-openjdk-1./openfire start Se averigua que esté corriendo .0.6. El servidor está funcionando.* TO 'openfire'@'localhost' IDENTIFIED BY 'sesamo'. Openfire para registrar los datos puede utilizar una base de datos interna o externa.01 sec) mysql> flush privileges. mysql> GRANT ALL PRIVILEGES ON openfire.00 sec) mysql> quit Bye sesamo es la contraseña del usuario openfire 163 . Query OK. Ahora hay que configurarlo.* TO openfire IDENTIFIED BY 'sesamo'./openfire status Si aparece The daemon is running. Query OK. Se crea la base de datos en MySQL mysqladmin create openfire -u root -psesamo Se entra en el cliente de mysql mysql -u root -psesamo Se crea un usuario y se le otorgan todos los permisos para manejar la base de datos Openfire mysql> GRANT ALL PRIVILEGES ON openfire.6.0 y se inicia: . 0 rows affected (0. 0 rows affected (0.

sql -u root -psesamo Para que openfire sea accesible desde afuera de la red local hay que abrir unos puertos en el cortafuegos.Ahora se importan las tablas para la base de datos mysql openfire < /opt/openfire/resources/database/openfire_mysql. si se tiene un dominio registrado. el nombre (Ej.ejemplo.com) aparecerá una pagina de configuración: 164 . En la barra de la direcciones de nuestro navegador se escribe: http://mioipodominio:9090 en lugar de mioipodominio se pone la dirección IP del servidor Linux o. nano /etc/sysconfig/iptables En la sección *filter se añaden estas lineas: -A INPUT -p tcp -m tcp --dport 5222:5223 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5269 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5275 -j ACCEPT -A INPUT -p tcp -m tcp --dport 7070 -j ACCEPT -A INPUT -p tcp -m tcp --dport 5443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 9090 -j ACCEPT -A INPUT -p tcp -m tcp --dport 9091 -j ACCEPT Se guardan los cambios y se reinicia iptables: service iptables restart Una vez configurado el firewall se accede a la pagina de configuración de Openfire. www.

se elige el idioma Se configura el nombre del dominio o la dirección IP: Se elige el tipo de base de datos que se utilizará: 165 .

Se configura el acceso a MySQL y la base de datos: En seteos de perfil se elige la opción “por defecto” Se configura el correo electrónico y la cuenta del administrador: 166 .

El servidor está listo para funcionar. Antes de entrar en la página de administración de Openfire hay que parar y volver a arrancar el servidor: /opt/openfire/bin/openfire stop /opt/openfire/bin/openfire start 167 .

Ahora se puede configurar el servidor; crear usuarios, instalar plugins, crear conferencias y otras cuantas funciones. Para probar la conexión el cliente predefinido de Openfire es Spark52 (en mi caso para Windows). Hay que descargarlo, instalarlo y abrirlo. Se pone come usuario admin, que es el que se ha creado a lo largo de la configuración de Openfire, y se presiona ingresar.

52 Spark Client

168

Se pueden configurar más usuarios y grupos desde la pagina de administración Si se quiere iniciar Openfire en automático: cd /opt/openfire/bin/extra nano openfired Se cambian estas tres lineas export OPENFIRE_HOME=/opt/openfire export OPENFIRE_USER=root CMD=”./openfire $1” Se guardan los cambios y se vuelve ejecutable el archivo: chmod +x openfired 169

Se copia en la carpeta de los demonios: cp openfired /etc/init.d/openfired y se añade a los servicios: chkconfig --add openfired chkconfig openfired on Para averiguar si Openfire arranca en automático se hace un un reboot de la maquina Linux. reboot 9.2 Instalar el Plugin SIPPhone en Openfire En este párrafo se verá come instalar el plugin SIPPhone para Openfire. Este plugin permite asociar a un usuario registrado en Openfire una cuenta SIP o extensión Asterisk. Luego se instala el mismo plugin en el cliente Spark y desde éste se podrán efectuar llamadas usando el dialplan configurado en Asterisk. Desde un navegador Web entramos en la pagina de administración.

En el menú Plugins y se escoge Available Plugins en el menú de la izquierda. Dependiendo de los plugins que ya se instalaron, aparecerá una lista parecida a esta:

170

Se presionba el botón a la derecha del plugin para instalarlo. Se presiona el botón Server en la barra del menú. En la segunda línea del menú habrá un nuevo menú: Phone. Lo presionamos para entrar en el menú de configuración del plugin.

Se escoge “Add new Phone Mapping” y se rellenan los campos:

171

Una vez terminado hay que configurar el cliente Spark que es el único que funciona con este plugin.• • • • • • • • XMMP username : el nombre del usuario openfire SIP username : el numero o nombre de la extensión Authorization Username : el numero o nombre de la extensión Display Phone Number : el numero que aparecerá al llamado Password: la contraseña asociada a la extensión Server: el nombre del dominio o IP de nuestro servidor Asterisk Outbound Proxy : si usamos un proxy para conectarnos al servidor Asterisk hay que indicarlo aquí sino se pone la dirección IP o el nombre de dominio del servidor Asterisk Voice Mail Number : si en extension. En el menú del cliente Spark se elige la voz Plugins y en Plugins disponibles Phone client y se instala 53 SipPhone para Linux 172 . Se repite la misma operación para todos los usuarios que se quiere asociar a una extensión de Asterisk.conf hemos configurado una extensión para entrar en nuestro contestador tenemos que indicarlo aquí (ejemplo 97) Se presionas el botón Create para guardar la configuración. En la versión Linux de Spark el plugin se instala correctamente solamente si el cliente y el plugin se compilan desde las fuentes53. Se abre el cliente Spark y se abre una conexión con el nombre de usuario configurado arriba (en este caso admin).

173 .

se cierra el cliente y se vuelve a iniciar. En el menú acciones se elige Phone Enabled 174 .Cuando se termina de descargar el plugin.

175 .Aparecerá el cliente SIP en una nueva línea del menú de Spark y se podrá empezar a usarlo para hacer llamadas.

De este modo cuando esa extensión está hablando. 9.conf haber configurado un usuario en el archivo manager. monitorear nuestros servidores Asterisk y además hacer llamadas VoIP esta es una buena solución.conf. Requisitos: • • • haber instalado openfire con una base de datos externa (Mysql) haber puesto el parámetro callevents=yes en la parte general del archivo sip.3 El Plugin Asterisk-IM Asterisk-IM permite asociar a cada usuario Openfire una extensión SIP configurada en sip.conf: 176 .Si se quiere usar un único programa para chatear.conf Se modifica el archivo manager. en el cliente jabber Spark el estado del usuario Openfire asociado con la extensión cambiará de disponible a “on the phone”.

agent.dtmf. en en la configuración del cortafuegos.call.originate Se actualiza la configuración de Asterisk: /etc/init.dialplan write = system.reporting.command. nano /etc/sysconfig/iptables En la seccion *filter se añade esta línea -A INPUT -p tcp—dport 5038 -j ACCEPT Se guardan los cambios y se reinicia IPtables: service iptables restart Ahora el archivo sip.conf Se modifica la siguiente línea en la parte general: callevents=yes 177 .config.verbose.cdr.conf La parte general debe aparecer así: [general] enabled = yes webenabled = yes port = 5038 httptimeout = 60 bindaddr = 0. hay que abrir el puerto 5038 TCP.d/asterisk reload En el caso que el servidor jabber y el servidor Asterisk estén en dos servidores distintos.conf nano /etc/asterisk/sip.user.0.0 allowmultiplelogin = yes displayconnects = yes timestampevents = yes luego se añade un nuevo usuario: [openfire] secret = sesamo displayconnects = yes read = system.config.nano /etc/asterisk/manager.call.reporting.log.agent.0.user.

Presionamos el menú “Available Plugins” Para instalarlo se presiona el botón que aparece al fondo de la línea del plugin. Se configura siguiendo las pautas indicadas en la imagen que sigue: 178 . Desde un navegador Web se abre la pagina de administración de Openfire y se va al menú Plugins. Asterisk IM.Desde la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv CLI> sip reload Se instala el plugin en Openfire. Se escoge el menú Asterisk-IM y luego General Settings. Una vez instalado en el barra de menú una nueva voz.

Se presiona el botón SAVE. La bolita verde a la izquierda indica che hay conexión con Asterisk. En la misma ventana se escoge el menú Add Server y se configura la conexión al Asterisk Manager Se presiona el botón Create Server. 179 .

el estado de del usuario admin cambiará como aparece en la imagen que sigue: 180 . Cuando la extensión 2000 esté hablando. Desde el cliente Spark se abre una conexión con el usuario admin que se ha configurado en Phone Mappings.18.Para averiguar que efectivamente el usuario Openfire esté conectado al Asterisk Manager se entra en la consola de Asterisk: asterisk -rvvvvvvvvvvvvvv se digita el comando: CLI> manager show connected Username IP Address Start Elapsed FileDes HttpCnt Read Write openfire 67. Se guardan los cambios y se entra en el menu Phone Mappings: Se configuran todos los usuarios de Openfire que se quiere asociar con una extensión SIP presente en el servidor Asterisk.186.202 1229776886 349 30 0 04079 04851 1 users connected.

En el caso de otro usuario: 181 .

hay que asegurarse de haber seguido todos los pasos necesarios contenidos en el párrafo 1.4 Asterisk como cliente en Openfire La configuración de Asterisk como cliente jabber en Openfire es parecida a la de GoogleTalk (párrafo 10.3.2). activamos el debug autoprune=yes 182 . Se empieza con la modifica del archivo jabber. Para que el modulo res_jabber funcione. nano /etc/asterisk/jabber.conf presente en la carpeta /etc/asterisk.conf [general] debug=yes .9.

net statusmessage=Asterisk server .net/openfire . la lista de amigos. el puerto TCP del servidor Openfire usado para conectarse usetls=yes .net buddy=fulano@voztovoice. registra automáticamente los nuevos usuarios en lista de amigos [vozcom] . uno por línea buddy=admin@voztovoice. etiqueta que define la conexión (importante para las funciones Jabberstatus y Jabbersend de Asterisk) type=client . Asterisk actuará como un cliente (las opciones son cliente. componente y server) serverhost=voztovoice. Desde un navegador Web se entra en la pagina de adminsitracion de Opnefire 183 . Usar el protocolo SASL buddy=voznet@voztovoice. remueve automáticamente los usuarios de la lista de amigos autoregister=yes . Usar el protocolo TLS usesasl=yes . el nombre de dominio o IP del servidor Openfire username=vozcom@voztovoice. la contraseña priority=10 . Se guardan los cambios y antes de actualizar la configuración de Asterisk se configurar este usuario en Openfire..net . el nivel de prioridad que tiene en cliente en caso de conflictos (ej: dos conexiones simultaneas del mismo usuario) port=5222 . un mensaje personalizado del usuario timeout=100 . Nombre del usuario Openfire del servidor asterisk secret=contraseña .net .

d/asterisk reload Se averigua el resultado desde la consola de Asterisk asterisk -rvvvvvvvvvvvv 184 . Ahora se puede actualizar la configuración de Asterisk: /etc/init.En la barra de menú se escoge “Usuarios/Grupos” y luego en el menú vertical en la izquierda “crear nuevo usuario” Se rellena el formulario y luego se presiona el botón crear usuario.

5 Conectar dos servidores Openfire Si se conectan dos servidores Openfire entre ellos.CLI> jabber show connected Jabber Users and their status: User: vozcom@voztovoice. los usuarios de uno podrán agregar en su lista de amigos usuarios del otro servidor.168.200 • • Primero: si hay un cortafuegos por el medio.org/xmpp/client/caps version: asterisk-xmpp 9.1.net Resource: openfire node: http://www.1.asterisk. Para lograr este tipo de comportamiento hay que modificar la configuración en los dos servidor: Los dos servidores están instalados en dos computadores de la misma LAN: Openfire A IP: 192.net Resource: None Buddy: voznet@voztovoice.net/openfire – Connected Para ver la lista de amigos: CLI> jabber show buddies Jabber buddy lists Client: vozcom@voztovoice. hay que abrir el puerto 5269 TCP en ambos Segundo: se entra en la pagina de administración del servidor A y se escoge el menú Server > Server Settings > Server to Server Se configura la página como sigue: 185 .100 Openfire B IP: 192.net Resource: None Buddy: admin@voztovoice.168.net/openfire Buddy: fulano@voztovoice.

Luego se pasa al menú Server > Server settings > Security settings y bajo el cuadro Server Connection Security se selecciona la casilla: 186 .

1. Si aparece la expresión en negrita todo está bien.1.1.100 en la White List Se guardan los cambios y se verifica que la conexión esté activa: Se entra en el menú Sessions > Server Session donde debería aparecer: Si no aparece ninguna conexión se puede usar el programa Telnet para averiguar si el puerto 5269 TCP esté efectivamente abierto.168. Desde la consola de Linux del servidor A se escribe: telnet telnet> o -a 192.Se guardan los cambios y se sigue el mismo procedimiento en el servidor B indicando la IP: 192. Connected to 192.200 5269 Trying 192.200.168..1..168.168.200 Escape character is ‘^]’. se abre una conexión con un nombre de usuario del Servidor Openfire A y se añade a la lista de amigos un usuario registrado en el servidor Openfire B: 187 . </stream:stream>Connection closed by foreign host. Se abre el cliente Spark.

hay que recurrir al Connection Manager. Cada Connection Manager es capaz de manejar cinco mil usuarios.Para tres o más servidores Openfire. se sigue el mismo procedimiento. 9. que queremos conectar entre ellos. El esquema de funcionamiento es el que aparece en la imagen aquí abajo: 188 . Se pueden instalar uno o más Connection Manager según el numero de usuarios.6 Openfire Connection Manager Si hay que manejar un numero considerable de usuarios (más de 1000 en linea a la vez). Este programa se configura delante del servidor Openfire y gestiona las conexiones y las autenticaciones de los usuarios.

gz Ahora solo falta configurar el programa.org) hostname: la dirección IP del servidor Openfire port: el puerto configurado en el servidor Openfire para aceptar las conexiones del Connection Manager (5262 predefinido) password: la contraseña que se ha definido en el servidor Openfire para aceptar las conexiones del Connection Manager name: un nombre que queremos asignar a el Connection Manager (muy útil si se tiene planeado instalar más de uno).xml Las líneas que hay que modificar son: • • • domain: el nombre de dominio del servidor Openfire (ej: miodominio. interface: dirección IP o nombre de dominio donde el Connection Manager aceptará las conexiones. Se entra en la carpeta de configuración y se modifica el archivo manager. Ahora hay que abrir los puertos 5222 y 5223 en el cortafuegos del computador donde esté instalado el Connection Manager.xml cd /opt/connection_manager/conf nano manager.tar. Para terminar se instala el “script” para arrancar Connection Manager en automático: cd /opt/connection_manager/bin/extra nano cmanagerd 189 .org/downloadServlet?filename=connectionmanager/connection_manager_3_6_3.gz Se descomprime: tar –xf connection_manager_3_6_3. • • • Se guardan los cambios.igniterealtime. Se descarga el programa: cd /opt wget http://www.tar.En ese ejemplo hay tres Connection Managers instalados que reciben las registraciones de los usuarios y a su vez están conectados con el servidor Openfire.

Desde la pagina di administración del servidor Openfire bajo el menú “Server settings” se elige “Connection Manager”. se escoge el puerto y se define una contraseña.d/cmanagerd status running pid is 5747 190 . Se presiona el botón “Save Settings”. Ahora se puede arrancar el Connection Manager.d/cmanagerd start Se averigua que esté corriendo: /etc/init./cmanager.Se modifican las siguientes líneas: export CMANAGER_HOME=/opt/connection_manager export CMANAGER_USER=root CMD=". En la pagina que aparece se activa el servicio.d/ chmod +x /etc/init.d/cmanagerd chkconfig –add cmanagerd chkconfig cmanagerd on Antes de arrancar el Connection Manager hay que modificar la configuración del servidor Openfire. En el servidor Linux donde se instaló se escribe: /etc/init.sh $1" Se guardan los cambios y se termina: cp cmanagerd /etc/init. Se abre el puerto 5262 TCP en el cortafuegos.

2010 5:02:17 AM] y en la pagina de administración de Openfire se verifica que está conectado: Desde un cliente XMPP se abre una conexión usando como dirección IP o nombre de Dominio la que se ha configurado en la linea “interface” del archivo manager.3 [Feb 6.6.xml 191 .Connection Manager 3.

00 sec) Se asigna a un usuario los privilegios para conectarse a la base de datos: mysql> GRANT ALL PRIVILEGES ON timeclock.org/tmp/timeclock.conf . Se crea una base de datos de prueba en MySQL: cd /usr/src wget http://www.1 Func_odbc.ODBC y Base de datos En este párrafo se verá como usar el conector ODBC y el archivo de configuración de Asterisk func_odbc.* TO ‘timeclock’@’localhost’ IDENTIFIED BY ‘sesamo’. Se actualizan los privilegios: mysql> flush privileges. +----+--------+----------+----------+------------+ id | empnum | lastin | lastout | comments | +----+--------+----------+----------+------------+ | 1 | 12345 | 00:00:00 | 00:00:00 | Fulano | | 2 | 23456 | 00:00:00 | 00:00:00 | Sutano | +----+--------+----------+----------+------------+ 2 rows in set (0.Capitulo X Potpourri 10.voztovoice.conf para hacer consultas en una base de datos MySQL y devolver los resultados al plan de llamadas. Se sale del cliente MySQL: mysql> quit .txt La base de datos viene con dos registros insertados mysql -u root -psesamo mysql> use timeclock mysql> SELECT * FROM users.txt mysql -u root -psesamo < timeclock.

1.n.conf Se añaden las siguientes líneas: [timeclock] enable=yes dsn=timeclock username=timeclock password=sesamo loguniqueid=yes pre-connect=yes en el campo password se pone la contraseña configurada en MySQL para el usuario timeclock nano /etc/asterisk/func_odbc.Wait(2) 193 .Answer exten => 222.ini [timeclock] Description = MySQL ODBC TIMECLOCK Driver = MySQL Server = localhost User = timeclock Password = sesamo Database = timeclock Port = 3306 Option = 3 Para terminar falta crear la parte del dialplan que se encargará de hacer las consultas a la base de datos que hemos creado: nano /etc/asterisk/extensions.conf se añaden las líneas: [TIMECLOCK] dsn=timeclock readsql=SELECT comments FROM users WHERE empnum=’${SQL_ESC(${ARG1})}’ writesql=UPDATE users SET empnum=’${SQL_ESC(${VAL1})}’ WHERE empnum=’$ {SQL_ESC(${ARG1})}’ se continúa con: nano /etc/odbc.Ahora hay que modificar algunos archivos de Asterisk para que todo funcione: nano /etc/asterisk/res_odbc.conf exten => 222.

exten => 222.n.5) exten => 222. 10.d/asterisk reload o /etc/init.Hangup exten => 222.n.beep.) exten => 222. Hasta luego.n. como cliente.Set(EMPNAME=${ODBC_TIMECLOCK(${EMPNUM})}) exten => 222. se usa un programa de síntesis de voz (Festival) para solicitar el llamante para que digite los 5 numero del empleado que está buscando se espera que el llamante digite una serie de 5 números y a través de la aplicación Read se almacenan los digitos en una variable se consulta la base de datos para averiguar si el numero existe. al servidor de googletalk. si no existe el dialplan sigue desde la etiqueta (notfound) si existe continúa con la linea siguiente se escuchará el nombre del empleado asociado a los 5 dígitos que se han enviado.n(notfound).n.Hangup Se vuelve a arrancar Asterisk: /etc/init.n.”) exten => 222.Festival(El nombre del empleado es ${EMPNAME}. Hasta luego.NoOp(Employee: ${EMPNAME}) exten => 222.Festival(Ningun empleado corresponde al numero ingresado.d/asterisk restart Flujo del dialplan: • • • • • • • se contesta la llamada.”) exten => 222. Desde la consola: asterisk -rvvvvvvvvvvv Se escribe el comando: 194 .n.Festival(Por favor ingrese los 5 digitos del numero del empleado.n.2 Asterisk y GoogleTalk Asterisk incluye la funcionalidad de conectarse.Read(EMPNUM. Una vez configurado Asterisk como cliente GoogleTalk se podrán recibir y efectuar llamadas de esta forma: • • Asterisk -> Gtalk Gtalk -> Asterisk Primero se averigua que el modulo res_jabber esté funcionando.NoOp(EMPNUM: ${EMPNUM}) exten => 222.GotoIf($[”${EMPNAME}foo” = “foo”]?notfound) exten => 222.n.n.

but is generally used for mog’s debugging. Autoregistra los nuevos usuarios en la lista de amigos [gtalk] type=client serverhost=talk.conf Se empieza con el jabber.google. Se sale de la consola: CLI> quit Para configurar GoogleTalk en Asterisk hay que modifica dos archivos: • • jabber.conf [general] debug=yes autoprune=yes . dominio del server GoogleTalk username=voztovoicenet@gmail.conf gtalk. Una primera prueba es intentar cargar el modulo: CLI> module load res_jabber si no se recibe ningún error significa que la operación ha tenido éxito.*CLI> help jabber Debe aparecer como respuesta una lista de comandos que se pueden utilizar con este modulo: jabber reload Reload Jabber configuration jabber set debug {on|off} Enable/Disable Jabber debug jabber show buddies Show buddy lists of our clients jabber show connected Show state of clients and components jabber test Shows roster.com . Si así no fuera. no se ha compilado Asterisk con el soporte Jabber o el modulo no viene cargado cuando Asterisk arranca. usuario que vamos a registrar en GoogleTalk 195 .conf nano /etc/asterisk/jabber.com . remueve automáticamente los usuarios de la lista de amigos autoregister=yes .

se activa el protocolo sasl buddy=fulano@gmail. se permiten llamadas de usuario GoogleTalk que no estén en la lista de amigos bindaddr=IPAsterisk . mensaje de estado que se visualizará junto al nombre de usuario timeout=100 En el caso que se quiera conectar más de un usuario GoogleTalk desde el servidor Asterisk hay que repetir una segunda vez todo el bloque cambiando los parámetros relacionados con el nuevo usuario Configuración de gtalk.direccion IP del servidor Asterisk [guest] disallow=all allow=ulaw context=google-in .conf: nano /etc/asterisk/gtalk. configuración para los usuarios huéspedes (que no están en la lista de amigos [fulano] username=fulano@gmail. desde este punto empieza la lista de amigos que se quiere añadir statusmessage=Asterisk Server . contraseña port=5222 .com disallow=all allow=ulaw 196 .conf [general] context=google-in . activa el protocolo TLS usesasl=yes .secret=XXXXXX .com .contexto donde entrarán las llamadas de los usuarios GoogleTalk allowguest=yes . puerto para la conexión a GoogleTalk usetls=yes .

Si se quiere configurar más de uno hay que repetir todo el bloque cambiando la [etiqueta] y el correo electrónico.Congestion(3) exten => 10000.n.connection=gtalk context=google-in Este bloque que empieza con la etiqueta [fulano] es la configuración de uno de los amigos presentes en la lista de amigos de GoogleTalk.n.conf se definió gtalk (vease etiqueta [gtalk]) a fulano@gmail.Voicemail(1000@default.Hangup() Todas las llamadas que entren desde GoogleTalk la giramos a la extensión 1000.n. Si dentro de treinta segundos no se contesta.GotoIf($[”${DIALSTATUS}” = “BUSY”]?busy:unavail) exten => s. la llamadas se transfiere al buzón de voz.u) exten => s.conf bajo el parametro “context”.n.NoOp( Call from Gtalk ) exten => s.Dial(gtalk/gtalk/fulano@gmail.VoiceMail(1000@default.Hangup Una explicación de las tres lineas: • • Se dice a Asterisk de llamar a través de gtalk bajo la configuración que en jabber.30) exten => s.n(unavail).n.d/asterisk reload 197 . si la llamada no tiene éxito o el servidor está congestionado recibiremos una señal de ocupado por 3 segundos se cuelga la llamada/canal • • Se actualiza la configuración de Asterisk con el comando: /etc/init.1. Importante notar que la etiqueta [google-in] es la misma que se configuró en el archivo gtalk.Set(CALLERID(name)=”From Google Talk”) exten => s.conf Para las llamadas entrantes se añaden las lineas: [google-in] exten => s.n.n(busy). Terminada la configuración hay que modificar el Dialplan para permitir las llamadas a usuarios GoogleTalk y al usuario GoogleTalk configurado en el servidor Asterisk.1.b) exten => s. Para las llamadas salientes se pone en el contexto internas: exten => 10000.n.com. nano /etc/asterisk/extensions.Hangup() exten => s.com) exten => 10000.Dial(SIP/1000.

tar Se descomprime: tar -xf wakeup.1.Ahora se puede desde la extensión 1000 hacer y recibir llamadas con GoogleTalk.php se copia en la carpeta agi-bin de asterisk cp wakeup.agi(wakeup.0 Se vuelve ejecutable el archivo wakeup.php /var/lib/asterisk/agi-bin/ Terminada esta primera parte se modifica el Dialplan para crear una nueva extensión que se usará para programar el despertador nano /etc/asterisk/extensions.Hangup Se guarda el archivo y se reinicia Asterisk /etc/init. Pyton. 10. Una vez programado si desde la misma extensión se marca otra vez la extensión 77 se 198 .0. Se descarga el archivo: cd /usr/src wget http://qod.php: chmod +x wakeup. Perl.php) exten => 77. Java. Asterisk permite a través de la aplicación AGI (Asterisk Gateway Interface) interactuar con la PBX a través de distintos lenguajes de programación (PHP.com/wakeup.d/asterisk reload Ahora desde un Softphone se marca el numero 77 y se siguen las instrucciones para programar el despertador.conf Se añaden las siguientes dos líneas en el contexto internas: exten => 77.n.2.0.).3 AGI y despertador Para configurar un despertador en Asterisk se usará uno script escrito en PHP.2.2.tar Se entra en la carpeta: cd wakeup. etc.

4 y se instala: python setup. banea (bloquea) las IP de donde se han originados los intentos interactuando con iptables (cortafuegos).sourceforge.4/files/redhat-initd /etc/init.bz2 se descomprime: tar -xf fail2ban-0.d/fail2ban chkconfig add fail2ban chkconfig fail2ban on Se configura para que lea los registros de Asterisk: cd /etc/fail2ban/filter.bz2 se entra en la carpeta: cd fail2ban-0.d nano asterisk.py install Se activa el script para arrancarlo como un servicio (para CentOS) cp /usr/src/fail2ban-0.4 Fail2ban Fail2ban es un programa que lee los registros (por ejemplo /var/log/asterisk/messages) y si hay un numero determinado de intentos de conexión sin éxito.tar.4.4/fail2ban0.8.net/project/fail2ban/fail2ban-stable/fail2ban-0.8.8.tar.8.conf y se añaden estas líneas 199 .8. Fail2ban está escrito en Python y para que funcione hay que instalar este lenguaje de programación: yum install python luego se descarga el programa: cd /usr/src wget http://downloads.tendrá la opción de poder modificar la hora del despertador.4. 10.

*) # Option: ignoreregex # Notes.# Fail2Ban configuration file # # # $Revision: 250 $ # [INCLUDES] # Read common prefixes.*: Registration from ‘.Wrong password NOTICE. The # host must be matched by a group named “host”.* <HOST> failed to authenticate as ‘.: regex to match the password failures messages in the logfile. If any customizations available—read them from # common.*: Host <HOST> failed MD5 authentication for ‘.*’ failed for ‘<HOST>’ . The tag “<HOST>” can # be used for standard IP/hostname matching and is only an alias for # (?:::f{4. protocol=all] sendmail-whois[name=ASTERISK.conf [Definition] #_daemon = asterisk # Option: failregex # Notes.* .*: No registration for peer ‘. # Values: TEXT # ignoreregex = con estas líneas se configura fail2ban para que controle eventuales accesos indeseados que aparecen en el archivo de registro de Asterisk. the line is ignored.dyndns.* . sender=fail2ban@pbx.conf al final del archivo se añaden las lineas que siguen: [asterisk-iptables] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK. Se termina modificando el archivo de configuración general de fail2ban: cd /etc/fail2ban nano jail.*’$ NOTICE.local #before = common.* . If this regex matches. dest=root@localhost.*’ (.6}:)?(?P<host>\S+) # Values: TEXT # failregex = NOTICE.*’ failed for ‘<HOST>’ .No matching peer found NOTICE.* .*: Registration from ‘.: regex to ignore.*’ failed for ‘<HOST>’ .*’ (from <HOST>) NOTICE.org] logpath = /var/log/asterisk/messages 200 .* .*: Registration from ‘.Username/auth name mismatch NOTICE.

fail2ban está configurado con Sendmail.d/fail2ban start Starting fail2ban: [ OK ] Desde ahora el servidor Asterisk tiene algo más de seguridad y se podrá monitorear los intentos de acceso no autorizados. Para enviar los correos. En lugar de root@localhost se pone la dirección de correo electrónico donde se quiere recibir los avisos. En la configuración hay que modificar la dirección de correo electrónico. Para que funcione hay que modificar la configuración del los archivos de registro de Asterisk: nano /etc/asterisk/logger. 201 .conf y averiguar que la línea messages tenga el parámetro que aparece en negrita messages => notice.maxretry = 5 bantime = 1800 En la línea logpath aparece el archivo de registros que fail2ban leerá para averiguar intentos frustrados de conexión a Asterisk.debug Se arranca fail2ban: /etc/init.

BackgroundDetect: Background a file with talk detect Bridge: Bridge two channels Busy: Indicate the Busy condition ChangeMonitor: Change monitoring filename of a channel .Apendice A Asterisk Aplicaciones AddQueueMember: Dynamically adds queue members ADSIProg: Load Asterisk ADSI Scripts into phone AgentLogin: Call agent login AgentMonitorOutgoing: Record agent’s outgoing call AGI: Executes an AGI compliant application AlarmReceiver: Provide support for receiving alarm reports from a burglar or fire alarm panel AMD: Attempts to detect answering machines Answer: Answer a channel if ringing Authenticate: Authenticate a user BackGround: Play an audio file while waiting for digits of an extension to go to.

ChanSpy: Listen to a channel.ChanIsAvail: Check channel availability ChannelRedirect: Redirects given channel to a dialplan target. and optionally whisper into it ClearHash: Clear the keys from a specified hashname Congestion: Indicate the Congestion condition ContinueWhile: Restart a While loop ControlPlayback: Play a file with fast forward and rewind DAHDIBarge: Barge in (monitor) DAHDI channel DAHDIRAS: Executes DAHDI ISDN RAS application DAHDIScan: Scan DAHDI channels to monitor calls DateTime: Says a specified time in a custom format DBdel: Delete a key from the database DBdeltree: Delete a family or keytree from the database DeadAGI: Executes AGI on a hungup channel Dial: Place a call and connect to the current channel Dictate: Virtual Dictation Machine 203 .

video.Directory: Provide directory of voicemail extensions DISA: DISA (Direct Inward System Access) DumpChan: Dump Info About The Calling Channel EAGI: Executes an EAGI compliant application Echo: Echo audio. or DTMF back to the calling party EndWhile: End a while loop Exec: Executes dialplan application ExecIf: Executes dialplan application. conditionally ExecIfTime: Conditional application execution based on the current time ExitWhile: End a While loop ExtenSpy: Listen to a channel. and optionally whisper into it ExternalIVR: Interfaces with an external IVR application Festival: Say text to the user Flash: Flashes a DAHDI Trunk FollowMe: Find-Me/Follow-Me application ForkCDR: Forks the Call Data Record 204 .

saving return address Goto: Jump to a particular priority.message) JabberStatus: JabberStatus(Jabber.ScreenName.screenname.GetCPEID: Get ADSI CPE ID Gosub: Jump to label. extension. or context GotoIf: Conditional goto GotoIfTime: Conditional Goto based on the current time Hangup: Hang up the calling channel IAX2Provision: Provision a calling IAXy with a given template ICES: Encode and stream using ‘ices’ ImportVar: Import a variable from a channel into a new variable JabberSend: JabberSend(jabber. saving return address GosubIf: Conditionally jump to label.Variable) Log: Send arbitrary text to a selected log level Macro: Macro Implementation MacroExclusive: Exclusive Macro Implementation MacroExit: Exit From Macro 205 .

MinivmRecord: Receive Mini-Voicemail and forward via e-mail MixMonitor: Record a call and mix the audio during the recording Monitor: Monitor a channel Morsecode: Plays morse code MP3Player: Play an MP3 file or stream 206 .MacroIf: Conditional Macro Implementation MailboxExists: Check to see if Voicemail mailbox exists MeetMe: MeetMe conference bridge MeetMeAdmin: MeetMe conference Administration MeetMeChannelAdmin: MeetMe conference Administration (channel specific) MeetMeCount: MeetMe participant count Milliwatt: Generate a Constant 1004Hz tone at 0dbm (mu-law) MinivmAccMess: Record account specific messages MinivmDelete: Delete Mini-Voicemail voicemail messages MinivmGreet: Play Mini-Voicemail prompts MinivmNotify: Notify voicemail owner about new messages.

MSet: Set channel variable(s) or function value(s) MusicOnHold: Play Music On Hold indefinitely MYSQL: Do several mySQLy things NBScat: Play an NBS local stream NoCDR: Tell Asterisk to not maintain a CDR for the current call NoOp: Do Nothing (No Operation) ODBCFinish: Clear the resultset of a successful multirow query Page: Pages phones Park: Park yourself ParkAndAnnounce: Park and Announce ParkedCall: Answer a parked call PauseMonitor: Pause monitoring of a channel PauseQueueMember: Pauses a queue member Pickup: Directed Call Pickup PickupChan: Pickup a ringing channel Playback: Play a file 207 .

if no CallerID sent Proceeding: Indicate proceeding Progress: Indicate progress Queue: Queue a call for a call queue QueueLog: Writes to the queue_log RaiseException: Handle an exceptional condition Read: Read a variable ReadExten: Read an extension into a variable ReadFile: Read the contents of a text file into a channel variable ReceiveFAX: Receive a FAX Record: Record to a file RemoveQueueMember: Dynamically removes queue members ResetCDR: Resets the Call Data Record RetryDial: Place a call.PlayTones: Play a tone list PrivacyManager: Require phone number to be entered. retrying on failure allowing optional exit extension. Return: Return from gosub routine 208 .

Ringing: Indicate ringing tone SayAlpha: Say Alpha SayCountPL: Say Polish counting words SayDigits: Say Digits SayNumber: Say Number SayPhonetic: Say Phonetic SayUnixTime: Says a specified time in a custom format SendDTMF: Sends arbitrary DTMF digits SendFAX: Send a FAX SendImage: Send an image file SendText: Send a Text Message SendURL: Send a URL Set: Set channel variable or function value SetAMAFlags: Set the AMA Flags SetCallerPres: Set CallerID Presentation SetMusicOnHold: Set default Music On Hold class 209 .

SIPAddHeader: Add a SIP header to the outbound call SIPDtmfMode: Change the dtmfmode for a SIP call SLAStation: Shared Line Appearance Station SLATrunk: Shared Line Appearance Trunk SMS: Communicates with SMS service centres and SMS capable analogue phones SoftHangup: Soft Hangup Application SpeechActivateGrammar: Activate a Grammar SpeechBackground: Play a sound file and wait for speech to be recognized SpeechCreate: Create a Speech Structure SpeechDeactivateGrammar: Deactivate a Grammar SpeechDestroy: End speech recognition SpeechLoadGrammar: Load a Grammar SpeechProcessingSound: Change background processing sound SpeechStart: Start recognizing voice in the audio stream SpeechUnloadGrammar: Unload a Grammar StackPop: Remove one address from gosub stack 210 .

always returning TrySystem: Try executing a system command UnpauseMonitor: Unpause monitoring of a channel UnpauseQueueMember: Unpauses a queue member UserEvent: Send an arbitrary event to the manager interface Verbose: Send arbitrary text to verbose output VMAuthenticate: Authenticate with Voicemail passwords 211 .StartMusicOnHold: Play Music On Hold StopMixMonitor: Stop recording a call through MixMonitor StopMonitor: Stop monitoring a channel StopMusicOnHold: Stop Playing Music On Hold StopPlayTones: Stop playing a tone list System: Execute a system command TestClient: Execute Interface Test Client TestServer: Execute Interface Test Server Transfer: Transfer caller to remote extension TryExec: Executes dialplan application.

playing Music On Hold WaitUntil: Wait (sleep) until the current time is the given epoch While: Start a while loop Zapateller: Block telemarketers with SIT 212 .VoiceMail: Leave a Voicemail message VoiceMailMain: Check Voicemail messages Wait: Waits for some time WaitExten: Waits for an extension to be entered WaitForRing: Wait for Ring Application WaitForSilence: Waits for a specified amount of silence WaitMusicOnHold: Wait.

Checks if domain is a local domain CHECKSIPDOMAIN CURL CUT DB Retrieves the contents of a URL Slices and dices strings. Read from or write to the Asterisk database . based upon a named delimiter. Gets or sets a CDR variable Gets/sets various pieces of information about the channel. Gets or sets Caller*ID presentation on the channel.Apendice B Asterisk Funciones AGENT ARRAY Gets information about an Agent Allows setting multiple variables at once Set whether an audiohook may be inherited to another channel AUDIOHOOK_INHERIT BASE64_DECODE BASE64_ENCODE BLACKLIST CALLERID CALLERPRES CDR CHANNEL Decode a base64 string Encode a string in base64 Check if the callerid is on the blacklist Gets or sets Caller*ID data on the channel.

0 otherwise 214 . Retrieve the details of the current dialplan exception Existence Test: Returns 1 if exists. Do a DUNDi lookup of a phone number Initiate a DUNDi query.DB_DELETE DB_EXISTS DEVICE_STATE DIALGROUP Return a value from the database and delete it Check to see if a key exists in the Asterisk database Get or Set a device state Manages a group of users for dialing Checks the existence of a dialplan target. Retrieve results from a DUNDIQUERY General or specific querying of NAPTR records for ENUM or ENUM-like DIALPLAN_EXISTS DUNDILOOKUP DUNDIQUERY DUNDIRESULT ENUMLOOKUP DNS pointers ENUMQUERY ENUMRESULT ENV EVAL EXCEPTION EXISTS Initiate an ENUM query Retrieve results from a ENUMQUERY Gets or sets the environment variable specified Evaluate stored variables.

215 . Counts the number of channels in the specified group Gets a list of the groups set on a channel. with an arbitrary delimiter Obtains the contents of a file Filter the string to include only the allowed characters Gets or sets the global variable specified Gets or sets the channel group. Counts the number of channels in the groups matching the specified GROUP_MATCH_COUNT pattern HASH HASHKEYS HINT IAXPEER IAXVAR ICONV Implementation of a dialplan associative array Retrieve the keys of a HASH() Get the devices set for a dialplan hint IAX peer information Sets or retrieves a remote variable Converts charsets of strings.EXTENSION_STATE FIELDQTY FILE FILTER GLOBAL GROUP GROUP_COUNT GROUP_LIST Get an extension’s state Count the fields.

IF IFMODULE IFTIME ‘:’ IMPORT ISNULL Conditional: Returns the data following ‘?’ if true. else the data following Retrieve the value of a variable from another channel NULL Test: Returns 1 if NULL or 0 otherwise Retrieve buddy status Hash the letters in the string into the equivalent keypad numbers. else the data following ‘:’ Checks if an Asterisk module is loaded in memory Temporal Conditional: Returns the data following ‘?’ if true. JABBER_STATUS KEYPADHASH LEN LOCAL LOCK Returns the length of the argument given Variables local to the gosub stack frame Attempt to obtain a named mutex Tell if a mailbox is configured MAILBOX_EXISTS MATH MD5 Performs Mathematical Functions Computes an MD5 digest Gets MiniVoicemail account information Reads or sets counters for MiniVoicemail message MINIVMACCOUNT MINIVMCOUNTER 216 .

QUEUE_VARIABLES Return Queue information in variables QUEUE_WAITING_COUNT Count number of calls currently waiting in a queue QUOTE RAND REALTIME Quotes a given string. escaping embedded quotes as necessary Choose a random number in a range RealTime Read/Write Functions RealTime Destroy Function RealTime Store Function 217 REALTIME_DESTROY REALTIME_STORE .ODBC_ANTIGF ODBC_FETCH ODBC_PRESENCE ODBC_SQL PP_EACH_USER QUEUE_MEMBER Runs the referenced query with the specified arguments Fetch a row from a multirow query Runs the referenced query with the specified arguments Runs the referenced query with the specified arguments Generate a string for each phoneprov user Count number of members answering a queue QUEUE_MEMBER_COUNT Count number of members answering a queue QUEUE_MEMBER_LIST Returns a list of interfaces on a queue QUEUE_MEMBER_PENALTY Gets or sets queue members penalty.

Gets the specified SIP header Gets the specified SIP parameter from the current channel Gets SIP peer information Retrieve details about an SMDI message. 218 . Retrieve an SMDI message. SMDI_MSG_RETRIEVE SORT SPEECH Sorts a list of key/vals into a list of keys. SPEECH_SCORE Gets the confidence score of a result.REGEX SET SHA1 SHARED SHELL SIP_HEADER SIPCHANINFO SIPPEER SMDI_MSG Regular Expression SET assigns a value to a channel variable Computes a SHA1 digest Gets or sets the shared variable specified Executes a command as if you were at a shell. SPEECH_ENGINE SPEECH_GRAMMAR SPEECH_RESULTS_TYPE Sets the type of results that will be returned. Gets the matched grammar of a result if available. based upon the vals Gets information about speech recognition results. Change a speech engine specific attribute.

219 .SPEECH_TEXT SPRINTF SQL_ESC STAT STRFTIME STRPTIME format. Convert the string to lower case. Returns the epoch of the arbitrary date/time string structured as described in the Returns system information specified by parameter. Timeout values are in seconds. Gets or sets timeouts on the channel. Convert the string to upper case. SYSINFO TIMEOUT TOLOWER TOUPPER TRYLOCK TXTCIDNAME UNLOCK URIDECODE URIENCODE Gets the recognized text of a result. Attempt to obtain a named mutex TXTCIDNAME looks up a caller name via DNS Unlocks a named mutex Decodes a URI-encoded string according to RFC 2396. Encodes a string to URI-safe encoding according to RFC 2396. Format a variable according to a format string Escapes single ticks for use in SQL statements Does a check on the specified file Returns the current date/time in a specified format.

VALID_EXTEN VERSION VMCOUNT VOLUME Determine whether an extension exists or not Return the Version info for this Asterisk Counts the voicemail in a specified mailbox Set the TX or RX volume of a channel 220 .

3.VoiceMailMain(${CALLERID(num)}@default) exten => 97.1.1.s.MusicOnHold(mp3.Hangup exten => 101.Answer() exten => 123.Answer exten => 102.Hangup exten => 222.Playback(hello-world) exten => 123.n.Answer exten => 150.n.Echo(15) exten => 150.n.Set(DB(${CALLERID(num)}/FOLLOWME)=0) exten => 102.n.n.Answer .Hangup exten => 102.Set(DB(${CALLERID(num)}/FOLLOWME)=1) exten => 101.1.n.Answer exten => 100.Hangup() exten => 150.Answer() exten => 97.Apendice C El plan de llamadas [general] static=yes writeprotect=no autofallthrough=yes priorityjumping=yes [globals] SUP = SIP/1000 FUL = SIP/0057310000000 JUST = SIP/justvoip DYNAMIC_FEATURES=test1#blindxfer#automon#disconnect#atxfer#parkcall#automixmon [internas] exten => 50.2.n.1) exten => 97.1.Wait(1) exten => 50.Playback(echo-test) exten => 150.Goto(IVR.300) exten => 100.n.n.n.1.Hangup() exten => 100.1.1.1.Answer exten => 101.n.n.n.Answer exten => 50.Hangup exten => 123.

n.VoiceMail(${EXTEN}@default.Macro(followme) exten => _100X.Answer() exten => _66XX.5) exten => 222.n.n.Hangup exten => 650.n. Hasta luego.n.n.n.n.1.1.Answer() exten => 660.Hangup exten => _100X.n.Playback(welcome) exten => 660.n.Hangup exten => 222.Wait(2) exten => _66XX.Wait(2) exten => 660.GotoIf($[“${DIALSTATUS}” = “BUSY”]?busy:unavail) exten => _100X.) exten => 222. Hasta luego.Agentlogin(${EXTEN}) exten => _200[01].n.n.Wait(2) exten => 222.45.n.n.Wait(2) exten => _66XX.n.Hangup exten => _100X.hHkKtTwWxX) exten => _100X.u) exten => _100X.NoOp(EMPNUM: ${EMPNUM}) exten => 222.n(notfound).Set(EMPNAME=${ODBC_TIMECLOCK(${EMPNUM})}) exten => 222.n.exten => 222.Hangup exten => _200[01].NoOp() exten => _4XXX.n.n.n.1.Record(/tmp/prompt${EXTEN:2}:wav) exten => _66XX.n.Dial(SIP/voznet/${EXTEN}.n.Dial(SIP/${EXTEN}.n.Festival(Ningun empleado corresponde al numero ingresado.Festival(Por favor ingrese los 5 digitos del numero del empleado.Playback(/tmp/prompt${EXTEN:2}) 222 .beep.n.n.Macro(disponible) exten => _100X.b) exten => _100X.1.”) exten => 222.n.Hangup exten => 3000.1.Queue(ventas) exten => 3000.1.30) exten => _4XXX.Festival(Asterisk y Festival trabajan junto.Hangup exten => _4XXX. Chevere!!!) exten => 650.n(busy). Espere mientras lo conectamos con una operadora) exten => 660.n(unavail).n.1.Answer() exten => 650.Read(EMPNUM.GotoIf($[”${EMPNAME}foo” = “foo”]?notfound) exten => 222.Swift(En el centro de comunicaciones de VoztoVoice.Festival(El nombre del empleado es ${EMPNAME}.Hangup() exten => 660.”) exten => 222.n.n.Hangup() exten => _66XX.NoOp(Employee: ${EMPNAME}) exten => 222.Voicemail(${EXTEN}@default.n.

1.Meetme(${EXTEN}.n.Meetme(.1.15) exten => _1XXX.n.n..n.1.n(busy).b) exten => _1XXX.Dial(SIP/1000.1.Wait(2) exten => _66XX.Hangup [from-pstn] exten => s....Hangup [externas] exten => _3XXXXXXXXX.DM(default)) exten => 3510.n.Hangup exten => 3510.n.Hangup exten => _500[01].Dial(SIP/justvoip/${EXTEN}) exten => _1XXX.1.n.1.n.u) exten => _1XXX.n.Dial(${JUST}/${EXTEN}) exten => _00573.exten => _66XX.1.Dial(SIP/${EXTEN}.Hangup [dundi-remoto] switch => DUNDi/vozorg [fax] exten => _X.n.Dial(SIP/justvoip/${EXTEN}) exten => _X..Playback(all-outgoing-lines-unavailable) exten => _00573.scM(default)) exten => _350[012].n..n.n.1..Hangup() exten => 10000.Voicemail(${EXTEN}@default.n(unavail).com) exten => 10000.Meetme(${EXTEN}) exten => _500[01].Dial(DAHDI/g1/${EXTEN:1}.Hangup exten => _00573.1.45) exten => _3XXXXXXXXX.Congestion(3) exten => 10000.Hangup exten => _1XXX.Dial(gtalk/gtalk/fulano@gmail.Hangup [dundi-local] exten => _0057.Hangup exten => _9.Voicemail(${EXTEN}@default.45) exten => _9.1.Hangup() [conferencias] exten => _350[012].1.n.n..GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) exten => _1XXX.n.45) exten => s.Dial(Mobile/NokiaE71/${EXTEN}.Hangup 223 .

NoOp( Call from Gtalk ) exten => s.n.GotoIf($[”${DIALSTATUS}” = “BUSY”]?busy:unavail) exten => s.park:704@parkedcalls exten => 705.hint.hint.n.SIP/1000 exten => 1001.Set(CALLERID(name)=”From Google Talk”) exten => s.45) exten => s.park:707@parkedcalls exten => 708.hint.Wait(2) exten => s.hint.hint.VoiceMail(1000@default.Dial(SIP/1000.park:701@parkedcalls exten => 702.park:709@parkedcalls exten => 710.hint.1.park:702@parkedcalls exten => 703.Answer exten => s.park:708@parkedcalls exten => 709.n.1.hint.hint.n.Hangup exten => fax.n(busy).Hangup() exten => s.n.Dial(IAX2/iaxmodem) exten => fax.hint.n.park:703@parkedcalls exten => 704.n.hint.u) exten => s.NoOp( Call from Eutelia ) exten => s.Voicemail(1000@default.park:706@parkedcalls exten => 707.30) exten => s.Hangup [google-in] exten => s.b) exten => s.n.hint.park:710@parkedcalls [solo-internas] include => internas include => subscribe include => parkedcalls [phones] include => internas include => externas include => subscribe include => parkedcalls include => conferencias [macro-disponible] 224 .[from-eutelia] exten => s.n.SIP/1001 exten => 701.hint.Dial(SIP/1000.park:705@parkedcalls exten => 706.Hangup() [subscribe] exten => 1000.n(unavail).1.n.

5.Set(TIMEOUT(digit)=7) exten => s.3000.1.Playback(invalid) exten => i.1) exten => 2.Hangup [IVR1] exten => s.4.5.3.NoOp(${FM}) exten => s.2) exten => h.Hangup [macro-followme] exten => s.Hangup 225 .Playback(all-circuits-busy-now) exten => s.ChanIsAvail(SIP/${MACRO_EXTEN}) exten => s.1.1.1.Playback(goodbye) exten => i.goto(IVR2.3.BackGround(custom/engmenu) exten => s.MusicOnHold exten => 3.Set(FM=${DB(${MACRO_EXTEN}/FOLLOWME)}) exten => s.Set(TIMEOUT(response)=10) exten => s.Playback(goodbye) exten => i.Gotoif($[${AVAILSTATUS} = 4]?4:3) exten => s.hangup exten => t.Goto(internas.n.Hangup exten => t.n.2.Echo() exten => 2.1.Set(CHANNEL(language)=es) exten => s.Playback(pls-wait-connect-call) exten => 3.san) exten => s.n.BackGround(custom/espeng) exten => s.goto(IVR1.WaitExten() exten => 1.3.3.1) exten => i.Wait(1) exten => s.n(followme).4.2.1.2.n.s.1.Playback(invalid) exten => i.WaitExten() exten => 1.Macroexit #include “IVR” Archivo IVR [IVR] exten => s.s.n.2.n.1.1.MacroExit exten => s.Followme(${MACRO_EXTEN}.goto(IVR.1) exten => h.1.1.s.n(exit).goto(IVR1.Set(TIMEOUT(response)=10) exten => s.Set(TIMEOUT(digit)=7) exten => s.2.exten => s.2.1.Playback(demo-echotest) exten => 1.1.s.1.6.1.Set(CHANNEL(language)=en) exten => s.1) exten => i.GotoIf($[”${FM}” = “1”]?followme:exit) exten => s.

1) exten => h.3.1.[IVR2] exten => s.BackGround(custom/espmenu) exten => s.Hangup Archivo enviofax Channel: SIP/justvoip/0039XXXXXXXXXXX Callerid: "FAX" WaitTime: 30 Maxretries:3 RetryTime: 300 Account: 1000 Application: SendFax Data: /tmp/prueba.1.1) exten => i.Set(CHANNEL(language)=es) exten => s.1.3.Goto(internas.1.Playback(pls-wait-connect-call) exten => 3.2.1.Playback(demo-echotest) exten => 1.goto(IVR1.Set(TIMEOUT(response)=10) exten => s.5.2.2.3000.Playback(goodbye) exten => i.1.Set(TIMEOUT(digit)=7) exten => s.Playback(invalid) exten => i.tif 226 .2.1.hangup exten => t.Echo() exten => 2.s.4.MusicOnHold exten => 3.WaitExten() exten => 1.

<http://fsf. We have designed this License in order to use it for manuals for free software. a Secondary Section may not explain any mathematics. royalty-free license. A "Modified Version" of the Document means any work containing the Document or a portion of it. which is a copyleft license designed for free software. 1. to use that work under the conditions stated herein. while not being considered responsible for modifications made by others. But this License is not limited to software manuals. and is addressed as "you".) The relationship could be a matter of historical connection with the subject or with related matters.3. or with modifications and/or translated into another language. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work. but changing it is not allowed. Such a notice grants a world-wide. in any medium. This License is a kind of "copyleft". if the Document is in part a textbook of mathematics. 2002. It complements the GNU General Public License. 0. Any member of the public is a licensee. below. or of legal. it can be used for any textual work. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. this License preserves for the author and publisher a way to get credit for their work. Secondarily. 3 November 2008 Copyright (C) 2000. modify or distribute the work in a way requiring permission under copyright law. either copied verbatim.Apendice D GNU Free Documentation License Version 1. (Thus. We recommend this License principally for works whose purpose is instruction or reference. PREAMBLE The purpose of this License is to make a manual. refers to any such manual or work. regardless of subject matter or whether it is published as a printed book. textbook. 2008 Free Software Foundation. that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it.org/> Everyone is permitted to copy and distribute verbatim copies of this license document. because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. which means that derivative works of the document must themselves be free in the same sense. You accept the license if you copy. . with or without modifying it. 2001. either commercially or noncommercially. Inc. 2007. The "Document". unlimited in duration.

in the notice that says that the Document is released under this License. and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. The "Cover Texts" are certain short passages of text that are listed. A copy that is not "Transparent" is called "Opaque". The "publisher" means any person or entity that distributes copies of the Document to the public. The "Invariant Sections" are certain Secondary Sections whose titles are designated. in the notice that says that the Document is released under this License. LaTeX input format. SGML or XML for which the DTD and/or processing tools are not generally available. or absence of markup. the title page itself. Texinfo input format. for a printed book.) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. SGML or XML using a publicly available DTD. PostScript or PDF designed for human modification. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors. preceding the beginning of the body of the text. represented in a format whose specification is available to the general public. and a Back-Cover Text may be at most 25 words. plus such following pages as are needed to hold. Examples of transparent image formats include PNG. and standard-conforming simple HTML. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. as being those of Invariant Sections. (Here XYZ stands for a specific section name mentioned below. A Front-Cover Text may be at most 5 words. philosophical. An image format is not Transparent if used for any substantial amount of text. or "History". If the Document does not identify any Invariant Sections then there are none. that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor. 228 . PostScript or PDF produced by some word processors for output purposes only. XCF and JPG. has been arranged to thwart or discourage subsequent modification by readers is not Transparent. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language.commercial. as Front-Cover Texts or Back-Cover Texts. The "Title Page" means. A "Transparent" copy of the Document means a machine-readable copy. For works in formats which do not have any title page as such. the material this License requires to appear in the title page. Examples of suitable formats for Transparent copies include plain ASCII without markup. A copy made in an otherwise Transparent file format whose markup. ethical or political position regarding them. The Document may contain zero Invariant Sections. "Endorsements". legibly. such as "Acknowledgements". "Title Page" means the text near the most prominent appearance of the work's title. "Dedications". and the machine-generated HTML.

2. You may add other material on the covers in addition. clearly and legibly. when you begin distribution of Opaque copies in quantity. provided that this License. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document. You may also lend copies. The front cover must present the full title with all words of the title equally prominent and visible. you must either include a machine-readable Transparent copy along with each Opaque copy. VERBATIM COPYING You may copy and distribute the Document in any medium. If you use the latter option. free of added material. and you may publicly display copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. you must take reasonably prudent steps. and continue the rest onto adjacent pages. you may accept compensation in exchange for copies.The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. Both covers must also clearly and legibly identify you as the publisher of these copies. all these Cover Texts: Front-Cover Texts on the front cover. can be treated as verbatim copying in other respects. and the Document's license notice requires Cover Texts. and the license notice saying this License applies to the Document are reproduced in all copies. If you publish or distribute Opaque copies of the Document numbering more than 100. you must enclose the copies in covers that carry. but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. either commercially or noncommercially. and that you add no other conditions whatsoever to those of this License. 229 . and Back-Cover Texts on the back cover. to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. the copyright notices. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. Copying with changes limited to the covers. These Warranty Disclaimers are considered to be included by reference in this License. However. under the same conditions stated above. or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document. as long as they preserve the title of the Document and satisfy these conditions. If the required texts for either cover are too voluminous to fit legibly. numbering more than 100. 3. you should put the first ones listed (as many as fit reasonably) on the actual cover.

Include. in the form shown in the Addendum below. new authors. year. In addition. E. B. immediately after the copyright notices. or if the original publisher of the version it refers to gives permission. create one stating the title. F. If there is no section Entitled "History" in the Document. G. I.It is requested. 4. that you contact the authors of the Document well before redistributing any large number of copies. but not required. unaltered in their text and in their titles. one or more persons or entities responsible for authorship of the modifications in the Modified Version. For any section Entitled "Acknowledgements" or "Dedications". Preserve all the Invariant Sections of the Document. You may use the same title as a previous version if the original publisher of that version gives permission. be listed in the History section of the Document). to give them a chance to provide you with an updated version of the Document. Use in the Title Page (and on the covers. Preserve the network location. if any) a title distinct from that of the Document. You may omit a network location for a work that was published at least four years before the Document itself. and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. if any. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. Preserve the Title of the section. C. a license notice giving the public permission to use the Modified Version under the terms of this License. if there were any. provided that you release the Modified Version under precisely this License. State on the Title page the name of the publisher of the Modified Version. given in the Document for public access to a Transparent copy of the Document. as authors. with the Modified Version filling the role of the Document. K. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above. authors. J. you must do these things in the Modified Version: A. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. Preserve the section Entitled "History". then add an item describing the Modified Version as stated in the previous sentence. Preserve its Title. thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. and publisher of the Modified Version as given on the Title Page. together with at least five of the principal authors of the Document (all of its principal authors. Include an unaltered copy of this License. Section numbers or the equivalent are not considered part of the section titles. and add to it an item stating at least the title. year. L. unless they release you from this requirement. 230 . Preserve all the copyright notices of the Document. List on the Title Page. as the publisher. These may be placed in the "History" section. and publisher of the Document as given on its Title Page. and from those of previous versions (which should. H. and likewise the network locations given in the Document for previous versions it was based on. if it has fewer than five). D.

COMBINING DOCUMENTS You may combine the Document with other documents released under this License. and a passage of up to 25 words as a Back-Cover Text. and any sections Entitled "Dedications". and that you preserve all their Warranty Disclaimers.M. If there are multiple Invariant Sections with the same name but different contents. and list them all as Invariant Sections of your combined work in its license notice. You must delete all sections Entitled "Endorsements". The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. provided that you include in the combination all of the Invariant Sections of all of the original documents. unmodified. Delete any section Entitled "Endorsements". add their titles to the list of Invariant Sections in the Modified Version's license notice. on explicit permission from the previous publisher that added the old one. In the combination. or else a unique number. in parentheses. These titles must be distinct from any other section titles. To do this. You may add a passage of up to five words as a Front-Cover Text. You may add a section Entitled "Endorsements". 231 . N. Such a section may not be included in the Modified Version. under the terms defined in section 4 above for modified versions. likewise combine any sections Entitled "Acknowledgements". you may at your option designate some or all of these sections as invariant. make the title of each such section unique by adding at the end of it. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. to the end of the list of Cover Texts in the Modified Version. The combined work need only contain one copy of this License. the name of the original author or publisher of that section if known. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document. provided it contains nothing but endorsements of your Modified Version by various parties--for example. O. Preserve any Warranty Disclaimers. 5. you may not add another. previously added by you or by arrangement made by the same entity you are acting on behalf of. you must combine any sections Entitled "History" in the various original documents. forming one section Entitled "History". Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. If the Document already includes a cover text for the same cover. but you may replace the old one. and multiple identical Invariant Sections may be replaced with a single copy. statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License. the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 7. so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders. provided that you also include the original English version of this License and the original versions of those notices and disclaimers. the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate. but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. and replace the individual copies of this License in the various documents with a single copy that is included in the collection. this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. and follow this License in all other respects regarding verbatim copying of that document. TRANSLATION Translation is considered a kind of modification. and distribute it individually under this License. or "History". You may include a translation of this License. You may extract a single document from such a collection. If a section in the Document is Entitled "Acknowledgements". or the electronic equivalent of covers if the Document is in electronic form. "Dedications". If the Cover Text requirement of section 3 is applicable to these copies of the Document. provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer.6. provided you insert a copy of this License into the extracted document. 8. then if the Document is less than one half of the entire aggregate. and any Warranty Disclaimers. Otherwise they must appear on printed covers that bracket the whole aggregate. the original version will prevail. in or on a volume of a storage or distribution medium. When the Document is included in an aggregate. 232 . AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works. and all the license notices in the Document.

FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new. your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. Moreover. modify. See http://www. Each version of the License is given a distinguishing version number. If the Document specifies that a proxy can decide which future versions of this License can be used. revised versions of the GNU Free Documentation License from time to time. If the Document specifies that a particular numbered version of this License "or any later version" applies to it. If the Document does not specify a version number of this License. or distribute it is void. A public wiki that anybody can edit is an example of such a server. and you cure the violation prior to 30 days after your receipt of the notice. and will automatically terminate your rights under this License. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. then your license from a particular copyright holder is reinstated (a) provisionally. However. if you cease all violation of this License. that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document.gnu. Any attempt otherwise to copy. receipt of a copy of some or all of the same material does not give you any rights to use it. but may differ in detail to address new problems or concerns. Such new versions will be similar in spirit to the present version.org/copyleft/. you may choose any version ever published (not as a draft) by the Free Software Foundation. A 233 . or distribute the Document except as expressly provided under this License. 11.9. 10. modify. and (b) permanently. if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. sublicense. TERMINATION You may not copy. sublicense. this is the first time you have received notice of violation of this License (for any work) from that copyright holder. unless and until the copyright holder explicitly and finally terminates your license. you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If your rights have been terminated and not permanently reinstated.

2009. and with the Back-Cover Texts being LIST. If your document contains nontrivial examples of program code. "Incorporate" means to publish or republish a Document. and subsequently incorporated in whole or in part into the MMC. and if all works that were first published under this License somewhere other than this MMC. If you have Invariant Sections. California. Permission is granted to copy. (1) had no cover texts or invariant sections. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1. a not-for-profit corporation with a principal place of business in San Francisco. provided the MMC is eligible for relicensing. with no Invariant Sections. as well as future copyleft versions of that license published by that same organization. in whole or in part.0 license published by Creative Commons Corporation. 2008. and no Back-Cover Texts. If you have Invariant Sections without Cover Texts. or some other combination of the three. Version 1.."Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site.. A copy of the license is included in the section entitled "GNU Free Documentation License". no Front-Cover Texts. we recommend releasing these examples in parallel under your choice of free software license. replace the "with. merge those two alternatives to suit the situation. include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. to permit their use in free software. distribute and/or modify this document under the terms of the GNU Free Documentation License. 234 . such as the GNU General Public License. with the Front-Cover Texts being LIST. Front-Cover Texts and Back-Cover Texts. ADDENDUM: How to use this License for your documents To use this License in a document you have written.3 or any later version published by the Free Software Foundation." line with this: with the Invariant Sections being LIST THEIR TITLES. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.Texts. An MMC is "eligible for relicensing" if it is licensed under this License. as part of another Document. and (2) were thus incorporated prior to November 1.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->