Voz
sobre
IP
y
Asterisk
Pablo Jorquera
2009
CAPITULO 1
Introducción
Que es Asterisk?
Asterisk es software. Exclusivamente software.
Es software open source, desarrollado principalmente por la empresa americana DIGIUM.
Liberado con la licencia GPL.
Se ejecuta en PC estándar (arquitectura x86, x86_64, ppc)
Bajo GNU/Linux, BSD o MacOSX.
Soporta todas las funcionalidades de las centralitas tradicionales y muchas más!
Historia
de Asterisk
Asterisk, desarrollado por Mark Spencer y esponsorizado por
Digium (creada para tal fin), comenzó en 1999.
La versión estable: Asterisk 1.2 fue publicada el 15 de
Noviembre del 2005.
En la actualidad es una solución probada y robusta, tanto para empresas que lo utilizan de
base de usuario como para proveedores o carriers
Digium
La empresa Digium, fundada por Mark Spencer,
Administra y mantiene el código fuente de Asterisk, y lo ofrece bajo dos licencias: GPL y
licencia comercial.
Vende Hardware de calidad creado especialmente para
Asterisk
Ofrece soporte tipo express profesional. Certificaciones dCAP (Digium Certified Asterisk
Professional)
Telefonía IP
La telefonía IP reúne la transmisión de voz y de datos, lo que posibilita la utilización de las
redes informáticas para efectuar llamadas telefónicas. Además, ésta tecnología al desarrollar
una única red encargada de cursar todo tipo de comunicación, ya sea de voz, datos o video,
se denomina red convergente o red multiservicios.
La telefonía IP surge como una alternativa a la telefonía tradicional, brindando nuevos
servicios al cliente y una serie de beneficios económicos y tecnológicos con características
especiales como:
1- Interoperatividad con las redes telefónicas actuales: En el caso de TELMEX se disponen
de dos tipos de Interconexión a la red de telefonía pública, desde una central telefónica IP y
directamente desde una tradicional.
2- Calidad de Servicio Garantizada a través de una red de alta velocidad:
- En Telefonía IP el concepto de calidad incluye aspectos como:
- Red de alta disponibilidad que ofrece hasta de un 99,99% de recursos.
- Calidad de voz garantizada (bajos indicadores de errores, de retardo, de eco, etc.).
3- Servicios de Valor Agregado: como el actual prepago, y nuevos servicios como la
mensajería
ACD Call Center o Automatic Call Distribution Call Center
El sistema de centralita IP Asterisk dispone de funcionalidades avanzadas que le permitirán
implementar un potente sistema de gestión de llamadas IP o IP Contact Center.
Entre las funcionalidades más destacadas que ofrece Asterisk para dicha función podemos
enumerar las siguientes:
•
ACD: Sistema de gestión de colas de llamada. Asterisk permite un número ilimitado de
colas y agentes, con lo que el sistema crecerá con su negocio.
•
IVR: Operadora automática sin limitaciones de opciones y funcionalidad.
•
CTI: Existen conectores estándar (TAPI) para integrar su sistema CRM con la
•
Grabación de llamadas: las llamadas en una PBX Asterisk pueden grabarse de forma
automática o bien a criterio del operador o agente. Asimismo dispone de un sencillo interfaz
para su audición posterior.
Si las funcionalidades implementadas directamente por Asterisk no cubren los
requerimientos de su centro de contactos, existen soluciones adicionales que le permitirán
disponer de uno de los sistemas más avanzados del mercado. Entre dichas funciones
podemos encontrar software de código abierto o bien software licenciado:
•
Queuemetrics: potente sistema de gestión y reporte de colas ACD.
•
Vicidial: Sistema auto marcador, que le permitirá gestionar eficazmente sus campañas.
•Gnudialer: Sistema con discado predictivo asistido y manual, y sirve para gestionar
campañas.
Nuevas funcionalidades Asterisk 1.6
Asterisk 1.6.0
Sin duda la reléase más esperada. Trae muchos cambios y nuevas funcionalidades, así que es
importante consultar los ficheros CHANGES y UPGRADE.
Otra de las novedades que trae Asterisk 1.6.0 además de no soportar Zaptel en favor de
DAHDI: el nuevo modelo de desarrollo. En Asterisk 1.4, se mantenía un único branch para
toda la versión 1.4, por lo que no se añadían nuevas funcionalidades. Esto no hacía posible la
inclusión de nuevas funcionalidades hasta las major releases, por lo que tardaban demasiado
en ver la luz.
Con el nuevo modelo de desarrollo se creará un branch por cada release. Actualmente ya
están creados los branches para Asterisk 1.6.0 y Asterisk 1.6.1. Al contrario que en Asterisk
1.4, en Asterisk 1.6 sí que se añadirán nuevas funcionalidades en Asterisk 1.6.1, Asterisk
1.6.2 y sucesivas versiones. Se espera que el tema del CallerID en las transferencias este
solucionado en Asterisk 1.6.1, y que Asterisk 1.6.2 incluya soporte para IPv6.
DAHDI 2.0.0
DAHDI es el reemplazo de Zaptel ya que la marca Zaptel es propiedad de otra empresa
dedicada a la venta de tarjetas minutos de telefonía.
DAHDI viene dividido en 2 paquetes, aunque es posible descargar uno que agrupa ambos:
dhadi-linux y dahdi-tools.
Dahdi-linux contiene los módulos del kernel para el manejo de las tarjetas de telefonía, y
dahdi-tools las herramientas que sustituyen a ztcfg, zttool, etc.
Esta separación hace posible que si se detecta un bug en una aplicación no sea necesario
hacer una release que incluya los módulos del kernel y vice versa.
Pues por fin tenemos estas nuevas versiones disponibles, aunque obviamente no recomiendo
actualizar a Asterisk 1.6.0 y DAHDI hoy….
Descarga, Compilación e Instalación de Asterisk 1.4
Instalación S.O
Este capítulo nos ayudara a preparar el sistema para la instalación de Asterisk. Este
funciona en muchas plataformas y sistemas operativos, mas nosotros elegimos
mantener las cosas simples y permanecer en una única plataforma y distribución de
Linux. Vamos usar la distribución CentOS en este curso. Las instrucciones realizadas en
este curso pueden funcionar con otras distribuciones, pero estas no han sido testeadas por
nosotros.
Elección paquetes y dependencias necesarias para compilación de asterisk.
Antiguamente existían algunos paquetes que eran necesarios para instalar Asterisk como el
readline y readline-devel que no son necesarios hoy. No existe hardware especial tal como
una placa de sonido
y el único paquete necesario es el propio Asterisk. Si usted estuviera usando hardware de
Digium o ztdummy, usted va a precisar del paquete zaptel. El paquete zaptel es necesario
para que algunas aplicaciones sean incluidas en tiempo de compilación. Si usted escoge
compilar Asterisk y no el zaptel, pero descubre que esta faltando una aplicación
relacionada al paquete zaptel (Como el Meetme()), usted tendrá que compilar el zaptel y
entonces será necesario recompilar Asterisk para que la aplicación sea incluida Para
interfaces T1 y E1 el paquete libpri es necesario. Bison es necesario para compilar el
Asterisk. Los paquetes de desarrollo ncurses y ncurses-development son necesarios si usted
quisiera construir nuevas herramientas (Como el astman). Las bibliotecas zlib y zlib-devel
son necesarias ahora para compilar. Esto se debe a la adhesión del protocolo DUNDi
(Distributed Universal Number Discovery).
Los paquetes necesitados para el sistema operativo Linux CentOS serán:
- Kernel sources y headers
- gcc y sus dependencias
- bison (necesario para los archivos de configuración.
- ncurses (necesario para la consola CLI)
- openssl y openssl-dev o libssl-dev
- Newt (para aplicaciones tal como zttool)
- Lib y zlib-devel
La recomendación es que durante el proceso de instalación del sistema operativo se
deberán seleccionar los siguientes paquetes:
- Sección Desarrollo:
* Herramientas de Desarrollo (TODO)
* Desarrollo de Software Anticuado (TODO) Como herramientas adicionales también se
podrá instalar:
- Sección Servidores:
* Servidor Web
* Servidor de Correo
* Servidor de Bases de Datos (MySQL y/o Postgres)
Paquetes requeridos relacionados con
Asterisk
La instalación de Asterisk esta compuesta por como mínimo 4 paquetes básicos que se
necesitaran o no en su totalidad según la necesidad especifica de nuestro proyecto, estos son:
asterisk, zaptel, libpri y asterisk-addons.
Cada uno de los paquetes tiene los siguientes contenidos:
- Asterisk:
Incluye el programa principal de asterisk.
- Zaptel:
Incluye los drivers para las tarjetas telefónicas Zaptel.
- LibPri:
Incluye las librerías PRI necesarias para conectarse al RTPC.
- Asterisk-addons:
Incluye módulos adicionales a asterisk, como por ejemplo el modulo
MySQL para conexión a bases de datos de este tipo.
El único paquete estrictamente necesario es asterisk, ya que libpri solo se necesitara en caso
de que vallamos a utilizar interfaces PRI y zaptel en caso de utilizar tarjetas ZAPTEL, en
caso de requerir utilidades que necesiten fuente de temporización y no tengamos
hardware Zaptel instalado, es requerido instalar el paquete zaptel activando por defecto el
modulo ztdummy.
Descarga paquetes de Asterisk
La descarga de asterisk y sus librerías pueden realizarse en forma de archivos tar.gz, para
descargar estos archivos los podemos encontrar en:
http://ftp.digium.com/pub/
La nomenclatura de estos paquetes será “asterisk-version.tar.gz” por ejemplo:
Asterisk
asterisk-1.4.x.tar.gz
Zaptel
zaptel-1.4.x.tar.gz
Libpri
libpri-1.4.x.tar.gz
Asterisk-a
ddons
asterisk-addons-1.4.x.
tar.gz
Esta descarga se puede realizar a través de un navegador Web como cambien desde la
línea de comandos ejecutando el comando 'wget':
wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.x.tar.gz
wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.x.tar.gz wget
http://downloads.digium.com/pub/libpri/libpri-1.4.x.tar.gz
wget http://downloads.digium.com/pub/asterisk/releases/asterisk-addons-1.4.x.tar.gz
Si fueron descargados los paquetes .tar.gz, estos se descomprimen ejecutando el comando 'tar'
desde la línea de comandos:
tar -xvzf archivo-comprimido.tar.gz
Esto creara un directorio con el nombre y versión del paquete descomprimido y dentro
estará el contenido del paquete
.
Instalación Asterisk 1.4
La instalación de los paquetes de asterisk se debe realizar en el siguiente orden:
1ero .- zaptel
2do .- libpri
3ero .- asterisk
4to .-asterisk-addons
Compilación e Instalación Zaptel
Para compilar e instalar el driver Zaptel se deben seguir los siguientes pasos como
usuario
'root'.
# cd /usr/src/
# wget http://downloads.digium.com/pub/zaptel/releases/zaptel-1.4.x.tar.gz
# cd /usr/src/zaptel-1.4.x
# ./configure
# make
# make install
# make config
Compilación e Instalación Libpri
Para compilar e instalar Libpri se deben seguir los siguientes pasos como usuario 'root'.
# cd /usr/src/
# wget http://downloads.digium.com/pub/libpri/libpri-1.4.x.tar.gz
# cd /usr/src/libpri-1.4.x
# make
# make install
Compilación e Instalación Asterisk
Para compilar e instalar Asterisk se deben seguir los siguientes pasos como usuario
'root'.
# cd /usr/src/
# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.4.x.tar.gz
# cd /usr/src/asterisk-1.4.x
# ./configure
# make # make install # make samples # make configCompilación e Instalación Asterisk-Adoons
Para compilar e instalar Asterisk-Adoons se deben seguir los siguientes pasos como
usuario
'root'.
# cd /usr/src/
# wget http://downloads.digium.com/pub/asterisk/releases/asterisk-addons-1.4.x.tar.gz
# cd /usr/src/asterisk-addons-1.4.x
# ./configure
# make
# make install
# make samples
Directorios Usados
A continuación los archivos y directorios mas importantes creados en el proceso de
instalación.
/etc/asterisk
En este directorio se encuentran todos los archivos necesarios para configurar la
gran cantidad
de servicios que Asterisk provee.Revisaremos los mas importantes.
asterisk.conf
Configuraciones generales de la ubicación de directorios de archivos de configuración,
Módulos compilados, voicemails etc. En general es buena idea no modificar estas
configuraciones, salvo casos especiales.
cdr.conf
Configuraciones referentes al "Call Detail Record". Los CDR son sumamente importantes
para las compañías telefónicas. Modificar datos en este archivo puede repercutir en
la integridad de los CDR si no se esta seguro de lo que se hace. Si la instalación es
únicamente de prueba, o los CDR no son materia importante, no hay problema.
codecs.conf
A menos que utilices SPEEX, o quieras hacer cosas especiales con la forma en la que los
codecs se comportan, es mejor no modificar este archivo.
extensions.conf
Tal vez el archivo mas importante de Asterisk. En este archivo se toman las decisiones de ruteo
de las llamadas. Mas adelante veremos la sintaxis de este archivo.
features.conf
Este archivo es también muy importante. Permite habilitar y configurar servicios genéricos
de un PBX como la transferencia asistida y monitoreo de llamadas.
iax.conf
Importante archivo para el funcionamiento del canal chan_iax que le permite a Asterisk
interactuar con otros dispositivos IAX, incluyendo otros PBX Asterisk.
logger.conf
Que nivel de verbosidad deben tener los mensajes de log y a donde deben ser enviados.
manager.conf
Configuración del importante servicio AMI (Asterisk Manager Interface) que permite
conectarnos a un socket TCP y manejar el PBX. De cierta forma se encuentra relacionado con
el archivo http.conf, que provee de una interfaces para programar aplicaciones con AJAX que
se comuniquen directamente con AMI.
modules.conf
Archivo sumamente importante. Determina que módulos serán cargados por Asterisk al
iniciar. Es frecuente que cuando se instala asterisk por primera vez, no arranque debido a que
no puede cargar un módulo para el que no tenemos soporte. Esto se soluciona comentando la
línea del módulo en este archivo.
sip.conf
Análogo del archivo iax.conf para el protocolo SIP
zapata.conf
Configuración de los canales ZAP. Las configuraciones de este archivo deben coincidir
con el hardware instalado y la configuración del driverzaptel.
voicemail.conf
Configuración de las casillas de voz creadas para los respectivos anexos.
meetme.conf
Configuración de las salas de conferencias.
/var/log/asterisk
En este directorio se encuentran los archivos de registro de las operaciones de
Asterisk. Definamos cada uno de los archivos encontrados dentro de este directorio.
cdr.db
Este archivo se encuentra disponible si se cuenta con el CDR handler para la base de
datos
SQLite. El archivo contiene la base de datos de los registros de las llamadas.
event_log
Registro de eventos sucedidos en el PBX.
Full
Creado con la intención de contener todos los mensajes de debug del sistema.
Messages
Contiene un listado de los mensajes de warning, debug y demás niveles de logeo.
queue_log
/var/lib/asterisk
Directorio con archivos de audio, llaves RSA, scripts AGI (Asterisk Gateway
Interface), base de datos astdb y archivos para el pequeño servidor HTTP para
AJAM (Asynchronus Javascript Asterisk Manager). Aquí veremos una descripción
de cada uno de los directorios, ya que los archivos pueden ser irrelevantes.
agi-bin/
Aquí se contienen programas en C, PHP, Python o cualquier otro lenguaje con el
que se pretenda interactuar desde Asterisk.
keys/
Directorio que contiene llaves RSA para la autenticación de llamadas con el protocolo
IAX2
Sounds/
Directorio con todos los sonidos que serán utilizados por aplicaciones como
Playback() y
Background ()
Para asegurarnos que el proceso de asterisk y zaptel inician de forma automática con
el arranque del servidor y en caso de reinicio del S.O completo y para el proceso de
inicio o detención de forma manual del servicio debemos ejecutarlos siguientes
comandos en la interfaz de línea de comandos:
# service zaptel start
# service asterisk start
# chkconfig zaptel on
# chkconfig asterisk on
Para acceder al monitor del sistema o también conocido como 'CLI>' ejecutamos
el siguiente
Comando:
# asterisk -r
Descarga, Compilación e Instalación de Asterisk 1.6
http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.6.1.1.tar.gz
http://downloads.asterisk.org/pub/telephony/dahdi-linux/releases/dahdi-linux-2.1.0.4.tar.gz
http://downloads.asterisk.org/pub/telephony/dahdi-tools/releases/dahdi-tools-2.1.0.2.tar.gz
http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.10.tar.gz
http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-addons-1.6.1.0.tar.gz
Instalación Libpritar -zxvf libpri-1.4.X.tar.gz
cd libpri-1.4.X
make
make install
InstalaciónDAHDI-LINUX
tar –zxvf dahdi-linux-2.1.X.X.tar.gz
cd dahdi-linux-2.1.0.4
make
make install
InstalaciónDAHDI-TOOLS
tar –zxvf dahdi-tools-2.1.X.X.tar.gz
cd dahdi-tools-2.1.0.2
./configure
make
make install
make config
Instalación Asterisk-1.6 Tar –zxvf asterisk-1.6.X.tar.gz
cd asterisk-1.6.1/
./configure
make
make install
make simples
make config
Instalación Asterisk-addonstar -zxvf asterisk-addons-1.6-current.tar.gz
cd asterisk-addons-1.6.0
./configure
make menuselect
make
make install
make simples
Uso de DAHDI
La TE120P es una tarjeta de interfaz digital de alto rendimiento, es una interfaz
telefónica capaz de interconectar sistemas tradicionales de la telefonía con las
tecnologías emergentes de Voz sobre IP.
Usada junto con Asterisk®, la TE120P puede usarse para proporcionar un
amplio conjunto de servicios de PBX. La tarjeta TE120P es fácil de expandir,
pudiendo configurarla como T1 (24 canales), E1 (32 canales), o J1 (24
canales).
Estas tarjetas deberán ser alojadas en un slot PCI libre y en el se conectará la tarjeta.Una
vez colocada la tarjeta en su puerto respectivo, debemos saber si es reconocida:
Luego tenemos los siguientes comandos:
ns:~# dahdi_hardware
Es para detectar el tipo de tarjeta de que estamos usando, al mismo tiempo para
ver si la reconoce.
ns:~# dahdi_cfg –v
Es para verificar que el archivo de configuración está correcto, y por consecuencia
muestra los canales bien configurados. Este comando hace lo que hacia el ztcfg –v
Si usted utiliza Zaptel:
Con esta opción Asterisk 1.4.22 o superior, no traerá por defecto zapata.conf por lo se
tiene que crear tomando como base el archivo chan_dahdi.conf aunque Asterisk
seguirá buscando el archivo zapata.conf
Está claro que de ahora en adelante, DAHDI va a tener que hacerse paso en medio de
lo que queda de Zaptel, al final Zaptel irá perdiendo soporte. El cambio es irreversible
y solo queda actualizarse y detectar los bug que pueda tener DAHDI, esperando que se
vaya mejorando a medida que pasa el tiempo.
Configuración de E1 con DAHDI
Con esta opción Asterisk 1.4.22 o superior, se deberá configurar en
/etc/dahdi/system.conf con una configuración prácticamente igual a la del zaptel.conf
y seguidamente /etc/asterisk/chan_dahdi.conf para definir los canales que Asterisk va
a utilizar
chan_dahdi.conf
Llamadas desde la PSTN hacia el servidor:
;extensions.conf
; Para el caso de numeración 4834000 hasta 4834099 de GTD.
[from-pstn]
exten => _40XX,1,Dial(SIP/${EXTEN},20)
exten => _40XX, 2, Hangup
Llamadas desde el servidor hacia la PSTN:
;extensions.conf
[anexos]
exten => _XXXXXXX,1,Dial(DAHDI/g1/${EXTEN},20)
exten => _XXXXXXX,2,Hangup
exten => _XXXXXXX,1,Dial(DAHDI/g1/${EXTEN},20)
exten => _XXXXXXX,2,Hangup
Plan de Marcación: Conceptos avanzados.
Directory: Accede a un servicio de directorio, apoyado en la información almacenada
para la gestión de un contexto de Voicemail, en este caso el Apellido y Nombre de los
usuarios. Con ello, se consigue que un usuario pueda acceder a la extensión
"escribiendo el nombre" del usuario de la extensión a quien llama, de manera similar a
como se dan de alta los nombres en una agenda de un móvil. SOLO FUNCIONA con
aquellos usuarios que tengan activado el buzón de voz.
Parámetros:
Contexto Voicemail
....Usar: voip-h323.
Contexto de Llamada
....Contexto de Llamada donde se sitúa la regla de llamada a la extensión.
Opciones
....Opciones: busca por el nombre. Por defecto busca por apellidos.
Voicemail.conf
100 => 1234,John Doe,[email protected],,hidefromdir=yes
Directory(vm-context[|dial-context[|options]]) - Ver. 1.4
Directory (vm-context[,dial-context,options]) - Ver.1.6
GotoIf: Permite un desvío del flujo de la llamada dentro de las reglas definidas para la
misma extensión (ojo, no permite el salto directo a otro contexto o extensión). Además
con la particularidad de que se va a controlar el salto en función de la evaluación de
una expresión condicional. Esta expresión condicional se conforma como:
${VARIABLE} [Elemento Condicional] Valor/${Variable}. Teniendo en cuenta que
hay que separar con un espacio en blanco los elementos.
Parámetros:
Condición
....Expresión Condicional que será evaluada (separados por un espacio en
blanco): ${VARIABLE} [Condición] [${Variable} o Valor].
Regla de Salto True
....Número de la Regla a la que salta en caso de ser Verdadera la Expresión.
Regla de Salto False
....Número de la Regla a la que salta en caso de ser Falsa la Expresión.
GotoIf (condition?label1[:label2])
Extensions.conf
exten => 206,1,GotoIf($["${CALLERID(num)}" = "303"]?dial1)
exten => 206,n,GotoIf($["${CALLERID(num)}" != "304"]?moh:dial2)
exten => 206,n(dial1),Dial(${SPHONE1},15,rt)
exten => 206,n,Hangup()
exten => 206,n(dial2),Dial(${PHONE2},15,rt)
exten => 206,n,Hangup()
exten => 206,n(moh),MusicOnHold(default)
MYSQL: Ejecuta una sentencia MySQL (Connect Query Fetch Clear Disconnect),
incluso almacena el resultado en variables que pueden ser accesibles en el DialPlan.
Observar su sintaxis: Connect Conector Lista_Vbles (dbhost dbuser dbpass dbname)
Query Resultado Conector Consulta (SELECT algo FROM Tabla WHERE
sentencia_sin_espacios) Fetch Resultado Conector Lista_Vbles (vble1 vble2 ...) Clear
Conector Disconnect Conector.
Parámetros:
Sentencia
....Una de las Siguientes: Connect Query Fetch Clear Disconnect.
Resultado
....Vble en la que se almacena el resultado de la ejecución de la sentencia SQL. (Para
Connect,Query,Fetch).
Conector
....Variable que señala dónde buscar los datos a Query/Fetch/Clear/Disconnect.
Siempre es ${variable_resultado}.
Consulta SQL/Lista V
....Consulta SQL (Sin entre comillas, y separando el espacio en blanco como " ") o
Lista de Variables donde almacenar (Fetch) o dónde se almacenan los datos de
conexión (Connect).
Extensión.conf
exten => 960,1,Noop(${CALLERID(num):1})
exten => 960,n,MYSQL(Connect connid localhost dialplan system asterisk)
exten => 960,n,MYSQL(Query resultid ${connid} 'SELECT ani FROM temp where
ani like ${CALLERID(num):1}')
exten => 960,n,MYSQL(Fetch fetchid ${resultid} AGIScript)
exten => 960,n,GotoIf($[${AGIScript} = ${CALLERID(num):1}]?existe:no-existe)
exten => 960,n,MYSQL(Clear ${resultid})
exten => 960,n,MYSQL(Disconnect ${connid})
exten => 960,n(existe),Noop(Numero ya existe ${CALLERID(num):1})
exten => 960,n,MYSQL(Clear ${resultid})
exten => 960,n,MYSQL(Disconnect ${connid})
exten => 960,n,Hangup()
exten => 960,n(no-existe),Noop(${CALLERID(num)})
AddQueueMember: Añade a una Cola de Llamadas la extensión desde la que se
llama, o el agente o extensión determinada por el parámetro Interface. Además es
posible "penalizar" la extensión con un nivel de prioridad.
Parámetros:
Nombre Queue ... Nombre de la cola de llamadas (Verificar que existe).
Interface ... Se puede especificar un interface con el formato: Tecnología/recurso (o agent/identificador).
Prioridad ... Penaliza la extensión con una prioridad.
Extensión.conf
Agregar a la cola.
exten => 123,1,AddQueueMember(Cola de atencion SIP/${CALLERIDNUM}@internal)
exten => 123,n,Playback(agent-loginok)
RemoveQueueMember: Nombre de la Cola de la que se desea dar de baja, como
agente de ella. Si no se especifica nada, el sistema entiende que es desde la misma
extensión desde dónde se llama, en caso de rellenar el campo Interface, se dará de baja
lo especificado en ese parámetro.
Parámetros: Cola
....Nombre de la Cola.
Interface
....Indica el interface que quiere darse de baja. Ejemplo: SIP/${CALLERIDNUM}.
Extensions.conf
exten => 124,1,RemoveQueueMember(Cola_atencion| SIP/${CALLERIDNUM}@internal)
exten => 124,n,Playback(agent-loginok)
exten => 124,n,Playback(vm-goodbye)
BackgroundDetect: Reproduce una melodía o un mensaje mientras intenta detectar
un digito que corresponda con una extensión.
Parámetros:
Archivo
....Especifica el archivo que contiene la Melodía o Mensaje.
Periodo
....Periodo de silencio en milisegundos (si sigue a un periodo de No Silencio salta a la
extensión talk).
Min. No-Silencio
....Mínimo periodo de No-Silencio en milisegundos.
Max. No-Silencio
DateTime: Reproduce una fecha a partir de una dada en formato unixtime. El formato
unixtime representa una fecha expresada en la cantidad de segundos desde el 1 de
enero de 1970 hasta el momento expresado en la fecha. La reproducción de las fechas
se realiza de acuerdo a un formato determinado.
Parámetros: Fecha y Hora
....Fecha y Hora expresada en formato "unixtime".
Zona Horaria
....Zona horaria (revisar zonas horarias en Linux).
Formato Reproducción
....Formato de reproducción de la fecha (por defecto: ABdY "digits/at" IMp).
DeadAgi: Ejecuta un script o programa creado por el usuario, al colgar la llamada en
curso. (Observar también la situación de contexto H hangup).
Parámetros: Script
....Nombre Script.
Argumentos
....Argumentos que acompañan la llamada al script.
EAGI: Ejecuta un script o programa creado por el usuario, con la particularidad de
Manejo de colas
El sistema de colas en Asterisk se compone de
• Llamadas entrantes que son ubicadas en una cola.
• Miembros que contestan las llamadas en la cola (extensiones o bien usuarios que se loguean como agentes).
• Una estrategia sobre cómo manejar la cola y repartir las llamadas entre los miembros
• Música que se reproduce durante la espera en la cola.
• Anuncios para miembros y emisores de llamadas.
Manejo de colas: Config
La configuración de las colas se define:
• Estáticamente: en el archivo queues.conf
• Dinámicamente: la configuración se almacena en una BD,
“disponibilizando” los cambios sin necesidad de realizar un reload
La configuración de los agentes se define en el archivo agents.conf
Manejo de colas: agentes
• Los agentes atienden las llamadas de una cola específica.
• Un agente debe realizar un login (llamando a una extensión especial que contiene la aplicación AgentLogin) indicando que está listo para tomar llamadas.
• Los miembros son aquellos canales disponibles que están activamente atendiendo la cola. Pueden ser tanto agentes como también canales regulares (sip/juan).
Manejo de colas: estrategias
Las llamadas son distribuidas entre los miembros de una cola siguiendo alguna de las
siguientes estrategias:
• ringall: hace sonar todos los canales disponibles hasta que alguno responda (configuración por defecto).
• roundrobin: hace sonar cada interfaz disponible por turnos.
• leastrecent: hace sonar la interfaz que fue menos recientemente llamada por esta cola.
• fewestcalls: hace sonar la interfaz con la menor cantidad de llamadas completas.
• random: hace sonar una interfaz al azar.
• rrmemory: igual que el round robin pero recuerda cual fue el último teléfono que atendió una llamada y continúa con el siguiente.
Manejo de colas: penalties y priorities.
• Penalty: se le asigna una penalidad a cada agente, de manera tal que primero se derivan las llamadas (vía la estrategia definida) a los agentes con el menor valor de penalidad. En el caso de estar todos ocupados, se continúa con la siguiente penalty y así sucesivamente.
1. Ejemplo: sólo si la telefonista está ocupada, se deriva el llamado a la oficina.
• Priority: se le asigna una prioridad a cada llamada entrante,
permitiendo situarla en un lugar más adelante de la cola (no siempre al final).
1. Ejemplo: las llamadas al nro. 110 tienen más prioridad que las del 111.
Manejo de colas: aplicaciones
Aplicaciones principales, utilizadas en extensions.conf:
• Queue: aplicación utilizada para encolar una llamada (toma como parámetro las colas definidas en queue.conf).
• AddQueueMember: agrega dinámicamente un miembro a la cola.
• RemoveQueueMember: remueve dinámicamente un miembro de la cola.
• AgentLogin: login de un agente a una cola.
Manejo de colas: CLI
Comandos relacionados de la CLI:
• show agents: muestra los agentes.
• show queues: lista todas las colas.
• show queue: muestra datos de una cola en particular.
• queue add member: agrega un miembro a la cola.
Manejo de colas: ejemplo.
• queue.conf
[MyQueue] ; nombre de la cola
music=default ; música que coloca antes que lo atiendan strategy=ringall ; estrategia de ring
timeout=15 ; tiempo máximo de ring a un miembro
retry=5 ; tiempo de espera hasta reintentar con otro miembro wrapuptime=0 ; tiempo de espera luego de intentar con todos los
miembros maxlen = 0 ;
announce-frequency = 0 ; cantidad de veces que sale el anuncio announce-holdtime = no ; si dice el tiempo de espera aproximado member => Agent/1001,1 member => Agent/1002,1 member => Agent/1003,1 • agents.conf [agents] agent => 1001,1111,Juan agent => 1002,2222,Pedro agent => 1003,3333,Pablo • extensions.conf
Logueo de un agente que ya existe en la cola
exten => 51,Set(LANGUAGE()=es) exten => 51,n,AgentLogin(,s)
Logueo de una extensión que no existe en la cola
exten => 123,1,AddQueueMember(Cola de atención SIP/${CALLERIDNUM}@internal) exten => 123,n,Playback(agent-loginok)
exten => 123,n,Playback(vm-goodbye)
Remover una extension de la cola.
exten => 124,1,RemoveQueueMember(Cola_atencion| SIP/${CALLERIDNUM}@internal) exten => 124,n,Playback(agent-loginok)
exten => 124,n,Playback(vm-goodbye)
Envío de una llamada a la cola.
exten => 2020,1,Answer exten => 2020,3,Wait(2) exten => 2020,4,SetMusicOnHold(default) exten => 2020,5,Queue(MyQueue|r) exten => 2020,6,Hangup
Asterisk AstDB
Asterisk incorpora una BD tipo Berkley DB v2, en ella el propio Asterisk almacena diversos valores
Como:
- Registros SIP, IAX. - Información sobre colas.
Nosotros como desarrolladores y programadores de nuestro dialplan también podemos almacenar Información en ella y consultarla desde el mismo
AstDB posee una organización referente a familias, y dentro de una
familia se pueden tener diversas keys, y para cada key un solo valor. A continuación un ejemplo de creación de una DB asterisk.
[root@asterisk ~]# asterisk –r
asterisk*CLI> database put MIFAMILIA mikey 1234
Updated database successfully
asterisk*CLI> database show MIFAMILIA
/MIFAMILIA/mikey : 1234
asterisk*CLI> database put MIFAMILIA mikey 4567
Updated database successfully
asterisk*CLI> database show MIFAMILIA
/MIFAMILIA/mikey : 4567
La forma de manipular esta DB creada anteriormente eliminando el conteni do y asignándole otro es la siguiente:
[AstDB]
exten => _XXXX,1,Set(valrespassadmin=${DB_DELETE(MIFAMILIA/mikey)}) exten => _XXXX,2,Set(DB(MIFAMILIA/mykey)=${EXTEN})
exten => _XXXX,3,Set(pass1=${DB(MIFAMILIA/mykey)}) exten => _XXXX,6,Hangup()
Configurar el desvío de llamada.
Veremos como configurar el desvío de llamada en Asterisk. Esta guía funciona con asterisk 1.4.X y asterisk 1.6.X.
Esta configuración es para que el numero a que se desvían las llamadas sea un fijo o celular y no una extensión interna de Asterisk. Para programar el desvío, la llamada tiene que ser efectuada desde una
extensión interna de Asterisk. Claramente, lo pueden modificar según sus exigencias.
[callfwd-add] ; contexto para programar el desvió de llamada
exten => s,1,Answer() ; contestamos la llamada
exten => s,n,Set(NUM=${CALLERID(num)}) ; asignamos a la variable NUM
el numero de la extensión que está llamando
exten => s,n,Set(COUNT=1) ; asignamos el valor 1 a la
variable COUNT
exten =>
s,n(inicio),Playback(please-enter-the&telephone-number&for&your&call-forwarding&astcc-followed-by-the-pound-key) ; La voz de asterisk nos dirá que tenemos que digitar el numero al cual queremos
desviar todas las llamadas
exten => s,n,Read(forw,,15,,2,10) ; Asterisk leerá los dígitos y
los guardará en la variable forw
exten => s,n,Playback(call-forwarding) : La voz de asterisk dirá
que el desvío de la llamada ha sido configurado para el numero
exten => s,n,Playback(has-been-set-to)
exten => s,n,SayDigits(${forw}) ; Saydigits lee uno a uno
los digitos de la variable forw
exten =>
s,n,Playback(if-this-is-correct-press&digits/1&if-this-is-not-correct&digits/2) ; Si el numero que escuchamos es exacto presionamos 1 sino 2
exten => s,n,Read(sino,,1,,,5) ; asterisk lee nuestra
respuesta y la guarda en la variable sino
exten => s,n,GotoIf($["${sino}" = "1"]?setf:conta) ; si sino es igual
a uno vamos a la etiqueta setf sino a conta
exten => s,n(conta),Set(COUNT=$[${COUNT} + 1]) ; añadimos a la variable COUNT
(que era 1) una unidad (el nuevo valor es 2)
exten => s,n,Gotoif($["${COUNT}" < "4"]?inicio:bye) ; si la variable COUNT es
menor que 4 vamos a etiqueta inicio sino a la etiqueta bye. Esto sirve para permitir tres intentos de configuración antes de colgar la llamada.
exten => s,n(setf),Set(DB(${NUM}/FORW)=${forw}) ; etiqueta setf, guardamos en
numero en la base de datos interna de Asterisk
exten => s,n,Wait(1) ; esperamos un segundo
exten => s,n(bye),Playback(goodbye) ; Escucharemos un saludo de
despedida
La base de datos interna de asterisk funciona de este modo: cada valor puede ser asignado a una familia/clave. En nuestro caso la familia es el numero de la extensión que ha programado el desvió de llamada (la
variable NUM), la clave el la palabra FORW. Un ejemplo: desde nuestra consola una vez que tengamos programado el desvió de llamada
asterisk –r
CLI> database show
/4000/FORW : 0991354111
Como pueden ver a la familia 4000 (la extensión que ha programado el desvío de llamada) clave FORW ha sido asignado el numero 0991354111. Cuando alguien llamará la extensión 4000 la llamada se desviará a este número [callfwd-remove] exten => s,1,Answer exten => s,n,Set(NUM=${CALLERID(num)}) exten => s,n,Wait(1) exten => s,n,Set(forw=${DB_DELETE(${NUM}/FORW)}) exten => s,n,Playback(call-fwd-cancelled) exten => s,n,Playback(goodbye) exten => s,n,Hangup
Esta segunda parte del código no hace nada más que borrar, para la extensión que llama, el numero configurado para el desvió de las llamadas.
Ahora en nuestro contexto local en extensions.conf tenemos que añadir dos líneas más:
exten => 71,1,Goto(callfwd-add,s,1)
exten => 72,1,Goto(callfwd-remove,s,1)
Llamando la extension 72 iremos al contexto callfwd-remove, extensión s, prioridad 1, (el contexto para borrar el desvío de llamada)
Supongamos que tenemos configurado el desvío de llamada para la extensión 4000.
Como lo vamos a usar en nuestro plan de llamadas (dialplan)?
[internal]
exten => 71,1,Goto(callfwd-add,s,1) ;Envio a desvio de llamada
exten => 72,1,Goto(callfwd-remove,s,1) ;Remover el desvio de llamada
exten => 4000,1,Answer() ; contestamos la llamada
exten => 4000,2,Ringing() ;Enviamos Ring
exten => 4000,n,Set(NUM=${DB(${EXTEN}/FORW)}) ; Leemos la base de datos para ver
si hay algún valor en la familia 4000/FORW y lo asignamos al variable NUM
exten => 4000,n,GotoIf($["${NUM}" = ""]?normal:forw) ; si la variable
NUM es vacía seguimos normalmente sino vamos a la etiqueta forw
exten => 4000,n(normal),Dial(SIP/4000,30,tTwkKxX) ; llamamos la extensión 4000
exten => 4000,n,Hangup() ; terminamos la llamada
exten => 4000,n(forw),DIAL(DAHDI/g1/${NUM},60,rtTwkKxX) ; si el desvío es activo,
usando nuestro proveedor de llamadas VoiP, marcamos el numero configurado para el desvío
exten => 4000,n,Hangup() ; terminamos la llamada
Los comandos disponibles para la base de datos de asterisk:
CLI> help database
database del Removes database key/value
database deltree Removes database keytree/values database get Gets database value
database put Adds/updates database value database show Shows database contents database showkey Shows database contents
Creo que es más difícil explicarlo que configurarlo... :) Hagan sus pruebas y me cuentan
Funcion no molestar DND (Do not disturb)
Puede ser que en algún momento de nuestro día laboral no queremos ser molestados por las llamadas telefónicas. Al mismo tiempo, pero, queremos que quienes nos llaman tengan las posibilidad de dejarnos un mensaje en nuestro contestador. Para hacer todo eso podemos crear una macro en Asterisk que haga ese “trabajo sucio”.
Abrimos el archivo /etc/asterisk/extensions.conf [macro-DND] exten => s,1,GotoIf(${DB_EXISTS(DND/${CALLERID(num)})}?disable-dnd,1) exten => s,n,Set(DB(DND/${CALLERID(num)})=1) exten => s,n,playback(do-not-disturb) exten => s,n,playback(activated) exten => s,n,hangup exten => disable-dnd,1,Set(DEL=${DB_DELETE(DND/${CALLERID(num)})}) exten => disable-dnd,n,playback(do-not-disturb) exten => disable-dnd,n,playback(de-activated) exten => disable-dnd,n,hangup
En la primera línea controlamos si en la base de datos de Asterisk existe un valor asociado a la familia DND y nuestro numero de extensión (CALLERID). Si no existe lo creamos con la línea 2 y le asignamos el valor 1. Luego usamos las voces de asterisk para anunciar que “No disturbar” ha sido activado.
En el caso que el registro ya existe en la base de datos, el Gotoif nos llevará a la extensión disable-dnd, prioridad 1 donde borraremos el registro y anunciaremos que el “No disturbar” ha sido desactivado.
En el mismo archivo dentro del contexto internal insertamos dos líneas más
exten => 99,1,Macro(DND) exten => 99,n,Hangup
La primare envía el llamante a la macro con nombre DND (la que acabamos de explicar más arriba). De esta forma podemos activar y desactivar el “No
disturbar” llamando la extensión numero 99. Si el “No disturbar” está activado se desactivará de lo contrario se activará.
Ahora tenemos que decirle a Asterisk que para todas las llamadas entrantes haga este tipo de control.
Siempre en nuestro contexto internal añadimos las siguientes líneas
exten => _40XX,1,GotoIf(${DB_EXISTS(DND/${EXTEN})}?DND-ON)
exten => _40XX,n,Dial(SIP/${EXTEN},20,t)
exten => _40XX,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => _40XX,n(busy),Voicemail(${EXTEN}@default,b)
exten => _40XX,n,hangup
exten => _40XX,n(unavail),Voicemail(${EXTEN}@default,u)
exten => _40XX,n,hangup
exten => _40XX,n(DND-ON),Goto(${EXTEN},6)
Si el registro existe en la base de datos de asterisk (línea 1) la llamada será enviada a la extensión con etiqueta DND-ON, y de ahí a la extensión _40XX prioridad 6. Esto significa que la llamada será transferida al contestador y al llamante será anunciado que la persona en la extensión XXXX no se encuentra disponible.
Si el registro no existe se procesará la línea dos y se llamará la extensión marcada. Luego según esté ocupada o en otra condición, la llamada se enviará a la correspondiente parte del plan de llamadas.
FAX con IAXmodem y Hylafax
Vamos a empezar. Primero instalamos las librerías libtiff y libtool
yum install libtiff libtiff-devel libtool
IAXmodem
IAXmodem es un modem software, escrito en C que utiliza un canal IAX (uno de los protocolos presentes en Asterisk) en lugar de una línea telefónica y utiliza un DSP por software en lugar de un chip DSP (Digital Signal Processing).
Descargamos las fuentes de iaxmodem:
cd /usr/src wget http://switch.dl.sourceforge.net/sourceforge/iaxmodem/iaxmodem-1.2.0.tar.gz Descomprimimos el paquete tar -zxvf iaxmodem-1.2.0.tar.gz Entramos en la carpeta: cd iaxmodem-1.2.0 y compilamos: ./configure make
Copiamos el programa en la siguiente carpeta:
cp iaxmodem /usr/local/sbin
Creamos algunas carpetas indispensables para que IAXmodem funcione:
mkdir /etc/iaxmodem
mkdir /var/log/iaxmodem
touch /var/log/iaxmodem/ttyIAX0
touch /var/log/iaxmodem/iaxmodem
Modificamos el archivo de configuración predefinido presente con las fuentes:
vi iaxmodem-cfg.ttyIAX
Esta es la configuración con la cual funciona bien: device /dev/ttyIAX owner uucp:uucp mode 660 port 4570 refresh 300 server 127.0.0.1 peername iaxmodem secret password cidname VozToVoice cidnumber XXXXXXXXXX codec ulaw
Esta configuración es valida si tenemos instalado IAXmodem (más que aconsejado) en el mismo computador donde está Asterisk. En el caso de dos computadores distintos tendrán que indicar en la línea server la dirección IP del servidor Asterisk. Pongan su contraseña en secret y en cidname y cidnumber nombre y número telefónico que usará IAXmodem para presentarse a Asterisk.
Podemos configurar cuantos IAXmodem queramos cambiando en la primera línea el nombre del device y creando un archivo separado para cada uno. Ejemplo: ttyIAX2 ttyIAX3, etc…
Guardamos las modificaciones y seguimos copiando el archivo en la carpeta /etc/iaxmodem que hemos creado:
Ahora modificamos la configuración de asterisk para insertar la nueva troncal IAX: Vi /etc/asterisk/iax.conf [general] disallow=all allow=ulaw allow=g729 allow=gsm bindport=4569 bindaddr=0.0.0.0 language=es srvlookup=yes [iaxmodem] type=friend context=fax disallow=all allow=ulaw username=iaxmodem secret=password qualify=yes notransfer=yes host=dynamic
Guardamos las modificaciones y actualizamos la configuración de asterisk entrando en la consola::
asterisk –r
Escribimos:
CLI> iax2 relaod
CLI> quit
Ahora podemos hacer una prueba para ver si la conexión entre IAXmodem y Asterisk funciona:
cd /usr/local/sbin ./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.0.0.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 pararlo presionamos CTRL-C
[2009-06-08 12:03:45] Terminating on signal 2...
Antes de hacerlo controlamos que en la consola de Asterisk aparezca la conexión de IAXmodem (en otra ventana Terminal)
Listo. Ya tenemos parte del “problema” solucionado.
Ahora instalamos el script presente en la carpeta de las fuentes de IAXmodem para que éste arranque al boot de Linux:
cd /usr/src/cd iaxmodem-1.2.0
mv iaxmodem.init.fedora /etc/init.d/iaxmodem
Lo volvemos ejecutable:
chmod +x /etc/init.d/iaxmodem
Lo configuramos para el arranque automático:
chkconfig --add iaxmodem chkconfig iaxmodem on
lo ponemos a “trabajar”:
/etc/init.d/iaxmodem start
Hylafax
Empecemos con Hylafax
Antes que nada instalamos algunos paquetes (dependencias) requeridas por Hylafax:
yum install ghostscript ghostscript-devel sharutils ghostscript-fonts
En la página de Hylafax están presentes los paquetes para las distintas distribuciones de Linux:
Descargamos el paquete para Centos:
wget http://yum.trixbox.org/centos/5/RPMS/hylafax-4.4.4-1rhel5.i386.rpm
Lo instalamos:
rpm -ivh hylafax-4.4.4-1rhel5.i386.rpm
Añadimos el faxgetty al inittab (faxgetty es el programa que realmente contesta las llamadas)
Vi /etc/inittab
Añadimos esta línea:
Guardamos los cambios y volvemos a arrancar inittab:
init q
Ahora podemos empezar con la configuración de Hylafax (un poco larga pero necesaria). Presten particular atención a las partes en negrita:
faxsetup
Update /var/spool/hylafax/status/any.info.
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]?
Contestamos yes
Modem support functions written to /var/spool/hylafax/etc/setup.modem.
Configuration parameters written to /var/spool/hylafax/etc/setup.cache.
No scheduler config file exists, creating one from scratch.
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]?
The non-default scheduler parameters are:
CountryCode: 57
AreaCode: 1
LongDistancePrefix: 0
InternationalPrefix: 00
Are these ok [yes]? yes
Creating new configuration file /var/spool/hylafax/etc/config...
Restarting HylaFAX server processes.
Should I restart the HylaFAX server processes [yes]?
/etc/rc.d/init.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, time to setup a configuration file for the modem. The manual
page config(5F) may be useful during this process. Also be aware
that at any time you can safely interrupt this procedure.
Reading scheduler config file /var/spool/hylafax/etc/config.
No existing configuration, let's do this from scratch.
Country code [1]? 57
Area code [415]? 1
Phone number of fax modem [+1.999.555.1212]? +571XXXXXXXX
Local identification string (for TSI/CIG) ["NothingSetup"]?
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]?
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.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]?
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: "NothingSetup" TagLineFont: etc/lutRS18.pcf
TagLineFormat: "From %%l|%c|Page %%P of %%T"
Are these ok [yes]?
Now we are going to probe the tty port to figure out the type
of modem that is attached. This takes a few seconds, so be patient.
Note that if you do not have the modem cabled to the port, or the
modem is turned off, this may hang (just go and cable up the modem
or turn it on, or whatever).
Probing for best speed to talk to modem: 38400 OK.
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. One class isn't inherently better than another;
however, one probably will suit a user's needs better than others.
Class 1 relies on HylaFAX to perform the bulk of the fax protocol.
Class 2 relies on the modem to perform the bulk of the fax protocol.
Class 2.0 is similar to Class 2 but may include more features.
Class 1.0 is similar to Class 1 but may add V.34-fax capability.
Class 2.1 is similar to Class 2.0 but adds V.34-fax capability.
HylaFAX generally will have more features when using Class 1/1.0 than
when using most modems' Class 2 or Class 2.0 implementations. Generally
any problems encountered in Class 1/1.0 can be resolved by modifications
to HylaFAX, but usually any problems encountered in Class 2/2.0/2.1 will
require the modem manufacturer to resolve it.
Use Class 1 unless you have a good reason not to.
This modem looks to have support for Class 1 and 1.0.
How should it be configured [1]?
Hmm, this looks like a Class 1 modem.
Product code (ATI0) is "spandsp".
Other information (ATI3) is "www.soft-switch.org".
DTE-DCE flow control scheme [default]?
Modem manufacturer is "spandsp".
Using prototype configuration file iaxmodem...
The modem configuration parameters are:
ModemResetCmds: "ATH1\nAT+VCID=1"
Are these ok [yes]?
Creating new configuration file /var/spool/hylafax/etc/config.ttyIAX...
Done setting up the modem configuration.
Checking /var/spool/hylafax/etc/config for consistency...
...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...
...saving current file as /var/spool/hylafax/etc/config.sav.
Don't forget to run faxmodem(8C) (if you have a send-only environment)
or configure init to run faxgetty on ttyIAX.
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; especially if have just installed new software. 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.
Is it ok to send a QUIT command to each process [yes]?
/etc/init.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 seteo de Hylafax los encontraremos en la carpeta /var/spool/hylafax/etc y en cualquier momento (si tenemos problemas) lo podemos modificar.
Prueba
Editamos el archivo extensions.conf y agregamos lo siguiente.
[from-pstn]
exten => s,1,Answer
exten => s,2,Dial(IAX/iaxmodem)
He guardado los cambios y reiniciado Asterisk
/etc/init.d/asterisk restart
FaxMaster el usuario predefinido que Hylafax usa para enviar el fax al correo electrónico. Si quieren pueden cambiarlo modificando el archivo FaxDispatch que encuentran en la carpeta /var/spool/hylafax/etc
Si quieren recibir el mensaje con el texto en español siempre en el mismo archivo añaden esta línea:
TEMPLATE=es
Para el envío de los faxes:
Crear en extension.conf un contexto [fax] (El mismo que hemos configurado para la troncal iaxmodem en iax.conf) con las siguientes líneas:
[fax]
exten => _X.,1,Dial(ZAP/g0/${EXTEN})
exten => _X.,n,Hangup
Actualizan el dialplan:
/etc/init.d/asterisk reload
Desde el terminal de Linux escriben:
sendfax -n -d <faxnumber> <file.txt>
Ejemplo:
sendfax –n –d 4834000 /tmp/documento.pdf
que es todo.
Instalar y configurar AvantFAX - FAX vía WEB
En un precedente articulo hemos visto como configurar iaxmoden y hylafax para asterisk 1.4 Si se acuerdan bien el envió de los faxes era algo incomodo (había que usar un comando desde el prompt de Linux. Afortunadamente instalando Avantfax todo se resuelve. Avantfax es una aplicación WEB para gestionar el envío y
recepción de faxes que se apoya a Hylafax. Esto evita tener instalado un cliente web para hylafax (tipo Winprint Hylafax) en cada computador.
Desde cualquier parte del mundo podremos entrar en la página WEB de nuestro Avantfax y enviar nuestros faxes o revisar los faxes recibidos. Gracias a la posibilidad de configurar distintos usuarios podemos también definir, para cada uno de ellos, categorías y permisos de acceso a la parte hardware (los faxes) y al archivos de los faxes enviados/recibidos.
La configuración es bastante sencilla. De hecho la ultima versión de Avantfax viene con uno script de auto instalación para Centos.
Vamos a empezar descargando el programa:
wget http://switch.dl.sourceforge.net/sourceforge/avantfax/avantfax-3.1.6.tgz
Lo descomprimimos:
Entramos en la carpeta:
cd avantfax-3.1.6
Y primero modificamos este archivo:
vi rh-prefs.txt
Tenemos que modificar las líneas en negrita:
# El nombre del dominio que usaremos para entrar a la pagina de administración de Avantfax
FAXDOMAIN=fax.miodominio.org
# La carpeta donde vamos a instalar avantax (accesible desde Apache)
INSTDIR=/var/www/html/avantfax
# La carpeta donde tenemos instalado Hylafax
HYLADIR=/usr
# La carpeta donde tenemos la configuración y los registros de Hylafax
SPOOL=/var/spool/hylafax
# Usuario, contraseña y nombre de la base de datos donde vamos a guardar las tablas y los datos de Avantfax
USER=avantfax PASS=contraseña DB=avantfax
# La contraseña del usuario root para MySQL (necesaria para que lo script pueda crear la base de datos y las demás configuraciones en MySQL)
ROOTMYSQLPWD=contraseña
# Nombre de usuario y grupo que usa Apache (encuentran estos datos en el archivo /etc/httpd/conf/httpd.conf
HTTPDUSER=apache HTTPDGROUP=apache
Guardamos los cambios y ya podemos arrancar el script
Creamos el directorio publico para apache.
Mkdir –p /var/www/html/avantfax
Copiamos el contenido.
cp –Rf /usr/src/avantfax-3.1.6/avantfax /var/www/html/avantfax
Una vez terminado ya podemos entrar a la pagina de administración de Avantfax a la dirección que hemos indicado en la variable FAXDOMAIN
En el ejemplo presentado en esta guía seria:
http://fax.miodominio.org/admin
Si les aparece esta pagina:
Hay un problema con la base de datos. Tenemos que revisar este archivo de configuración:
Vi /var/www/html/avantfax/includes/local_config.php
Y revisar bien estas líneas para que correspondan a la configuración de la base de datos MySQL que hemos definido en el archivo rh-prefs.txt:
define('AFDB_USER', 'avantfax'); // username
define('AFDB_PASS', 'contraseña'); // password define('AFDB_NAME', 'avantfax'); // database name
define('AFDB_ENGINE', 'mysql'); // database engine: mysql define('AFDB_HOST', 'localhost'); // database host
Guardamos los cambios y volvemos a entrar a la página web de Avantfax. Deberíamos encontrarnos con esta imagen:
Para entrar ponemos como username admin y como contraseña password. La primera vez que nos conectamos tendremos que cambiar la contraseña y, si queremos, rellenar un formulario con los datos personales.
Una vez adentro este es el menú que encontraremos
Como pueden ver todos mis faxes están configurados con IAXmodem y directamente conectados a Asterisk. Cuando está entrando un fax aparecerá:
Discado automático
Archivos .call
• Se utilizan para iniciar llamadas desde una aplicación externa. • Son archivos de texto que al copiarse en el directorio
/var/spool/asterisk/outgoing Asterisk notará su presencia e inmediatamente activará la extensión en la prioridad especificada en el archivo .call. • Generalmente, se combinan con el programador de tareas de Linux: el cron. • Algunos ejemplos de uso son: soluciones de callback, despertador telefónico,
anuncios automáticos.
Ejemplo:
En el siguiente ejemplo: se llama al 4844000 en el canal Zap/g1/ y envía la llamada al contexto [mensajes-salida], extensión 84, Prioridad 1:
Archivo mensaje.call Channel: Zap/g1/43424444 MaxRetries: 2 RetryTime: 60 WaitTime: 30 Context: mensajes-salida Extension: 84 Priority: 1 extensions.conf [mensajes-salida] exten => 84,1,Playback(anuncio) exten => 84,2,Playback(vm-goodbye) exten => 84,3,Hangup
AGI
La AGI (o Asterisk Gateway Interface) provee una interfaz estándar para que programas externos puedan controlar el plan de marcación.
Generalmente, los scripts AGI se utilizan para realizar lógica avanzada, comunicarse con base de datos relacionales, etc.
Los lenguajes más comunes de programación de scripts AGI son: PHP, Python y Perl, aunque se puede utilizar cualquier otro lenguaje.
El intercambio de información del script con Asterisk se realiza vía los canales de comunicación: STDIN, STDOUT y STDERR.
Lee desde STDIN para obtener información.
Escribe en STDOUT para enviar información.
Escribe en STDERR para enviar información de debugging.
El script AGI envía comandos a Asterisk escribiendo en el STDOUT. Seguidamente Asterisk envía una respuesta por cada uno de ellos que es leída por el script
Algunos ejemplos de comandos son:
• ANSWER: atiende. • HANGUP: cuelga.
• SAY [NUMBER | DIGITS | ALPHA | PHONETICS]: dice un número, dígito, caracter o una cadena fonéticamente.
• SET [CONTEXT | EXTENSION | PRIORITY]: establece un nuevo contexto, extensión o prioridad luego de finalizada la ejecución de script.
• VERBOSE: imprime un mensaje en el log.
• WAIT FOR DIGIT: espera que se presione un dígito.
• [SET | GET] VARIABLE: asigna u obtiene el valor de una variable del plan de marcación.
El programa debe:
Tener derechos de ejecución y presentar un intérprete válido
Ej chmod 755 mi_cript.php
Cómo llamar al script desde el dialplan:
exten => 123,1,Answer()
exten => 123,2,AGI(mi_script.php|argumentos)
AGI: ejemplo en PHP
El siguiente script está escrito en PHP y dicta los números que se encuentran en el archivo que se le pasa como parámetro
#!/usr/bin/php –q <?php
// Esta línea es para que que haga no mantenga en un buffer el output ob_implicit_flush(true);
set_time_limit(6); error_reporting(0);
// Se abren los diferentes archivos (STDIN, STDOUT y un archivo de log del AGI) $in = fopen("php://stdin","r");
$out = fopen("php://stdout","w");
$stdlog = fopen("/var/log/asterisk/my_agi.log", "w");
// Si debug es true, escribe en el archivo de log definido anteriormente $debug = true;
// Toma el nombre del archivo con los números a dictar del primer parámetro $archivo = $argv[1];
// Define la funcion read, que lee el input del STDIN function read() {
global $in, $debug, $stdlog;
$input = str_replace("\n", "", fgets($in, 4096)); if ($debug) fputs($stdlog, "read: $input\n"); return $input;