Asterisk telefonia ip, internet

Published on May 2016 | Categories: Types, Presentations | Downloads: 115 | Comments: 0 | Views: 1430
of 293
Download PDF   Embed   Report

Asterisk, telefonia ip, llamadas por internet, ahorro en llamadas

Comments

Content


1
NO ESTA CONSIDERADA ESTA PARTE

Cierto es que llevamos varios años
esperando que estos añadidos se
conviertan de una vez por todas en
funcionalidades estables, no obstante
cabe recordar a todos que Asterisk
pese a los esfuerzos de muchas
empresas que dedican tiempo y
recursos en desarrollar y corregir cada
una de las partes que lo forman y pese
a que hay muchísimo dinero
moviéndose en torno a él tanto a nivel
de Hardware, instalaciones, soluciones
personalizadas, etc, también hay que entender que, hay un volumen altísimo de
usuarios en comparación con el de desarrolladores por lo que se hace muy difícil
coordinar todos estos esfuerzos para conseguir que todos los usuarios estén
contentos.

En la actualidad Digium se centra en el desarrollo y mejora de la versión 1.6 mientras
que la versión estable para producción, la versión 1.4, sólo recibe atenciones de
soporte para las versiones comerciales.

Por otra parte las versiones 1.4.2X, las últimas que sacó Digium con la funcionalidad
DAHDI ya implantada en vez de Zaptel, han resultado ser bastante decepcionantes en
cuando a estabilidad.
En la actualidad a pesar que Digium trabaja para estabilizar Asterisk 1.6 ,para
producción la versión 1.4 es la más estable y recomendable.



















2
Coincidencia de patrones

Los patrones permiten crear una extensión en su Dialplan que coincide con muchos
números diferentes.

Sintaxis:

Los patrones siempre empiezan con un guion bajo (_).

Después puede utilizar uno o más de los siguientes caracteres:

-7X : Coincide con cualquier digito del 0 al 9.
-7Z : Coincide con cualquier digito del 1 al 9.

-7N : Coincide con cualquier digito del 2 al 9.

-7[1,5-7] : Coincide con un solo digito a partir de la serie de dígitos
especificado. En este caso, el patrón coincide con 1, 5,6, o 7.

-7. (punto) : Comodín , coincide con uno o mas caracteres, no importa
lo que son.

-7! (bang) : Comodín , coincide con cero o mas caracteres, no importa
lo que son.

Esta expresión nunca “_.”
De hecho, Asterisk le avisara si intenta volver a utilizarlo. En cambio, utilizar
este si es posible: _X.

Para utilizar la concordancia mediante patrones en su Dialplan, simplemente poner el
patrón en el lugar de la extensión (nombre o número):

exten => _NXX, 1, PLayback (thankyou) : Al marcar un número entre 200 y 999 º
se escucha el sonido de thankyou.gsm.

Otra cosa importante a saber acerca de patrones de Asterisk es que si se encuentra
más de un patron que coincida con lo pulsado, se utilizará el más especifico.
Supongamos que ha definido los siguientes dos modelos, y marca 555-1212 .
exten => _555XXXX, 1, Playback (digitos / 1)
exten => _55512XX, 1, Playback (digitos / 2)

En este caso, la segunda prorroga, porque es mas especifica.

Usando la variable de canal $ (EXTEN):

exten => _XXX, 1, SayDigits ($ {EXTEN}) ; la aplicacion SayDigits () muestra los 3
3
;últimos dígitos marcados.
-7${EXTEN: x}

x es el lugar donde se desea que la cadena volvio a empezar,
de izquierda a derecha.

EXTEN es 95551212
${EXTEN:1} = 5.551.212

-7${EXTEN: x: y}
x es el inicio , e y es el numero de dígitos a regresar.
EXTEN es 94169671111
$ {EXTEN:1:3} = 416.
$ {EXTEN:4:7} = 9671111.
$ {EXTEN:-4:4} = 1111 (comenzaría cuatro dígitos desde el final).

Esta es una construcción muy potente, pero la mayoría de estas
variaciones no son muy comunes en uso normal.

Manipulación de expresiones y operadores

Expresiones básicas

Las expresiones son combinaciones de variables, operadores, y cadenas de valores
para producir un resultado.

Una expresión puede mostrar valores, alterar las cadenas, o realizar cálculos
matemáticos.

Cada una de estas expresiones tiene un resultado o valor, dependiendo del valor de las
variables o las cadenas.

Sintaxis: $ [expresion]
Ejemplos:
$ [$ {COUNT}+ 1]
$ [$ {COUNT} / 2]

Operadores

Símbolos que permiten manipular las variables.


Operadores booleanos

Estos operadores evalúan si la expresión es cierta o no.

-7 expr1 | expr2: Este operador (llamado "or" o "pipe") devuelve 1 si la expr1
4
es verdadera (no es una cadena vacía ni cero). De lo
contrario, devuelve la evaluación de expr2.

-7expr1 & expr2: Este operador (llamado "and") devuelve 1 si las dos
expresiones son verdaderas (es decir, ninguna expresión es
cadena vacía o cero). De lo contrario, devuelve 0.

-7expr1 {=,>,> =, <, <=,! =} expr2: Estos operadores retornan el resultado de la
comparación de las dos expresiones sean enteros o
5
cadenas .El resultado de cada comparación es 1 si la
relación es cierta , o 0 si la relación es falsa.

Operadores matemáticos



-7expr1 (+, -) expr2

-7expr1 (*, /,%) expr2



Operadores de expresión regular



-7expr1: expr2 : Siendo expr2 un expresión regular comprueba si expr1 es una
expresión o subexpresión regular de expr2 ,si lo es la
devuelve sino devuelve 0.

Funciones del Dialplan


Las funciones le permiten calcular la longitud de cadena, fechas y horas,…,todo dentro
de una expresión.

Sintaxis: Function_name (argumento)

Al igual que las variables, para referenciar el valor de la función se usan argumentos:

$ {Function_name (argumento)}

Las funciones también pueden encapsular otras funciones:

${FUNCTION_NAME(${FUNCTION_NAME(argument)})}
Para obtener una lista completa de funciones disponibles:
*CLI> core show functions

Configuración para canales de VoIP: SIP e IAX2

Los ficheros a manipular son sip.conf e iax.conf, la instalación crea ficheros de ejemplo
con la sintaxis bastante comentada a modo de guía.

En sip.conf se definen:

– Variables generales de SIP.
– Clientes SIP.
– Servidores SI
120
En sip.conf también se definen tanto los clientes que se conectarán a Asterisk, como
los proveedores que se utilizaran para encaminar llamadas. Conceptualmente, se
distinguen:

– user: Envia llamadas a Asterisk
– peer: Recibe llamadas de Asterisk (proveedor).
– friend: Recibe y Envía llamadas (usuario).
Un ejemplo básico del archivo sip.conf:
[general]
context=default
port=5060 ; Puerto UDP en el que responderá el Asterisk .
bindaddr=0.0.0.0 ; Si queremos especificar que Asterisk esté en una IP (si un
; equipo tiene 3 IPs .por ej.) 0.0.0.0 vale para cualquiera.
srvlookup=yes ; Habilita servidor DNS SRV.

[david]
type=friend ;puede recibir y hacer llamadas.
secret=1234
qualify=yes ;Tiempo de latencia no superior a 2000 ms.
nat=no
host=dynamic ; El dispositivo se registra con una IP variante .
canreinvite=no ; Asterisk por defecto trata de redirigir.
context=internal ; El contexto que controla todo esto.

Igual que tenemos para el protocolo SIP el fichero sip.conf, también tenemos el fichero
iax.conf para el protocolo IAX2.

En este fichero se definen:
– Variables generales de IAX.
– Clientes IAX.
– Servidores IAX.
Un ejemplo básico del archivo iax.conf:
[general]
bindport = 4569 ;Puerto de IAX
bindaddr = 0.0.0.0
disallow=all ;Para permitir la utilizacion de codecs primero hay que
;desabilitar todos
allow=ulaw
allow=alaw
allow=gsm

[david]
type=friend
121
username=david
secret=1234
host=192.168.1.30
context=fromiax
qualify=yes

Verificación de la configuración con el CLI.
Para ver los usuarios sip e iax:

*CLI>sip show peers
*CLI>iax show peers

Buzones de voz (Voicemail)

Uno de los servicios más interesantes de las PBX, Asterisk implementa un sistema de
buzones de voz bastante flexible.
Algunas características de este servicio:

- Ilimitados contenedores voicemail con protección de password, contenidos en
carpetas.
- Saludos diferentes para los estados busy y unavailable.
- Saludos configurables.
- Habilidad de asociar un telefono con varios voicemail's y un voicemail con
varios telefonos.
- Posibilidad de envio al correo electrónico con el archivo de sonido como
adjunto.

La configuración se hará en el archivo voicemail.conf (en /etc/asterisk/). Aquí
deberemos definir los contextos y contenedores voicemail.

A continuación vamos a ver una configuración básica.
La configuración avanzada se encuentra en el apartado “Configuración de Asterisk”.

Creación de mailbox

En el contexto de voicemail definimos diferentes mailbox cuya sintaxis es:

mailbox => password,name[,email[,pager_email[,options]]]
En la que:
mailbox: Este es el número de buzón. Por lo general, se corresponde con una
extensión.
password: Esta es la contraseña numérica que el propietario del buzón usara
para acceder a su buzón de voz.
name: Este es el nombre del propietario del buzón.
email: Esta es la dirección de correo electrónico del propietario del buzón.
122
Asterisk puede enviar notificaciones de voz a la casilla de correo.
pager_email: Esta es la dirección de correo electrónico del pager o teléfono
celular. Asterisk puede enviar un breve mensaje de notificación
de voz a la dirección de correo electrónico especificada.
options: Este campo es una lista de opciones que establece el propietario del
buzón de la zona horaria y redefiniciones de configuración de voz. Hay
nueve opciones validas: attach, serveremail, tz,ssaycid,
review,operator, callback, dialout,y exitcontext. Estas opciones deben
estar en pares option = value , separados por el carácter tubería (|).
La opción tz establece la zona horaria del usuario a una zona horaria
previamente definida en el contexto [zonemesages] en voicemail.conf,
y las otras ocho opciones son sobre el voicemail.

Un ejemplo de mailbox podría ser algo como esto:

101 => 1234,David,[email protected],tz=central|attach=yes

Añadir el voicemail al Dialplan

Para ello, vamos a utilizar VoiceMail().

VoiceMail() : aplicación que envía al llamante un mensaje. El buzón debe ser
especificado como mailbox@context (el contexto por defecto es default).
Si se utiliza la letra b, la persona que llama escuchara el mensaje de
ocupado. Si se usa la letra u, la persona que llama escuchará el mensaje
de no disponible (si existe).

exten => 101,1,Dial(${JOHN},10) ; después de 10 segundos pasa al voicemail
exten => 101,n,VoiceMail(101@default,u)

Acceso al voicemail

Los usuarios pueden recuperar sus mensajes de correo de voz, cambiar sus opciones
de voz, y grabar sus saludos de voz utilizando el VoiceMailMain().

exten => 700,1, VoiceMailMain() :accedes al buzon de voz del llamante.

Marcación por nombre de directorio

Una última característica del sistema de correo de voz de Asterisk es la de marcación
por nombre de directorio.

Esto se crea con Directory(). Esta aplicación utiliza los nombres definidos en los
mailbox de voicemail.conf .

Sintaxis: Directory (voicemailcontext,context,options)

-7 voicemailcontext: El contexto voicemail para leer los nombres.
123
-7 context: El contexto opcional del dialplan para llamar al usuario.
-7 options: Por defecto se busca el usuario por apellido.
Con la opción “f” se busca por nombre.
Con la opción “e” se busca por extensión.

Se solicita al usuario que introduzca por teclado las 3 primeras letras del
nombre/apellido/extension del empleado.

Audio en Asterisk

Reproducción

El audio en Asterisk juega un papel importante. En el mundo de las PBX tradicionales
es habitual que mientras el llamante no llega a su destino se le entretenga con musica
en espera. Ademas la reproduccion de audio es necesaria para la construccion de
sistemas IVR.

Asterisk, en su instalacion, facilita algunos sonidos comunes para, por ejemplo, el
buzon de voz, o para notificar fallos de la red (el usuario no se encuentra, etc), aunque
podemos llevar esto mucho mas alla, mediante Festival y otras aplicaciones.

Música en Espera

Asterisk puede poner un canal dado en espera ('HOLD'), principalmente en las
siguientes situaciones:
- Durante una transferencia.
- Durante una llamada si se ha especificado el parámetro 'm', que indica que
no se oirá tono de llamada sino música en espera.
- Durante una espera en el parking.
- Si la aplicación MusicOnHold o WaitMusicOnHold ha sido llamada desde el
DialPlan.
- Si el destino de la llamada ha solicitado explícitamente que la llamada sea
puesta en espera.

Es posible tener distintos tipos de música en espera.
La música en espera se configura en musiconhold.conf en /etc/asterisk/.
La configuración de este archivo se encuentra en el apartado “Configuración de
Asterisk”.

Aplicación Festival

La aplicación Festival en un TTS, es decir un sistema de síntesis de voz. Si queremos
crear un menú de voz, saludos de bienvenida, leer archivos de texto, entonces es que
lo necesitamos.

Para que Festival se integre en Asterisk, antes de compilar la centralita tenemos que
instalar dos paquetes:
124
yum install festival festival-devel

Para averiguar que el modulo de festival esté correctamente cargado en asterisk,
desde la consola de la centralita:

*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)

Si aparece algún tipo de error significa que el modulo no ha sido compilado y tenemos
que volver a la compilación de Asterisk.

Festival tiene como idioma predefinido el ingles. 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 modificamos el archivo de configuración de festival
nano /usr/share/festival/festival.scm
añadimos estas líneas:

;(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)))

Guardamos el archivo y modificamos el archivo de configuración de festival en
asterisk:

nano /etc/asterisk/festival.conf

estas son la líneas que hay que modificar/activar:
125
[general]
host=localhost
port=1314
festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n

Guardamos el archivo y reiniciamos Asterisk.
Ahora vamos a añadir unas cuantas líneas en extensions.conf.
nano /etc/asterisk/extensions.conf
exten => 650,1,Answer()
exten => 650,n,Festival(lo conseguiste!!!)
exten => 650,n,Hangup()

Codecs y carga de CPU

En principio Asterisk puede reproducir de muchisimos codecs (GSM,G711,G729,MP3)
y de archivos de audio sin codificar (WAV), siempre que nos sea posible deberiamos
pasar cualquier archivo que queramos reproducir a WAV, pues decodificar es un
trabajo que puede cargar mucho a la CPU con cada reproduccion. Aunque tambien es
cierto que un archivo codificado ocupa bastante menos que uno que no lo está, pero
sacrificamos espacio por cantidad de llamadas que pueden ser atendidas.

¿Qué uso se da de los Códecs de audio en Asterisk?

Sirven para digitalizar la voz humana.
Cuando dos dispositivos van a establecer una comunicación, acuerdan el códec
a utilizar.

Factores importantes a la hora de seleccionar un códec:

– Calidad de audio.
– Coste computacional.
– Gasto de ancho de banda.


Comparación de ancho de banda utilizado por los códecs:


Códec & Bit Rate (Kbps)
Bandwidth Ethernet(Kbps)
G.711 (64 Kbps)
87.2 Kbps
G.729 (8 Kbps)
31.2 Kbps
G.723.1 (6.3 Kbps)
21.9 Kbps
G.723.1 (5.3 Kbps)
20.8 Kbps
G.726 (32 Kbps)
55.2 Kbps
126

G.726 (24 Kbps)
47.2 Kbps
G.728 (16 Kbps)
31.5 Kbps


Los proveedores VoIP suelen trabajar en G.729, que consume muy poco ancho de
banda y no sería viable utilizar G.711 por ejemplo. El códec G.729 no es libre, cada
licencia de G.729 para un canal es de 10$ pero hay una implementación que puede
utilizarse con fines no lucrativos o educacionales, tanto de este códec como del
G.723.1, en el siguiente enlace:

http://asterisk.hosting.lv/.
Para comprobar cuántos codecs soporta Asterisk :
*CLI> core show codecs audio

Para comprobar el coste de transcoding :

*CLI> core show translation

Asterisk no soporta por defecto la reproduccion de mp3, puedes activarla compilando
el paquete de addons y activando el soporte para MP3, o instalando el paquete de tu
distribucion.

Definir un idioma

Un idioma en Asterisk es un conjunto de sonidos colocados en el directorio de sonidos
de Asterisk (revisa /etc/asterisk/asterisk.conf). Se puede definir un lenguaje en
el archivo de configuracion del canal (por ejemplo sip.conf o iax.conf) o utilizando
Set(CHANNEL(language)=idioma) que cambia el idioma para la llamada en curso.

Esto permite que aplicaciones que reproducen sonidos, como Playback(), SayDigits() o
SayNumber() puedan hacerlo en el idioma del llamante.

Es bastante comun definir un idioma global (español , por ejemplo) y para ciertos
contextos, (entrantes-internacionales) ponerlo a un idioma más apropiado como
ingles.

Castellanizar Asterisk

Por defecto las voces que incluye Asterisk están en Inglés, el lenguaje universal, pero a
veces para la perfecta compresión de algunas de las diversas funcionalidades de
Asterisk, como el buzón de voz, es necesario tener las voces en Castellano.
Con estos sencillos pasos lo conseguiremos:


Añadir lo siguiente al fichero asterisk.conf (en /etc/asterisk/):
[options]
127
languageprefix = yes


Incluir la línea “language=es” en los ficheros de configuración. (sip.conf,
iax.conf, extensions.conf, voicemail.conf,...,diposnibles en /etc/asterisk/).


Editar el fichero indications.conf, poniendo “country=es”.
Ficheros de sonido en castellano:
- http://www.voipnovatos.es/voces/
- Descargamos en formato gsm, alaw, g729, ...
- Editar árbol de directorios (todo cuelga de “es”)
- Copiar a /var/lib/asterisk/sounds/es/

Grabación

Para la grabación no hace falta ninguna aplicación especial, podríamos coger cualquier
aplicación de audio como Audacity o una grabadora de sonidos. No obstante, Asterisk
incorpora una serie de aplicaciones para la grabación en el sistema telefónico. Esto
puede utilizarse para crear una macro que reproduzca un mensaje de bienvenida
personalizado por el usuario.

Aplicación para la grabación

La aplicacion Record() graba en un archivo la voz del llamante.
Sintaxis: Record(nombre.formato[,silencio,duracion_maxima,opciones])
Podemos utilizar %d en el nombre del fichero, así se utilizará un índice auto-
incremental, para no sobrescribir grabaciones. El nombre del fichero queda guardado
en la variable ${RECORDED_FILE}.
exten => ext1,n,Record(sonido-asterisk%d.alaw)
Legalidad en la grabación de llamadas

La legislación actual en España determina que:


Es ilegal grabar o escuchar una conversación en la que uno no es parte, y los
demás desconocen la grabación o escucha.
Es legal grabar una conversación en la que uno es parte, pero es ilegal facilitar
esa grabación a un tercero que no haya sido autorizado por los que
participaron en la conversación.

El Tribunal Constitucional lo deja bien claro en su sentencia del 29 de Noviembre de
1984,STC 11/1984,cuando establece, entre otras consideraciones que:
128
“Quien graba una conversación de otros atenta, independientemente de toda otra
consideración, al derecho reconocido en el art. 18.3 CE; por el contrario, quien graba
una conversación con otro no incurre, por este solo hecho , en conducta contraria al
precepto constitucional citado.”

Si uno no es parte en la conversación estará vulnerando un derecho fundamental,
reconocido en el artículo 18.3 de la Constitución, pero quien graba las palabras que un
tercero le dirige no está realizando por ese sólo hecho ilícito alguno. Cuestión
diferente sería si esa conversación se divulga y la intromisión que pueda suponer en la
esfera de la persona cuyas palabras se han recogido.

Para las grabaciones ajenas, el Código Penal castiga con prisión de uno a cuatro años y
multa de doce a veinticuatro meses. El artículo 197 castiga a quien para descubrir los
secretos o vulnerar la intimidad de otro, sin su consentimiento, utilice artificios
técnicos de escucha, transmisión, grabación o reproducción del sonido o de la imagen,
o de cualquier otra señal de comunicación.

Se plantearon a la Agencia Española de Protección de Datos diversas cuestiones
relacionadas con la recopilación por parte de una empresa de diversos registros de
voz, con la finalidad de elaborar un programa de “Software” de reconocimiento de voz.
La recopilación tendría lugar mediante la realización de llamadas telefónicas
efectuadas desde un Estado miembro de la Unión Europea.

En relación con esta cuestión, se considera que “siempre que quien haya de realizar el
tratamiento tenga conocimiento directo o indirecto de quién es la persona cuya voz
está siendo objeto de grabación, así como de su número de teléfono, la grabación
efectuada tendrá la naturaleza de dato de carácter personal” y el tratamiento
efectuado estará sometido a la normativa de protección de datos ,al incorporarse al
mismo los datos identificativos del sujeto (nombre y apellidos), su número de teléfono
y su voz, conforme a lo dispuesto en el artículo 3.a) de la LOPD y el artículo 1.4 del Real
Decreto 1332/1994, del 20 de Junio, que indica que dichos datos podrán proceder de
información acústica.

Macros

Las macros son una herramienta excelente para ahorrarte repetición de código, y
facilidad de cambio y adaptación para tu Dialplan.

Si tuviera que repetir para un centenar de usuarios las líneas siguientes supondría una
gran cantidad de copy/paste. Sería más sencillo un cambio en la manera en que trabaja
las extensiones.
exten => 101,1,Dial(${JOHN},10)
exten => 101,n,VoiceMail(101@default)
exten => 101,n,Hangup()
.
Puede definir una macro que contiene una lista de pasos a seguir. Todo lo que necesita
para el cambio es la macro, y las referencias. Si está familiarizado con la programación,
129
usted reconocerá que las macros son similares a las subrutinas en muchos lenguajes de
programación modernos.

Definición de macros

Los contextos de toda macro deben ser “[macro-nombreMacro]“. Esto les distingue de
los contextos ordinarios y facilita su llamada.
Los comandos de la macro se construyen casi igual a cualquier otra cosa en el Dialplan,
el único factor limitante es que solo se usan en la extensión “s”.

Llamadas a macros

Para utilizar una macro en nuestro dialplan, utilizamos Macro() .
exten => 101,1, Macro (nombreMacro)
Macro () define varias variables especiales para nuestro uso. Son:

${MACRO_CONTEXT}: El contexto original en el que se llama a la macro.
${MACRO_EXTEN}: La extensión original en la que se llama a la macro.
${MACRO_PRIORITY}: La prioridad inicial en el que se llama a la macro.
${ARG n }: El enésimo argumento pasado a la macro .
Aplicando al ejemplo:

exten => 101,1, Macro (voicemail)
[macro-voicemail]
exten => s,1,Dial(${JOHN},10)
exten => s,n,VoiceMail(${MACRO_EXTEN}@default)
exten => s,n,Hangup()

Si todo el que llame va a realizar la llamada a través del mismo canal y extensión que
define la variable JOHN ya hemos terminado sino es necesario el uso de argumentos.

Utilización de argumentos en macros

Vamos a pasar el canal como argumento:
exten => 101,1,Macro(voicemail,${JOHN})
[macro-voicemail]
exten => s,1,Dial(${ARG1},10)
exten => s,n,VoiceMail(${MACRO_EXTEN}@default)
exten => s,n,Hangup()
130
Uso de la base de datos de Asterisk (AstDB)

Asterisk proporciona un poderoso mecanismo para el almacenamiento de valores de
llamada con el uso de una base de datos interna llamada AstDB. Esta no es una
relacional tradicional, como MySQL, SQLServer y otras, es del tipo Berkeley DB
Version 1.

Nos puede ser de utilidad para sistemas pequeños.

Existen dos entidades: familias(Families) y llaves(Keys), cada key esta asociada a una
Family, si un Key toma un valor nuevo, el anterior es superpuesto por este nuevo valor.

Almacenamiento de datos en AstDB

Para almacenar un nuevo valor en la base de datos de Asterisk, utilizamos la aplicación
Set(), pero en lugar de usarlo para establecer un canal de la variable, la usamos para
definir una variable AstDB.

Para asignar la clave count en la familia test con el valor 1:

exten => 456,1,Set(DB(test/count)=1)

También puede guardar los valores de Asterisk con la línea de comandos CLI,
ejecutando el comando database poniendo el valor de la clave de la familia.

*CLI>database put family key value.
*CLI>database put test count 1

Recuperación de datos de AstDB

Para recuperar un valor de AstDB y asignarlo a una variable, usamos la aplicación Set ()
de nuevo. Vamos a recuperar el valor de count de la familia test,asignando a una
variable llamada COUNT y, a continuación, decimos el valor:

exten => 456,n,Set(COUNT=${DB(test/count)})
exten => 456,n,SayNumber(${COUNT})

También puede comprobar el valor de una clave desde la línea de comandos de
Asterisk utilizando el comando:

database get family key
database get test key

Para ver todo el contenido de AstDB, se utiliza el comando:

database show
131
Borrado de datos de AstDB

Hay dos maneras de borrar los datos de la base de datos de Asterisk.
Borrar solo la llave devolviendo su valor antes de eliminarla: DB_DELETE().
exten => 457,1,Set(COUNT= ${DB_DELETE(test/count)})
En el CLI : *CLI>database del key
Borrar la familia y la clave: DBdeltree(family).

exten => 457,1, DBdeltree(test)

En el CLI: *CLI>database deltree family .

Transferencias de llamadas

La configuración de la transferencia de llamadas entre diversos usuarios,
independientemente de la tecnología que usen se realiza en el archivo features.conf
en /etc/asterisk/.

Hay que especificar en dicho archivo las siguientes características:

• blindxfer => secuencia : Permite realizar una transferencia de llamada a ciegas
marcando la secuencia.
• atxfer => secuencia : Permite realizar una transferencia de llamada atendida.
El origen es puesto en espera, mientras el destino se
comunica con el nuevo destino para anunciarle la
llamada. Si el nuevo destino cuelga, la llamada no se
transfiere.
• pickupexten => secuencia : Especifica la secuencia a marcar para coger una
llamada de alguien del mismo callgroup.
Para poder realizar transferencias vía PBX, Asterisk debe estar a la escucha de los
tonos configurados, para ello la aplicación Dial debe haber recibido como parámetro 't'
para permitir la transferencia en destino o 'T' para hacerlo en origen (o ambas).

CallParking


El callparking o aparcamiento de llamadas es una funcionalidad que permite transferir
la llamada a un 'parking' virtual. Pudiendo colgar sin que la llamada origen sea
desconectada de Asterisk, ya que se encontrará aparcada.

Para operar, el usuario transfiere la llamada a una extensión especial (parkext en
features.conf), Asterisk aparca la llamada y anuncia la posición en el parking.
132
Cualquier usuario que tenga incluido en su contexto el contexto especial 'parkedcalls'
puede recuperar la llamada aparcada llamando directamente a su posición en el
parking.

Los parámetros para el callparking son controlados con la configuración del
features.conf. En el contexto [general] del features.conf hay 4 caracteristicas
relacionadas con el callparking:


parkext: Esta es la extensión del parking. Al transferir una llamada a esta
extensión se llama a la posición determinada del aparcamiento .Por defecto es
700.


parkpos: Esta opción define el número de aparcamientos. Por ejemplo, entre
701-720 crea 20 aparcamientos numeradas del 701 al 720.


context: Este es el nombre del contexto del aparcamiento.Para poder aparcar
llamadas, debe incluir este contexto.


parkingtime: Si se establece, esta opción controla el tiempo(en segundos) que
una llamada puede permanecer en el aparcamiento. Si la llamada no está
recogida en el tiempo especificado, se llama de nuevo.

Es necesario reiniciar (restart) Asterisk no vale con hacer reload.

También es necesario que el usuario sea capaz de transferir las llamadas a la extensión
del parking, debe estar seguro de la utilización de la "t" y / o T del Dial().
Ejemplo:
extensions.conf
[incoming]
include => parkedcalls
exten => 103,1,Dial(SIP/Pedro,,tT)
exten => 104,1,Dial(SIP/John,,tT)

features.conf

[general] parkext =>
700 parkpos => 701
context => parkedcalls
parkingtime => 120

[featuremap]
blindxfer => #
disconnect => *
133
atxfer => *2
parkcall => *7

Para visualizar estos datos desde la linea de commandos CLI:

*CLI> show parkedcalls

Para ilustrar como usar el Call Parking, supongamos que David marca la extensión 103
para hablar con Pedro. Después de un tiempo, Pedro transfiere la llamada a la
extensión 700 aparcando la llamada de David en la posición 701. Pedro marca la
extensión 104 para llamar a John , y le dice que el que la llamada de David se
encuentra en la extensión 701. John entonces marca de extensión 701 y comienza a
hablar David.

CallPickup

CallPickup es la auto-transferencia de un teléfono que esta sonando, en otras palabras,
el hecho de poder descolgar y responder a la llamada entrante a un teléfono o grupo
de teléfonos determinado desde un tercer teléfono que no está sonando.

La configuración para el 'Callpickup' se configura en features.conf.
En cada usuario de la centralita se definen estos dos parámetros:


callgroup: Toda llamada que entra a una extensión determinada pertenece
al/los callgroups de la extensión.


pickupgroup: Es el/los callgroups de llamadas entrantes en los que el usuario
puede hacer 'pickup'.

Hay dos tipos de callpickup:

- Group callpickup: Permite que descuelgues cualquier llamada de alguien de
mismo grupo que tu. Para utilizar esta funcionalidad la secuencia a marcar
suele ser *8# o *8.

- Directed pickup: Permite que descolgar una llamada según una extensión
especifica, suena el telefono y si descuelgas y marcas una secuencia más tu
extensión se transfiere la llamada a tu extensión.

Ejemplo:

features.conf

[general]
…………….
pickupexten=*8
……………
134
sip.conf

[100] ; 100 puede coger llamadas de 101 ya que pickupgroup abarca el
; callgroup de 101
……… callgroup=1
pickupgroup=1-3

[101] ;101 tambien puede coger llamadas de 100
……….
callgroup=2
pickupgroup=1

Para ver estos datos desde el CLI:

*CLI>feature show

Manejo de Colas

Una llamada entrante puede ser enviada a una cola de llamadas, que será distribuida
entre los agentes disponibles, miembros que contestan las llamadas.

Las colas se utilizan mucho en entornos tipo 'Call Center', con los canales tipo de
Agente (que hacen 'login en el sistema').
El sistema de colas se compone de:
- Llamadas entrantes que son ubicadas en una cola.

- Miembros que contestan las llamadas en la cola

- 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.
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.
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. También existe
135
el concepto de agente dinámico por si cualquier usuario quiere agregarse a una cola.
Para esto se utilizan las aplicaciones AddQueueMember() y RemoveQueueMember().
Los miembros son aquellos canales disponibles que están activamente atendiendo la
cola. Pueden ser tanto agentes como también canales regulares (SIP/105).
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 agente disponible por turnos.

- leastrecent: hace sonar el agente que es menos recientemente llamado
por esta cola.

- fewestcalls: hace sonar el agente 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.

Cada agente tiene lo denominado Penalty(penalidad) de manera que se derivan las
llamadas (según 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.

Para establecer esto en los agentes estaticos en queues.conf:

member => SIP/3000,1
member => SIP/3001,2

Si hay agentes dinamicos ellos tienen penalidad 1, a no ser que se les asigne otra al
agregarse a la cola:

exten => 888,1,AddQueueMember(davidqueue||3) ;penalidad 3

Si se asignan a dos agentes la misma penalidad sonarian los dos si hay una llamada.
También es posible asignar a cada llamada entrante una Priority(prioridad)
permitiendo situarla en un lugar más adelante de la cola (no siempre al final), por
ejemplo si es un cliente importante adelantarle en la cola. Por defecto todas tienen
prioridad 0 (estrategia FIFO (First In First Out)).

Si queremos que cierta llamada sea adelantada en la cola deberemos modificar la
variable de prioridad , QUEUE_PRIO.
136
exten => 101,1,Playback(bienvenido)
exten =>101,n,SetVar(QUEUE_PRIO=10)
exten =>101,n,Queue(davidqueue)

Es posible que un miembro de una cola en determinado momento quiera no
responder llamadas de esta, esto es posible hacerlo de dos formas:


Con las aplicaciones de Pausa:

exten => 333,1,PauseQueueMember(davidqueue|SIP/100)
exten => 334,n,UnpauseQueueMember(davidqueue|SIP/100)


Opcion de TimeOut : Cuando no se contexta una llamada se entra en pausa
automaticamente (poniendo en el contexto de la cola “autopause=yes”).

Las aplicaciones principales relacionadas con las colas, utilizadas en extensions.conf:

- Queue(): aplicación utilizada para encolar una llamada (toma como
parámetro las colas definidas en queue.conf).

exten => 1234,n,Queue(ventas|t|||45|)

- AddQueueMember(cola): agrega dinámicamente un miembro a la cola.

- RemoveQueueMember(cola): remueve dinámicamente un miembro
de la cola.

- PauseQueueMember(cola|miembro): Pone en pausa al miembro en la
cola.

- UnpauseQueueMember(cola|miembro) : Reactiva al miembro en la
cola.

- AgentLogin(): login de un agente a una cola.
Comandos relacionados de la CLI:

Mostrar los agentes :

*CLI>show agents

Lista de todas las colas:

*CLI>show queues

Muestra los datos de una cola en particular:

*CLI>show queue nombrecola
137

Agrega un miembro a la cola:

*CLI>queue add member nombremiembro

Elimina un miembro de la cola :

*CLI>queue remove member nombremiembro
Un ejemplo del archivo queues.conf con una cola definida es:
[general]
;Si usamos agentes dinamicos su configuración se guardara en la BD de
Asterisk. De ;esta forma si Asterisk se vuelve a arrancar , cada agente será
;enrutado a su ;correspondiente cola.
persistentmembers=yes
;Para mantener las estadísticas en la cola durante un “reload”
keepstats=no

[davidqueue]
music=default
strategy=ringall
timeout=15 ;tiempo maximo de ring
retry=5 ;tiempo de espera para intentar con otro miembro
wrapuptime=0 ;tiempo de espera tras intentar con todos los miembros
member => SIP /100,1

Algunas de las variables para obtener información de las colas son:


QUEUE_MEMBER_COUNT(queue) : nº de miembros de una cola
exten => 3001,1,Set(NUM = ${QUEUE_MEMBER_COUNT(davidqueue)})
exten =>3001,n,SayNumber(${NUM})


QUEUE_MEMBER_LIST(queue) :guarda los nombres de los miembros de la cola
exten =>4001,1,Set(MEM=${QUEUE_MEMBER_LIST(davidqueue)})
exten =>4001,n,NoOp(MEM=${MEM})


QUEUE_WAITING_COUNT(queue): nº de personas esperando en la cola
exten =>5001,1,Set(ESP=${QUEUE_WAITING_COUNT(davidqueue)})
exten =>5001,n,SayNumber(${ESP})

Registro de llamadas(CDR)

Asterisk permite llevar un control exhaustivo de todas las llamadas que se han
realizado o recibido. Este control es interesante para el propio control de facturación,
138
independientemente del proveedor y además permite realizar estadísticas. Dicho
control se denomina CDR(Call Detail Record).

El registro del CDR se escribe por defecto en el archivo:

/var/log/asterisk/cdr-csv/Master.csv

Tambien es posible almacenar los registros en una base de datos MySQL configurando
el archivo cdr_mysql.conf en /etc/asterisk/, para configurar el CDR se hace en cdr.conf
en la misma carpeta.

Para confirmar el estado del CDR desde el CLI, se puede ejecutar:

*CLI> cdr status

Algunos de los campos más importantes son:


accountcode: código de la cuenta a utilizar.
src: número del caller ID.
dst: extensión destino.
dcontext: contexto destino.
start: comienzo de la llamada (fecha/hora).
answer: respuesta de la llamada (fecha/hora).
end: fin de la llamada (fecha/hora).
duration: duración de la llamada en segundos, desde que fue
discada hasta el corte.
billsec: duración de la llamada en segundos, desde que fue
atendida hasta el corte.
disposition: estado de la llamada (atendida, no atentendida, ocupado, fallida).

Existen muchas aplicaciones que permite gestionar el CDR. Desarrollar una propia no
es realmente muy complejo. Para la aplicación se utilizará Asternic CDR Reports de
Nicolás Gudiño.

Sala de conferencias


Una conferencia en Asterisk permite que varias personas estén incluidas en una misma
conversación, Asterisk trabaja esto de una manera fácil y flexible mediante las
Aplicaciones MeetMe (conferencia,opciones,password) para crear conferencias y para
contar los participantes MeetMeCount(conferencia,variable_contador).

Algunas de las cosas que se pueden hacer en conferencias son:
Crear passwords para salas de conferencias.
139
Tipos de conferencia (mute conference, lock conference, kick partipants).

Posibilidad de silenciar a todos los particiántes menos a uno, útil en caso de
discursos de entrada o mensajes importantes.

Creación de conferencias estáticas o dinámicas.
Se puede limitar el número de participantes.
Las opciones de configuración para el sistema de MeetMe se encuentran en
meetme.conf en la carpeta /etc/asterisk/.

Dentro de la configuración, hay que establecer las salas de conferencias y definir un
número opcional de contraseñas. (Si una contraseña esta definida aquí, será necesaria
para acceder a esta sala para toda la conferencia).
Definimos la sala de conferencias en la extensión 600 (en meetme.conf):
[roms]
conf => 600

Creamos una simple sala de conferencias utilizando la extensión 600,la opción i (que
anuncia cuando la gente entra y sale de la conferencia), y una contraseña de 54321 en
extensions.conf:

exten => 600,1, MeetMe (600, i, 54321)

Si usted pasa una variable como segundo argumento para MeetMeCount(), el numero
de participantes se asigna a la variable, y la reproducción de estos cada vez que se
añade uno se omite. Usted puede usar esto para limitar el número de participantes, de
esta forma:
; Limitar la sala de conferencias para 10 participantes
exten => 600,1,MeetMeCount(600,CONFCOUNT)
exten => 600,n,GotoIf($[${CONFCOUNT} <= 10]?meetme:conf_full,1)
exten => 600,n(meetme),MeetMe(600,i,54321)
exten => conf_full,1,Playback(conf-full)

IVR (Interactive Voice Response)


IVR es el nombre de la tecnología que permite interactuar con un menú de voz
utilizando un teléfono.

Es relativamente fácil y sencillo, configurar un menú de ese tipo en Asterisk.

Una vez hechas varias grabaciones de mensajes con la aplicación Record() como hemos
comentado y haberlas guardado estos en /var/lib/asterisk/sounds/ se puede comenzar
a configurar el IVR en extensions.conf.
140
Las ventajas que proporciona el sistema no reside solamente en la reducción de costes
y en el incremento de la eficiencia del CallCenter sino que también:

Y Ayuda a reducir los turnos de los operadores y sus costes asociados.
Y Incrementa las horas de servicio.
Y Disminuye la tasa de llamadas perdidas.
Y Incrementa la disponibilidad de los operadores.
Y Proporciona una tasa de re-direccionamiento solucionando un mayor
número de primeras llamadas.
Y Mejora la flexibilidad para responder a las necesidades del cliente o a
picos de llamadas.

El 95% del éxito del diseño de los sistemas IVR de Asterisk se basa en trabajar junto al
cliente desarrollando casos de uso consistentes y probar (y rehacer) prototipos con
usuarios finales "reales" (a los cuales, incluidos nosotros mismos, les fastidia "hablar"
con una maquina). Si la transacción promedio es corta y amigable, la ventaja frente al
acceso Web es que no todos tienen Internet en todo momento, aunque si un teléfono.

El 5% restante es solo programación.
Principales errores de "ergonomía":
Y Menús demasiado largos.
Y Los usuarios se pierden o no encuentran lo que necesitan.
Y No comprenden cómo usar el sistema.
Y Lógica confusa y "callejones sin salida".
Y Suponer que el usuario conoce la "jerga" del negocio.
Principales errores de diseño:
Y Ineficiente recuperación ante fallos.
Y Falta de canales de atención suficientes.
Y Carencia de una salida hacia un operador humano.
Resumen de algunos principios generales:
Y Los menús no tienen que reproducir la estructura organizativa o
departamental de la empresa.
Y Si el servicio tiene alguna restricción, es preciso avisar al usuario antes de
nada. Por ejemplo, en un servicio de compra de tarjetas de llamadas
prepago, si se requiere que el usuario sea cliente, es preciso avisarle antes
de nada.
Y Proporcionar solo la información que se necesita y de la forma más simple
posible.
Y Diseñar para la mayoría de los usuarios evitando que tengan que recorrer
opciones que solo interesan a unos pocos.
141
Y Hacer que el sistema trabaje por el usuario, por ejemplo, no pidiendo el
mismo dato varias veces y evitando preguntar información que el sistema
puede conocer.
Y Ser consistente y no cambiar a menudo las opciones de los menús.

Saludo inicial:

Y Debe haber una bienvenida breve: buenos días, buenas tardes...
Y No repetirlo si en algún momento el usuario vuelve al inicio.
Es preciso evitar:
Y Mensajes promocionales: poner solo si el usuario los puede encontrar
justificados y, sobretodo, han de ser breves permitiendo acceder a la
información en aquel mismo momento.
Y Tener que pulsar la tecla * para saber si el terminal es de tonos (DTMF)
o no.
Y Remitir al usuario a otro servicio.
Menú principal:
Y El primer menú debe ser el principal a no ser que se tenga que pedirse
identificación.
Y Máximo 20 segundos de duración total contando el saludo inicial y el
menú principal.

Identificación:

Y Pedir identificación sólo cuando sea necesaria.
Y Pedir el identificador más fácil de recordar: teléfono, DNI...
Y Gestionar el final de la entrada de datos por medio de timeout, no solicitar
ningún tecleo adicional.

Las opciones de navegación recomendables son:

Y Volver atrás.
Y Menú principal.
Y Repetir.
Y Ayuda (si lo necesita la aplicación).
Y Si existe una opción de paso al operador, debe ser la última.
Y No hay que cortar nunca la comunicación si el usuario se equivoca. Es
preciso dar caminos alternativos.
Y Ordenar las opciones de las más específicas a las mas generales.
Preguntas Si/No:
Y Se usan para recuperar errores y para confirmar acciones.
142
Y Tienen que ser preguntas directas que induzcan a decir de forma natural
solo Si o No:
Incorrecto: Por favor, confirme si su DNI es: XXXXXXXX
Correcto: DNI: XXXXXXXX. ¿Es correcto?

Y Debe ser una única pregunta, no dos en una.
Y Si además de la pregunta hay texto informativo, poner la pregunta al final
de la frase. Ejemplo: Para obtener más información sobre las condiciones
del contrato, ¿desea que pase la llamada a un agente?.

Discado automático (Auto-dial out)

Los Call Files (.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.

La estructura de un Call File es la siguiente:

Channel: <channel> ; La extensión que queremos llamar.

Callerid: <callerid> ; El identificativo de llamada que queremos enviar a la
;extensión llamada.

WaitTime: <number> ; Cuantos segundos esperamos antes de considerar la
;llamada sin éxito.

Maxretries: <number> ; Numero de veces que intentaremos llamar la
;extensión

RetryTime: <number> ; Cuantos segundos debe esperar asterisk para volver a
; marcar

Account: <account> ; El nombre de la cuenta con la cual queremos grabar
; esta llamada (CDR)

Una vez que la extensión llamada conteste tenemos que decirle a asterisk lo que tiene
que hacer. Esto también se define en el mismo archivo. Hay dos opciones:

Ejecutar una aplicación:

Application: <appname> ; la aplicación que queremos utilizar

Data: <args> ; aquí podemos definir las opciones de la aplicación
143
Ejecutar un punto exacto del plan de llamadas (Dialplan):

Context: <context> ; El contexto en el dial plan

Extension: <exten> ; La extensión que queremos usar en el contexto
; especificado.

Priority: <priority> ; El numero de la prioridad o la etiqueta si definida

Setvar: <var=value> ; Variables que se pueden necesitar en el
; contexto, extensión y prioridad que definimos.

Ejemplo:

En el siguiente ejemplo: se llama al 43424444 en el canal SIP y envía la llamada al
contexto [mensajes-salida], extensión 84, Prioridad 1:
- Archivo mensaje.call


Channel: SIP/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

Sistema de logs

En el archivo /etc/asterisk/logger.conf se encuentra la configuración del sistema de
logging de Asterisk.

Los distintos niveles de información a capturar en los logs son:

Verbose: mensajes generales sobre lo que está ocurriendo en el sistema (por
ejemplo si el valor de verbosity es mayor a 3, muestra las instrucciones del plan
de marcación).
Debug: mensajes con información extendida, en general utilizados por
programadores.
Notice: notificaciones no críticas.
Warning: mensajes de alerta posiblemente críticos.
144
Error: mensajes indicando que ocurrió algo grave.

En el contexto [logfiles] del archivo logger.conf se indican los archivos y mensajes a
loguear en c/u, la sintaxis es: archivo => nivel1,...,niveln
Los archivos de log se crean por defecto en /var/log/asterisk/ (esto se puede cambiar
/etc/asterisk/asterisk.conf).


Ejemplos:


debug => debug
full => notice,warning,error,debug,verbose

Para enviar a la consola, hay que definir el archivo especial console:

console => notice,warning,error,debug

También se pueden enviar al syslog:

syslog.local0 => debug, warning, error, notice, verbose

Configurando además en /etc/syslog.conf:

local0.*@ip_servidor

Los comandos relacionados con el manejo del log en el CLI son:

Reabre los archivos de log del Asterisk y recarga la configuración del logger:

*CLI>logger reload

Rota los archivos de log y luego hace un logger reload.

*CLI>logger rótate

Cambia el nivel de información a mostrar en la consola. Por ej.: set verbose 999

*CLI>core set verbose

ENUM y Asterisk

ENUM (proviene de tElephone Number Mapping) o mapeo de números telefónicos,
está constituido por una serie de protocolos que permiten crear una convergencia
entre la red telefónica tradicional y Internet. Permite asociar (utilizando el protocolo
DNS) un número telefónico a todas una serie de servicios típicos de la red internet
(VoIP, correo electrónico, pagina web, etc.).

¿Cómo funciona?
145
Se ha creado una nueva jerarquía de dominios bajo el DNS e164.ARPA donde se
almacenan los servicios asociados a un determinado numero telefónico.

Un ejemplo:

+5712345678 -7 8.7.6.5.4.3.2.1.7.5.e164.arpa

El servidor DNS (Name Authority Pointer o NAPTR) que alberga la entrada, tiene
registrados los servicios (sip, mail, http) publicados para dicho número.
Ejemplo de entrada en Bind:

$ORIGIN 8.7.6.5.4.3.2.1.7.5.E164.ARPA.
IN NAPTR 100 10 "U" "E2U+SIP" "!^.*$!SIP:[email protected]!"
IN NAPTR 102 10 "U" "E2U+MAILTO"
"!^.*$!MAILTO:[email protected]!"

Prioridad 1: contactar vía SIP con [email protected].
Prioridad 2: contactar por correo con [email protected].

Como queda claro a través de este ejemplo una vez que tengamos estos datos
podremos usarlos en nuestra centralita. Llamar directamente la SIP URI en lugar del
número telefónico (ahorrando los costos de llamadas) o enviar un correo electrónico.

Ejemplo:

Llamada desde un teléfono IP al +34944991234

1) Consulta del teléfono al servidor DNS sobre la dirección

4.3.2.1.9.9.4.4.9.4.3.e164.arpa

2) El DNS responde:

sip:[email protected]
mailto:[email protected]

3) El teléfono llama a sip:[email protected]

Si queremos hacer una prueba podemos registrar nuestro número telefónico y
asociarlo a distintos servicios Internet a través de E164.org, un directorio ENUM
publico.

Utilización de ENUM en Asterisk:
Primero tenemos que modificar el fichero enum.conf.
[general]
search => e164.arpa
146
search => e164.org
h323driver => H323

Ponemos estas líneas que nos permitirán hacer búsqueda en la jerarquía DNS
e164.arpa y e164.org.

Guardamos los cambios y echamos una mirada a las funciones disponibles en
Asterisk para hacer consultas a estos DNS:

ENUMLOOKUP: nos permite hacer una consulta de los registros NAPTR
asociados a un determinado número telefónico.

ENUMQUERY: nos permite hacer una consulta de los registros NAPTR pero, al
contrario de ENUMLOOKUP generará como resultado un ID que luego
podremos usar con la función ENUMRESULT.

ENUMRESULT: permite consultar los resultados generados por ENUMQUERY
usando el ID creado por ENUMQUERY.

Ejemplo:

Vamos a construir nuestro 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.,1,Set(Enum1=${ENUMLOOKUP(+${EXTEN:2},sip,c)}|counter=0)
exten => _00.,2,GotoIf($["${counter}"<"${Enum1}"]?3:6)
exten => _00.,3,Set(counter=$[${counter}+1])
exten => _00.,4,Dial(SIP/${ENUMLOOKUP(+${EXTEN:2},sip,,${counter})})
exten => _00.,5,GotoIf($["${counter}"<"${sipcount}"]?3:6)
exten => _00.,6,Dial(SIP/MyproveedorVoIP/${EXTEN})
exten => _00.,7,Hangup

DUNDI

DUNDi ™ es un sistema peer-to-peer que permite localizar gateways para servicios
telefónicos. A diferencia de los servicios centralizados tradicionales (como ENUM), es
totalmente distribuido. No es en sí un protocolo VoIP de señalización.
DUNDi se puede utilizar dentro de una empresa para crear una completa PBX federada
con ningún punto de fracaso, y la posibilidad de añadir nuevas extensiones
arbitrariamente.

Diagrama DUNDI:
147


Hay tres archivos que necesitan ser configurados para DUNDi: dundi.conf,
extensions.conf, y iax.conf. El archivo dundi.conf controla la autentificación de los
compañeros que nos permiten realizar búsquedas a través de nuestro sistema. Dado
que es posible ejecutar varias redes diferentes en la misma caja, es necesario definir
una sección diferente para cada interlocutor, a continuación, configurar las redes de
pares en el que se permiten realizar búsquedas. Además, tenemos que definir los
compañeros que desea utilizar para realizar búsquedas.

Configuracion del archivo dundi.conf:

[general]
; puerto mediante el cual se comunica el protocolo dundi.
port=4520
; identificador de mi Asterisk en la nube dundi, se recomienda sea la MAC de la
; tarjeta de red eth0.
entityid=00:0C:29:0C:AB:C2
; Tiempo que permanece en cache la ruta para ir a las extensiones aprendidas ;
; mediante dundi .
cachetime=5
; Máximo número de saltos que se harán buscando el destino dentro de la red ;
; dundi .
ttl=12
; si al preguntar a un par, el ACK tarda más de 2 segundos, se cancela la
;búsqueda a través de ese peer; es ;útil cuando no está activo el peer o cuando
;hay una conexión ;mala hacia el peer
autokill=yes

Publicación de mis números en la red dundi (contextos dundi):

Los contextos en esta sección se enlazan con los contextos de
extensions.conf.

El contexto referenciado de extensions.conf es donde se controla qué
numeros se publican en la red dundi.
148
Al configurar un peer con el que nos vamos a enlazar, se puede determinar
a cuales de los mapas puede tener acceso el peer.

Contextos dundi:

nombre_contexto => contexto_extensions,peso,proto,destino[,opciones]]
nombre_contexto: Nombre del contexto al que se hace referencia en una
petición dundi.
contexto_extensions. Nombre del contexto en el extensions.conf, donde se
buscarán los números que son solicitados en la nube dundi.
peso. Deberá ser 0 en caso de que nuestro conmutador publique directamente
los números, en caso contrario, deberá tener el valor del número de saltos que
necesita para llevar al destino.
proto. Cualquiera de los protocolos IP (sip, iax,323) con el cual el peer remoto
se debe comunicar con nosotros.
destino. Es la información que se entrega al peer para que pueda llegar al
número que está marcando.
opciones. Pueden ser varios argumentos los cuales indican el comportamiento
que se tendrá cuando no tengamos nosotros el número que se está solicitando.

- nounsolicited. No se permiten llamadas que no sean solicitadas.

- nocomunsolicited. No se permiten llamadas comerciales que no sean
solicitadas.

- nopartial. No se permiten búsquedas para patrones parciales.

- residential, comercial,mobile. Le indica a los pares qué tipo de números
son los que se están publicando a través de este contexto.

[mappings]
priv =>dundi-priv-local,0,IAX2,priv:${SECRET}@162.248.175.91/${NUMBER}
,nounsolicited,nocomunsolicit,nopatial

Variables:

${SECRET}. Es reemplazado por el password almacenado en la base de datos.
${NUMBER}. Es el número solicitado.
${IPADDR}. Es la IP de nuestro Asterisk. No se recomienda su uso.
Generación de llaves:
La autenticación en una red dundi normalmente se hace mediante llave
pública/privada:

cd /var/lib/asterisk/keys
astgenkey -n dundi_ext_44xx
149
yum -y install php
cp dundi_ext_44xx.pub /var/www/html
service httpd start
wget -c http://132.248.175.90/dundi_principal.pub
*CLI>reload res_crypto.so
*CLI>reload pbx_dundi.so
*CLI>dundi lookup 4400@priv

Dundi: configuración de pares:

;Par principal, el principal publica las demás extensiones
[00:0c:29:d8:86:c0] ; MAC address del par principal
model = symmetric
host = 132.248.175.90
inkey = dundi_principal ; nombre de la llave pública del par
outkey = dundi_ext_44xx ; nombre de mi llave privada
include = priv
permit = priv
qualify = yes
dynamic=yes

Configuración del archivo extensions.conf:

; tratamos de ir en el contexto local al número de extensión, después vamos a
buscar a ;otro contexto. dundi-priv-lookup apunta a la directiva switch la cual
permite buscar las ;extensiones ;en otros conmutadores. Esto posibilita la
convergencia entre múltiples ;servidores Asterisk con ;diferentes números de
bloques de extensiones
[macro-dundi-lookup]
exten => s,1,Goto(${ARG1},1)
include => dundi-priv-local
include => dundi-priv-lookup

Definición de contextos:
; Son las extensiones locales, por ejemplo: 44XX
[dundi-priv-local]
exten => _44XX,1,Macro(Dial,${EXTEN})
; Buscamos con nuestros pares
[dundi-priv-lookup]
switch => DUNDi/priv
; Cuando se trata de una llamada de un par privado, llega aquí.
[dundi-priv-incoming]
include => dundi-priv-local

Búsqueda en pares:
150
; Contexto para llamadas salientes, aquí nos comunicamos con la red dundi,
pero ;agregamos 4 dígitos
[pares-dundi]
exten => _XXXX,1,Macro(dundi-lookup,${EXTEN})
[internos]
include => pares-dundi
Configuracion del archivo iax.conf:
[priv]
type=user
dbsecret=dundi/secret
context=internos
disallow=all
allow=ulaw
allow=alaw
allow=gsm

Aspectos avanzados de Asterisk:

¿Qué es AGI?


AGI (Asterisk Gateway Interface) nos permite ejecutar en Asterisk software de terceros
escrito en casi cualquier lenguaje (C, C#, Bourne Shell, PHP, Ruby, Python, Perl, Java).
Permite extender al infinito las posibilidades de Asterisk, juntando su potencia, con las
posibilidades que ofrece un lenguaje de programación.

El programa debe cumplir:

– Ser ejecutable (chmod 755 script.php).
– Localizado por defecto en /var/lib/asterisk/agi-bin
– Asociado con alguna extensión en el Dial Plan:
exten => 200,1,AGI(programa.php|argumentos)

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.
151
HANGUP: cuelga.
SAY [NUMBER | DIGITS | ALPHA |
| 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: PHONETICS]: dice un número, dígito, caracter o una
cadena fonéticamente.
SET [CONTEXT | EXTENSION espera que se presione un dígito.
[SET | GET] VARIABLE: asigna u obtiene el valor de una variable del plan de
marcación.

¿Qué es AMI?

AMI (Asterisk Manager TCP/IP API) permite que programas cliente se conecten a
Asterisk mediante TCP/IP y sean capaces de ejecutar comandos y leer eventos, como
por ejemplo crear o monitorizar llamadas ,canales y colas. Por cada cosa que Asterisk
realiza se generan eventos que pueden ser leídos mediante una sesión de manager, y
el usuario puede tratarlos a su gusto.

Además, AMI permite la ejecución de comandos, lo que proporcina la posibilidad de
alterar el comportamiento de Asterisk desde un programa hecho a medida.

Funcionamiento:

Para trabajar con AMI es necesario tener un usuario definido en el fichero
manager.conf. A partir de aquí hay que establecer una comunicación TCP/IP con el
servidor de Asterisk en el puerto 5038, y una vez conectado y autentificado, se puede
comenzar a leer los eventos o ejecutar comandos.

Las cuentas de usuario se configuran en /etc/asterisk/manager.conf.
Ejemplo:
[general]
enabled=yes
[admin]
secret = 1234
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user

En este caso, "admin" es el nombre de usuario, la clave es "1234" y sólo se permiten
conexiones para este usuario vía localhost. El resto de las líneas establecen permisos
(r,w,r/w) para cada clase (system, call, etc.).
152
Una de las mejores aplicaciones opensource para controlar y visualizar el estado en
tiempo real de la centralita Asterisk es: Flash Operator Panel (FOP).


¿Qué es AJAM?


AJAM es una nueva tecnología disponible en Asterisk 1.4 (Asyncronous Javascript
Asterisk Manager) que permite conectar con Asterisk por medio de HTTP. Para poder
trabajar con AJAM es necesario configurar los ficheros manager.conf y httpd.conf.

Configuración del servidor HTTP de Asterisk:

1) Descomentar "enabled=yes" en /etc/asterisk/http.conf para habilitar el
pequeño servidor HTTP de Asterisk.

2) Si se desea tener acceso a simples páginas HTML, CSS, JavaScript, etc., hay
que descomentar "enablestatic = yes" .

3) Poner la Ip del servidor Asterisk y el puerto en "bindaddr" y "bindport ‘’
respectivamente.

4) Ajuste el "prefix" que debe ser el comienzo de cualquier URI en el servidor .
El valor predeterminado es "asterisk" ..

Permitir el acceso al Manager via HTTP:

1) Asegúrese de que tiene tanto "enabled = yes" como "webenabled = yes" en
la configuración / etc / asterisk / manager.conf .

2) También puede usar "httptimeout" para establecer el tiempo de espera
predeterminado para las conexiones HTTP (en segundos).

3) Asegurarse de la configuración de manager.conf teniendo claro cuál es el
username y la password.

Una vez que estos cambios de configuración han sido completados puede reiniciar
Asterisk y podrá acceder a distintas funciones de web. Puede encontrar una lista
completa de estas funciones:

*CLI> show http o *CLI> http show status

Ejemplos de funcionamiento:

• Para abrir una sesión de Asterisk Manager:

http://192.168.1.200:8088/asterisk/manager?action=login&username=admin_
de_usuario&secret=amp111

• Para ver la salida del comando status:
153
http://192.168.1.200:8088/asterisk/rawman?action=status

¿Qué es AEL2?


AEL2 (Asterisk Extension Language versión 2) tiene como objetivo proporcionar una
forma diferente de escribir el Dialplan ,una forma más flexible.
Para utilizar AEL2, lo único que tiene que hacer es tener cargado el modulo
pbx_ael2.so. Esto se hará de forma automática si se utiliza 'autoload = yes "en
/etc/asterisk/modules.conf. Cuando se carga el módulo, se busca 'extensions.ael2' en
/etc/asterisk/. Algunos usuarios pueden mantienen el archivo extensions.conf para
conservar las características que se configuran en la sección "general" de
extensions.conf.

Para volver a cargar extensions.ael2:

*CLI> ael2 reload

Hacer un debug de los Contextos:

*CLI> ael2 debug contexts

Hacer un debug de las macros:

*CLI> ael2 debug macros

Ejemplo:

context prueba {
1234 => { Dial(SIP/${EXTEN},45);
switch (${DIALSTATUS}) {
case BUSY:
Voicemail(b200);
break;
case NOANSWER:
Voicemail(u200);






}
}

Eso seria similar a esto:
bre
ak;
defa
ult:


}


Noop(Algo raro ha
pasado); Hangup;

[prueba]
exten => 1234,1,Dial(SIP/${EXTEN},45)
exten => 1234,n,GotoIf($[${DIALSTATUS}=’BUSY’]?BUSY)
exten => 1234,n,GotoIf($[${DIALSTATUS}=’NOANSWER’]?NOANSWER)
exten => 1234,n,Hangup()
154
exten => 1234,BUSY,Voicemail(b200)
exten => 1234,BUSY,Hangup()
exten => 1234,NOANSWER,Voicemail(u200);
exten => 1234,NOANSWER,Hangup()

¿Qué es ARA?


Asterisk permite ser configurado en una Base de Datos, mediante Asterisk Realtime
Architecture.

Por ejemplo soporta MySQL, podiendo migrar a la base de datos lo siguiente:

– Configuración de dispositivos SIP e IAX.
– Configuración de buzones de voz.
– Configuración de colas.

El fichero a configurar es extconfig.conf. El fichero res_mysql.conf contiene la
configuración de la base de datos.

ARA dispone de 2 tipos de Realtime: estático y dinámico:

– Estático: La configuración esta almacenada en la BD, pero Asterisk la carga al
arrancar como si fuera un fichero. Si se realiza algún cambio, es necesario hacer
un reload.

– Dinámico: La configuración esta almacenada en la BD y Asterisk realiza una
consulta a esa BD cada vez que necesita un dato. No es necesario hacer reload
si se han realizado cambios. Mucha carga para el servidor...
Todos los ficheros no soportan Realtime Dinámico como el fichero de colas
(queues.conf).

Ejemplo de configuración (extconfig.conf):
[settings]

;;RealTime Dynamic
;file => driver,database,table
;sipusers => mysql,asterisk,dispositivos_sip
;iaxpeers => mysql,asterisk,dispositivos_iax
;voicemail => mysql,asterisk,buzones

;;RealTime Static
;file => driver,database,table
;sip.conf => mysql,asterisk,sip_conf
;extensions.conf => mysql,asterisk,extensions_conf
;iax.conf => mysql,asterisk,iax_conf
;queues.conf => mysql,asterisk,queues_conf
;voicemail.conf => mysql,asterisk,voicemail_conf
155
Administración de Asterisk

La administración de Asterisk se hace por interfaz web o por la línea de comandos CLI
en modo administrador.

Interfaces web para Asterisk:

Asterisk GUI:


Interfaz gráfica para Asterisk creada por Digium.

El AsteriskGUI se creó para hacer que la configuración, gestión, y ajuste de su sistema
Asterisk sea menos complicado, proporcionando un fácil uso de la interfaz gráfica.

El AsteriskGUI es diferente de la mayoría de las interfaces que se han creado para su
uso con Asterisk, ya que la interfaz realmente manipula el Asterisk y los archivos de
configuración.

Se lanzó tras el lanzamiento del Asterisk Appliance.

Lo “bueno” de esta interfaz, es que lee la configuración que hemos escrito a mano, la
entiende y permite gestionarla vía web, algo que las demás interfaces no hacen
(siempre machacan los cambios o acuden a archivos externos incluidos para
saltarse esta dificultad, en lugar de plantarle cara).

Es importante que conozcamos estas GUI, porque Digium planea convertirla en un
estándar para las versiones Appliance, AsteriskNOW y Asterisk Business Edition.

En Agosto de 2008 Digium sacó la versión estable de Asterisk GUI 2.0.

Instalación:

Para instalar la interfaz gráfica web lo tenemos que hacer desde subversion, por ello
necesitaremos el cliente:

yum install subversion

En /usr/src:

svn checkout http://svn.digium.com/svn/asterisk-gui/branches/2.0 ast-gui
cd ast-gui
./configure
make && make install && make samples

Ahora configuramos los archivos para poder activar el pequeño servidor http que trae
Asterisk GUI y la autenticación para acceder:
156
En /etc/asterisk/http.conf:

[general]
enabled=yes
enablestatic=yes
En /etc/asterisk/manager.conf:
[general]
displaysystemname = yes
enabled = yes
webenabled = yes
port = 5038
;httptimeout = 60
bindaddr = 0.0.0.0

[admin]
secret = clave
read = system,call,log,verbose,command,agent,config
write = system,call,log,verbose,command,agent,config

Una vez guardados, comprobamos que todo ha ido bien:

make checkconfig

Con este último comando (el make checkconfig) confirmaremos que la configuración es
la correcta, sino nos dará algún mensaje de error. Tan solo deberemos asegurarnos que
está habilitado el manager en el puerto 5038 así como que existe un usuario valido en
el manager.conf y haber des comentado los parámetros en el archivo http.conf,
reiniciamos Asterisk y listo.

Arrancamos asterisk:

./asterisk -vvvgc

Ahora ya podemos ir a arrancar el script para finalizar la configuración:

http://ipServidor:8088/asterisk/static/config/cfgbasic.html.



FreePBX:


FreePBX es una completa aplicación web de PBX. Asterisk no viene con ninguna
Interfaz y no podemos conectar un teléfono en ella y hacerlo funcionar sin editar
archivos de configuración y crear un Dialplan para su uso.

FreePBX simplifica esto ofreciendo funcionalidades pre-programados accesibles a
157
través de una interfaz web amigable que le permite tener un PBX completamente
funcional casi de inmediato sin necesidad de programación.

FreePBX se basa en la pila LAMPA ™ (Linux, Apache, MySQL, PHP y Asterisk). Es un
sistema modular, con clic para instalar plugins descargables a través de Internet desde
el repositorio de módulo en línea.

Algunas de las características de FreePBX son:

- Agregar o cambiar la extensión y las cuentas de correo de voz en cuestión de
segundos.
- El soporte nativo de SIP, IAX, y los clientes de ZAP (otros criterios de valoración
son apoyados a través de extensiones personalizadas).
- Reducir los costos de larga distancia con LCR.
- Enrrutar las llamadas entrantes basándose en la hora del día.
- Crear Recepcionista digital interactiva (IVR).
- Grupos de llamada de diseño sofisticado.
- Gestión de llamadas con colas.
- Detectar y recibir los faxes entrantes.
- Copias de seguridad y restaurar el sistema.
- Guardar las grabaciones de audio de las llamadas.
- Ver detalle de llamadas con Asterisk-stat.
- Ver las extensiones y el estado de los trunks con Flash Operator Panel.
- Ver grabaciones de la conversación con Asterisk Recording Interface (ARI).
- Número ilimitado de Conferencias (limitado por la potencia de CPU disponible.
(300 usuarios simultáneos en conferencias sobre un Pentium 4 a 3 GHz, 600
con doble núcleo!)...
- Música en espera.

Instalación de FreePBX

1.) Instalar Asterisk.

2.) Deshabilitar SeLinux (si no lo desactivaste en la instalación del sistema
operativo).


En /etc/selinux/config -7 "selinux=disabled"


3.) Instalar paquetes necesarios para FreePBX

yum install e2fsprogs-devel keyutils-libs-devel krb5-devel libogg libselinux-
devel libsepol-devel libxml2-devel libtiff-devel gmp php-pear php-pear-DB
php-gd php-mysql php-pdo ncurses-devel audiofile-devel libogg-devel mysql-
158
devel zlib-devel perl-DateManip sendmail-cf kernel-devel openssl-devel
httpd sox spandsp mpg123

4.) Instalar lame

wget http://easynews.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz
tar zxvf lame-3.97.tar.gz
cd lame-3.97
./configure
make
make install

5.) Descargar FreePBX

wget http://mirror.freepbx.org/freepbx.tar.gz

6.) Instalar BD para FreePBX (mysql con password)

mysqladmin create asteriskcdrdb –p
mysql --user root -p asteriskcdrdb <
/usr/src/freepbx/SQL/cdr_mysql_table.sql
mysqladmin create asterisk –p
mysql --user root -p asterisk < /usr/src/freepbx/SQL/newinstall.sql
mysql -u root –p
GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost
IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED
BY 'password';
flush privileges;

7.) Cambios en el Sistema Linux

useradd -c "Asterisk PBX" -d /var/lib/asterisk asterisk
Cambiar el usuario y grupo apache por usuario y grupo asterisk
nano +231 /etc/httpd/conf/httpd.conf

Cambiar AllowOverride None a AllowOverride All
nano +329 /etc/httpd/conf/httpd.conf

8.) Instalar FreePBX

yum install db
cd /usr/src/freepbx
./start_asterisk start
./install_amp --username=asterisk --password=password
159
En /etc/rc.local -7 "/usr/local/sbin/amportal start"

chkconfig httpd on
chkconfig mysqld on

9.) Solucionar Problemas de Flash Operator Panel (Si no tienes instalado Fop2)

wget http://www.asternic.org/files/op_panel-0.29.tar.gz
tar xvfz op_panel-0.29.tar.gz
cd op_panel-0.29
cp op_server.pl /var/www/html/panel/
cp flash/operator_panel.swf /var/www/html/panel/
En el archivo op_server.cfg:
[general]
use_amportal_conf=1
//usuario y clave similar al registrado en el archivo
/etc/asterisk/manager.conf
manager_user=admin
manager_secret=password

10.) Solucionar Password de ARI

nano /var/www/html/recordings/includes/main.conf.php

$ari_admin_password = "password";

11.) Configurar Sendmail:

nano /etc/mail/sendmail.mc

define(`SMART_HOST', `relay.DOMAIN.com)dnl
MASQUERADE_AS(`pbx.DOMAIN.com')dnl
FEATURE(`masquerade_envelope')dnl
make -C /etc/mail

12.) Editar sip_nat.conf para NAT:
nano /etc/asterisk/sip_nat.conf
localnet=192.168.1.0/255.255.255.0
externhost=pbx.DOMAIN.com
externrefresh=10
fromdomain=DOMAIN.com o externip=ipPublica
nat=yes
160
qualify=yes
canreinvite=no

13.) Añadir extra codecs a la configuracion:
nano /etc/asterisk/sip_custom.conf
allow=gsm
allow=h261
allow=h263
allow=h263p
videosupport=yes
nano /etc/asterisk/iax_custom.conf
allow=gsm
allow=h261
allow=h263
allow=h263p
videosupport=yes

14.) Editar Configuracion de Correo:

nano /etc/amportal.conf

//Si la interface web de la PBX sera accedida desde internet o localmente.
AMPWEBADDRESS=pbx.DOMAIN.com o IpPublica o ip Privada

nano /etc/asterisk/vm_email.inc

remove "Visit http://AMPWEBADDRESS/cgi- bin/vmail.cgi?action=login
&mailbox=${VM_MAILBOX} to check your voicemail with a web browser.\n"
nano /etc/asterisk/vm_general.inc
[email protected] ;
// El email desde donde la notificacion pudo venir
fromstring=DOMAIN PBX ; // Nombre Real o email Sender

15.) Configuracion para Music on Hold:

chown asterisk /var/lib/php/session/
sed -i "s|upload_max_filesize = 2M|upload_max_filesize = 20M|"
/etc/php.ini
En /etc/httpd/conf.d/php.conf -7 echo "LimitRequestBody 20000000"
ln -s /var/lib/asterisk/moh /var/lib/asterisk/mohmp3

16.) Iniciar FreePBX
161
En consola -7 amportal start
En el Explorador en http://IpDelServidor/admin

Línea de comandos de Asterisk: CLI


Esta línea de comandos es bastante potente, y permite controlar y monitorizar gran
parte de la situación de la centralita.

Soporta el empleo de la tecla <Tabulador>, al estilo de las consolas de UNIX/GNU
Linux, por lo que para ver un listado de todos los comandos disponibles, basta con
presionar varias veces la tecla.

Asterisk CLI es la consola de Asterisk desde donde podemos “debugear” y comprobar
el funcionamiento de Asterisk.
Para acceder a ella debemos ejecutar:

service asterisk start
cd /usr/sbin
asterisk –r

El CLI permite acciones tales como:


Ver que versión de Astersik tenemos instalada:

*CLI> show versión


Tiempo que lleva en ejecución después del último reinicio:

*CLI> core show uptime


Recargar configuraciones en el PBX funcional
(necesario cuando modificamos algún archivo de configuración):
*CLI> reload


Mostrar aplicaciones registradas en Asterisk:

*CLI>show applications


Listar los canales definidos:

*CLI>show channels


Mostrar información sobre los codecs instalados :

*CLI>show codecs
162
Mostrar un cuadro de doble entrada con los tiempos de conversión entre
formatos de codecs:

*CLI>show translation

Es posible realizar una desconexión del CLI 'quit'.
Asterisk continuará ejecutándose en segundo plano.
Para matar al propio Asterisk desde el CLI, se puede utilizar el comando stop, en sus
tres variantes:


Detiene Asterisk al momento:

*CLI> stop now


Detiene Asterisk cuando no haya carga:

*CLI> stop when convenient


Detiene Asterisk cuando no haya carga y deja de aceptar peticiones de
llamadas a partir de este momento:

*CLI> stop gracefully

Nivel de “Verbose”: Este valor indica la cantidad de mensajes que se recibirán sobre los
eventos generales del sistema. Cuanto más alto, más información sobre lo que sucede
en la centralita se recibirá.

Este nivel, se puede establecer de varias formas:
Al arrancar el demonio:
sudo asterisk vvvvvv


Al conectarse al demonio:

sudo asterisk -rvvvvvvvv


Desde el CLI (Quitar opciones de visualización):

*CLI>set verbose O

Nivel de “Debug”: Este valor indica la cantidad de mensajes que se recibirán sobre los
eventos generales del sistema, pero utilizado normalmente para depurar problemas de
drivers o de aplicaciones.

Este nivel, se puede establecer de varias formas:
163
Al arrancar el demonio:

sudo asterisk dddd


Al conectarse al demonio:

sudo asterisk –rdddd


Desde el CLI (Recibir como máximo 30 mensajes):

*CLI> Set Debug 30


Realizar un debug de un canal:

*CLI>debug channel

Acciones del canal de consola (console channel):
Permite hacer un llamada desde la consola :
*CLI>console dial


Permite contestar una llamada desde la consola:

*CLI>console answer


Cuelga la llamada en curso en la consola:

*CLI>console hangup

Acciones sobre los módulos:


Cargar/descargar un módulo específico:

*CLI>module load/unload


Mostrar todos los módulos levantados:

*CLI>module show

Acciones del Dialplan:


Mostrar el plan de marcación actual:

*CLI>dialplan show


Guardar los cambios realizados:
164
*CLI>dialplan save

Agregar / eliminar una extensión en un contexto dado al plan de marcación:

*CLI>dialplan add/remove extensión

Incorporar / eliminar un include en un contexto dado en el plan de marcación:

*CLI>dialplan add/remove include

A través de la línea de comandos CLI también podemos controlar por ejemplo los
usuarios SIP e IAX2, el estado de las tarjetas de telefonía o los buzones de voz
existentes en la centralita Asterisk:

*CLI>sip show peers
*CLI>iax2 show peers
*CLI>zap show status
*CLI>voicemail show users

Para obtener información detallada sobre todos los comandos del CLI basta con poner:

*CLI>help

Versiones Enterprise de Asterisk:

Asterisk Appliance

Descripción:

El Asterisk Appliance (AA50) es un PBX basado y dirigido
hacia las PyMES (2-50 usuarios), oficinas remotas de
grandes organizaciones (2-50 usuarios por sitio), y los
proveedores de servicios gestionados para la premisa
CPE con las soluciones basadas en SIP o IAX trunking.

El AA50 también ofrece una solución híbrida alternativa (una combinación de las
aplicaciones de VoIP usando legado de equipo de telecomunicaciones) para los clientes
empresariales que todavía no están preparados para migrar a una solución de VoIP.

El Asterisk Appliance 50 tiene las características de la licencia comercial Asterisk
Business Edition ™, así como de la Digium AsteriskGUI 1.0 desarrollados.

El AA50 está disponible en las siguientes configuraciones: Sólo VoIP (S800i), ocho FXO
(S808B), y cuatro FXS y cuatro FXO (S844B).

Características:
165
-Servidor Asterisk completo con AsteriskGUI.
- Asterisk Business Edition con licencia comercial.
-Built-in Router Ideal para pequeñas oficinas.
-Hasta ocho puertos analógicos.
-Apoyo a una combinación de módulos FXO y FXS.
-1GB Compact Flash Card ®.
-Hardware base de Cancelación de eco.
-8 MB Onboard Flash.
-64 MB de RAM Onboard.
-5 Puertos Ethernet (4 LAN, 1 WAN)

Beneficios:

./ Paquetes “Todo en uno” con Hardware de Digium, Asterisk Digium Software,
sistema de documentación, y servicios de suscripción.
./ Mayor fiabilidad en el PC.
./ Baja necesidad de energía -7 Reducidos costes de propiedad.
./ Permite un completo despliegue ofreciendo rentables soluciones de telefonía
con una instalación sencilla y características como el auto-aprovisionamiento o
la posibilidad de utilización de teléfonos IP de Polycom.
./ Una suscripción añade la paz mediante la prestación de apoyo en cualquier
incidente, en curso de garantía, y en el acceso a las personas adecuadas.

Asterisk Business Edition ™

Software Digium

Digium ofrece Asterisk Business Edition, una versión
perfeccionada de la versión de fuente abierta Asterisk PBX,
para el sistema operativo Linux. Digium Partner también
ofrece productos que se integran con Asterisk Business
Edition y de fuente abierta Asterisk.

Descripción:

¿Por qué Asterisk Business Edition?

Asterisk es una completa plataforma de telecomunicaciones y representa una muy
valiosa pieza de software por una serie de razones:

- Reducción de los costos extrema
- Control y personalización
- Flexible dial plan
- Rich, característica de base amplia

Fácil de Instalar, configurar y Usar
166
Asterisk Business Edition incluye soporte rPath ™ distribución de Linux con una mejor
instalación, un manual técnico Asterisk, y una guía rápida; hace que Asterisk sea aún
más fácil de instalar, configurar y utilizar.

Para mejorar la interactividad del cliente con un Asterisk PBX, Asterisk Business Edition
se integra con el reconocimiento LumenVox ™ Engine ™ y Cepstral Texto-a-Habla. Una
versión de prueba de la Cepstral producto está incluido, y un puerto libre de Lumenvox
Lite también está disponible la solicitud a Asterisk Business Edition clientes. La compra
de una licencia es necesaria para activar funciones adicionales de estos productos.

Rendimiento, interoperabilidad y fiabilidad

El programa de pruebas de Digium asegura la fiabilidad, el rendimiento y la
interoperabilidad de Asterisk Business Edition con los principales equipos, software y
protocolos. Digium hardware tarjetas se realizarán las pruebas de la total
compatibilidad con Asterisk Business Edition, como son varios modelos de seleccionar
los servidores, VoIP, y los dispositivos TDM. Todas las principales funciones de
software en Asterisk Business Edition son testeadas para la funcionalidad y la
fiabilidad. Banco de pruebas de sistemas también son sometidos a extremas
condiciones de estrés Empirix ™ utilizando equipos de prueba para simular cientos de
miles de llamadas en el mundo real con diversas combinaciones y configuraciones.

Como resultado, los clientes pueden confiar en su probada combinación de Asterisk
Digium software y hardware que trabajan juntos para proporcionar una caracteristica-
rica VoIP PBX o sistema.

Características:

-Soporte de Asterisk Bussiness Ed.



-Hangup



-SayUnixTime
-AbsoluteTimeout -HasNewVoicemail -SendDTMF
-AddQueueMember -HasVoicemail -SetAccount
-ADSIprog -IAX2Provision -SetAMAFlags
-AgentCallbackLogin -ImportVar -SetCallerID
-AgentLogin -LookupBlacklist -SetCallerPres
-AgentMonitorOutgoing -LookupCIDName -SetCDRUserField
-AGI -Macro -SetCIDName
-Answer -MacroExit -SetCIDNum
-AppendCDRUserField -MacroIf -SetGlobalVar
-Authenticate -MailboxExists -SetGroup
-Background -Math -SetLanguage
-BackgroundDetect -MD5 -SetMusicOnHold
-Busy -MD5Check -SetRDNIS
-ChangeMonitor -MeetMe -SetVar
-ChanIsAvail -MeetMeAdmin -SIPAddHeader
-ChanSpy -MeetMeCount -SIPDtmfMode
-CheckGroup -Milliwatt -SIPGetHeader
-Congestion -Monitor -SoftHangup
-ControlPlayback -MP3Player -StartMusicOnHold
-Cut -MusicOnHold -StopMonitor
167

-DateTime -NoCDR -StopMusicOnHold
-DBDel -NoOp -StopPlayTones
-DBdeltree -Park -StripLSD
-DBGet -ParkAndAnnounce -StripMSD
-DBPut -ParkedCall -Suffix
-Dial -PauseQueueMember -System
-DigitTimeout -Playback -TestClient
-Directory -PlayTones -TestServer
-DISA -Prefix -Transfer
-DumpChan -PrivacyManager -TryServer
-DUNDiLookup -Progress -TXTCIDName
-Echo -Queue -UnpauseQueueMember
-Endwhile -Random -UserEvent
-EnumLookup -Read -Verbose
-Eval -ReadFile -VMAuthenticate
-Exec -RealTime -VoiceMail
-ExecIf -RealTimeUpdate -VoiceMailMain
-ExecIfTime -RemoveQueueMember -Wait
-Flash -RetryDial -WaitExten
-ForkCDR -ResetCDR -WaitForRing
-GetCPEID -ResponseTimeout -WaitForSilence
-GetGroupCount -Ringing -WaitMusicOnHold
-GetGroupMatchCount -SayAlpha -While
-Goto -SayDigits -Zapteller
-GotoIf -SayNumber -ZapBarge
-GotoIfTime -SayPhonetic -ZapScan

Beneficios:

Reducción de costos extrema

Combinado con la telefonía de bajo costo de hardware, Asterisk Business
Edition se puede utilizar para crear un PBX a una fracción del precio tradicional
de PBX y sistemas clave, proporcionando al mismo tiempo un nivel de
funcionalidad superior a la de muchos de los más caros sistemas disponibles.

Control

Asterisk Business Edition permite al usuario tomar el control de su sistema
telefónico. Una vez que la llamada es en una caja linux ® con Asterisk, nada se
puede hacer para él. De la misma forma que Apache le da al usuario un control
de grano fino sobre prácticamente todos los aspectos de su operación (y de su
carácter de fuente abierta da más flexibilidad), lo mismo se aplica a Asterisk.

Rápido Despliegue y desarrollo

Asterisk PBX permite la IVR y aplicaciones que se creó y desplegó rápidamente.
Su potente CLI texto y archivos de configuración permite una rápida
configuración y diagnóstico en tiempo real.
168
Rich, característica de base amplia

Porque es de código abierto Asterisk y que se aplica de software, no sólo
aportan características como el buzón de voz, menús de voz, IVR, y de las
conferencias, que son muy costosas para los sistemas de propiedad, sino que
también permite nuevas características que se añadirán rápidamente y con un
mínimo de Esfuerzo.

Personalización

A través de su apoyo a la internacionalización, los archivos de configuración, y
el código fuente, cada uno de los aspectos de Asterisk pueden ser ajustados.
Por ejemplo, los códigos de Asterisk para funciones de llamadas podría ser
cambiado para que coincida con un sistema existente.

Despliegue de contenido dinámico

De la misma forma que los servidores web como Apache permitirá a los
usuarios desplegar contenido dinámico, como la información de la cuenta, la
película muestra los tiempos, etc, en la web, Asterisk permite desplegar esos
contenidos dinámicos a través del teléfono, con la misma facilidad como CGI.

Marcado Extremadamente flexible

Asterisk es excepcionalmente flexible de marcado permite una integración sin
problemas de IVR y la funcionalidad PBX. Muchas de las características de
Asterisk (deseado y las características de la futura) se pueden aplicar usando
nada más que la extensión lógica. Asterisk apoya una mezcla de longitudes de
extensión.

Distribuciones Linux con Asterisk:

Las distribuciones con Asterisk más conocidas son:

Y AsteriskNOW
Y TrixBox
Y Elastix

El 80% de los usuarios que utilizan este tipo de distribuciones para montar su sistema
de comunicaciones, no saben cómo modifican los ficheros de configuración o
directamente jamás lo han hecho.

Los usuarios de distribuciones controladas por interfaz web suelen olvidar (o no
quieren reconocer)que toda interfaz es creada con un objetivo: simplificar la
configuración y gestión de una aplicación (en este caso, de Asterisk), esta
simplificación tiene un efecto muy negativo, impide realizar tareas que no han sido
previamente preparadas por los creadores de dicha interfaz o incluso han sido
169
desechadas por su complejidad y poca utilidad para un público general, se dice
entonces que esa distribución está “a merced” de lo que permita hacer la interfaz . En
muchos casos se puede pensar que no se puede hacer algo, simplemente porque la
interfaz web no lo permite.

AsteriskNOW


AsteriskNOW es el camino más rápido para empezar la construcción de soluciones
personalizadas de telefonía con Asterisk. Simplemente descarga el archivo. Iso,
grabarlo en un CD, colóquelo en la unidad de CD o DVD en el equipo de destino y en
menos de 30 minutos tendrá un sistema Asterisk funcional lista para su aplicación
personalizada de telefonía.

Instalar Asterisk y la costumbre comenzar a construir aplicaciones de telefonía con
AsteriskNOW. AsteriskNOW instala una distribución completa de Linux (rPath en las
primeras versiones y CentOs en la última versión 1.5), Asterisk, el marco de conductor
DAHDI, Asterisk-GUI, la base de datos MySQL, el servidor web Apache y una amplia
variedad de herramientas de desarrollo y componentes.

¿Qué es AsteriskNOW?

AsteriskNOW hace fácil crear soluciones personalizadas de telefonía por la instalación
automática de la "plomería". Gran parte de la complejidad de Asterisk y Linux es
manejado por el instalador y el GUI de administración. Los desarrolladores de
aplicaciones e intergrators pueden concentrarse en la construcción de su solución.
170
¿Qué puedo crear con AsteriskNOW?
Entre las muchas aplicaciones que puedes crear con AsteriskNOW son:
VoIP Gateway Servidor IVR
Skype Gateway Sistema de buzón de voz
IP PBX Call Recorder
Call Center ACD Servidor de fax
Conferencia de
Puente
Speech Server

¿A quién está dirigido?

AsteriskNOW fue construido para los desarrolladores de aplicaciones, integradores de
sistemas, estudiantes, piratas informáticos y otros que quieren para crear soluciones
personalizadas con Asterisk.

¿Quién apoya a AsteriskNOW?

Los usuarios de AsteriskNOW tienen dos opciones. Hay una comunidad activa de
usuarios de AsteriskNOW, integradores y desarrolladores que ofrecen apoyo a la
comunidad en los foros de AsteriskNOW y lista de correo.

Digium ofrece suscripciones de soporte comercial para AsteriskNOW. Si su aplicación
requiere el apoyo directo del fabricante, consulta la página de suscripciones.

Características y funciones:

AsteriskNOW tiene una larga lista de características que lo convierten en el preferido
de Asterisk listo para ejecutar la distribución:

- Instalación fácil y rápida. Normalmente se instala en 15 minutos o menos.
- No requiere un profundo conocimiento de Linux. Seguro para los usuarios de
Mac y Windows.
- Web-interfaz de configuración basada en las tareas de gestión hace que la
mayoría de apuntar y hacer clic.
- Los datos Construir aplicaciones dirigidas con soporte integrado para ODBC y
HTTPS.
- Asistente para la configuración de las conexiones de VoIP hace que sea fácil de
conectar.
- Instalación de pre-construidos, paquetes de aplicaciones utilizando el
administrador de aplicaciones.
- Detección automática y la configuración de analógicas Digium y hardware de
telefonía Digitial.
171
- Sound Manager hace fácil crear, instalar y gestionar el sistema de mensajes y
grabaciones.
- Dialplan y editor de secuencia de comandos AEL con resaltado de sintaxis y
validación simplifica el desarrollo.
- Nombre y Call Detail Record (CDR) Viewer proporciona acceso instantáneo a la
actividad del sistema.
- Integrado de texto de ayuda para las aplicaciones, funciones, CLI, AGI y los
comandos de AMI.
- En tiempo real de seguimiento y depuración de la consola ayuda a simplificar el
proceso de desarrollo.
- Paso a paso el desarrollo de aplicación tutoriales enseñar los fundamentos
rápidamente.
- Apoyo a la creación de agrupaciones y de alta disponibilidad que sea fácil de
escalar las aplicaciones.
- Actualizaciones automáticas mantener su sistema en armonía y seguridad.
- Ahorre dinero con una oferta especial en el apoyo de Digium y servicios de
formación.

Actualidad:

El 1 de Abril Digium publicó la versión estable de AsteriskNOW 1.5.0.
Digium publicó su primera beta de esta versión en Octubre de 2008 y
ya iba siendo hora de que lo actualizaran. Los principales cambios:

Distribución CentOS actualizado. Web
basada en httpd y FreePBX Asterisk
1.6 con soporte de DAHDI. Versiones
x86 (32 bits) y x64 (64 bits)

Podéis descargarlo de aquí: http://www.asterisknow.org/downloads.

TrixBox

TrixBox es una distribución basada en CentOS que comercializa la empresa Fonality.
Esta distribución tiene una versión gratuita y es de las distribuciones rápidas, una de
las más utilizadas por newbies.
172


Una vez instalado TrixBox, el sistema dispone de:

Asterisk
Apache
MySQL
SugarCRM
ARI
FreePBX

Principales características

Trixbox es una completísima y poderosa plataforma. Los productos que incluye son:

TrixBox dashboard
Asterisk (tm) Open Source PBX
FreePBX herramienta web de administración
SugarCRM
Munin (en paquete administrador)
HUDLite server/admin (en paquete administrador)
IVRGraph (en paquete administrador)
phpMyAdmin (en paquete administrador)
Webmin (en paquete administrador)
Códecs que soporta:
ADPCM
G.711 (A-Law & μ-Law)
G.722
G.723.1 (pass through)
G.726
G.729 (through purchase of a commercial license)
GSM
iLBC
173
Protocolos con los que trabaja:

IAX™ (Inter-Asterisk Exchange)
IAX2™ (Inter-Asterisk Exchange V2)
H.323
SIP (Session Initiation Protocol)
MGCP (Media Gateway Control Protocol
SCCP (Cisco® Skinny®)
Traditional Telephony Interoperability
FXS
FXO
DTMF support
PRI Protocols

Versiones de TrixBox:

Trixbox posee dos tipos de versiones:

1) TrixBox CE (Community Edition)

Comenzó en el año 2004 como un proyecto popular PBX denominado
Asterisk@Home. Desde ese momento se convirtió en la distribución más
popular, con más de 65.000 descargas al mes. Dicha versión se caracteriza por
dos pilares importantes: su flexibilidad para satisfacer las necesidades de los
clientes y, sobre todo, por ser gratuita.

¿Por qué utilizar TrixBox CE?

Como se acaba de comentar TrixBox CE es una versión muy flexible, que no solo
permite configurar funciones y módulos parametrizables para las necesidades de
cada cliente, sino que también es posible acudir a la comunidad de TrixBox para
ayudar o ser ayudado. Esta es una de las más grandes y más activas del mundo y
sus miembros trabajan entre ellos día a día con el fin de responder consultas,
resolver problemas, fallos y en seguir desarrollando la herramienta.

¿Quién utiliza TrixBox CE?

Empresas de todo el mundo, desde aquellas que posen muy pocas estaciones
de trabajo, hasta medianas compañías que poseen cientos de empleados.

2) TrixBox Pro (Versión comercial de pago)

Es una solución denominada "hibrid-hosted", que significa que el cliente puede
realizar una monitorización 24 horas al día los 7 días de la semana, administrar la
central desde cualquier lugar y recibir actualizaciones del software de manera
automática. Trixbox Pro es una versión empresarial que se ejecuta sobre
tecnologías PBXtra, comercializada desde el 2004 permitiendo enviar/recibir más
de 120 millones de llamadas por día. La familia trixbox Pro posee 3 versiones:
174
Standard Edition (SE)
Enterprise Edition (EE)
Call Center Edition (CCE)

Características y beneficios:

1. Gratis y flexible:
Las 3 versiones poseen las siguientes características:
Standard Edition (SE) : Gratis.
Enterprise Edition (EE) y Call Center Edition (CCE): coste mensual muy
bajo o una cuota de por vida.

2. Fácil instalación, uso y configuración:

Posee un instalador que hace que la instalación sea sencilla; posee, además, un
administrador intuitivo y un panel de control que facilita la instalación,
configuración y administración.

3. Características avanzadas:

Posee características como contestador automático, integración con el Outlook,
voicemail a email, informes, llamadas en conferencia, etc.

4. HUD:

El Hud es una herramienta denominada de "todo en uno", que permite a los
empleados poder manejar las comunicaciones de la empresa desde su propio
escritorio. De esta manera pueden acceder a chats privados, realizar llamadas
con hacer un solo clic, realizar transferencia de llamadas, etc.

5. Seis idiomas:

El panel de control de trixbox Pro está en 6 idiomas, permitiendo así que
cualquier usuario pueda configurar la central: Inglés, Francés, Español, Alemán,
Italiano y Portugués.

Descripción de las principales características de TrixBox Pro:

Contestador Automático (IVR):

Una de sus características es la funcionalidad de Contestador-Automático que
guía a los que llamen según las opciones predefinidas. Esta característica en
este producto es muy poderosa y fácil de usar con solo unos clics. Se puede
configurar el flujo de las llamadas, redirigir llamadas fuera del lugar de trabajo y
algunas opciones más.
175
Integración con Outlook:

Llamadas entrantes: cuando el teléfono suena, el identificador de llamadas
puede analizar contra los contactos del Outlook y si una coincidencia es
encontrada se mostrara una ventana con el nombre de la persona.

Hacer llamadas desde su casilla de entrada personal: basta con hacer clic con el
botón derecho en el contacto o en un mensaje del contacto para llamarle.

Buzón de voz:

Ofrece cuatro maneras fáciles de almacenar mensajes:

• Presionando un botón en el teléfono.
• Marcando remotamente desde cualquier teléfono.
• Recibiendo archivos .WAV adjuntos en el mail.
• Escuchando a través del panel de control web.

Mensajes de voz a email:

La posibilidad de recibir mensajes de voz como simples emails. Trixbox viene
preconfigurado para enviar a cada empleado un email cuando estos reciban un
mensaje de voz. También se puede tener el audio adjunto al email y escucharlo
directamente en la bandeja de entrada.

Scheduler:

Se pueden reproducir diferentes mensajes a las personas que llaman según la
hora del día. Configurar un menú totalmente diferente los fines de semana con
opciones diferentes que se pueden elegir.

Teléfonos analógicos e IP:

Es el sistema de teléfonos más flexible del mercado, soportando todos los
teléfonos analógicos y numerosos teléfonos IP de marcas como Cisco, Polycom,
Aastra, SwissVoice y Snom.

VoIP:

Trixbox está preparado para VoIP dependiendo del producto que se esté
usando, el cual limita la cantidad de teléfonos posibles. Fácilmente se puede
conectar TrixBox con cualquier proveedor de VoIP (SIP o IAX).

Panel de control web:

Ofrece una interfaz web fácil de usar. Un panel de administrador que maneja
todos los aspectos del TrixBox remotamente y un panel de usuario para
empleados que les permite manejar sus configuraciones personales (como
176
escuchar sus mensajes de voz, responder llamados mediante un clic, traspaso
de llamadas, etc.) desde cualquier parte.

Reportes y monitorización:

Con esta característica se pueden analizar en tiempo real los registros de
llamadas para cualquier extensión usando potentes filtros y parámetros de
búsqueda. También provee informes de los gastos que un cliente ha hecho o su
registro de llamadas individual. Todos estos informes pueden ser exportados en
formato .csv.

Puentes para conferencias:

Los puentes para conferencias vienen preconfigurados gratuitamente y
soportan un número ilimitado de participantes internos y externos.

Soporte de sucursales:

Desarrollo de servidores de bajo coste en cada sucursal u oficina. Algunas de las
opciones de las que se disponen en esta característica:

Llamadas gratis entre sucursales vía VoIP.
Traspaso de llamadas a cualquier extensión que esté conectada al
servidor.

Elastix


Elastix es un software aplicativo que integra las mejores herramientas disponibles para
PBXs basados en Asterisk en una interfaz simple y fácil de usar. Además añade su
propio conjunto de utilidades y permite la creación de módulos de terceros para hacer
de este el mejor paquete de software disponible para la telefonía de código abierto.

Elastix implementa gran parte de su funcionalidad sobre 4 programas de software muy
importantes como son Asterisk, Hylafax, Openfire y Postfix. Estos brindan las funciones
de PBX, Fax, Mensajería Instantánea y Correo electrónico respectivamente.

La meta de Elastix son la confiabilidad, modularidad y fácil uso. Estas características
añadidas a la robustez para reportar hacen de él, la mejor opción para implementar un
PBX basado en Asterisk.
177
























Características:

Es difícil hacer una lista con todas las características de Elastix en un simple listado,
pero las más importantes son:

VoIP PBX:

Grabación de llamadas con interfaz vía Web.
Voicemails con soporte para notificaciones por e-mail.
IVR configurable y bastante flexible.
Soporte para sintetización de voz.
Herramienta para crear lotes de extensiones lo cual facilita instalaciones
nuevas.
Cancelador de eco integrado.
Provisionador de teléfonos vía Web. Esto permite instalar numerosos teléfonos
en muy corto tiempo.
Soporte para Video-teléfonos.
Interfaz de detección de hardware de telefonía.
Servidor DHCP para asignación dinámica de IPs a Teléfonos IP.
Panel de operador. Desde donde el operador puede ver toda la actividad
telefónica de manera gráfica y realizar sencillas acciones drag-n-drop como
transferencias, aparcar llamadas, etc.
Aparcamiento de llamadas.
Reporte de detalle de llamadas (CDRs) con soporte para búsquedas por fecha,
extensión y otros criterios.
Tarifación con informes de consumo por destino.
Informe de uso de canales por tecnología (SIP, ZAP, IAX, H323).
Soporte para colas de llamadas.
Centro de conferencias. Desde donde se puede programar conferencias
estáticas o temporales.
178
Soporta protocolo SIP, IAX, H323, MGCP, SKINNY entre otros.
Codecs soportados: ADPCM, G.711 (A-Law & μ-Law), G.722, G.723.1 (pass
through), G.726, G.729 (si se compra licencia comercial), GSM, iLBC.
Soporte para interfaces análogas FXS/FXO.
Soporte para interfaces digitales E1/T1/J1 a través de protocolos PRI/BRI/R2.
Soporte para interfaces bluetooth para celulares (canal chan_mobile).
Identificación de llamadas.
Troncalización (uso de trunks).
Rutas entrantes y salientes las cuales se pueden configurar por coincidencia de
patrones de marcado lo cual da mucha flexibilidad.
Soporte para follow-me.
Soporte para grupos de timbrado.
Soporte para paging e intercom. El modelo de teléfono debe soportar también
esta característica.
Soporte para condiciones de tiempo. Es decir que la central se comporte de un
modo diferente dependiendo del horario.
Soporte para PINes de seguridad.
Soporte DISA.
Soporte Callback.
Editor Web de archivos de configuración de Asterisk.
Acceso interactivo desde el Web a la consola de Asterisk.

Fax:

Servidor de Fax administrable desde Web.
Visor de Faxes integrado, pudiendo descargarse los faxes desde el Web en
formato PDF.
Aplicación fax-a-email. Personalización
de faxes-a-email. Control de acceso
para clientes de fax.
Puede ser integrado con WinprintHylafax. Esta aplicación permite, desde
cualquier aplicación Windows, enviar a imprimir un documento y este
realmente se envía por fax.
Configurador Web de plantillas de emails.

General:

Ayuda en línea incorporada.
Elastix está traducido a 22 idiomas.
Monitor de recursos del sistema.
Configurador de parámetros de red.
Control de apagado/re-encendido de la central vía Web.
Manejo centralizado de usuarios y perfiles gracias al soporte de ACLs.
Administración centralizada de actualizaciones.
Soporte para copias de seguridad y la restauración de las mismas a través del
Web.
Soporte para temas o skins.
179
Interfaz para configurar fecha/hora/huso horario de la central.

Email:

Servidor de correo electrónico con soporte multidominio.
Administrable desde Web.
Interfaz de configuración de Relay.
Cliente de Email basado en Web.
Soporte para "cuotas" configurable desde el Web.
Soporte Antispam.

Colaboración:

Calendario integrado con PBX con soporte para recordatorios de voz.
Libreta telefónica (Phone Book) con capacidad clic-to-call.
Dos productos de CRM integrados a la interfaz como vTigerCRM y SugarCRM.

Extras:

Interfaz de generación de tarjetas de telefonía basada en software A2Billing.
CRM completo basado en el producto vTigerCRM.
También versión de código abierto de SugarCRM.

Centro de llamadas:

Módulo de centro de llamadas con marcador predictivo incluido.

El módulo de centro de llamadas puede manejar tanto campañas de llamadas
entrantes como salientes. Algunas de las características son:

- Soporte para lista de números no-llamar (Do-Not-Call List).
- Soporte para campañas entrantes y salientes.
- Asociación de formularios por campaña.
- Asociación de guión por campaña.
- Consola de agente.
- Soporte para breaks, siendo estos configurables y de diferentes
tipos.
- Marcador predictivo de código abierto.
- Informes avanzados.

Mensajería instantánea:

Servidor de mensajería instantánea basado en OpenFire e integrado a PBX con
soporte para protocolo Jabber, lo que permite usar una amplia gama de
clientes de mensajería instantánea disponibles.
Se puede iniciar una llamada desde el cliente de mensajería (si se usa el cliente
Spark).
El servidor de mensajería es configurable desde Web.
180
Soporta grupos de usuarios.
Soporta conexión a otras redes de mensajería como MSN, Yahoo Messenger,
GTalk, ICQ, etc. Esto permite estar conectado a varias redes desde un mismo
cliente.
Informe de sesiones de usuarios.
Soporte para plugins.
Soporta LDAP.
Soporta conexiones server-to-server para compartir usuarios.

Soporte para hardware de telefonía:

Elastix cuenta con un buen soporte para hardware de telefonía, contando con drivers
para los principales fabricantes de tarjetas como:

OpenVox
Digium
Sangoma
Rhino Equipment
Xorcom
Yeastar

La mayoría de estos controladores se soportan a través de los drivers del proyecto
Zaptel o versiones modificadas del mismo. Otros se soportan en base al proyecto
mISDN u otros.

Elastix también soporta muchas marcas de teléfonos gracias a que los protocolos SIP e
IAX que usa Asterisk lo permiten. Estos protocolos son abiertos por lo que
prácticamente cualquier fabricante puede implementar un teléfono que se comunique
sobre estos estándares.
Algunos fabricantes de teléfonos soportados son:
Polycom
Atcom
Aastra
Linksys
Snom
Cisco
Nokia
UTstarcom

Casos de uso de una Centralita Asterisk:


Centralita nueva con conexiones y extensiones de varios tipos. Pasarela
para dotar a una centralita tradicional de servicios nuevos. Pasarela
para dotar a una centralita tradicional de nuevas extensiones.
Varias Oficinas con un Asterisk Centralizado.
181
Varias Oficinas con Sistemas Asterisk interconectados.


Centralita nueva con conexiones y extensiones de varios tipos.



Pasarela para dotar a una centralita tradicional de servicios nuevos.

Posibles servicios: Conexión con Operador IP, Buzón de Voz a email, Sistema de
respuesta automático, etc.


182
Pasarela para dotar a una centralita tradicional de nuevas extensiones.

Para poder hacer esto la centralita tradicional debería poder programarse para ello.



Varias Oficinas con un Asterisk Centralizado.

De esta forma, además de comunicaciones entre Sedes, todas las sedes pueden hacer
llamadas al exterior a través de la central Asterisk. Las extensiones externas podrán
seguir el protocolo SIP o el Protocolo IAX.


183
Varias Oficinas con Sistemas Asterisk interconectados.


Todos los Asterisk Pueden utilizar los otros Asterisk para hablar con números de las
provincias donde se encuentran.Entre ellos se pueden conectar mediante IAX o SIP,e
incluso se puede montar un plan de numeración único entre todos.











Extensión101 Extensión102 Extensión101 Extensión102
184
Ampliación del sistema de telefonía de una empresa

Supongamos una empresa con una infraestructura de comunicaciones tradicional,
basada en una red de telefonía y una red de datos independientes.

El sistema de telefonía está controlado por una PBX propietaria que da servicio a un
determinado número de extensiones analógicas y digitales, y que se encuentra
conectada a la red de telefonía pública.

La empresa experimenta un crecimiento inesperado, pero bienvenido, de personal y la
PBX alcanza su máxima capacidad y todavía quedan extensiones por asignar.



























Solución Uno: Ampliación de la PBX con los módulos apropiados, siempre que
ese modelo no se encuentre descatalogado por el fabricante, asumiendo el
elevado coste de este tipo de hardware y exponiéndonos a la misma situación
en crecimientos futuros.


Solución Dos: Compra de nueva PBX, con mayores prestaciones y módulo de
VoIP para acercar la empresa a la nueva tecnología. Lo que supone costes
elevadísimos, dependencia del fabricante y poca flexibilidad en las aplicaciones
disponibles.

./ Solución Asterisk: Instalación de una centralita Asterisk que aprovechando la
PBX antigua, ofrece nuevas extensiones analógicas y/o digitales con hardware
de menor coste. Pero que, sobretodo, ofrece un número mucho mayor de
extensiones VoIP sin hardware adicional, y con gran escalabilidad para
próximas ampliaciones.
185

























Soluciones de Asterisk para sistemas de telefonía entre sedes
remotas


Una ventaja inmediata de las soluciones de telefonía IP consiste en la posibilidad de
realizar llamadas entre sedes remotas sin coste e integrando el sistema de numeración
(extensiones) entre ellas.

Asterisk ofrece una solución ideal para este tipo de organizaciones con sedes distantes.

Sistema Centralizado


Existe un servidor centralizado por donde entran y salen las llamadas a la red de
telefonía tradicional, y que se encarga de gestionar los clientes de VoIP (extensiones
VoIP) de todas las delegaciones.


186
Sistema Distribuido


Cada delegación tiene su propia centralita Asterisk conectada a la red WAN de la
empresa (A través de internet o líneas dedicadas) y a la red telefónica.

Entre los Asterisk, a través del protocolo IAX (Inter-Asterisk eXchange) intercambian
información de rutado, permitiendo una gestión del sistema de telefonía de la
compañía y un rutado inteligente de llamadas.




La revolución Asterisk


Cambio en el concepto de PBX

Probablemente lo más importante de Asterisk es que no es un sistema de telefonía en
caja negra. Es una plataforma de comunicaciones basada en un servidor informático.
Esto no sólo cambia la manera de concebir los sistemas de telefonía, sino que además
presenta una serie de ventajas sorprendentes.

Flexibilidad y Customización

Efectivamente una instalación Asterisk puede ser diseñada, configurada,
conectada e instalada de diferentes maneras, por lo que se convierte en una
solución universal para todas las necesidades.


Asterisk puede aceptar conexiones a teléfonos locales, pero
también a teléfonos en otras partes del mundo, que se convierten
en parte de la red telefónica de su oficina.
187
Asterisk puede interconectarse usando señalización analógica, digital
o IP.


Asterisk funciona igual de bien con viejos teléfonos analógicos que
con teléfonos IP o SoftPhones, que son en realidad software del PC.

Escalabilidad

Asterisk es una solución muy buena de PBX para una pequeña oficina con 2 o 3
extensiones internas y 1 línea saliente, pero también funciona perfectamente
para una plataforma de comunicaciones de una empresa con 900 teléfonos IP,
centenares de llamadas simultáneas y varios primarios RDSI.

Para Asterisk el tamaño no importa. Sin ningún coste añadido incluso la
instalación más pequeña puede ofrecer las características más avanzadas de
telefonía como IVR, buzón de voz, conferencias, servicio hasta ahora reservado
a las grandes empresas.

Es importante recordar que Asterisk puede crecer de forma lineal según sus
necesidades. ¿Necesita otro teléfono en su oficina? Sólo debe comprar el
teléfono; no deberá modificar las licencias de hardware o software ni justificar
gasto alguno ante el Departamento de Finanzas.

Integración

Asterisk puede integrarse con otros sistemas TI (Tecnologías de Información) en
la organización empresarial, aportando así un valor añadido a los procesos de
negocio nuevos y/o mejorados.

A continuación presentamos una serie de ejemplos que ilustran el valor
añadido que representa para una empresa integrar las telecomunicaciones y
otros sistemas TI.

Ejemplos de uso de Asterisk:

Ejemplo 1: Centros médicos – Llamada recordatoria


Cuando a un paciente le dan cita con semanas e incluso meses de antelación, es
probable que se olvide del día. Si no acude a la cita repercutirá en los ingresos de ese
día y el personal médico estará desocupado el tiempo previsto para la consulta.

A fin de mejorar su funcionamiento y rendimiento, los centros médicos pueden instalar
un sistema telefónico basado en Asterisk, que tras integrarlo con la agenda de visitas
programadas, llamará al paciente el día o semana anterior recordándole su cita
mediante un mensaje de voz grabado. De esta manera se garantizan los ingresos
previstos y se aumenta la productividad.
188
Ejemplo 2: Centros de telemarketing – Integración con sistemas CRM


Los centros de telemarketing llamarán a una lista de números para intentar vender a
los usuarios un producto o servicio. La lista con los números se descarga en el software
CRM (Customer Relationship Management).

El sistema CRM contacta con el sistema de comunicaciones pidiendo que se marque de
forma automática el número y de esta manera tener una serie de mejoras:

• Llamada automática: los agentes sólo deben hacer clic sobre el número de
teléfono que aparece en la pantalla y el sistema marca el número.
• Registro de llamadas: el sistema de comunicaciones genera
automáticamente una entrada para cada llamada como parte del historial
telefónico del cliente.
• Centrarse en el objetivo: el sistema de comunicaciones puede programarse
de modo que en horas laborables sólo marque números de la lista de
números, impidiendo a los empleados realizar llamadas personales.

Esta integración genera más productividad al acelerar la cadencia de trabajo y centrar
a los agentes en la tarea que están llevando a cabo. También disminuye los costes no
relacionados con las operaciones de la empresa.

Ejemplo 3: Agencias de viajes (Self service)


Una agencia de viajes contrata vuelos, estancias en hoteles y visitas para sus clientes.
En contextos como excursiones o viajes de trabajo son habituales las cancelaciones y
los cambios de planes. ¿Qué sucede si hay que cancelar fuera de horarios de oficina?
¿Qué pasa si hay una avalancha de llamadas entrantes?

Integrando el sistema de comunicaciones con el sistema de reservas, los clientes
podrán llamar y cambiar o cancelar su reserva mediante menús interactivos. Por lo
tanto, la agencia de viajes podrá optimizar los costes operativos y los costes derivados
de proveedores (hoteles y empresas de transporte).


La complejidad Asterisk


Los expertos resaltan que en cualquier Software sea libre o cerrado sus ventajas y
riesgos están directamente relacionados con su uso adecuado. Y recuerdan que
Asterisk es un sistema complejo, aunque sea una solución avanzada basada en
software abierto.

Es necesario apoyarse en un equipo técnico o empresas externas que conozcan bien
Asterisk para que su implantación y ciclo de vida sea plenamente satisfactorio.
189
En muchos proyectos no solo se tiene que considerar un servicio de instalación,
soporte sino también la integración con otros sistemas de la compañía.

En el terreno de los problemas que puede presentar Asterisk hay que aclarar que por sí
solo no ofrece escalabilidad o alta disponibilidad, pero se puede alcanzar una solución
intermedia de alta disponibilidad a través de la redundancia y usando software de
terceros.

¿Y el futuro?

“Asterisk es un software abierto y como tal su evolución es posible gracias a una
comunidad de usuarios y empresas que comparten su código y experiencias a través de
Internet. Los Call Centers son los primeros beneficiados de una herramienta como
Asterisk ya que para ellos el PBX es un componente imprescindible para prestar sus
servicios .Igualmente las empresas que pueden beneficiarse de Asterisk no solo para
reducir costes sino también para crear soluciones más sostenibles para diferentes tipos
de negocios”, señala Iván Sixto, CEO Business Development manager de I6NET.

Sobre el futuro de Asterisk podría trazarse un paralelismo a la situación que
experimenta Linux en el mercado de los sistemas operativos. “No se convertirá en un
monopolio, pero será un rival totalmente viable en ambos campos. Especialmente en
tiempos de recortes de costes como los que se avecinan, aunado con un cambio en la
tecnología (Voz IP) tendrá una oportunidad única de sustituir a soluciones existentes”,
señala Eduardo Malpica, responsable de Consultoría Preventa de Altitude Software
España.

Conclusiones

La adopción de una centralita VoIP no debería ser una opción para aquellas personas o
entidades que hayan llegado a la conclusión de que necesitan una centralita, sino que
debería verse como algo inevitable.

Los grandes operadores siguen cobrando precios desorbitados por un servicio que,
desde la aparición de Internet y la interconexión de grandes redes, ha perdido su razón
de ser: la transmisión de voz.

Asterisk está revolucionando el mundo de la telefonía, nunca existió una herramienta
tan completa, versátil, extensible y flexible en la industria de las comunicaciones de
voz, y es que tiene una potencia y escalabilidad que es inalcanzable, en relación
prestaciones-precio, para ninguna centralita convencional.

Además gracias a que es libre, en licencia y en código, el único límite que existe para
los servicios que podemos ofrecer, es nuestra imaginación.

Una vez más se demuestra que el paradigma Open Source funciona, y funciona bien,
no existen productos comerciales que superen en calidad y características a otros
proyectos como son Linux, Apache o Mozilla, por mencionar unos cuantos.
Asterisk es en pocas palabras, el futuro de la telefonía.
190




























Capítulo

3






Pruebas realizadas











Iniciación en Linux

Como todo iniciado en el mundo Linux, lo primero en lo que me centre fue en la
elección de la distribución correcta para tener un aprendizaje lo más rápido posible.
Tras mirar lo que me ofrecía cada una de las siguientes distribuciones, decidí instalar
Kubuntu 9.04.


191















192










Kubuntu & Asterisk

Pese a que el aprendizaje y familiarización con Linux fue sencillo y breve no lo fue tanto
el primer contacto con Asterisk y tampoco la primera instalación aunque la información
en cuanto a instalar de este tipo centralitas es abundante para la mayoría de las
distribuciones Kubuntu no es de las más habituales o empleadas .Tras conseguir un
funcionamiento correcto de la centralita Asterisk pasé a informarme sobre las
distribuciones más empleadas para crear servidores de este tipo.
193

Elección del servidor adecuado para Asterisk


¿Qué hay que tener en cuenta en la elección del servidor Asterisk?

Para la elección del equipo servidor de nuestro sistema Asterisk deberemos tener en
cuenta:

• Número de usuarios, o extensiones internas, del sistema y tecnología
empleada, VoIP o teléfonos analógicos.
• Códecs empleados y necesidades de conversión.
• Cantidad de tráfico de voz esperado.
• Existencia de conferencias.
• Funcionalidades avanzadas como menús interactivos de voz, integración con
aplicaciones informáticas empresariales, sistemas de facturación,…


¿Cuál es la mejor distribución para instalar Asterisk?

“Asterisk funciona perfectamente bajo cualquier distribución”

No obstante, según una encuesta que se realizó hace algún tiempo en la página web
de los usuarios de Asterisk-ES (foro de Asterisk), la mayoría se decantan por dos:
Debian y CentOS.

CentOS (acrónimo de Community ENTerprise Operating System)
es un clon a nivel binario de la distribución Red Hat Enterprise
Linux, compilado por voluntarios. Es una alternativa para
aquellos que quieren usar la plataforma RHL pero no quiere
alejarse de sus principios de software libre.

Otra ventaja que tiene CentOS es la gran cantidad de usuarios que trabajan con esta
distribución y la cantidad de paquetes en ‘rpm’ que existen, lo que hace que existan
multitud de foros de usuarios que preguntan y responden basados en esta
distribución.
Debian es muy usado por su gran estabilidad y seguridad. Su gran
estabilidad se basa en que llevan mucho tiempo arreglando los bugs
que puede tener cierto programa antes de ser liberado como
estable. Sin embargo este proceso puede durar hasta años por lo
que muchos no son tan pacientes en esperar y quizás decidan en
migrar a otra distribución.

Mi elección definitiva para las prácticas y el montaje de la centralita Asterisk fue
CentOs 5.4. Para instalarlo seguí el siguiente manual.
194

Puesta a punto del servidor antes de la instalación de Asterisk:


Servidor HTTP Apache

Apache es un proyecto nacido para crear un servidor web estable, fiable y veloz para
plataformas Unix. Apache nace, por una parte, de un código ya existente y de una serie
de patch para mejorar su fiabilidad y sus características; de ahí su nombre: ¡A PAtCHy
sErver! El equipo de desarrollo, además, está formado por voluntarios, repartidos por
todo el mundo, que sigue manteniendo este servidor web libre.

Instalación

yum install httpd httpd-devel php php-common php-devel

Arranque de Apache

Iniciar el servicio

service httod start
chkconfig httpd on
Parar el servicio

service httpd stop

Reiniciar el servicio

service httpd restart

Servidor DHCP (DHCPD)

DHCP es un protocolo diseñado principalmente para ahorrar tiempo gestionando
direcciones IP en una red grande. El servicio DHCP está activo en un servidor donde se
centraliza la gestión de la direcciones IP de la red. Hoy en día, muchos sistemas
operativos incluyen este servicio dada su importancia.

Funcionamiento

El funcionamiento DHCP se basa en la arquitectura cliente / servidor (como casi todos
los servicios de Internet), por lo que hace falta un servidor DHCP (dhcpd) y el cliente
DHCP para su funcionamiento. En el caso más simple es un servidor DHCP el que recibe
la solicitud de asignación de dirección IP ( y el resto de los parámetros de
configuración) del cliente. Si no existe un servidor DHCP se necesitará un agente
(normalmente un router) que sabe la dirección del servidor DHCP.

El protocolo funciona en cuatro pasos:

• DHCP discover
• DHCP offer
• DHCP request
• DHCP ACK
195



Modos en DHCP

Existen 3 modos en DHCP para poder asignar direcciones IP a otros equipos:

Asignación manual: El administrador configura manualmente las direcciones IP
del cliente en el servidor DCHP. Cuando la estación de trabajo del cliente pide
una dirección IP, el servidor mira la dirección MAC y procede a asignar la que
configuró el administrador.
Asignación automática: Al cliente DHCP (ordenador, impresora, etc.) se le
asigna una dirección IP cuando contacta por primera vez con el DHCP Server.
En este método la IP es asignada de forma aleatoria y no es configurada de
antemano.
Asignación dinámica: El servidor DHCP asigna una dirección IP a un cliente de
forma temporal. Digamos que es entregada al cliente que hace la petición por
un espacio de tiempo. Cuando este tiempo acaba, la IP es revocada y la
estación de trabajo ya no puede funcionar en la red hasta que no pida otra.

Instalación

yum install –y dhcpd

Configuración

El fichero de configuración está en /etc/ y se denomina dhcpd.conf.
La configuración es la siguiente:

; Esta opción especifica si el servidor de DHCP debe intentar actualizar el servidor de DNS
ddns-update-style interim;
ignore client-updates;


;Segmento red y submascara de red
subnet 192.168.1.0 netmask 255.255.255.0 {

;Definimos la gateway y la submascara de red
option routers 192.168.1.3;
option subnet-mask 255.255.255.0;
196

;Rango de IP´S que repartirá
range 192.168.1.201 192.168.1.203;

; Tiempo de vida por defecto de la IP
default-lease-time 86400;

;Máximo tiempo de vida de la IP
max-lease-time 608400;

;DNS
option domain-name-servers 194.179.1.100;

;Servidor TFTP
option tftp-server-name "192.168.1.3";
}


DHCP también usa el fichero /var/lib/dhcp/dhcpd.leases para almacenar la información de
los clientes, se utiliza para saber las IP´s que va asignando.

Un ejemplo del contenido del archivo dhcpd.leases tras asignar la IP 192.168.1.203 a
un teléfono IP Sipura es:



lease 192.168.1.203 {

starts 2 2009/09/22 09:56:15;
ends 3 2009/09/23 09:56:15;
binding state active;
next binding state free;
hardware ethernet 00:0e:08:da:c2:3c;
uid "\001\000\016\010\332\302<";
client-hostname "SipuraSPA";

}

Arranque del demonio DHCPD

Iniciar el servicio

service dhcpd start
chkconfig dhcpd on
Parar el servicio

service dhcpd stop

Reiniciar el servicio

service dhcpd restart
197

Servidor TFTP (TFTPD)

TFTP (Trivial file transfer Protocol) es un protocolo de red para la transferencia de
archivos entre sistemas conectados a una red TCP (Transmission Control Protocol),
basado en la arquitectura cliente-servidor. Desde un equipo cliente se puede conectar
a un servidor para descargar archivos desde él o para enviarle archivos,
independientemente del sistema operativo utilizado en cada equipo.

Características

Utiliza UDP (en el puerto 69) como protocolo de transporte (a diferencia del
FTP que utiliza el puerto 21 TCP).
No puede listar el contenido de los directorios.
No existen mecanismos de autenticación o cifrado.
Se utiliza para leer o escribir archivos de un servidor remoto.
Soporta tres modos diferentes de transferencia, "netascii", "octet" y "mail", de
los que los dos primeros corresponden a los modos "ascii" e "imagen" (binario)
del protocolo FTP.

Instalación del servidor TFTP

yum install –y xinetd

Configuración

El fichero de configuración se encuentra en /etc/xinetd.d/ y se denomina tftp.
La configuración es la siguiente:

service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = /root/tftpboot
per_source = 11
cps = 100 2
flags = IPv4
}

Arranque del servicio Xinetd

Iniciar el servicio

service xinetd start
chkconfig xinetd on
Parar el servicio

service xinetd stop
198

Reiniciar el servicio

service xinetd restart

Servidor MySQL (MySQLD)

MySQL es un sistema de administración relacional de bases de datos. Una base de
datos relacional archiva datos en tablas separadas en vez de colocar todos los datos en
un gran archivo. Esto permite velocidad y flexibilidad. Las tablas están conectadas por
relaciones definidas que hacen posible combinar datos de diferentes tablas sobre
pedido.

MySQL es software de fuente abierta. Fuente abierta significa que es posible para
cualquier persona usarlo y modificarlo. Cualquier persona puede bajar el código fuente
de MySQL y usarlo sin pagar. Cualquier interesado puede estudiar el código fuente y
ajustarlo a sus necesidades. MySQL usa el GPL (GNU General Public License) para
definir que puede hacer y que no puede hacer con el software en diferentes
situaciones. Si usted no se ajusta al GPL o requiere introducir código MySQL en
aplicaciones comerciales, usted puede comprar una versión comercial licenciada.

Instalación del servidor y el cliente MySQL

yum install mysql-server
yum install mysql

Arranque del servicio mysqld

Iniciar el servicio

service mysqld start
chkconfig mysqld on
Parar el servicio

service mysqld stop

Reiniciar el servicio

service mysqld restart

Establecimiento de contraseña de root y privilegios

mysql –u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'root' WITH
GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql>quit;


phpMyAdmin

phpMyAdmin es una herramienta escrita en PHP con la intención de manejar la
administración de MySQL a través de páginas web, utilizando Internet.
199


Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y modificar tablas,
borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en
campos, administrar privilegios, exportar datos en varios formatos y está disponible en
50 idiomas. Se encuentra disponible bajo la licencia GPL.

Instalación php

yum install –y php*

Instalación phpMyAdmin

cd /var/www/html
wget –c http://sourceforge.net/projects/phpmyadmin/files/phpMyAdmin-3.2.4-rc1-all-
languages.tar.gz
tar xvfz phpMyAdmin-3.2.4-rc1-all-languages.tar.gz
mv phpMyAdmin-3.2.4-rc1-all-languages.tar.gz phpmyadmin
cd phpmyadmin
cp config.sample.inc.php config.inc.php
nano config.inc.php

Sustituir “ $cfg['Servers'][$i]['auth_type'] = ‘cookies ’ ” por :

$cfg['Servers'][$i]['auth_type'] = ‘http‘;

service httpd restart


Acceso a phpmyadmin

http://IP del servidor/phpmyadmin/


Servidor SNMP (SNMPD)

SNMP (Simple Network Management Protocol), en sus distintas versiones, es un
conjunto de aplicaciones de gestión de red que emplea los servicios ofrecidos por
TCP/IP y que ha llegado a convertirse en un estándar.

Y es que este protocolo de gestión facilita de una manera simple y flexible el
intercambio de información de forma estructurada y efectiva.

Los elementos básicos son los Administradores ( Management Stations) ubicados en
el/los equipo/s de gestión de red y los Gestores (Network Agents: elementos pasivos
ubicados en los nodos -host, routers, modems, multiplexores, ... a ser gestionados),
siendo los segundos los que envían información a los primeros, relativa a los
elementos gestionados, por iniciativa propia o al ser interrogados (polling) de manera
secuencial, apoyándose en los parámetros contenidos en sus MIB (Management
Information Base).
200
Su principal inconveniente es el exceso de tráfico que se genera, lo que lo puede hacer
incompatible para entornos amplios de red.

Los cinco tipos de mensajes SNMP intercambiados entre los Agentes y los
Administradores, son:

• Get Request: Una petición del Administrador al Agente para que envíe los
valores contenidos en el MIB (base de datos).
• Get Next Request: Una petición del Administrador al Agente para que envíe los
valores contenidos en el MIB referente al objeto siguiente al especificado
anteriormente.
• Get Response: La respuesta del Agente a la petición de información lanzada
por el Administrador.
• Set Request: Una petición del Administrador al Agente para que cambie el
valor contenido en el MIB referente a un determinado objeto.
• Trap: Un mensaje espontáneo enviado por el Agente al Administrador, al
detectar una condición predeterminada, como es la conexión/desconexión de
una estación o una alarma.

Instalación de SNMP

Instalar NETSNMP y otros paquetes:

# perl -MCPAN -e shell

/etc/perl/CPAN/Config.pm inicialize.
CPAN is the world-wide archive of perl resources. It consists of about 100 sites that all replicate
the same contents all around the globe. Many countries have at least one CPAN site already.
The resources found on CPAN are easily accessible with the CPAN.pm module. If you want to use
CPAN.pm, you have to configure it properly.

If you do not want to enter a dialog now, you can answer 'no' to this question and I'll try to auto
configure. (Note: you can revisit this dialog anytime later by typing 'o conf init' at the cpan
prompt.)

Are you ready for manual configuration? [yes] “no”

cpan> install Net::SNMP
Checking if your kit is complete...
Looks good Warning:
prerequisite Crypt::DES 2.03 not found.
Warning: prerequisite Digest::HMAC 1.00 not found.
Warning: prerequisite Digest::SHA1 1.02 not found.
Writing Makefile for Net::SNMP ----
Unsatisfied dependencies detected during [D/DT/DTOWN/Net-SNMP-5.2.0.tar.gz] -----
Digest::HMAC
Crypt::DES
Digest::SHA1
Shall I follow them and prepend them to the queue
of modules we are processing right now? [yes] “Enter”
201
cpan>exit

Ahora es necesario instalar los paquetes de SNMP:

yum install arpwatch.i386 net-snmp-devel.i386 net-snmp-libs.i386 net-snmp-perl.i386 net-
snmp-utils.i386 cluster-snmp.i386 openhpi-subagent.i386 php-snmp.i386

Configuración del SNMP

Necesitas modificar el fichero snmpd.conf:

# nano /etc/snmp/snmpd.conf

Borra todo su contenido pulsando continuamente “Ctrl+K” y copia lo siguiente:

master agentx
agentXPerms 0660 0660 root root
com2sec local localhost public_asterisk
com2sec mynetwork 230.5.42.12 public_asterisk
group MyROGroup any local
group MyROGroup any mynetwork
view all included .1
access MyROGroup "" any noauth 0 all none none

Guarda el fichero y reinicia el demonio SNMPD:

# /etc/init.d/snmpd restart

Cambia los privilegios a agentx:

# chmod 755 /var/agentx



Acceso al Servidor: PUTTY

Se trata de una aplicación gratuita SSH41, Telnet, rlogin y cliente TCP raw que nos
permite acceder al servidor Asterisk en modo consola y así poder acceder a la línea de
comandos.En Host Name: 192.168.1.200 IP del servidor Asterisk y pulsamos en
“Open”.
202



Nos aparecerá una pantalla negra solicitando que nos loguemos “Login as”
Ejemplo de Login como “Root”.





Acceso al Servidor: WinSCP


Se trata de un cliente SFTP (Security File Transfer Protocol) gráfico que emplea SSH
(Security Shell) y que hemos utilizado en algunos casos para transferir y editar archivos
de configuración de Asterisk.
Ejemplo de acceso al directorio de archivos de Asterisk:
203







Instalación de Asterisk:

Asterisk 1.4.xx (de 1.4.0 a 1.4.21)

1.) El primer paso es descargar los módulos necesarios: zaptel, libpri,
asterisk y asterisk-addons desde los repositorios públicos de Digium y
guardarlos en nuestro sistema( /usr/src/) :


cd /usr/src/
mkdir asterisk
204
cd asterisk


wget http://downloads.digium.com/pub/libpri/libpri-1.4-current.tar.gz wget
http://downloads.digium.com/pub/zaptel/zaptel-1.4-current.tar.gz wget
http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz
wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.4-current.tar.gz


2.) Ahora debemos averiguar la versión exacta de nuestro kernel con el comando
uname –a, deberíamos ver algo como:



[root@asterisk~]# uname -a

Linux asterisk.asteriskclub.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686
i686 i386 GNU/Linux

Apuntamos si la versión del kernel es 2.4 o 2.6, ya que necesitaremos esta
información luego.



3.) Luego verificamos si tenemos instaladas las fuentes del kernel, para ello
utilizamos el comando rpm -q kernel-devel:



[root@asterisk ~]# rpm -q kernel-devel

kernel-devel-2.6.18-8.el5



Si no están instaladas podemos hacerlo con yum de la siguiente forma:

yum install kernel-devel



4.) Ahora sí, instalamos los siguientes paquetes necesarios para al instalación de
Asterisk:


yum install bison bison-devel ncurses ncurses-devel zlib zlib-devel gcc-c++ openssl-
devel gnutls-devel gcc openssl


5.) Un paso más antes de empezar con la instalación, CentOS no instala las fuentes
del kernel en el directorio /usr/src/linux como está escrito en los Makefile de
Zaptel y Astersik, para ello nos vamos a /usr/src/ y creamos un link llamado
linux hacia el directorio con las fuentes del kernel el cual está ubicado en
/usr/src/kernels/mi_version_del_kernel (aquí utilizamos la información
obtenida del paso 2) estos son los resultados que esperamos:


[root@asterisk ~]# cd /usr/src/
[root@asterisk src]# ln -s
kernels/2.6.18-8.el5-i686/ linux
[root@asterisk src]# ll
205
total 28
drwxr-xr-x 2 root root 4096 jun 13 08:43 asterisk
drwxr-xr-x 3 root root 4096 jun 12 13:17 kernels
lrwxrwxrwx 1 root root 26 jun 13 09:12 linux -> kernels/2.6.18-8.el5-i686/
drwxr-xr-x 7 root root 4096 jun 12 13:34 redhat



6.) Listo, ahora sí, nos posicionamos en la carpeta donde bajamos los paquetes
(/usr/src/), los desempaquetamos y descomprimimos, así:



cd /usr/src/asterisk
tar -vxzf libpri-current tar.gz
tar -vxzf zaptel-current.tar.gz
tar -vxzf asterisk-current.tar.gz
tar -vxzf asterisk-addons-current.tar.gz


Luego ingresamos a la carpeta libpri



cd libpri-1.4.0


y ejecutamos:



make clean
make
make install



Grabamos y cerramos el archivo.
Luego ingresamos a la carpeta zaptel


cd ../zaptel-1.4.2.1


y ejecutamos:



make clean
make
make install
make config (para hacer que el modulo zaptel se carge al tiempo de boot)


Finalmente ingresamos a la carpeta asterisk:



cd ../asterisk-1.4.4
206
y ejecutamos:


make clean
./configure
make
make install
make samples (para crear archivos de ejemplo)
make config



7.) Listo !! si todo salió bien deberíamos poder cargar Asterisk con:



asterisk –vvvvvvvvcg o asterisk –rvvvvvvv


8.) Opcionalmente podemos ponerle a nuestra central soporte para códec g729,
descargando una version OpenSource.


cd /var/lib/asterisk/modules
wget http://asterisk.hosting.lv/bin/codec_g729-ast14-gcc4-glibc-
pentium4.so
mv codec_g729-ast14-gcc4-glibc-pentium4.so codec_g729.so
chmod +x codec_g729.so
service asterisk restart

Asterisk 1.4xx (de 1.4.22 a 1.4.27) y 1.6.x

1.) Empezamos actualizando el S.O.


yum -y update


2.) Instalaremos algunos paquetes necesarios antes de Asterisk en sí mismo.



yum install libtiff-devel php-pear php-pear-db php-gd php-mysql php-pdo
audiofile-devel mysql-devel perl-datemanip


3.) Creamos la carpeta dónde guardaremos los paquetes de asterisk y los
descargamos:



cd /usr/src
mkdir asterisk
cd asterisk

Instalamos el subversion para para poder descargar el Asterisk:



yum –y install subversión
207
svn checkout http://svn.digium.com/svn/asterisk/branches/1.4/asterisk-1.4.26.1
svn checkout http://svn.digium.com/svn/asterisk-addons/branches/1.4/asterisk-
addons-1.4.9
wget http://downloads.digium.com/pub/telephony/dahdi-linux/dahdi-linux-
2.1.0.4.tar.gz
wget http://downloads.digium.com/pub/telephony/dahdi-tools/dahdi-tools-
2.1.0.2.tar.gz
wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.9.tar.gz

Descomprimimos:

tar zxvf libpri-1.4.9.tar.gz
tar zxvf dahdi-linux-2.1.0.4.tar.gz
tar zxvf dahdi-tools-2.1.0.2.tar.gz


4.) Instalamos libpri:



cd libpri-1.4.9
make
make install
cd ..

5.) Instalamos dahdi-linux



cd dahdi-linux-2.1.0.4
make
make install
cd ..

6.) Instalamos dahdi-tools



cd dahdi-tools-2.1.0.2
./configure
make menuselect
make
make install
make config
cd ..

7.) Instalamos asterisk


cd asterisk-1.4.26.1/
./configure
make menuselect
make
make install

8.) Instalamos asterisk-addons
208
cd /usr/src/asterisk-addons-1.4.9/
./configure
make menuselect
make
make install


Elección de la version Asterisk:

Diferencia entre los Asterisk 1.4 (hasta 1.4.21) y los Asterisk 1.4.22 (y
superiores) y 1.6 en telefonía analógica: De Zaptel a DAHDI

En el paso de Asterisk 1.4.21 a Asterisk 1.4.22 Digium como ya anuncié, cambió el
nombre de la interfaz de telefonía analógica Zaptel a DAHDI (Digium Asterisk Hardware
Device Interface) para dar cabida a los deseos del titular de la marca Zaptel.

A parte del cambio de nombre Digium aprovechó para efectuar la corrección de
errores e introducir una serie de características:


Los supresores de eco pueden aplicarse por canal y
seleccionando el tiempo de configuración.
La asignación de memoria de canal ha pasado de un
gran bloque a bloques más pequeños con el fin de
reducir los errores de memoria.
Apoyo para las tarjetas RDSI BRI (Basic Rate
Interface), concretamente para las tarjetas B410P
(módulo con 4 puertos BRI).

Otros de los avances es el empaquetamiento de los módulos, pasando de uno sólo
(zaptel) a dos diferenciados por tener uno los módulos del Kernel (dahdi-linux) y otro
con las herramientas para su uso (dahdi-tools).

En el primer paquete, dahdi-linux la equivalencia de módulos es la siguiente:

- zaptel.ko -7 dahdi.ko
- ztd-eth.ko -7 dahdi_dynamic_eth.ko
- ztd-loc.ko -7 dahdi_dynamic_loc.ko
- ztdummy.ko -7 dahdi_dummy.ko
- ztdynamic.ko -7 dahdi_dynamic.ko
- zttranscode.ko -7 dahdi_transcode.ko

En el segundo paquete, dahdi-tools la equivalencia de módulos es la siguiente:

- ztcfg -7 dahdi_cfg
- ztmonitor -7 dahdi_monitor
- ztscan -7 dahdi_scan
- ztspeed -7 dahdi_speed
209
- zttest -7 dahdi_test
- zttool -7 dahdi_tool
- zapconf -7dahdi_genconf

En las versiones de Asterisk 1.4 y 1.6 en las que se usa DAHDI, los módulos que utilizan
los servicios de este canal son:

- chan_zap.so -7 chan_dahdi.so
- app_zapbarge.so -7 app_dahdibarge.so
- app_zarpras.so -7 app_dahdiras.so
- app_zapscan.so -7 app_dahdiscan.so
- codec_zap.so -7 codec_dahdi.so

La descripción de cada módulo es la siguiente:


chan_dahdi.so: Este modulo determina que nombre del canal se debe utilizar
para llamadas entrantes .Si no se quiere usar el nombre de canal DAHDI y se
quiere seguir usando el canal Zap hay que añadir la siguiente línea al archivo
asterisk.conf de /etc/asterisk/:

dahdichanname=no


app_dahdibarge.so: La aplicación ZapBarge será ahora DAHDIBarge.
app_dahdiras.so: La aplicación ZapRAS será ahora DAHDIRAS.
app_dahdiscan.so: La aplicación ZapScan será ahora DAHDIScan.

Por último, la configuración para el controlador del canal se lee del archivo
chan_dahdi.conf en /etc/asterisk/ en vez del zapata.conf, mientras que la información
de las tarjetas que detecte aparecerá en dahdi-channels.conf en vez de en zaptel.conf.

Configuración DAHDI

1.) Ejecutamos dahdi_scan y veremos que las tarjetas que reconoce DAHDI y su estado
(actualmente Unconfigured).En este caso disponemos de una tarjeta de telefonía
con 4 puertos,2 de ellos ocupados por dos módulos un FXO y un FXS.

[root@asterisk ~]# dahdi_scan

[1]
active=yes
alarms=OK
description=Wildcard TDM400P REV E/F Board 5
name=WCTDM/4
manufacturer=Digium
devicetype=Wildcard TDM400P REV E/F
location=PCI Bus 08 Slot 02
basechan=1
totchans=4
irq=209
210
type=analog
port=1,FXO
port=2,FXS
port=3,none
port=4,none


2.) Ahora que sabemos que dahdi reconoce nuestras tarjetas, pasamos a
configurarlas. para eso ejecutamos:

[root@asterisk ~]# dahdi_genconf

[root@asterisk ~]# dahdi_cfg -vv
dahdi tools version - 2.2.0
dahdi version: 2.2.0
echo canceller(s):
configuration
======================

channel map:

channel 01: fxs kewlstart (default) (echo canceler: mg2) (slaves: 01)
channel 02: fxo kewlstart (default) (echo canceler: mg2) (slaves: 02)

2 channels to configure.

setting echocan for channel 1 to mg2
setting echocan for channel 2 to mg2


3.) A partir de aquí ajustaremos la configuración de dahdi para adaptarla a
nuestras necesidades.

3.1.) Editamos /etc/dahdi/modules y comentamos todos aquellos drivers que
no usamos.

[root@asterisk asterisk]# nano /etc/dahdi/modules

# Contains the list of modules to be loaded / unloaded by /etc/init.d/dahdi.
#
# NOTE: Please add/edit /etc/modprobe.d/dahdi or /etc/modprobe.conf if you
# would like to add any module parameters.
#
# Format of this file: list of modules, each in its own line.
# Anything after a '#' is ignore, likewise trailing and leading
# whitespaces and empty lines.

# Digium TE205P/TE207P/TE210P/TE212P: PCI dual-port T1/E1/J1
# Digium TE405P/TE407P/TE410P/TE412P: PCI quad-port T1/E1/J1
# Digium TE220: PCI-Express dual-port T1/E1/J1
# Digium TE420: PCI-Express quad-port T1/E1/J1
#wct4xxp

# Digium TE120P: PCI single-port T1/E1/J1
# Digium TE121: PCI-Express single-port T1/E1/J1
211
# Digium TE122: PCI single-port T1/E1/J1
#wcte12xp

# Digium T100P: PCI single-port T1
# Digium E100P: PCI single-port E1
#wct1xxp

# Digium TE110P: PCI single-port T1/E1/J1
#wcte11xp

# Digium TDM2400P/AEX2400: up to 24 analog ports
# Digium TDM800P/AEX800: up to 8 analog ports
# Digium TDM410P/AEX410: up to 4 analog ports
#wctdm24xxp

# X100P - Single port FXO interface
# X101P - Single port FXO interface
#wcfxo

# Digium TDM400P: up to 4 analog ports
wctdm

# Digium B410P: 4 NT/TE BRI ports
#wcb4xxp

# Digium TC400B: G729 / G723 Transcoding Engine
#wctc4xxp

# Xorcom Astribank Devices
#xpp_usb


3.2.) A continuación editamos /etc/dahdi/system.conf. ponemos controlar
aparte del idioma el número de canal para cada módulo.


[root@asterisk asterisk]# nano /etc/dahdi/system.conf

# Autogenerated by /usr/sbin/dahdi_genconf on Thu Nov 5 06:19:40 2009
# If you edit this file and execute /usr/sbin/dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCTDM/4 "Wildcard TDM400P REV E/F Board 5" (MASTER)
fxsks=1
echocanceller=mg2,1
fxoks=2
echocanceller=mg2,2
# channel 3, WCTDM/4/2, no module.
# channel 4, WCTDM/4/3, no module.
# Global data
loadzone = es
defaultzone = es

4.) Echemos un vistazo al fichero /etc/asterisk/dahdi_channels.conf
212
[root@asterisk asterisk]# nano /etc/asterisk/dahdi-channels.conf

; Autogenerated by /usr/sbin/dahdi_genconf on Thu Nov 5 06:19:40 2009
; If you edit this file and execute /usr/sbin/dahdi_genconf again,
; your manual changes will be LOST.
; Dahdi Channels Configurations (chan_dahdi.conf)
;
; This is not intended to be a complete chan_dahdi.conf. Rather, it is intended
; to be #include-d by /etc/chan_dahdi.conf that will include the global settings
;
; Span 1: WCTDM/4 "Wildcard TDM400P REV E/F Board 5" (MASTER)
;;; line="1 WCTDM/4/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=from-pstn
channel => 1
callerid=
group=
context=default

;;; line="2 WCTDM/4/1 FXOKS"
signalling=fxo_ks
callerid="Channel 2" <4002>
mailbox=4002
group=5
context=from-internal
channel => 2
callerid=
mailbox=
group=
context=default


Tenemos las tarjetas reconocidas pero no tenemos canales.



[root@asterisk etc]# asterisk -r
*CLI> dahdi show channels

Chan extension Context Language Moh interpret
pseudo default default

*CLI> dahdi show status

Description Alarms IRQ bpviol CRC4
Wildcard TDM400P REV E/F Board 5 OK 0 0 0


5.) Asterisk interpreta los canales a través del fichero de configuración
chan_dahdi.conf. Este fichero no existe, así que lo crearemos nosotros.



[root@asterisk asterisk]# nano chan_dahdi.conf


Añadiremos simplemente 2 líneas:
213
[channels]
#include dahdi-channels.conf

con esto le decimos al sistema asterisk que lea el fichero dahdi-channels.conf
(creado en la ejecución de dahdi_genconf y dahdi_cfg -vv).


6.) Ahora simplemente reiniciamos asterisk



[root@asterisk asterisk]# asterisk -r

*CLI> dahdi show channels

Chan Extension Context Language MOH Interpret
pseudo default default
1 default default
2 default default

7.) Paramos Asterisk :


[root@asterisk asterisk]# service asterisk stop


Reiniciamos DAHDI:


[root@asterisk asterisk]# service dahdi restart



Iniciamos Asterisk y listo:


[root@asterisk asterisk]# service asterisk start


8.) Al descolgar el telefono analógico en el CLI:

-- Starting simple switch on 'DAHDI/2-1'
-- Hungup 'DAHDI/2-1'

Pruebas de llamada al canal DAHDI en Asterisk 1.4.26.1

La configuración del canal DAHDI en el extensions.conf es:

exten => 1234,1,Dial(DAHDI/2-1,30,Ttm)
exten => 1234,n,Hangup


Llamada de la extensión 105 a la extensión 1234 que desvía al canal DAHDI, la salida
del CLI es la siguiente:
214
-- Executing [1234@incoming:1] Dial("SIP/105-08601bd0", "DAHDI/2-1|30|Ttm") in
new stack
-- Called 2-1
-- Started music on hold, class 'default', on SIP/105-08601bd0
-- DAHDI/2-1 is ringing
-- DAHDI/2-1 is ringing
-- Stopped music on hold on SIP/105-08601bd0
-- Hungup 'DAHDI/2-1'
== Spawn extension (incoming, 1234, 1) exited non-zero on 'SIP/105-08601bd0'


Llamada del teléfono analógico (canal DAHDI) a la extensión 105:

-- Starting simple switch on 'DAHDI/2-1'
-- Executing [105@incoming:1] Dial("DAHDI/2-1", "SIP/105|30|Ttm") in new stack
-- Called 105
-- Started music on hold, class 'default', on DAHDI/2-1
-- SIP/105-0948a5a0 is ringing
-- Stopped music on hold on DAHDI/2-1
== Spawn extension (incoming, 105, 1) exited non-zero on 'DAHDI/2-1'
-- Hungup 'DAHDI/2-1'


Pruebas básicas realizadas en Asterisk 1.4.21

Pruebas SoftPhones:

1.) Realizamos la configuración de 2 usuarios SIP y de 2 usuarios IAX2 en los
ficheros extensions.conf, iax.conf y sip.conf.

extensions.conf

exten => 100,1,Dial(SIP/100,30,Ttm)
exten => 100,n,Hangup
exten => 101,1,Dial(SIP/101,30,Ttm)
exten => 101,n,Hangup
;exten => 300,1,Dial(IAX2/300,30,Ttrm)
;exten => 300,n,Hangup
;exten => 400,1,Dial(IAX2/400,30,Ttrm)
;exten => 400,n,Hangup

sip.conf

[general]
context=default
allowoverlap=no
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
language=es
callevents=yes

[100]

type=friend
username=100
215
secret=1234
mailbox=100
host=dynamic
context=default
canreinvite=yes
dtmfmode=rfc2833
nat=no

[101]

type=friend
username=101
secret=1234
mailbox=101
host=dynamic
context=default
canreinvite=yes
dtmfmode=rfc2833
nat=no

iax.conf

[general]
bindport=4569
bindaddr=0.0.0.0
srvlookup=yes
accountcode=lss0101
delayreject=yes
language=es
disallow=all
allow=gsm
allow=ulaw
allow=alaw

[300]
type=friend
host=dynamic
secret=1234
auth=md5,plain
context=default
qualify=yes
callerid = "300"
autokill=yes

[400]
type=friend
host=dynamic
secret=1234
auth=md5,plain
context=default
qualify=yes
callerid = "400"
autokill=yes


2.) Hacemos un “reload” de Asterisk para que detecte las extensiones de los
usuarios.
216

[root@asterisk]# asterisk –rvvv
*CLI> reload


3.) Realizamos la configuración de los 4 usuarios en 2 Softphones Zoiper situados
en dos ordenadores diferentes.

































De la misma manera se configuran las otras dos extensiones de cada protocolo.
Para tener más información sobre la configuración de este y otros SoftPhones ir
al subcapítulo SoftPhones del capítulo de Asterisk.(ENLACE)

4.) Comprobamos que los usuarios se han registrado correctamente en los
SoftPhones.



-- Registered IAX '300' at 192.168.1.200 port 4569
-- Registered SIP '100' at 192.168.1.200 port 5060
-- Saved useragent "Zoiper rev.5324" for peer 300
-- Saved useragent "Zoiper rev.5324" for peer 100
217




5.) Vemos el comportamiento de la centralita Asterisk, a través del SoftPhone, al
realizar llamadas entre las extensiones (teniendo en cuenta que no podemos
llamar de una extensión SIP a una IAX2 y bicerversa).


-- Executing [100@default:1] Dial("SIP/101- 097f7fb8", "SIP/100|30|Ttm") in
new stack
-- Called 100
-- Started music on hold, class 'default', on SIP/101-097f7fb8
-- SIP/100-097f9a98 is ringing
-- SIP/100-097f9a98 answered SIP/101-097f7fb8
-- Stopped music on hold on SIP/101-097f7fb8
== Spawn extension (default, 100, 1) exited non-zero on 'SIP/101-097f7fb8'



218
Pruebas teléfonos IP (SipuraSPA):



1.) Realizamos la configuración de 4 usuarios SIP en los ficheros extensions.conf y
sip.conf.

De la misma forma que en el apartado anterior realizamos la configuración en
dichos ficheros de las extensiones SIP: 102, 103, 104, 105, que serán utilizadas
también en pruebas posteriores.

2.) Hacemos un “reload” de Asterisk para que detecte las extensiones de los
usuarios.


[root@asterisk]# asterisk –rvvv
*CLI> reload


3.) Realizamos la configuración de los 4 usuarios en 2 telefenos IP SipuraSPA de
dos extensiones cada uno.
La configuración del teléfono en cuanto al servidor Asterisk es la siguiente:


























Un ejemplo de configuración de una extensión de las dos que permite
configurar cada teléfono IP es:
219




































4.) Comprobamos que los usuarios se han registrado correctamente en los
teléfonos IP.










-- Registered SIP '102' at 192.168.1.201 port 5060
-- Saved useragent "Sipura/SPA841-3.1.3(a)" for peer 102


5.) Vemos el comportamiento de la centralita Asterisk, a través del CLI, al realizar
llamadas entre las extensiones SIP de los teléfonos IP y las de los SoftPhones
configuradas en el apartado anterior.


-- Executing [100@default:1] Dial("SIP/102-097f96a8", "SIP/100|30|Ttm") in
new stack
-- Called 100
-- Started music on hold, class 'default', on SIP/102-097f96a8
-- SIP/100-098066d8 is ringing
-- Stopped music on hold on SIP/102-097f96a8
220
== Spawn extension (default, 100, 1) exited non-zero on 'SIP/102-097f96a8'


Pruebas de funcionamiento de buzones de voz:

1.) Desconectamos un teléfono IP paa obligar la redirección a los buzones de las
extensiones registradas en él.


extensions.conf

exten => 100,1,Dial(SIP/100,30,Ttm)
exten => 100,n,Voicemail(100)
exten => 100,n,Hangup

voicemail.conf

[general]
format=wav49|gsm|wav
;serveremail=asterisk
attach=yes
skipms=3000
maxsilence=10
silencethreshold=128
maxlogins=3
emaildateformat=%A, %B %d, %Y at %r
sendvoicemail=yes

[zonemessages]
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

[default]
100 => 1234,100,100@localhost


2.) Vemos el comportamiento de la centralita Asterisk, a través del CLI, al realizar
una llamada a una de las extensiones del teléfono IP que no está registrada.


-- Executing [100@default:1] Dial("SIP/102-0891c9f0", "SIP/100|30|Ttm") in
new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [100@default:2] VoiceMail("SIP/102-0891c9f0", "100") in new
stack
-- <SIP/102-0891c9f0> Playing 'vm-intro' (language 'es')
-- <SIP/102-0891c9f0> Playing 'beep' (language 'es')
-- Recording the message
-- x=0, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8
format: wav49, 0x889d9f0
-- x=1, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8
format: gsm, 0x89181f0
-- x=2, open writing: /var/spool/asterisk/voicemail/default/100/tmp/ylgos8
format: wav, 0x88fc230
221
-- User hung up


Al grabar el primer mensaje en la cuenta de voicemail hay que especificar los
códecs en los que quieres que se grabe el mensaje. A continuación grabará en
esos formatos todos los mensajes que se dejen a no ser que se cambie.

3.) Vemos cómo escuchar el mensaje guardado en el buzón.


extensions.conf

;exten => 1001,1,VoiceMailMain(100)

Para escuchar los mensajes: Marcar 1001.
Tras grabar dejar dos mensajes en el buzón de voz a la extensión 100:
Después de marcar la extensión para escuchar los buzones de voz de la
extensión 100 (1001) te pide la password del buzón, si la metes correctamente
t dice el numero de mensajes que tienes en el buzón y te da una serie de
opciones:

-- Executing [1001@default:1] VoiceMailMain("SIP/102-08914790", "100") in
new stack
-- <SIP/102-08914790> Playing 'vm-password' (language 'es')
-- <SIP/102-08914790> Playing 'vm-youhave' (language 'es')
-- <SIP/102-08914790> Playing 'digits/2' (language 'es')
-- <SIP/102-08914790> Playing 'vm-messages' (language 'es') -->OPCION 1
-- <SIP/102-08914790> Playing 'vm-INBOX' (language 'es') -->OPCION 2
-- <SIP/102-08914790> Playing 'vm-onefor' (language 'es') -->OPCION 3


Pulsamos el 1 para escuchar los mensajes.Te dice la fecha y hora del primero y
reproduce la grabación:


-- <SIP/102-08914790> Playing 'vm-first' (language 'es')
-- <SIP/102-08914790> Playing 'vm-message' (language 'es')
== Parsing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0000.txt':
Found
-- <SIP/102-08914790> Playing 'vm-received' (language 'es')
-- <SIP/102-08914790> Playing 'digits/today' (language 'es')
-- <SIP/102-08914790> Playing 'digits/at' (language 'es')
-- <SIP/102-08914790> Playing 'digits/11' (language 'es')
-- <SIP/102-08914790> Playing 'digits/24' (language 'es')
-- <SIP/102-08914790> Playing 'digits/a-m' (language 'es')
-- <SIP/102-08914790> Playing
'/var/spool/asterisk/voicemail/default/100/INBOX/msg0000' (language 'es')


Entre otras opciones te permite volverlo a escuchar y escuchar el siguiente
mensaje,etc.

-- <SIP/102-08914790> Playing 'vm-advopts' (language 'es') -->OPCION 4
-- <SIP/102-08914790> Playing 'vm-repeat' (language 'es') -->OPCION 5
222
-- <SIP/102-08914790> Playing 'vm-next' (language 'es') -->OPCION 6
-- <SIP/102-08914790> Playing 'vm-delete' (language 'es') -->OPCION 7
-- <SIP/102-08914790> Playing 'vm-toforward' (language 'es') -->OPCION 8
-- <SIP/102-08914790> Playing 'vm-savemessage' (language 'es') -->OPCION 9
-- <SIP/102-08914790> Playing 'vm-helpexit' (language 'es') -->OPCION 0


Escuchamos el siguiente pulsando el 6.

== Parsing '/var/spool/asterisk/voicemail/default/100/INBOX/msg0001.txt':
Found
-- <SIP/102-08914790> Playing 'vm-received' (language 'es')
-- <SIP/102-08914790> Playing 'digits/today' (language 'es')
-- <SIP/102-08914790> Playing 'digits/at' (language 'es')
-- <SIP/102-08914790> Playing 'digits/11' (language 'es')
-- <SIP/102-08914790> Playing 'digits/28' (language 'es')
-- <SIP/102-08914790> Playing 'digits/a-m' (language 'es')
-- <SIP/102-08914790> Playing
'/var/spool/asterisk/voicemail/default/100/INBOX/msg0001' (language 'es')


Pruebas utilización de las aplicaciones Goto() y GotoIf() y de variables de canal:



1.) Llamamos a la extensión 100 dependiendo del contenido de la variable de canal
DIALSTATUS que comprueba el estado de la extensión a la que llamamos.

Si la llamada no es contestada pero el canal esta activo --> Cuelga
Si la llamada está ocupada o la línea está saturada --> Aplicaciones Busy() y
Congestion()
Si la llamada que estamos realizando es a un canal inactivo la redirecciona a la
extensión 102 tras decir la extensión marcada.


exten => 1222,1,Dial(SIP/100,30,Ttm)
exten => 1222,n,NoOp(Dial Status : ${DIALSTATUS})
exten => 1222,n,Set(COUNT=${EXTEN})
exten => 1222,n,Goto(${DIALSTATUS},1)

exten => NOANSWER,1,Hangup
exten => CONGESTION,1,Congestion
exten => CANCEL,1,Hangup
exten => BUSY,1,Busy
exten => CHANUNAVAIL,1,SayNumber(${COUNT})
exten => CHANUNAVAIL,2,Dial(SIP/101,30,Ttm)


-- Executing [1222@default:1] Dial("SIP/102-08915210", "SIP/100|30|Ttm") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [1222@default:2] NoOp("SIP/102-08915210", "Dial Status : CHANUNAVAIL") in
new stack
-- Executing [1222@default:3] Set("SIP/102-08915210", "COUNT=1222") in new stack
-- Executing [1222@default:4] Goto("SIP/102-08915210", "CHANUNAVAIL|1") in new stack
-- Goto (default,CHANUNAVAIL,1)
-- Executing [CHANUNAVAIL@default:1] SayNumber("SIP/102-08915210", "1222") in new stack
-- <SIP/102-08915210> Playing 'digits/thousand' (language 'es')
223
-- <SIP/102-08915210> Playing 'digits/200' (language 'es')
-- <SIP/102-08915210> Playing 'digits/22' (language 'es')
-- Executing [CHANUNAVAIL@default:2] Dial("SIP/102-08915210", "SIP/101|30|Ttm") in new
stack
-- Called 101
-- Started music on hold, class 'default', on SIP/102-08915210
-- SIP/101-08920878 is ringing
-- Stopped music on hold on SIP/102-08915210
== Spawn extension (default, CHANUNAVAIL, 2) exited non-zero on 'SIP/102-08915210'


2.) Vemos el funcionamiento del GotoIf, tal que dependiendo del valor de una
variabvle se llama a una extension o a otra.


exten => 6666,1,Set(TEST=2)
;exten => 6666,1,Set(TEST=1)
exten => 6666,n,GotoIf($[${TEST} = 1]?ir,1:adios,1)
exten => adios,1,Goto(default,100,1)
exten => ir,1,Goto(default,101,1)
exten => t,1,Goto(default,101,1)


Probamos con la variable TEST=2 (redirecciona a dios y llama a la extensión 100
que no está registrada y por tanto salta el buzón).


-- Executing [6666@default:1] Set("SIP/102-0891dbe0", "TEST=2") in new stack
-- Executing [6666@default:2] GotoIf("SIP/102-0891dbe0", "0?ir|1:adios|1") in new stack
-- Goto (default,adios,1)
-- Executing [adios@default:1] Goto("SIP/102-0891dbe0", "default|100|1") in new stack
-- Goto (default,100,1)
-- Executing [100@default:1] Dial("SIP/102-0891dbe0", "SIP/100|30|Ttm") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [100@default:2] VoiceMail("SIP/102-0891dbe0", "100") in new stack
-- <SIP/102-0891dbe0> Playing 'vm-intro' (language 'es')
== Spawn extension (default, 100, 2) exited non-zero on 'SIP/102-0891dbe0'


Probamos con la variable TEST=1 (redirecciona a ir y llama a la extensión 101).


-- Executing [6666@default:1] Set("SIP/102-b756d130", "TEST=1") in new stack
-- Executing [6666@default:2] GotoIf("SIP/102-b756d130", "1?ir|1:adios|1") in new stack
-- Goto (default,ir,1)
-- Executing [ir@default:1] Goto("SIP/102-b756d130", "default|101|1") in new stack
-- Goto (default,101,1)
-- Executing [101@default:1] Dial("SIP/102-b756d130", "SIP/101|30|Ttm") in new stack
-- Called 101
-- Started music on hold, class 'default', on SIP/102-b756d130
-- SIP/101-0891db38 is ringing
-- Stopped music on hold on SIP/102-b756d130
== Spawn extension (default, 101, 1) exited non-zero on 'SIP/102-b756d130'
224
3.) Contador decreciente.


exten => 1123,1,Set(COUNT=10)
exten => 1123,n(start),GotoIf($[${COUNT} > 0]?:goodbye)
exten => 1123,n,SayNumber(${COUNT})
exten => 1123,n,Set(COUNT=$[${COUNT} - 1])
exten => 1123,n,Goto(start)
exten => 1123,n(goodbye),Hangup


-- Executing [1123@default:1] Set("SIP/102-b7568b98", "COUNT=10") in new stack
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "10") in new stack
-- <SIP/102-b7568b98> Playing 'digits/10' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=9") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "9") in new stack
-- <SIP/102-b7568b98> Playing 'digits/9' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=8") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "8") in new stack
-- <SIP/102-b7568b98> Playing 'digits/8' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=7") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "7") in new stack
-- <SIP/102-b7568b98> Playing 'digits/7' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=6") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "6") in new stack
-- <SIP/102-b7568b98> Playing 'digits/6' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=5") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "5") in new stack
-- <SIP/102-b7568b98> Playing 'digits/5' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=4") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "4") in new stack
-- <SIP/102-b7568b98> Playing 'digits/4' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=3") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "3") in new stack
-- <SIP/102-b7568b98> Playing 'digits/3' (language 'es')
225
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=2") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "2") in new stack
-- <SIP/102-b7568b98> Playing 'digits/2' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=1") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "1?:goodbye") in new stack
-- Executing [1123@default:3] SayNumber("SIP/102-b7568b98", "1") in new stack
-- <SIP/102-b7568b98> Playing 'digits/1' (language 'es')
-- Executing [1123@default:4] Set("SIP/102-b7568b98", "COUNT=0") in new stack
-- Executing [1123@default:5] Goto("SIP/102-b7568b98", "start") in new stack
-- Goto (default,1123,2)
-- Executing [1123@default:2] GotoIf("SIP/102-b7568b98", "0?:goodbye") in new stack
-- Goto (default,1123,6)
-- Executing [1123@default:6] Hangup("SIP/102-b7568b98", "") in new stack
== Spawn extension (default, 1123, 6) exited non-zero on 'SIP/102-b7568b98'


Pruebas de funcionamiento colas y registro de miembros:



queues.conf

[general]
persistentmembers = yes
keepstats=no

[davidqueue]
musiconhold = default
strategy = ringall
;servicelevel = 0
eventwhencalled = yes
timeout = 10
retry = 1
;autofil = yes
context = intern
;wrapuptime = 0
;maxten = 0
;joinempty = yes
announce-frequency = 30
announce-holdtime = yes
leavewhenempty = strict

member => SIP/100,1
member => SIP/103,2
member => SIP/104,3
member => SIP/105,1

extensions.conf

exten => 2000,1,Queue(davidqueue|tThH||)

exten => 2001,1,AddQueueMember(davidqueue|SIP/101)
226
exten => 2001,n,Hangup
exten => 2002,1,RemoveQueueMember(davidqueue|SIP/101)
exten => 2002,n,Hangup

exten => 2003,1,AddQueueMember(davidqueue,,1)
exten => 2003,n,Hangup

exten => 2004,1,RemoveQueueMember(davidqueue)
exten => 2004,n,Hangup

exten => 3009,1,Set(NUM=${QUEUE_MEMBER_COUNT(davidqueue)})
exten => 3009,n,SayNumber(${NUM})

exten => 3004,1,PauseQueueMember(davidqueue|SIP/105)
exten => 3004,n,Hangup

exten => 3005,1,UnpauseQueueMember(davidqueue|SIP/105)
exten => 3005,n,Hangup

exten => 3006,1,PauseQueueMember(davidqueue|SIP/100)
exten => 3006,n,Hangup

exten => 3007,1,UnpauseQueueMember(davidqueue|SIP/100)
exten => 3007,n,Hangup


1.) Comprobamos que la cola a sido correctamente configurada desde el CLI:


*CLI> queue show
davidqueue has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0,
A:0, SL:0.0% within 0s
Members:
SIP/105 with penalty 1 (Not in use) has taken no calls yet
SIP/104 with penalty 3 (Not in use) has taken no calls yet
SIP/103 with penalty 2 (Not in use) has taken no calls yet
SIP/100 with penalty 1 (Not in use) has taken no calls yet
No Callers>


2.) Llamada desde la extensión 102 a la cola (2000)



-- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack
-- Started music on hold, class 'default', on SIP/102-09368d60
-- Called SIP/100
-- Called SIP/105
-- SIP/100-093ce628 is ringing
-- SIP/105-0936a510 is ringing
-- Stopped music on hold on SIP/102-09368d60
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'

Vemos que suenan a la vez los teléfonos de los miembros de menor penalidad.

3.) Pausamos la extensión 105 y llamamos de nuevo a la cola.
227
-- Executing [3004@default:1] PauseQueueMember("SIP/102-09368d60",
"davidqueue|SIP/105") in new stack
-- Executing [3004@default:2] Hangup("SIP/102-09368d60", "") in new stack
== Spawn extension (default, 3004, 2) exited non-zero on 'SIP/102-09368d60'

-- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new
stack
-- Started music on hold, class 'default', on SIP/102-09368d60
-- Called SIP/100
-- SIP/100-093cba30 is ringing
-- Stopped music on hold on SIP/102-09368d60
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'



Esta vez solo suena la extensión 100 de forma que en cualquier momento
podemos evitar contestar las llamadas de la cola.


4.) Añadimos dinámicamente el miembro 101 con prioridad 1 a la cola , llamamos
a la cola para ver su funcionamiento y lo eliminamos.


*CLI> queue add member SIP/101 to davidqueue penalty 1

Added interface 'SIP/101' to queue 'davidqueue'

-- Executing [2000@default:1] Queue("SIP/102-093d98a0", "davidqueue|tThH||") in new
stack
-- Started music on hold, class 'default', on SIP/102-093d98a0
-- Called SIP/100
-- Called SIP/101
-- SIP/100-093dd8c0 is ringing
-- SIP/101-093e18e0 is ringing
-- Stopped music on hold on SIP/102-093d98a0
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-093d98a0'


Como se puede observar a pesar de ser un miembro dinámico el
funcionamiento es el mismo que cualquier miembro estático.


-- Executing [2002@default:1] RemoveQueueMember("SIP/102-09368d60",
"davidqueue|SIP/101") in new stack
-- Executing [2002@default:2] Hangup("SIP/102-09368d60", "") in new stack
== Spawn extension (default, 2002, 2) exited non-zero on 'SIP/102-09368d60'


A través de la extension 2002 eliminamos dichos miembro dinámico.

*CLI> queue show
davidqueue has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime), W:0, C:0,
A:0, SL:0.0% within 0s
Members:
SIP/105 with penalty 1 (paused) (Not in use) has taken no calls yet
SIP/104 with penalty 3 (Not in use) has taken no calls yet
228
SIP/103 with penalty 2 (Not in use) has taken no calls yet
SIP/100 with penalty 1 (Not in use) has taken no calls yet
No Callers



5.) Pausamos el miembro 100 y llamamos a la cola para observar como sonará el
de penalidad inmediatamente superior.


-- Executing [3006@default:1] PauseQueueMember("SIP/102-093ce628",
"davidqueue|SIP/100") in new stack
-- Executing [3006@default:2] Hangup("SIP/102-093ce628", "") in new stack
== Spawn extension (default, 3006, 2) exited non-zero on 'SIP/102-093ce628'

-- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack
-- Started music on hold, class 'default', on SIP/102-09368d60
-- Called SIP/103
-- SIP/103-093ce628 is ringing
-- Stopped music on hold on SIP/102-09368d60
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'



Efectivamente el siguiente de mayor penalidad es el miembro 103 y por tanto
es el que suena.

6.) Comprobamos que pasa si tenemos que esperar en la cola

Llama la extensión 102 a la cola y comienza a ser atendido por el miembro 103.


-- Executing [2000@default:1] Queue("SIP/102-09368d60", "davidqueue|tThH||") in new stack
-- Started music on hold, class 'default', on SIP/102-09368d60
-- Called SIP/103
-- SIP/103-093ce628 is ringing
-- SIP/103-093ce628 answered SIP/102-09368d60
-- Stopped music on hold on SIP/102-09368d60
-- Started music on hold, class 'default', on SIP/103-093ce628

A continuación llama a la cola la extensión 101, pero resulta que el miembro
103 está hablando y por tanto no puede coger, el llamante es avisado de que es
el primero esperando y tras dejar de hablar con la extensión 102 atiende a la
extensión que estaba esperando.

-- Executing [2000@default:1] Queue("SIP/101-0936a510", "davidqueue|tThH||") in new
stack
-- Started music on hold, class 'default', on SIP/101-0936a510
-- Called SIP/103
-- SIP/103-093e2ac0 is ringing
-- Nobody picked up in 10000 ms
-- Stopped music on hold on SIP/101-0936a510
-- <SIP/101-0936a510> Playing 'queue-youarenext' (language 'es')
-- Told SIP/101-0936a510 in davidqueue their queue position (which was 1)
-- <SIP/101-0936a510> Playing 'queue-thankyou' (language 'es')
-- Started music on hold, class 'default', on SIP/101-0936a510
-- Called SIP/103
229
-- SIP/103-093e2ac0 is ringing
-- Nobody picked up in 10000 ms
-- Called SIP/103
-- SIP/103-093e2ac0 is ringing
-- Stopped music on hold on SIP/103-093ce628
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/102-09368d60'
-- SIP/103-093e2ac0 answered SIP/101-0936a510
-- Stopped music on hold on SIP/101-0936a510
== Spawn extension (default, 2000, 1) exited non-zero on 'SIP/101-0936a510'

7.) ¿Cuántos miembros hay en la cola?

-- Executing [3009@default:1] Set("SIP/102-093ce628", "NUM=4") in new stack
-- Executing [3009@default:2] SayNumber("SIP/102-093ce628", "4") in new stack
-- <SIP/102-093ce628> Playing 'digits/4' (language 'es')


Otras pruebas:

Pruebas de uso de conferencias en Asterisk 1.4.26.2:



1.) Agregamos a la conferencia creada en el fichero meetme.conf en la extensión
600 a 3 usuarios que desean conversar. La configuración en el fichero
extensions.conf para acceder a la conferencia es:

;Agregarse a la conferencia 600
exten => 600,1,Meetme(600,i,1234)

Al llamar el primer miembro (5000), hace una grabación con su nombre y tras
pulsar # te da un serie de opciones como escuchar la grabación, regrabarla o
aceptarla y después de elegir esta última opción la operadora le indica de su
posición en la conferencia (en este caso el 1).

-- Executing [600@acceso:1] MeetMe("SIP/5000-08d7d820", "600|i|1234") in new stack
== Parsing '/etc/asterisk/meetme.conf': Found
-- Created MeetMe conference 1023 for conference '600'
-- Recording
-- <SIP/5000-08d7d820> Playing 'vm-rec-name' (language 'es')
-- <SIP/5000-08d7d820> Playing 'beep' (language 'es')
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-1 format: sln,
0x8d8f598
[Dec 10 21:49:55] DTMF[29532]: channel.c:2330 ast_read: DTMF begin '#' received on
SIP/5000-08d7d820
[Dec 10 21:49:55] DTMF[29532]: channel.c:2340 ast_read: DTMF begin passthrough '#' on
SIP/5000-08d7d820
[Dec 10 21:49:55] DTMF[29532]: channel.c:2262 ast_read: DTMF end '#' received on
SIP/5000-08d7d820, duration 140 ms
[Dec 10 21:49:55] DTMF[29532]: channel.c:2299 ast_read: DTMF end accepted with begin '#'
on SIP/5000-08d7d820
[Dec 10 21:49:55] DTMF[29532]: channel.c:2315 ast_read: DTMF end passthrough '#' on
SIP/5000-08d7d820
-- User ended message by pressing #
-- <SIP/5000-08d7d820> Playing 'auth-thankyou' (language 'es')
230
-- <SIP/5000-08d7d820> Playing 'vm-review' (language 'es')
[Dec 10 21:50:02] DTMF[29532]: channel.c:2330 ast_read: DTMF begin '1' received on
SIP/5000-08d7d820
[Dec 10 21:50:02] DTMF[29532]: channel.c:2334 ast_read: DTMF begin ignored '1' on
SIP/5000-08d7d820
[Dec 10 21:50:02] DTMF[29532]: channel.c:2262 ast_read: DTMF end '1' received on
SIP/5000-08d7d820, duration 110 ms
[Dec 10 21:50:02] DTMF[29532]: channel.c:2315 ast_read: DTMF end passthrough '1' on
SIP/5000-08d7d820
-- <SIP/5000-08d7d820> Playing 'vm-msgsaved' (language 'es')
-- <SIP/5000-08d7d820> Playing 'conf-onlyperson' (language 'es')
[Dec 10 21:50:06] DEBUG[29532]: app_meetme.c:1817 conf_run: Placed channel SIP/5000-
08d7d820 in DAHDI conf 1023

Hacemos lo mismo con los otros dos usuarios (2003 y 4000):

-- Executing [600@acceso:1] MeetMe("SIP/2003-08df6190", "600|i|1234") in new stack
-- Recording
-- <SIP/2003-08df6190> Playing 'vm-rec-name' (language 'es')
-- <SIP/2003-08df6190> Playing 'beep' (language 'es')
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-2 format: sln,
0x8d8f598
[Dec 10 21:54:56] DTMF[29573]: channel.c:2262 ast_read: DTMF end '#' received on
SIP/2003-08df6190, duration 90 ms
[Dec 10 21:54:56] DTMF[29573]: channel.c:2288 ast_read: DTMF begin emulation of '#' with
duration 90 queued on SIP/2003-08df6190
[Dec 10 21:54:56] DTMF[29573]: channel.c:2407 ast_read: DTMF end emulation of '#'
queued on SIP/2003-08df6190
-- User ended message by pressing #
-- <SIP/2003-08df6190> Playing 'auth-thankyou' (language 'es')
-- <SIP/2003-08df6190> Playing 'vm-review' (language 'es')
[Dec 10 21:55:05] DTMF[29573]: channel.c:2262 ast_read: DTMF end '2' received on
SIP/2003-08df6190, duration 90 ms
[Dec 10 21:55:05] DTMF[29573]: channel.c:2315 ast_read: DTMF end passthrough '2' on
SIP/2003-08df6190
-- Reviewing the recording
-- <SIP/2003-08df6190> Playing '/var/spool/asterisk/meetme/meetme-username-600-2'
(language 'es')
-- <SIP/2003-08df6190> Playing 'vm-review' (language 'es')
[Dec 10 21:55:13] DTMF[29573]: channel.c:2262 ast_read: DTMF end '1' received on
SIP/2003-08df6190, duration 90 ms
[Dec 10 21:55:13] DTMF[29573]: channel.c:2315 ast_read: DTMF end passthrough '1' on
SIP/2003-08df6190
-- <SIP/2003-08df6190> Playing 'vm-msgsaved' (language 'es')
[Dec 10 21:55:15] DEBUG[29533]: app_meetme.c:1457 announce_thread: About to play
/var/spool/asterisk/meetme/meetme-username-600-2
-- <DAHDI/pseudo-1307374741> Playing '/var/spool/asterisk/meetme/meetme-username-600-2'
(language 'es')
-- <DAHDI/pseudo-1307374741> Playing 'conf-hasjoin' (language 'es')
[Dec 10 21:55:19] DEBUG[29573]: app_meetme.c:1817 conf_run: Placed channel SIP/2003-
08df6190 in DAHDI conf 1023

-- Executing [600@acceso:1] MeetMe("SIP/4000-08d910f8", "600|i|1234") in new stack
-- Recording
-- <SIP/4000-08d910f8> Playing 'vm-rec-name' (language 'es')
-- <SIP/4000-08d910f8> Playing 'beep' (language 'es')
231
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-3 format: sln,
0x8d90478
[Dec 10 21:56:35] DTMF[29589]: channel.c:2330 ast_read: DTMF begin '#' received on
SIP/4000-08d910f8
[Dec 10 21:56:35] DTMF[29589]: channel.c:2340 ast_read: DTMF begin passthrough '#' on
SIP/4000-08d910f8
[Dec 10 21:56:35] DTMF[29589]: channel.c:2262 ast_read: DTMF end '#' received on
SIP/4000-08d910f8, duration 170 ms
[Dec 10 21:56:35] DTMF[29589]: channel.c:2299 ast_read: DTMF end accepted with begin '#'
on SIP/4000-08d910f8
[Dec 10 21:56:35] DTMF[29589]: channel.c:2315 ast_read: DTMF end passthrough '#' on
SIP/4000-08d910f8
-- User ended message by pressing #
-- <SIP/4000-08d910f8> Playing 'auth-thankyou' (language 'es')
-- <SIP/4000-08d910f8> Playing 'vm-review' (language 'es')
[Dec 10 21:56:43] DTMF[29589]: channel.c:2330 ast_read: DTMF begin '3' received on
SIP/4000-08d910f8
[Dec 10 21:56:43] DTMF[29589]: channel.c:2334 ast_read: DTMF begin ignored '3' on
SIP/4000-08d910f8
[Dec 10 21:56:43] DTMF[29589]: channel.c:2262 ast_read: DTMF end '3' received on
SIP/4000-08d910f8, duration 140 ms
[Dec 10 21:56:43] DTMF[29589]: channel.c:2315 ast_read: DTMF end passthrough '3' on
SIP/4000-08d910f8
-- Re-recording
-- <SIP/4000-08d910f8> Playing 'vm-rec-name' (language 'es')
-- <SIP/4000-08d910f8> Playing 'beep' (language 'es')
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-3 format: sln,
0x8d90478
[Dec 10 21:56:49] DTMF[29589]: channel.c:2330 ast_read: DTMF begin '#' received on
SIP/4000-08d910f8
[Dec 10 21:56:49] DTMF[29589]: channel.c:2340 ast_read: DTMF begin passthrough '#' on
SIP/4000-08d910f8
[Dec 10 21:56:49] DTMF[29589]: channel.c:2262 ast_read: DTMF end '#' received on
SIP/4000-08d910f8, duration 130 ms
[Dec 10 21:56:49] DTMF[29589]: channel.c:2299 ast_read: DTMF end accepted with begin '#'
on SIP/4000-08d910f8
[Dec 10 21:56:49] DTMF[29589]: channel.c:2315 ast_read: DTMF end passthrough '#' on
SIP/4000-08d910f8
-- User ended message by pressing #
-- <SIP/4000-08d910f8> Playing 'auth-thankyou' (language 'es')
-- <SIP/4000-08d910f8> Playing 'vm-review' (language 'es')
[Dec 10 21:56:52] DTMF[29589]: channel.c:2330 ast_read: DTMF begin '1' received on
SIP/4000-08d910f8
[Dec 10 21:56:52] DTMF[29589]: channel.c:2334 ast_read: DTMF begin ignored '1' on
SIP/4000-08d910f8
[Dec 10 21:56:52] DTMF[29589]: channel.c:2262 ast_read: DTMF end '1' received on
SIP/4000-08d910f8, duration 140 ms
[Dec 10 21:56:52] DTMF[29589]: channel.c:2315 ast_read: DTMF end passthrough '1' on
SIP/4000-08d910f8
-- <SIP/4000-08d910f8> Playing 'vm-msgsaved' (language 'es')
[Dec 10 21:56:54] DEBUG[29533]: app_meetme.c:1457 announce_thread: About to play
/var/spool/asterisk/meetme/meetme-username-600-3
-- <DAHDI/pseudo-1307374741> Playing '/var/spool/asterisk/meetme/meetme-username-600-3'
(language 'es')
-- <DAHDI/pseudo-1307374741> Playing 'conf-hasjoin' (language 'es')
[Dec 10 21:56:58] DEBUG[29589]: app_meetme.c:1817 conf_run: Placed channel SIP/4000-
08d910f8 in DAHDI conf 1023
232
En estos momentos hay 3 personas en la conferencia (600).
Vamos a comprobarlo:

;Saber cuantas personas hay en la conferencia
exten => 601,1,Playback(conf-thereare)
exten => 601,n,MeetMeCount(600)
exten => 601,n,Playback(conf-peopleinconf)

-- Executing [601@acceso:1] Playback("SIP/2000-08e14e28", "conf-thereare") in new stack
-- <SIP/2000-08e14e28> Playing 'conf-thereare' (language 'es')
-- Executing [601@acceso:2] MeetMeCount("SIP/2000-08e14e28", "600") in new stack
-- <SIP/2000-08e14e28> Playing 'digits/3' (language 'es')
-- Executing [601@acceso:3] Playback("SIP/2000-08e14e28", "conf-peopleinconf") in new
stack
-- <SIP/2000-08e14e28> Playing 'conf-peopleinconf' (language 'es')
== Auto fallthrough, channel 'SIP/2000-08e14e28' status is 'UNKNOWN'


2.) Vamos a restringir el número de personas de la conferencia a 2:

Para esto utilizaremos una macro que irá comparando cada vez que alquien
intente acceder a la conferencia dejándole o no dependiendo del número de
usuarios que ya hay en ella.

;Retringir Numero de personas en la conferencia
exten => 610,1,Set(confmax=2)
exten => 610,n,Macro(meetme)

[macro-meetme]
;exten => s,1,NoOp("confmax=" ${confmax})
exten => s,1,MeetMeCount(${MACRO_EXTEN},count)
;exten => s,n,NoOp("count=" ${count})
;exten => s,n,NoOp(${count}">" ${confmax})
exten => s,n,Gotoif($[${count} >= ${confmax}]?103)
exten => s,n,MeetMe(${MACRO_EXTEN})
exten => s,n,Hangup
exten => s,103,Playback(conf-invalid)
exten => s,104,Hangup

Como podemos ver en el archivo meetme.conf:

conf => 600,1234

Esto indica que sólo hay una conferencia creada y que para acceder a ella habrá
que marcar el número 600. Por esto en la primera prueba al marcar el 610 nos
saca esto por el CLI a la par que nos informa que no es un número de
conferencia el que acabamos de marcar.

-- Executing [610@acceso:1] Set("SIP/5000-08d7d7e0", "confmax=2") in new stack
-- Executing [610@acceso:2] Macro("SIP/5000-08d7d7e0", "meetme") in new stack
-- Executing [s@macro-meetme:1] MeetMeCount("SIP/5000-08d7d7e0", "610|count") in new
stack
== Parsing '/etc/asterisk/meetme.conf': Found
[Dec 10 22:04:27] DEBUG[29699]: app_meetme.c:2587 find_conf: 610 isn't a valid conference
233
[Dec 10 22:04:27] DEBUG[29699]: app_macro.c:379 _macro_exec: Executed application:
MeetMeCount
-- Executing [s@macro-meetme:2] GotoIf("SIP/5000-08d7d7e0", "0?103") in new stack
[Dec 10 22:04:27] DEBUG[29699]: app_macro.c:379 _macro_exec: Executed application: Gotoif
-- Executing [s@macro-meetme:3] MeetMe("SIP/5000-08d7d7e0", "610") in new stack
== Parsing '/etc/asterisk/meetme.conf': Found
[Dec 10 22:04:27] DEBUG[29699]: app_meetme.c:2587 find_conf: 610 isn't a valid conference
-- <SIP/5000-08d7d7e0> Playing 'conf-invalid' (language 'es')
== Spawn extension (macro-meetme, s, 3) exited non-zero on 'SIP/5000-08d7d7e0' in macro
'meetme'
== Spawn extension (acceso, 610, 2) exited non-zero on 'SIP/5000-08d7d7e0'


Modificamos el archivo meetme.conf añadiendo la linea: conf => 610 para así
crear una nueva conferencia de extensión 610, la cual la limitaremos a 2
personas.

No le ponemos contraseña porque esta conferencia al tener restringido el
acceso a sólo 2 personas el acceso de ambas personas para hablar será
instantáneo.

Al igual que antes, agregamos los dos usuarios a la conferencia y probamos con
un tercero para ver que resultados obtenemos:

-- Executing [610@acceso:1] Set("SIP/5000-b6911148", "confmax=2") in new stack
-- Executing [610@acceso:2] Macro("SIP/5000-b6911148", "meetme") in new stack
-- Executing [s@macro-meetme:1] MeetMeCount("SIP/5000-b6911148", "610|count") in
new stack
[Dec 10 22:41:46] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application:
MeetMeCount
-- Executing [s@macro-meetme:2] GotoIf("SIP/5000-b6911148", "1?103") in new stack
-- Goto (macro-meetme,s,103)
[Dec 10 22:41:46] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application: Gotoif
-- Executing [s@macro-meetme:103] Playback("SIP/5000-b6911148", "conf-invalid") in new
stack
-- <SIP/5000-b6911148> Playing 'conf-invalid' (language 'es')
[Dec 10 22:41:51] DEBUG[30235]: app_macro.c:379 _macro_exec: Executed application:
Playback
-- Executing [s@macro-meetme:104] Hangup("SIP/5000-b6911148", "") in new stack
== Spawn extension (macro-meetme, s, 104) exited non-zero on 'SIP/5000-b6911148' in macro
'meetme'
== Spawn extension (acceso, 610, 2) exited non-zero on 'SIP/5000-b6911148'

El mensaje es claro: "Este no es un numero de conferencia valido, inténtelo de
nuevo".

3.) Como último ejemplo vamos a crear una conferencia dinámicamente, es decir,
sin configurarla en el meetme.conf.

;Crear una conferencia dinámica
exten => 620,1,Meetme(,scDM(default))
exten => 620,n,Hangup

El proceso de creacion es el siguiente:
234
1. Introduzca el numero de conferencia + #:

-- Executing [620@acceso:1] MeetMe("SIP/5000-b6902bf0", "|scDM(default)") in new
stack
-- <SIP/5000-b6902bf0> Playing 'conf-getconfno' (language 'es')

2. Introduzca el pin d ela conferencia

-- <SIP/5000-b6902bf0> Playing 'conf-getpin' (language 'es')

3. Crea la conferencia y te pide de nuevo el pin

-- Created MeetMe conference 1023 for conference '621'
-- <SIP/5000-b6902bf0> Playing 'conf-getpin' (language 'es')

4. Te dice si estas solo o no

-- <SIP/5000-b6902bf0> Playing 'conf-onlyperson' (language 'es')

Ahora probemos a añadir otro usuario a la conferencia que la hemos creado
con la extensión 621 y 1234 de contraseña.Es importante que no generemos
una conferencia con la misma extensión de la creación dinámica de
conferencias (620).

Para el acceso a cualquier conferencia hay que definir una extensión, en el
archivo extensions.conf en este caso la 621:

;Acceso a conferencias dinamicas y estaticas
exten => 621,1,Meetme()
exten => 621,n,Hangup

-- Executing [621@acceso:1] MeetMe("SIP/2003-b6910c70", "") in new stack
-- <SIP/2003-b6910c70> Playing 'conf-getconfno' (language 'es')
-- <SIP/2003-b6910c70> Playing 'conf-getpin' (language 'es')
-- Stopped music on hold on SIP/5000-b690f648


Tras poner el número de conferencia + # y el pin se accede a la conferencia.

Pruebas Proveedor VoIP: Gizmo5

Uso de Gizmo 5 con Asterisk

Este proveedor tiene dos servicios fácilmente acoplables a las centralitas Asterisk:

• Recepción de llamadas.
• Realización de llamadas.

El primero se consigue a través de una cuenta Call In, de forma que tras obtener la
cuenta solo habría que configurar el archivo sip.conf con la información del proveedor
235
y el Dialplan a través del extensions.conf para que determinadas llamadas sean
recibidas a través de dicho proveedor.

El segundo se consigue a través de una cuenta Call Out, de forma que tras obtener la
cuenta, al igual en el servicio Call In, se configuran los archivos sip.conf y
extensions.conf.

En los siguientes apartados se ve un ejemplo de estas configuraciones y del uso de este
servicio.

Configuración

sip.conf

[general]
[…]
register => 17473702523:Yet100:[email protected]/17473702523

[proxy01.sipphone.com]
type=peer
context=from-external
disallow=all
allow=ulaw
allow=alaw
allow=ilbc
dtmfmode=rfc2833
host=proxy01.sipphone.com
fromdomain=proxy01.sipphone.com
insecure=very
qualify=yes
username=17473702523
fromuser=17473702523
authuser=17473702523
secret=XXXXXXXX
canreinvite=no

extensions.conf

;exten => _6XXXXXXXX,1,Dial(SIP/+34${EXTEN}@proxy01.sipphone.com,20,r)
;exten => _6XXXXXXXX,n,Hangup

Comprobación del registro

*CLI> sip show peers


Name/username
----------------------
proxy01.sipphone.com/1747

Host
-------
198.65.166.131

Dyn Nat ACL Port
-----------------------
5060

Status
---------
OK (216 ms)

Llamada a movil desde GIZMO 5 utilizando cuenta Call Out:

Realización de una llamada desde el usuario SIP/102 hacia un móvil:
236
-- Executing [650XXXXXX@default:1] Dial("SIP/102-08913970",
"SIP/[email protected]|20|r") in new stack
-- Called [email protected]
-- SIP/proxy01.sipphone.com-089213f8 answered SIP/102-08913970
-- Packet2Packet bridging SIP/102-08913970 and SIP/proxy01.sipphone.com-089213f8
== Spawn extension (default, 650XXXXXX, 1) exited non-zero on 'SIP/102-08913970'


Pruebas Trunk IAX entre dos servidores Asterisk

¿Qué es un Trunk?

Un Trunk es una conexión, bien entre dos servidores o entre un servidor y las
aplicaciones de un operador de Telefonía IP que permite el tráfico de VoIP.

Trunk IAX Local entre dos servidores Asterisk

Como se ve en la imagen siguiente el Trunk IAX enlaza dos servidores de la misma red.





La configuración necesaria para que las extensiones de ambos servidores puedan
comunicarse es la siguiente:
237


Tras reiniciar ambos servidores, comprobamos que el registro de las extensiones trunk
es correcto:



Al realizar una llamada desde la extensión 2003 del Servidor a la 100 del Portátil en el
CLI de Asterisk obtenemos:
238



Al realizar una llamada desde la extensión 100 del Portátil a la 2003 del Servidor en el
CLI de Asterisk obtenemos:



239
Trunk IAX entre dos servidores Asterisk

La configuración sería igual a la del Trunk IAX local, la única diferencia es que sería
necesario abrir el puerto correspondiente al protocolo IAX 2 en ambos routers para
poder recibir los paquetes uno del otro.



Pruebas extensión remota

Para configurar una extensión remota debemos configurarla como cualquier otra en
iax.conf:

[6000] type=friend
username=6000
secret=1234
host=dynamic
context=remoto
canreinvite=yes
dtmfmode=rfc2833

Debemos configurar su acceso en el fichero extensions.conf:

[remoto]
exten => 6000,1,Dial(IAX2/${EXTEN},30,Ttm)
exten => 6000,n,Hangup

En el otro lado tendremos configurado en un softphone Zoiper una extensión IAX
poniendo como Dominio la IP externa del servidor.
240
Para poder establecer el registro de dicha extensión es necesario abrir el puerto
correspondiente al protocolo IAX 2 (4569) en el router por el que se comunica con el
exterior la centralita Asterisk.Tras abrir el puerto deberíamos ver algo similar a esto:














Este es el esquema de la conexión con una extensión remota:




Para comprobar el correcto funcionamiento vemos el registro de la extensión
remota(6000):

-- Registered IAX2 '6000' (AUTHENTICATED) at 82.130.246.138:45755

localhost*CLI> iax2 show peers

Name/Username Host
6001/6001 192.168.1.50
Mask
(D) 255.255.255.255
Port
4569
Status
Unmonitored
6000/6000 82.130.246.138 (D) 255.255.255.255 45755 Unmonitored
2 iax2 peers [0 online, 0 offline, 2 unmonitored]
241
Y probamos a llamar desde la extensión de prueba 6001 a la extensión remota:

-- Accepting AUTHENTICATED call from 192.168.1.50:
> requested format = gsm,
> requested prefs = (),
> actual format = gsm,
> host prefs = (gsm|ulaw|alaw),
> priority = mine
-- Executing [6000@remoto:1] Dial("IAX2/6001-14139", "IAX2/6000|30|Ttm") in
new stack
-- Called 6000
-- Started music on hold, class 'default', on IAX2/6001-14139
-- Call accepted by 82.130.246.138 (format gsm)
-- Format for call is gsm
-- IAX2/6000-9140 is ringing
-- IAX2/6000-9140 answered IAX2/6001-14139
-- Stopped music on hold on IAX2/6001-14139
-- Hungup 'IAX2/6000-9140'
== Spawn extension (remoto, 6000, 1) exited non-zero on 'IAX2/6001-14139'
-- Hungup 'IAX2/6001-14139'

Prueba con Adaptador Telefónico Analógico SPA 3000

El esquema de las pruebas es el siguiente:




242
En primer lugar tenemos que acceder a la configuración del SPA 3000 a través de la IP
(192.168.1.211) para configurar las llamadas entrantes a través del apartado PSTN Line
(PSTN->VoIP) y las llamadas salientes a través del apartado Line 1 (VoIP->PSTN).

Line 1
























PSTN Line
























Vemos la configuración del fichero sip.conf:

[9000]
type=friend
username=9000
secret=1234
host=dynamic
context=pstn
qualify=yes
243
[9001] type=peer
username=9001
fromuser=9001
secret=1234
host=dynamic
port=5061
context=pstn
dtmfmode=rfc2833
insecure=very

Comprobamos el registro de las dos líneas:

-- Registered SIP '9000' at 192.168.1.211 port 5060
-- Saved useragent "Sipura/SPA3000-2.0.13(GWg)" for peer 9000
-- Registered SIP '9001' at 192.168.1.211 port 5061
-- Saved useragent "Sipura/SPA3000-2.0.13(GWg)" for peer 9001
NOTICE[3840]: chan_sip.c:13107 handle_response_peerpoke: Peer '9000' is now
Reachable. (25ms / 2000ms)

localhost*CLI> sip show peers
Name/username Host Dyn Nat ACL Port Status
9001/9001 192.168.1.211 D 5061 Unmonitored
9000/9000 192.168.1.211 D 5060 OK (14 ms)

La configuración del fichero extensions.conf teniendo en cuenta que queremos que las
llamadas entrantes de números que empiecen por 9 se redireccionen a un teléfono
analógico y las de los números que empiecen por 6 se redireccionen a un teléfono IP y
que también queremos que las llamadas salientes que empiecen por 9 salgan por la
PSTN:
[globals]
PSTN=192.168.1.211:5061

[pstn]
;Entrantes
exten => 9001,1,NoOP("El CALLERID es: ${CALLERID(num)}")
exten => 9001,n,GotoIf($["${CALLERID(num):0:1}"= "9"]?100:200)
exten => 9001,100,Goto(pstn,9000,1)
exten => 9001,200,Goto(pstn,103,1)
;Si es un numero que empieza por 9
exten => 9000,1,Dial(SIP/9000,30,Ttm)
exten => 9000,n,Hangup

;Si es un numero que empieza por 6
exten => 103,1,Dial(SIP/103,30,Ttm)
exten => 103,n,Hangup

;Salientes
exten => _9XXXXXXXX,1,Dial(SIP/${EXTEN}@${PSTN},30,Ttm)
exten => _9XXXXXXXX,n,Hangup

Realizamos 3 pruebas para comprobar el correcto funcionamiento:

Prueba 1) Llamada desde un móvil al número que está conectado con el SPA 3000:
244
-- Executing [9001@pstn:1] NoOp("SIP/9001-b7776538", ""El CALLERID es: 650664616"") in
new stack
-- Executing [9001@pstn:2] GotoIf("SIP/9001-b7776538", "0?100:200") in new stack
-- Goto (pstn,9001,200)
-- Executing [9001@pstn:200] Goto("SIP/9001-b7776538", "pstn|103|1") in new stack
-- Goto (pstn,103,1)
-- Executing [103@pstn:1] Dial("SIP/9001-b7776538", "SIP/103|30|Ttm") in new stack
-- Called 103
-- Started music on hold, class 'default', on SIP/9001-b7776538
-- SIP/103-0a157af0 is ringing
-- Stopped music on hold on SIP/9001-b7776538
== Spawn extension (pstn, 103, 1) exited non-zero on 'SIP/9001-b7776538'

Prueba 2) Llamada desde un teléfono fijo al número que está conectado con el SPA:

-- Executing [9001@pstn:1] NoOp("SIP/9001-b7771ae0", ""El CALLERID es: 945177145"") in
new stack
-- Executing [9001@pstn:2] GotoIf("SIP/9001-b7771ae0", "1?100:200") in new stack
-- Goto (pstn,9001,100)
-- Executing [9001@pstn:100] Goto("SIP/9001-b7771ae0", "pstn|9000|1") in new stack
-- Goto (pstn,9000,1)
-- Executing [9000@pstn:1] Dial("SIP/9001-b7771ae0", "SIP/9000|30|Ttm") in new stack
-- Called 9000
-- Started music on hold, class 'default', on SIP/9001-b7771ae0
-- SIP/9000-0a157af0 is ringing
-- Stopped music on hold on SIP/9001-b7771ae0
== Spawn extension (pstn, 9000, 1) exited non-zero on 'SIP/9001-b7771ae0'

Prueba 3) Llamada desde la extensión 103 de la centralita a un número fijo:

-- Executing [945177145@acceso2:1] Dial("SIP/103-0a157af0",
"SIP/[email protected]:5061|30|Ttm") in new stack
-- Called [email protected]:5061
-- Started music on hold, class 'default', on SIP/103-0a157af0
-- SIP/192.168.1.211:5061-0a15d138 is ringing
-- SIP/192.168.1.211:5061-0a15d138 answered SIP/103-0a157af0
-- Stopped music on hold on SIP/103-0a157af0
== Spawn extension (acceso2, 945177145, 1) exited non-zero on 'SIP/103-0a157af0'
245




























Capítulo

4






Centralita Asterisk para Yet Informática
y Pruebas realizadas








Descripción de la centralita nueva: Asterisk

Para la correcta creación e implantación de la centralita Asterisk en la empresa Yet
Informática S.L. se ha hecho un Demo para ver el futuro funcionamiento de la central
de una manera más reducida, tras las pruebas generales , las de las aplicaciones
integradas en la centralita y las de otras funcionalidades nuevas estaremos preparados
para dicha implantación.

A continuación veremos cada uno de estos pasos a realizar.
246
Esquema Conceptual del Demo realizado antes de la implantación














Usuario remoto
con SoftPhone




Teléfono IP
(Sipura 841)

Teléfono
Analógico
TDM400P
(1FXO,1FXS)


Teléfono
IP (Sipura
841)




PSTN

IAX2

SIP
'-----

Teléfono IP
(All· NET)

PC con
SoftPhone

@
Astensk SWITCH


Teléfono
IP
(Sipura
841)

Teléfono
Analógico







lli..'J)licación del Plan de llamadas de la Centralita {Dialplan)

Uamadas entrantes














Menú


1) Departamento Comercial.
2 ) Departamento Soporte.
3 ) Departamento Desarrollo o Twister.
O ) Pasar con Operadora.
t ) Si se tarda en marcar uno de los dígitos anteriores
se volverá a escuchar el menú de nuevo.
i ) Si se marca un dígito erróneo en el menú se volverá
a escuchar de nuevo.



Códíco


[i ncomi ng)

include =>administraclon

(administradon)

includt =>acceso

exten => 902147424,l.Answer
exten =>902147424,n,Background(menu]

exten =>
O,l,Goto(recepcion,902147424,1) exten
=> l,l,Goto(comerc ial,902147424,1) exten
=> 2,1,Goto(soporte,902147423,1) exten
=> 3,1,Goto(t wister,945003903,1) exten =>
t,l,Goto(902147424,1)
exten => i,l,Goto{902147424,1)

exten => 902147423,1,Goto(soporte,902147423,1)



247
248
[recepc ion)

exten => 902147424, ,Set(NUM=${EX TEN})
exten => 902147424,n,Macro(general,recepc ionlaborai,
${CALR},${NUM}) [comerc ial]
exten => 902147424, ,Set(NUM=${EX TEN})
exten => 902147424,n,Macro(general, comerc iallaborai,
${CALC},${NUM}) [soporte]
exten => 902147423, ,Set(NUM=${EX TEN})
exten => 902147423,n Macro(general soportelaborai,
${CALS},${NUM}) [twister]
exten => 945003903, ,Set(NUM=${EX TEN})
exten => 945003903,n,Macro(general, twisterlaborai, ${CALT},${NUM})





c_M_e_n_ú , ..-l't IJII.ll Macro Genera l
..·.

Contexto





Macro Genera l


En esta macro se com pr ueba el ca lendario del Departamento
marcado, o bte niendo, si así f uera el caso, el nom b re del evento
en el mome nto de la llamada y redireccionándola a l contexto q ue
coincida con dicho evento.



Código


[macro-genera l )

exten => s, l,Answer
exten => s,n,Set(SALTO=${ARG1})
exten => s,n,AGI(${ARG2})
exten => s,n, Goto(${SALTO},${AAG3},1)
249

Contexto



En el demo de la a plicación, los ca lendarios de l os departamen tos sólo
tend rán un tip o de eventos que serán l os eventos de No Disponible que
tend rán el siguiente formato:


(No Disponible Opto)


(el contexto No Disponible Sop orte se explicará más detenidamente)
En caso de que no haiga evento la red i rección será al contexto po r
defecto que tiene el siguiente formato:


[dpto+laboral)



Código


[recepc ionl a boral]

exten => 902147424,l,Macro(la
borai,${QR}) [comerc ialla boral]
exten => 902147424,l,Macro(l a borai,${QC})

[soportela boral]

exten => 902147423,l,Macro(la
borai,${QS}) [twisterla boral]
exten => 945003903,l,Macro(la borai,${QT})

(No Disponible Recepc ion)

exten => 902147424,l,Macro(nodisponi ble,${BR})

(No Disponible Comerc ial)

exten => 902147424,l,Macro(nodisponi ble,${BC})
(No Dispni ble Twister]
exten => 945003903,l,Macro(nodisponi ble,${BT})
250



Contexto

No Disponible Opto Macro No Disponible

dpto·+laboral Macro La bora l








Macro No Disponible 1



En esta macro se informa a la persona q ue ha llamado que en ese
momen to no puede ser atend ido y se le pasa con el buzón de voz ,


Código


[macro·nodisponible)

exten => s,l,PLa yBack(grabacion2)
exten => s,n,Voi cema ii(${ARG1})
exten => S,n,Hangup



Macro La bora l



En esta macro se com prue ba en la base de datos de la agenda de
clientes si el que ha llamado es cliente VI P, si es así se le añade
una prio ridad de for ma que en el acceso a la co la no esperan, en
caso contrario se meterá en la cola sin ningún tipo de privilegios y
si todos los miem bros están ocu pados tendrá que esperar,



E l contexto No Disponibl e Sop orte es d iferente a l de otros depar-
tamen tos, cuando llega una llamada en horario no la bo ra l llega a
este contexto, se com pr ueba si el teléfono que llama es de un
cliente VI P, si es así se llaman a dos móviles de atención 24 horas
y si no es posible atenderles se envía a uno de esos móviles un
SMS y un email a l departamento para que se le atienda lo antes
posible, incluso se le permite gra bar un mensa je de buzón de voz ,
251
Código


[macro-laboral]

exten => s l,Answer
exten => s,n,
Wait(2)
exten => s,n,SetMusicOnHold(defaul t]
;Consultar con la base de datos si es VIPpara pasar a la primera posicion de la
cola exten => s,n,MYSQL( Connect connid loG3Ihost rroot root agenda)
exten => s,n,MYSQL(Query resultid ${connid SELECl\ mant FROM\ clientes\ INNER\
JOIN\ telefono\ ON\ clientes.id=telefono.idEmp W HERE\ telefono="NUM2"})
exten => s,n,NoOp(resultid = ${resultid})
;Si es VIP --> POSICIONAR DELANTE EN LA COLA
exten => s,n MYSQL(Fetch fetchid ${resultid}
PRIO) exten => s,n,NoOp( ${PRIO})
exten => s,n, Gotolf($["${PRIO}"="VIP")?prio:no)
exten => s,n(prio),MYSQL(Disconnect ${connid}]
; exten => s,n, Gotolf($["${NUM}"=2003)?prio2:no)
exten => s,n,Set(QUEUE_PRIO=
O) exten => s,n, Queue(${ARG1})r)
exten => s,n,Hangup
exten => s,n(no),MYSQL(Disconnect ${connid})
exten => s,n, Queue(${ARG1})r)
exten => s,n,Hangup


(No Ol sponlblSoport ]

;Comprobar en la base de datos si el diente es VIP(contrato d e mantenimiento d e
24h).SIIo ts s1nvla a la prioridad lOO sino lo ts ala 90.
;exten => 902147423,1,MYSQL(Connect conni d l ocalhost root root a¡:enda)
;exten =>902147423,n,No0p(conni d =${connid}]
;extn =>902147423,n,Stt{NUM = S{CALLEROI (num)]]
;exten =>902147423,n,MYSQL(Query resulti d S{connid SELECl\ mant FROM\
clientes\ INNER\ JOIN\ telefono\ ON\ cl entes.id=telefono.i dEmp\ WHERE\
telefono="S{NU$
;exten => 902147423,n,No0p(resulti d = S{resultid})
;xtn =>902147423,n,MYSQL(F tch f tchid S{r s u tid] MANT)
;exten =>902147423,n,MYSQL(Disconnect S{connid}]
;exten => 902147423,n,Gotolf($["${MANT]"=" VIP"]?100:90)



;exten => 902147423,90,Macro(nodisponible, ${BS})

;exten =>902147423,100,No0p(${NUM})
;exten => 902147423,n,Gotoif($["${NUM:O:l}" = "6")?200:300)
;extn => 902147423,200, 0iai(SIP/+34${MOVIL1]@proxyOl.sipphone.com, 20,r ]
;xten =>902147423,n, Oiai(Sebi/¡1/${MOVIL1}, 30)
;exten =>902147423,n,Dial(SIP/+34${MOVIL2}@proxy01.sipphone.com,20,r)
;exten => 902147423,n,Oiai(Sebi/g1/${MOVIL2} 30)
;extn =>902147423,n,AGI(sms_s nd.php)
;exten =>902147423,n,Voi cemaii(${ARG1})
;exten => 902147423,n,Hangup
;xtn =>902147423,300, 0iai{OAHOI/${MOVIL1),20,r)
;exten => 902147423,n,Diai(OAHOI/${MOVIL2},20,r)
;exten => 902147423,n,AGI(sms_send.php)
;extn =>902147423,n,Voi cemall(3333)
;exten =>902147423,n,Han¡:up
252
Accesos Directos a usuarios de la Empresa















Gestión de Buzones de Voz





Gestión de las Colas de la aplicación
























253
254














































255
Funcionamiento de la Funcionalidad CallBack

Los pasos para realizar el CallBack son los siguientes:

1) Marcar el teléfono al que se llamará.
2) Marcar la fecha de la llamada en el formato siguiente:

4 dígitos para el año
2 dígitos para el mes
2 dígitos para el día

3) Marcar la hora de la llamada en el formato siguiente:

2 dígitos para la hora
2 dígitos para los minutos

4) Verificar que los datos introducidos son correctos o volver a introducirlos.
5) Se generará el Call File teniendo en cuenta si la llamada será a un número
externo o no, para comprobarlo mira que el primer digito sea un 6.



256

Uso de Conferencias en la aplicación

Agregarse a la conferencia 600



Saber cuántas personas hay en la conferencia


Restringir el número de participantes de una conferencia




Uso de Conferencia dinámica




Última llamada recibida

Esta funcionalidad en los teléfonos IP de gama media o alta no haría falta pero para
poder obtener esta información usando cualquier teléfono IP se ha implementado.
































257
Consiste en comprobar en la base de datos del CDR cuál ha sido la última llamada
recibida para el CALLERID que ha llamado a la extensión de esta funcionalidad y
llamarla.




Última llamada realizada

Consiste en comprobar en la base de datos del CDR cuál ha sido la última llamada
realizada por el CALLERID que ha llamado a la extensión de esta funcionalidad y
llamarla. Si la última llamada a sido realizada a un usuario interno se mira cual es la
llamada anterior y si no es interna se realiza la llamada.


258




Funcionamiento de la Funcionalidad DISA

Configuración 1) Al llamar a la centralita un determinado número, está le llama y le da tono
para llamar a través de esta.



Configuración 2) Al llamar a la extensión 333 de la centralita, está le llama y le da tono para
llamar a través de esta.


259
Configuración 3) Al llamar a la extensión 9999 de la centralita, tras marcar la contraseña 1234
seguido del carácter #, está da tono para llamar a través de esta a cualquier
número de salida que este en el contexto
“acceso”.




Funcionamiento del desvío de las llamadas de usuarios internos a otro teléfono



Activación del desvío de llamadas de una extensión de un usuario interno



Desactivación del desvío de llamadas de una extensión de un usuario interno


260
Prueba para la extensión 5000 tras efectuar el desvío.




Pruebas generales

Prueba 1) Llama a la centralita en un horario no laborable un usuario VIP.

Parte de código utilizado:

[acceso]
exten => 787,1,Set(NUM=${EXTEN})
exten => 787,n,Macro(general,soportelaboral,${CALS},${NUM})

[macro-general]
;1)COMPROBACION CON EL CALENDARIO
exten => s,1,Answer
exten => s,n,Set(SALTO=${ARG1})
exten => s,n,AGI(${ARG2})
exten => s,n,Goto(${SALTO},${ARG3},1)

[No Disponible Soporte]
;Comprobar en la base de datos si el cliente es VIP(contrato de mantenimiento de 24h).Si lo
es se le envia a la prioridad 100 sino lo es a la 90.
exten => 787,1,MYSQL(Connect connid localhost root root agenda)
exten => 787,n,NoOp(connid = ${connid})
exten => 787,n,Set(NUM2= ${CALLERID(num)})
exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\
telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616)
;exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\
JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=${NUM2})
exten => 787,n,NoOp(resultid = ${resultid})
exten => 787,n,MYSQL(Fetch fetchid ${resultid} MANT)
exten => 787,n,NoOp(MANT = ${MANT})
exten => 787,n,MYSQL(Disconnect ${connid})
exten => 787,n,GotoIf($["${MANT}"="VIP"]?100:90)

exten => 787,90,Macro(nodisponible,${BS})
exten => 787,100,Set(N=650664616)
;exten => 787,100,Set(N=${NUM2})
exten => 787,n,Gotoif($["${N:0:1}" = "6"]?200:300)
exten => 787,200,Dial(SIP/+34${MOVIL1}@proxy01.sipphone.com,20,r)
exten => 787,n,Dial(Sebi/g1/${MOVIL1},30)
exten => 787,n,Dial(SIP/+34${MOVIL2}@proxy01.sipphone.com,20,r)
exten => 787,n,Dial(Sebi/g1/${MOVIL2},30)
exten => 787,n,AGI(sms_send.php)
exten => 787,n,Voicemail(3333)
exten => 787,n,Hangup
;sI ESTUVIERA CONECTADO A LA PSTN Y NO FUERA UN MOVIL SALDRIA POR AHI
exten => 787,300,Dial(DAHDI/${MOVIL1},20,r)
261
exten => 787,n,Dial(DAHDI/${MOVIL2},20,r)
exten => 787,n,AGI(sms_send.php)
exten => 787,n,Voicemail(3333)
exten => 787,n,Hangup

El log en caso de que coja el móvil el encargado de atender a usuarios 24 desde el
proveedor IP Gizmo 5:

-- Executing [787@acceso:1] Set("SIP/2003-b6901320", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2003-b6901320", "general|soportelaboral|pyastcal.py|787")
in new stack
-- Executing [s@macro-general:1] Answer("SIP/2003-b6901320", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/2003-b6901320", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2003-b6901320", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
-- Executing [s@macro-general:4] Goto("SIP/2003-b6901320", "No Disponible Soporte|787|1") in new
stack
-- Goto (No Disponible Soporte,787,1)
== Channel 'SIP/2003-b6901320' jumping out of macro 'general'
-- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-b6901320", "Connect connid localhost
root root agenda") in new stack
-- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-b6901320", "connid = 1") in new stack
-- Executing [787@No Disponible Soporte:3] Set("SIP/2003-b6901320", "NUM2= 2003") in new stack
-- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-b6901320", "Query resultid 1 SELECT
mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE
telefono=650664616") in new stack
-- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-b6901320", "resultid = 2") in new stack
-- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-b6901320", "Fetch fetchid 2 MANT") in
new stack
-- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-b6901320", "MANT = VIP") in new stack
-- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-b6901320", "Disconnect 1") in new
stack
-- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-b6901320", "1?100:90") in new stack
-- Goto (No Disponible Soporte,787,100)
-- Executing [787@No Disponible Soporte:100] Set("SIP/2003-b6901320", "N=650664616") in new
stack
-- Executing [787@No Disponible Soporte:101] GotoIf("SIP/2003-b6901320", "1?200:300") in new stack
-- Goto (No Disponible Soporte,787,200)
-- Executing [787@No Disponible Soporte:200] Dial("SIP/2003-b6901320",
"SIP/[email protected]|20|r") in new stack
-- Called [email protected]
-- SIP/proxy01.sipphone.com-0a1e3628 answered SIP/2003-b6901320
-- Packet2Packet bridging SIP/2003-b6901320 and SIP/proxy01.sipphone.com-0a1e3628
== Spawn extension (No Disponible Soporte, 787, 200) exited non-zero on 'SIP/2003-b6901320'

Para ver el correcto envio de SMS quito el valor a las variables que contienen los
móviles a llamar en horario no laboral:

-- Executing [787@acceso:1] Set("SIP/2003-b6900f70", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2003-b6900f70", "general|soportelaboral|pyastcal.py|787") in
new stack
-- Executing [s@macro-general:1] Answer("SIP/2003-b6900f70", "") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2003-b6900f70", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
262
-- Executing [s@macro-general:4] Goto("SIP/2003-b6900f70", "No Disponible Soporte|787|1") in new
stack
-- Goto (No Disponible Soporte,787,1)
== Channel 'SIP/2003-b6900f70' jumping out of macro 'general'
-- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-b6900f70", "Connect connid localhost
root root agenda") in new stack
-- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-b6900f70", "connid = 1") in new stack
-- Executing [787@No Disponible Soporte:3] Set("SIP/2003-b6900f70", "NUM2= 2003") in new stack
-- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-b6900f70", "Query resultid 1 SELECT
mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE
telefono=650664616") in new stack
-- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-b6900f70", "resultid = 2") in new stack
-- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-b6900f70", "Fetch fetchid 2 MANT") in
new stack
-- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-b6900f70", "MANT = VIP") in new stack
-- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-b6900f70", "Disconnect 1") in new stack
-- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-b6900f70", "1?100:90") in new stack
-- Goto (No Disponible Soporte,787,100)
-- Executing [787@No Disponible Soporte:100] Set("SIP/2003-b6900f70", "N=650664616") in new stack
-- Executing [787@No Disponible Soporte:101] GotoIf("SIP/2003-b6900f70", "1?200:300") in new stack
-- Goto (No Disponible Soporte,787,200)
-- Executing [787@No Disponible Soporte:200] Dial("SIP/2003-b6900f70",
"SIP/[email protected]|20|r") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [787@No Disponible Soporte:201] Dial("SIP/2003-b6900f70", "Sebi/g1/|30") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [787@No Disponible Soporte:202] Dial("SIP/2003-b6900f70",
"SIP/[email protected]|20|r") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [787@No Disponible Soporte:203] Dial("SIP/2003-b6900f70", "Sebi/g1/|30") in new stack
== Everyone is busy/congested at this time (1:0/0/1)
-- Executing [787@No Disponible Soporte:204] AGI("SIP/2003-b6900f70", "sms_send.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php
-- AGI Script sms_send.php completed, returning 0
== Spawn extension (No Disponible Soporte, 787, 205) exited non-zero on 'SIP/2003-b6900f70'
Prueba 2) Llama a la centralita en un horario no laborable un usuario no VIP.
Parte de código utilizado:
[No Disponible Soporte]
;Comprobar en la base de datos si el cliente es VIP(contrato de mantenimiento de 24h).Si lo
es se le envia a la prioridad 100 sino lo es a la 90.
exten => 787,1,MYSQL(Connect connid localhost root root agenda)
exten => 787,n,NoOp(connid = ${connid})
exten => 787,n,Set(NUM2= ${CALLERID(num)})
exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\
telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616)
;exten => 787,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\
JOIN\ telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=${NUM2})
exten => 787,n,NoOp(resultid = ${resultid})
exten => 787,n,MYSQL(Fetch fetchid ${resultid} MANT)
exten => 787,n,NoOp(MANT = ${MANT})
exten => 787,n,MYSQL(Disconnect ${connid})
exten => 787,n,GotoIf($["${MANT}"="VIP"]?100:90)
263
exten => 787,90,Macro(nodisponible,${BS})
[macro-nodisponible]
exten => s,1,PLayBack(grabacion2)
exten => s,n,Voicemail(${ARG1})
exten => S,n,Hangup

El log desde el CLI es el siguiente:

-- Executing [787@acceso:1] Set("SIP/2003-0a1e3110", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2003-0a1e3110", "general|soportelaboral|pyastcal.py|787")
in new stack
-- Executing [s@macro-general:1] Answer("SIP/2003-0a1e3110", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/2003-0a1e3110", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2003-0a1e3110", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
-- Executing [s@macro-general:4] Goto("SIP/2003-0a1e3110", "No Disponible Soporte|787|1") in new
stack
-- Goto (No Disponible Soporte,787,1)
== Channel 'SIP/2003-0a1e3110' jumping out of macro 'general'
-- Executing [787@No Disponible Soporte:1] MYSQL("SIP/2003-0a1e3110", "Connect connid localhost
root root agenda") in new stack
-- Executing [787@No Disponible Soporte:2] NoOp("SIP/2003-0a1e3110", "connid = 1") in new stack
-- Executing [787@No Disponible Soporte:3] Set("SIP/2003-0a1e3110", "NUM2= 2003") in new stack
-- Executing [787@No Disponible Soporte:4] MYSQL("SIP/2003-0a1e3110", "Query resultid 1 SELECT
mant FROM clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono= 2003") in
new stack
-- Executing [787@No Disponible Soporte:5] NoOp("SIP/2003-0a1e3110", "resultid = 2") in new stack
-- Executing [787@No Disponible Soporte:6] MYSQL("SIP/2003-0a1e3110", "Fetch fetchid 2 MANT") in
new stack
-- Executing [787@No Disponible Soporte:7] NoOp("SIP/2003-0a1e3110", "MANT = ") in new stack
-- Executing [787@No Disponible Soporte:8] MYSQL("SIP/2003-0a1e3110", "Disconnect 1") in new stack
-- Executing [787@No Disponible Soporte:9] GotoIf("SIP/2003-0a1e3110", "0?100:90") in new stack
-- Goto (No Disponible Soporte,787,90)
-- Executing [787@No Disponible Soporte:90] Macro("SIP/2003-0a1e3110", "nodisponible|3333") in
new stack
-- Executing [s@macro-nodisponible:1] Playback("SIP/2003-0a1e3110", "grabacion2") in new stack
-- Executing [s@macro-nodisponible:2] VoiceMail("SIP/2003-0a1e3110", "3333") in new stack
-- <SIP/2003-0a1e3110> Playing 'vm-intro' (language 'es')
== Spawn extension (macro-nodisponible, s, 2) exited non-zero on 'SIP/2003-0a1e3110' in macro
'nodisponible'
== Spawn extension (No Disponible Soporte, 787, 90) exited non-zero on 'SIP/2003-0a1e3110'

Prueba 3) Llama a la centralita en un horario laboral un usuario VIP.

1) Pausar todos los miembros menos el 2001 de la cola del Departamento de Soporte,
al que le llegarán todas las llamadas.
2) El 2005 llama a la cola.(se le mantiene en espera)
3) El 4000 llama a la cola.(se le mantiene en espera)
4) El 2003 llama a la cola --> QUEUE_PRIO=10 (se le mantiene en espera)
5) Cuando el 2001 coja el telefono deberia hablar con 2003.
264
El código utilizado en el apartado 1 es el siguiente:

exten => _XXXX22,1,PauseQueueMember(${QS}|SIP/${EXTEN:0:4})
exten => _XXXX22,n,Hangup

El log del CLI del apartado 1 es:

-- Executing [200022@acceso:1] PauseQueueMember("SIP/2003-b6900590",
"soportequeue|SIP/2000") in new stack
-- Executing [200022@acceso:2] Hangup("SIP/2003-b6900590", "") in new stack
-- Executing [200522@acceso:1] PauseQueueMember("SIP/2003-b690ea58",
"soportequeue|SIP/2005") in new stack
-- Executing [200522@acceso:2] Hangup("SIP/2003-b690ea58", "") in new stack
== Spawn extension (acceso, 200522, 2) exited non-zero on 'SIP/2003-b690ea58'
-- Executing [200322@acceso:1] PauseQueueMember("SIP/2003-b690d430",
"soportequeue|SIP/2003") in new stack
-- Executing [200322@acceso:2] Hangup("SIP/2003-b690d430", "") in new stack

El código utilizado en los apartados 2,3,4 y 5 es el siguiente:

exten => 787,1,Set(NUM=${EXTEN})
exten => 787,n,Macro(general,soportelaboral,${CALS},${NUM})
[macro-general]
;1)COMPROBACION CON EL CALENDARIO
exten => s,1,Answer
exten => s,n,Set(SALTO=${ARG1})
exten => s,n,AGI(${ARG2})
exten => s,n,Goto(${SALTO},${ARG3},1)

[soportelaboral]
exten => 787,1,Macro(laboral,${QS})
[macro-laboral]
exten => s,1,Answer
exten => s,n,Wait(2)
exten => s,n,SetMusicOnHold(default)
;Consultar con la base de datos si es VIP para pasar a la primera posicion de la cola
exten => s,n,MYSQL(Connect connid localhost root root agenda)
exten => s,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\
JOIN\ telefono\ ON\ clientes.id=telefono.idEmp WHERE\ telefono="NUM2"})
exten => s,n,NoOp(resultid = ${resultid})
;Si es VIP --> POSICIONAR DELANTE EN LA COLA
exten => s,n,MYSQL(Fetch fetchid ${resultid} PRIO)
exten => s,n,NoOp( ${PRIO})
exten => s,n,GotoIf($["${PRIO}"="VIP"]?prio:no)
exten => s,n(prio),MYSQL(Disconnect ${connid})
;exten => s,n,GotoIf($["${NUM}"=2003]?prio2:no)
exten => s,n,Set(QUEUE_PRIO=10)
exten => s,n,Queue(${ARG1}|r)
exten => s,n,Hangup
exten => s,n(no),MYSQL(Disconnect ${connid})
exten => s,n,Queue(${ARG1}|r)
exten => s,n,Hangup
265
El log del CLI del apartado 2 es:

-- Executing [787@acceso:1] Set("SIP/2005-b6902d00", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2005-b6902d00", "general|soportelaboral|pyastcal.py|787")
in new stack
-- Executing [s@macro-general:1] Answer("SIP/2005-b6902d00", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/2005-b6902d00", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2005-b6902d00", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
-- Executing [s@macro-general:4] Goto("SIP/2005-b6902d00", "soportelaboral|787|1") in new stack
-- Goto (soportelaboral,787,1)
== Channel 'SIP/2005-b6902d00' jumping out of macro 'general'
-- Executing [787@soportelaboral:1] Macro("SIP/2005-b6902d00", "laboral|soportequeue") in new
stack
-- Executing [s@macro-laboral:1] Answer("SIP/2005-b6902d00", "") in new stack
-- Executing [s@macro-laboral:2] Wait("SIP/2005-b6902d00", "2") in new stack
-- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2005-b6902d00", "default") in new stack
-- Executing [s@macro-laboral:5] MYSQL("SIP/2005-b6902d00", "Query resultid ") in new stack
-- Executing [s@macro-laboral:6] NoOp("SIP/2005-b6902d00", "resultid = ") in new stack
-- Executing [s@macro-laboral:7] MYSQL("SIP/2005-b6902d00", "Fetch fetchid PRIO") in new stack
-- Executing [s@macro-laboral:8] NoOp("SIP/2005-b6902d00", " ") in new stack
-- Executing [s@macro-laboral:9] GotoIf("SIP/2005-b6902d00", "0?prio:no") in new stack
-- Goto (macro-laboral,s,14)
-- Executing [s@macro-laboral:14] MYSQL("SIP/2005-b6902d00", "Disconnect 1") in new stack
-- Executing [s@macro-laboral:15] Queue("SIP/2005-b6902d00", "soportequeue|r") in new stack
-- Called SIP/2001
-- SIP/2001-0a17d960 is ringing

El log del CLI del apartado 3 es:

-- Executing [787@acceso:1] Set("SIP/4000-b6900590", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/4000-b6900590", "general|soportelaboral|pyastcal.py|787")
in new stack
-- Executing [s@macro-general:1] Answer("SIP/4000-b6900590", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/4000-b6900590", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/4000-b6900590", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
-- Executing [s@macro-general:4] Goto("SIP/4000-b6900590", "soportelaboral|787|1") in new stack
-- Goto (soportelaboral,787,1)
== Channel 'SIP/4000-b6900590' jumping out of macro 'general'
-- Executing [787@soportelaboral:1] Macro("SIP/4000-b6900590", "laboral|soportequeue") in new
stack
-- Executing [s@macro-laboral:1] Answer("SIP/4000-b6900590", "") in new stack
-- Executing [s@macro-laboral:2] Wait("SIP/4000-b6900590", "2") in new stack
-- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/4000-b6900590", "default") in new stack
-- Executing [s@macro-laboral:4] MYSQL("SIP/4000-b6900590", "Connect connid localhost root root
agenda") in new stack
-- Executing [s@macro-laboral:5] MYSQL("SIP/4000-b6900590", "Query resultid ") in new stack
-- Executing [s@macro-laboral:6] NoOp("SIP/4000-b6900590", "resultid = ") in new stack
-- Executing [s@macro-laboral:7] MYSQL("SIP/4000-b6900590", "Fetch fetchid PRIO") in new stack
-- Executing [s@macro-laboral:8] NoOp("SIP/4000-b6900590", " ") in new stack
-- Executing [s@macro-laboral:9] GotoIf("SIP/4000-b6900590", "0?prio:no") in new stack
-- Goto (macro-laboral,s,14)
-- Executing [s@macro-laboral:14] MYSQL("SIP/4000-b6900590", "Disconnect 1") in new stack
266
-- Executing [s@macro-laboral:15] Queue("SIP/4000-b6900590", "soportequeue|r") in new stack
-- Called SIP/2001
-- SIP/2001-0a1fb1b8 is ringing
-- Nobody picked up in 10000 ms

El log del CLI del apartado 4 es:

-- Executing [787@acceso:1] Set("SIP/2003-b6902d00", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2003-b6902d00", "general|soportelaboral|pyastcal.py|787")
in new stack
-- Executing [s@macro-general:1] Answer("SIP/2003-b6902d00", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/2003-b6902d00", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2003-b6902d00", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0
-- Executing [s@macro-general:4] Goto("SIP/2003-b6902d00", "soportelaboral|787|1") in new stack
-- Goto (soportelaboral,787,1)
== Channel 'SIP/2003-b6902d00' jumping out of macro 'general'
-- Executing [787@soportelaboral:1] Macro("SIP/2003-b6902d00", "laboral|soportequeue") in new
stack
-- Executing [s@macro-laboral:1] Answer("SIP/2003-b6902d00", "") in new stack
-- Executing [s@macro-laboral:2] Wait("SIP/2003-b6902d00", "2") in new stack
-- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2003-b6902d00", "default") in new stack
-- Executing [s@macro-laboral:4] MYSQL("SIP/2003-b6902d00", "Connect connid localhost root root
agenda") in new stack
-- Executing [s@macro-laboral:5] MYSQL("SIP/2003-b6902d00", "Query resultid 1 SELECT mant FROM
clientes INNER JOIN telefono ON clientes.id=telefono.idEmp WHERE telefono=650664616") in new
stack
-- Executing [s@macro-laboral:6] NoOp("SIP/2003-b6902d00", "resultid = 2") in new stack
-- Executing [s@macro-laboral:7] MYSQL("SIP/2003-b6902d00", "Fetch fetchid 2 PRIO") in new stack
-- Executing [s@macro-laboral:8] NoOp("SIP/2003-b6902d00", " VIP") in new stack
-- Executing [s@macro-laboral:9] GotoIf("SIP/2003-b6902d00", "1?prio:no") in new stack
-- Goto (macro-laboral,s,10)
-- Executing [s@macro-laboral:10] MYSQL("SIP/2003-b6902d00", "Disconnect 1") in new stack
-- Executing [s@macro-laboral:11] Set("SIP/2003-b6902d00", "QUEUE_PRIO=10") in new stack
-- Executing [s@macro-laboral:12] Queue("SIP/2003-b6902d00", "soportequeue|r") in new stack
-- Called SIP/2001
-- SIP/2001-0a1ee040 is ringing
-- Nobody picked up in 10000 ms

El log del CLI del apartado 5 es:

-- SIP/2001-0a217400 answered SIP/2003-b69196e8
-- Native bridging SIP/2003-b69196e8 and SIP/2001-0a217400

Prueba 4) Llama a la centralita en un horario laboral un usuario no VIP.

Parte de código utilizado:

[macro-general]

;1)COMPROBACION CON EL CALENDARIO
exten => s,1,Answer
exten => s,n,Set(SALTO=${ARG1})
267
exten => s,n,AGI(${ARG2})
exten => s,n,Goto(${SALTO},${ARG3},1)
[soportelaboral]
;PRUEBAS
exten => 787,1,Macro(laboral,${QS})
[macro-laboral]
exten => s,1,Answer
exten => s,n,Wait(2)
exten => s,n,SetMusicOnHold(default)
;Consultar con la base de datos si es VIP para pasar a la primera posicion de la cola
exten => s,n,MYSQL(Connect connid localhost root root agenda)
exten => s,n,MYSQL(Query resultid ${connid SELECT\ mant FROM\ clientes\ INNER\ JOIN\
telefono\ ON\ clientes.id=telefono.idEmp WHERE\ telefono="NUM2"})
;exten => s,n,MYSQL(Query resultid ${connid} SELECT\ mant FROM\ clientes\ INNER\ JOIN\
telefono\ ON\ clientes.id=telefono.idEmp\ WHERE\ telefono=650664616)
exten => s,n,NoOp(resultid = ${resultid})
;Si es VIP --> POSICIONAR DELANTE EN LA COLA
exten => s,n,MYSQL(Fetch fetchid ${resultid} PRIO)
exten => s,n,NoOp( ${PRIO})
exten => s,n,GotoIf($["${PRIO}"="VIP"]?prio:no)
exten => s,n(prio),MYSQL(Disconnect ${connid})
;exten => s,n,GotoIf($["${NUM}"=2003]?prio2:no)
exten => s,n,Set(QUEUE_PRIO=10)
exten => s,n,Queue(${ARG1}|r)
exten => s,n,Hangup
exten => s,n(no),MYSQL(Disconnect ${connid})
exten => s,n,Queue(${ARG1}|r)
exten => s,n,Hangup

El log desde el CLI es el siguiente:

-- Executing [787@acceso:1] Set("SIP/2003-092dc808", "NUM=787") in new stack
-- Executing [787@acceso:2] Macro("SIP/2003-092dc808", "general|soportelaboral|pyastcal.py|787") in
new stack
-- Executing [s@macro-general:1] Answer("SIP/2003-092dc808", "") in new stack
-- Executing [s@macro-general:2] Set("SIP/2003-092dc808", "SALTO=soportelaboral") in new stack
-- Executing [s@macro-general:3] AGI("SIP/2003-092dc808", "pyastcal.py") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/pyastcal.py
-- AGI Script pyastcal.py completed, returning 0

-- Executing [s@macro-general:4] Goto("SIP/2003-092dc808", "soportelaboral|787|1") in new stack
-- Goto (soportelaboral,787,1)
== Channel 'SIP/2003-092dc808' jumping out of macro 'general'
-- Executing [787@soportelaboral:1] Macro("SIP/2003-092dc808", "laboral|soportequeue") in new stack
-- Executing [s@macro-laboral:1] Answer("SIP/2003-092dc808", "") in new stack
-- Executing [s@macro-laboral:2] Wait("SIP/2003-092dc808", "2") in new stack
-- Executing [s@macro-laboral:3] SetMusicOnHold("SIP/2003-092dc808", "default") in new stack
-- Executing [s@macro-laboral:4] MYSQL("SIP/2003-092dc808", "Connect connid localhost root root
agenda") in new stack
-- Executing [s@macro-laboral:5] Set("SIP/2003-092dc808", "NUM = 2003") in new stack
-- Executing [s@macro-laboral:6] MYSQL("SIP/2003-092dc808", "Query resultid ") in new stack
-- Executing [s@macro-laboral:7] NoOp("SIP/2003-092dc808", "resultid = ") in new stack
268
-- Executing [s@macro-laboral:8] GotoIf("SIP/2003-092dc808", "0?prio:no") in new stack
-- Goto (macro-laboral,s,13)

-- Executing [s@macro-laboral:13] MYSQL("SIP/2003-092dc808", "Disconnect 1") in new stack
-- Executing [s@macro-laboral:14] Queue("SIP/2003-092dc808", "soportequeue|r") in new stack
-- Called SIP/2001
-- Called SIP/2004
-- Called SIP/2003
-- Called SIP/2002
-- SIP/2001-09337208 is ringing
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2004-0933b228 is busy
-- Nobody picked up in 1000 ms
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2003-0933f248 is busy
-- Nobody picked up in 1000 ms
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2002-09343268 is busy
-- Nobody picked up in 1000 ms
-- Nobody picked up in 10000 ms
-- Nobody picked up in 10000 ms
-- Called SIP/2001
-- Called SIP/2004
-- Called SIP/2003
-- Called SIP/2002
-- SIP/2001-09337208 is ringing
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2004-0933b228 is busy
-- Nobody picked up in 0 ms
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2003-0933f248 is busy
-- Nobody picked up in 0 ms
-- Got SIP response 486 "Busy Here" back from 192.168.1.206
-- SIP/2002-09343268 is busy
-- Nobody picked up in 1000 ms
== Spawn extension (macro-laboral, s, 14) exited non-zero on 'SIP/2003-092dc808' in macro 'laboral'
== Spawn extension (soportelaboral, 787, 1) exited non-zero on 'SIP/2003-092dc808'

Prueba 5) Comportamiento en el menú

Parte de código utilizado:

exten => 902147424,1,Answer
exten => 902147424,n,Background(menu)
exten => 902147424,n,Wait(10)

exten => 0,1,Goto(recepcion,${PHONE1},1)
exten => 1,1,Goto(comercial,${PHONE1},1)
exten => 2,1,Goto(soporte,${PHONE2},1)
exten => 3,1,Goto(twister,${PHONE3},1)
exten => 4000,1,Goto(acceso,${EXTEN},1)
exten => t,1,Goto(${PHONE1},1)
exten => i,1,Goto(${PHONE1},1)

exten => 4000,1,Macro(acceso,${EXTEN})
269
[macro-acceso]

exten => s,1,Dial(SIP/${ARG1},30,Ttm)
exten => s,n,Voicemail(${ARG1})
exten => s,n,Hangup

El log desde el CLI es el siguiente:

-- Executing [902147424@acceso:1] Answer("SIP/2003-b6900590", "") in new stack
-- Executing [902147424@acceso:2] BackGround("SIP/2003-b6900590", "menu") in new stack
-- <SIP/2003-b6900590> Playing 'menu' (language 'es')
== CDR updated on SIP/2003-b6900590
-- Executing [4000@acceso:1] Macro("SIP/2003-b6900590", "acceso|4000") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/2003-b6900590", "SIP/4000|30|Ttm") in new stack
-- Called 4000
-- Started music on hold, class 'default', on SIP/2003-b6900590
-- SIP/4000-0a17d5c8 is ringing
-- Stopped music on hold on SIP/2003-b6900590
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/2003-b6900590' in macro 'acceso'
== Spawn extension (acceso, 4000, 1) exited non-zero on 'SIP/2003-b6900590'

Configuración de ficheros más utilizados

Tabla de descripción de ficheros de configuración


Fichero

Descripción




extensions.conf

En este fichero, junto con los ficheros
que incluye la carpeta dialplan se
concentra el núcleo de la centralita, el
plan de llamadas, explicado
anteriormente.


sip.conf

En este fichero se registran
los usuarios SIP


iax.conf

En este fichero se registran
los usuarios IAX




features.conf

En Este fichero se establece la
configuración de Call Parking y
Call Pickup

270



manager.conf

En este fichero se configuran
los usuarios del AMI.


meetme.conf

En este fichero se configuran las
conferencias por defecto de la centralita.


queues.conf

En este fichero se configuran
las colas de la centralita.


voicemail.conf

En este fichero se configuran
los buzones de voz.



Fichero de configuración: EXTENSIONS.CONF, SIP.CONF, IAX.CONF

Para visualizar estos ficheros acudir al anexo.

Fichero de configuración: FEATURES.CONF





Fichero de configuración: MANAGER.CONF





Fichero de configuración: MEETME.CONF





Fichero de configuración: QUEUES.CONF







































































2
7
1
272





Fichero de configuración: VOICEMAIL.CONF




273



Bases de datos empleadas

Tabla de descripción de las bases de datos utilizadas




Nombre de Base de Datos

Descripción



cdr

En esta base de datos se guardan los
datos del registro de llamadas y los
canales de la aplicación CDR Reports.


fop2

En esta base de datos se guardan los
datos del FOP 2.


qstats

En esta base de datos se guardan los
datos del Asternic Call Center Stats.

274





agenda

En esta base de datos se guardan los
usuarios, clientes y teléfonos de estos de
la aplicación YetBook.


nagios

En esta base de datos se guarda la
configuración y los datos de Nagios.



Conocimiento de las tablas de cada base de datos mostrando parte de su contenido

Base de Datos: cdr




Tablas de cdr

cdr

channels



! Tabla cdr




calldate

clid

src

dst

dcontext

channel

dstchannel

lastapp
2009-12-22
21:44:43
"2000"
<2000>

2000

2003

acceso
SIP/2000-
b6800a38
SIP/2003-
0a30b038
VoiceMail



lastdata

duration

billsec

disposition

amaflags

accountcode

uniqueid

userfield
2003 34 3 ANSWERED 3




! Tabla channels



id

channel

accountcode

name

1

SIP/2003

David
2 SIP/2000
275

Mikel

3

SIP/2001

Eduardo

4

SIP/2004

Josemi

5

SIP/2002

Josean



Base de Datos: fop2




Tablas de cdr

visual_phonebook



! Tabla visual_phonebook




id

firstname

lastname

company

phone1

phone2

picture
1 Mikel

Yet Informatica 2000

1-mark.jpg
2 Eduardo

Yet Informatica 2001

3 Josean

Yet Informatica 2002

4 David

Yet Informatica 2003

5 Josemi

Yet Informatica 2004




Base de Datos: qstats




Tablas de cdr

qagent

qevent

qname

queue_stats
276
! Tabla qagent




agent_id

agent
2 SIP/2001
3 SIP/2004
4 SIP/2003
5 SIP/2002
6 SIP/2000
7 SIP/2005
8 SIP/4000



! Tabla qevent




event_id

event
1 ABANDON
2 AGENTDUMP
3 AGENTLOGIN
4 AGENTCALLBACKLOGIN
5 AGENTLOGOFF
6 AGENTCALLBACKLOGOFF
7 COMPLETEAGENT
8 COMPLETECALLER
9 CONFIGRELOAD
10 CONNECT
11 ENTERQUEUE
12 EXITWITHKEY
13 EXITWITHTIMEOUT
14 QUEUESTART
15 SYSCOMPAT
16 TRANSFER
17 PAUSE
277
18 UNPAUSE



! Tabla qname




qname_id

queue
2 recepcionqueue
3 comercialqueue
4 soportequeue



! Table queue_stats




queue_stats_id

uniqueid

datetime

qname

qagent

qevent

info1

info2

info3


1

SIP/2003

2009-11-05
05:01:19


4


4


14

… … … … … …



705

SIP/2003

2009-12-22
23:35:20


4


4


9




Base de Datos: agenda




Tablas de agenda
clientes
telefono
usuarios


! Tabla clientes




id

nameEmp

cliente

mant
1 Calnaba Yet VIP
2 Puma Yet Completo
278

3 Adidas Yet VIP



! Tabla telefono




idEmp

telefono
1 650664616
2 654545454
2 676767676
2 943212112
2 945787876
3 654323232
3 656997878
3 698987332


! Tabla usuarios




id

name

extension

tipo
2 Mikel 2000 Soporte
5 Valentin 5000 Direccion
6 Alberto Acosta 3000 Twister
7 Eduardo 2001 Soporte
9 Josean 2002 Soporte
10 Irune 1000 Administracion



Base de Datos: nagios




Tablas de nagios
nagios_acknowledgements
nagios_commands
nagios_commenthistory
nagios_comments
279

nagios_configfiles

nagios_configfilevariables
….
nagios_timedeventqueue
nagios_timedevents
nagios_timeperiod_timeranges
nagios_timeperiods
280

Explicación teórica y práctica de funcionalidades extra:

Agenda de Contactos: YetBook

Esta aplicación Web se diseñó para solucionar varios problemas:


• Necesidad de control exhaustivo de clientes de la empresa, así como, del
mantenimiento que tienen contratado con esta.


• Control de número de extensión de los usuarios de la empresa y de las
opciones programadas en el Dialplan para satisfacer determinadas
funcionalidades de la centralita Asterisk. Por ejemplo, extensión para
agregarse a una cola en concreto o como realizar el desvío de llamadas de tu
extensión a tu móvil.


• Acceso a las diferentes aplicaciones necesarias para el control de distintas
actividades a realizar, como por ejemplo la aplicación FOP 2.


Como se puede ver en la siguiente imagen, la aplicación está dividida en diferentes
apartados, en los cuales se puede añadir/eliminar/modificar usuarios y clientes, tener
acceso a las extensiones especiales del Dialplan y a las direcciones de las aplicaciones
integradas con la centralita.































A continuación se explicará el funcionamiento de cada una de estas funciones:
281

En este apartado tenemos una visión de los usuarios de la centralita.






























Añadir Usuarios: Permite agregar un usuario a la base de datos a la que está enlazada
la aplicación, no modifica el fichero sip.conf, la idea es agregar el usuario y después
modificar dicho fichero de configuración.
282

En la imagen anterior hemos visto como es el proceso de adicción de un usuario,
rellenando los campos Nombre, Extensión y Departamento, y en la imagen siguiente
vemos el resultado.






























Eliminar Usuarios: Permite eliminar un usuario de la base de datos a la que está
enlazada la aplicación, no modifica el fichero sip.conf, la idea es eliminar el usuario y
después modificar dicho fichero de configuración.
283

En la imagen anterior vemos el identificador del usuario a eliminar,en el ejemplo será
el8,y a continuación en la siguientes imágenes vemos la elección de usuario a eliminar
y comprobamos que se ha eliminado.





Eliminar Usuario




Introduzca la extension
del usuario a eliminar:



li.lt§i.M [email protected],ii
















Tabla de Usuarios


. Direccion




·n.u ID·=n11
Valentin 5000

I§@R.!§iij
284

Modificar Usuarios: Permite modificar un usuario en la base de datos a la que está
enlazada la aplicación, no modifica el fichero sip.conf, la idea es modificar el usuario y
después modificar dicho fichero de configuración.


En la siguiente imagen vemos el usuario que vamos a modificar.































En la siguiente imagen vemos el formulario de modificación de usuarios, rellenando el
identificador de usuario, Nombre, Extensión y Departamento.
285

En la imagen siguiente vemos el resultado de la modificación:































En este apartado tenemos una visión de los clientes de la expresa.
286

Añadir Clientes: Permite agregar un cliente a la base de datos a la que está enlazada la
aplicación.


En la siguiente imagen vemos como es el proceso de adicción de un cliente, rellenando
los campos Nombre de Empresa, Mantenimiento (Parcial, Completo, VIP) y el nº de
teléfonos asociados a dicha empresa.






























En la siguiente imagen vemos el formulario de introducción de teléfonos.
287

En la siguiente imagen vemos el resultado tras añadir el cliente:






























Eliminar Clientes: Permite eliminar un cliente de la base de datos a la que está
enlazada la aplicación.


En la imagen siguiente vemos el formulario es similar al de la eliminación de usuarios.
288

Comprobamos que la eliminación se ha efectuado adecuadamente.






























Modificar Clientes: Permite modificar un cliente en la base de datos a la que está
enlazada la aplicación.


A continuación vemos los formularios de modificación:
289

En las dos imágenes siguientes vemos como nos da la posibilidad de simplemente
modificar los valores actuales o agregar también más teléfonos al cliente.





Modificar Cliente




Nombre de Empresa: Adidas

Mantenimiento: v1P

Telelfono/os

654323232
656997878

IMff%4!1













654323232
656997878





Introduzca el numero
de telefonos a añadir:

1
290
Rellenamos el campo del teléfono que vamos a añadir:






























Vemos las modificaciones realizadas:






























A continuacion veremos un recordatorio de las extensiones del Dialplan para que los
usuarios puedan consultarlo cuando quieran.
291







. Dejar mensaje en buzon:

1 extension + s i



. Acceso a buzon de voz:

1 extension + 9 1













• Gestión de Colas:

Cola N!! de Cola
Recepeion o
Comercial 1
Soporte 2
Twister 3

Para agregarse a una cola;


1 extension + O + NllCola 1
292




Para eliminarse de tma coJa:


1 extension + 1+ NºCola 1


Para pausamos en tma cola;


1 extension + 2 + NºCola 1


Para despausarnos en una cola:


1 extension + 3 + NºCola 1















. Funcionalidad CaiiBack:


1 extension = 900 1




• Gestion de conferencias:


Agregarse a laconferencia 600:


1 extension = 600 1
293






N" de personas en la conferencia 600:


1 extension = 601 1


Crear conferencia dinamica:


1 extension = 620 1


Acceso a conferencia dinamica:


1 extension = 621 1

















. Ultima llamada recibida:

1 extension = 761



• Ultima llamada realizada:

1 extension = 75 1
294



• Funcionalidad DISA:


1 extension = 9999 1


Clave+# y N' a llamar





• Desvio de llamadas:


Realizar desvio:


1 extension = 71 1















• Desvio de llamadas:


Realizar desvio:


1 extension = 71 1


eancelar desvio:

1 extension = 721








Por último para recordar el acceso a la aplicaciones integradas con la centralita
Asterisk:
295



Aplicaciones Integradas


. FOP2:


.1\plicadon de tipo panel de control para visualizar la
actividad de los usuarios.


1 http://192.168.1.200/fop2 1




• Asternic Call Center Stats:















. Asternic Call Center Stats:


Herramienta para analizar los registros de cola de la
eentralita.


1 http:/1192.168.1.200/stats 1




. Asternic CDR Reports:


Herramienta que analiza losresgistros deDamadas de cada
usuario de la centralita.
296




• Asternic CDR Reports:


Herramienta que analiza Jos resgistros de llamadas de cada
usuario dela centralita.


1 http:/1192. 168. 1.200/cdr 1




• Nagios:


Aplicacioo para la monitorizacion de servidores con la
controlaremos el estado de la central.













nerrdlltreULd lJUe dJTcllUíl ture gJ::,Lrob ue ucuuctuaut.ctUd •
usuario de la centralita.


1 http:/1192. 168.1.200/cdr 1




. Nagios:


Aplicacíon paralamooitorizacion de servidores con la
controlaremos el estado de la central.


1 http:l/192.168.1.200/nagios 1
297
Integración con Google Calendar



La utilización de Google Calendar será la siguiente:


Para tener diferentes calendarios y así hacer una gestión óptima de las
llamadas, comprobando los eventos de dichos calendarios y redireccionando a
unos contextos u otros dependiendo de estos en el momento de las llamadas.


Uso de los recordatorios a través de mensajes de texto en determinadas
situaciones.

Para tener un uso correcto de Google Calendar visualizar la Guía.

Pruebas de existencia de evento en el momento en un calendario

El código de la aplicación que comprueba la existencia de eventos es el siguiente:


298


Prueba 1 ) Hay un evento de 10:30 a 11:30


[root@localhost agi-bin]# python pyastcal.py
----------------------------------
Fecha inicio evento:
2009-12-23
Fecha actual:
2009-12-23
Fecha fin evento:
2009-12-23
Hora inicio evento:
10:30:00
Hora actual:
10:48:47.174531
Hora fin evento:
11:30:00
----------------------------------
SET VARIABLE "SALTO" "No Disponible Soporte"
299
El calendario tiene el siguiente aspecto:


































Prueba 2 ) No hay ningun evento


[root@localhost agi-bin]# python pyastcal.py
----------------------------------
Fecha inicio evento:
2009-12-23
Fecha actual:
2009-12-23
Fecha fin evento:
2009-12-24
Hora inicio evento:
23:00:00
Hora actual:
10:47:05.294826
Hora fin evento:
08:00:00
----------------------------------
SET VARIABLE "SALTO" "soportelaboral"
300
El calendario tiene el siguiente aspecto:


































Prueba 2 ) Hay un evento de dia completo

[root@localhost agi-bin]# python pyastcal.py
----------------------------------
Fecha inicio evento:
2009-12-22
Fecha actual:
2009-12-23
Fecha fin evento:
2009-12-23
Hora inicio evento:
23:00:00
Hora actual:
10:50:29.834773
Hora fin evento:
23:00:00
----------------------------------
SET VARIABLE "SALTO" "No Disponible Soporte"
301
El calendario tiene el siguiente aspecto:



































Pruebas de envío de recordatorios a través de SMS con Google Calendar

Configuración de la extensión que ejecuta el programa que interactúa con Google
Calendar para que se genere un evento en el calendario por el cual se enviará el SMS
como recordatorio:

exten => 1200,1,Answer
exten => 1200,n,NoOp("CallerID=${ARG1}")
exten => 1200,n,AGI(sms_send.php)
exten => 1200,n,NoOp("Sms_send.php ejecutado...")
exten => 1200,n,Hangup

Vemos el comportamiento de Asterisk al llamar a la extensión 1200 a través del CLI:

-- Executing [1200@acceso:1] Answer("SIP/4000-b68150b0", "") in new stack
-- Executing [1200@acceso:2] NoOp("SIP/4000-b68150b0", ""CallerID="") in new stack
-- Executing [1200@acceso:3] AGI("SIP/4000-b68150b0", "sms_send.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php
-- AGI Script sms_send.php completed, returning 0
-- Executing [1200@acceso:4] NoOp("SIP/4000-b68150b0", ""Sms_send.php ejecutado..."") in
new stack
-- Executing [1200@acceso:5] Hangup("SIP/4000-b68150b0", "") in new stack
== Spawn extension (acceso, 1200, 5) exited non-zero on 'SIP/4000-b68150b0'

Comprobamos el log de la aplicación para ver que los datos enviados son los correctos:
302
[email protected]
Password=XXXXXXX
Minutos despues de la hora actual en la que empieza el evento=10
Duracion del Evento=10
Mensaje enviado: 'Asterisk: Tiene una llamada perdida de la extension: 100'
Enviado: Resource id #8

Miramos en el calendario para comprobar que se ha creado el evento:



































Para ver el código de los archivos utilizados acudir al anexo correspondiente.
303
Chan_Sebi

¿Qué?,¿Cómo? y ¿Por qué?

Chan_sebi es un canal para Asterisk, que utiliza modems Huawei para proveer de
gateways gsm de voz y/o sms.

En principio se ha hecho pensando en los E169/K3520 de Huawei, modems que tienen
capacidades de llamada de voz. Internamente utilizan un chipset de Qualcomm (de la
serie MSM7200). Con un modem usb de estos modelos, tenemos un gateway de voz
que además no tiene que hacer conversiones de audio como las que se hacen con un
FXO analógico, ni los problemas de señalización inherentes a los canales analógicos, ya
que toda la gestión de audio y de señalización se hace de forma digital (bien a través
del canal de audio, bien a través del canal de datos), pudiendo ser comparado a un
router RDSI=>GSM de un puerto.

La idea surgió, según su creador “Odicha”, de la posibilidad de aprovechar las
capacidades de voz de estos modems para tener un gateway gsm a un costo muy
económico. La mayor parte de los operadores los dan a costo cero cumpliendo unos
mínimos de permanencia o consumo, como cualquier otro terminal telefónico.

Técnicamente estos modems son vistos por el S.O. como un “hub” usb con varios
dispositivos. En principio tres puertos seriales y un puerto de almacenamiento con dos
dispositivos (un cd y un lector de memoria). Asi los subid 00,01 y 02 serán los puertos
de comunicación, cada uno con distintas funciones (audio, datos y gestión general) y el
subid 03 que nos dará control sobre el cd virtual y el lector de tarjetas.

A partir de esta base se construye un controlador de canal que toma como punto de
partida el chan_mobile, ya existente en Asterisk.

Para descargar asterisk-addons con chan_sebi:

svn export http://asterisk-es-rsp.irontec.com/svn/team/Odicha/asterisk-addons-1.4.9 asterisk-addons/

Instalación y Configuración de chan_sebi

A nivel de descarga e instalación comentar cuáles son sus prerrequisitos.

El S.O. debe ser capaz de montar los subid 00, 01 y 02 del modem Huawei como
usbTTYx. Los kernels antiguos (por debajo de 2.6.20 generalmente) no son capaces de
hacerlo automáticamente por lo que habrá que modificar algunas cosas para que se
detecten de la forma adecuada y sean cargados por usbserial. Normalmente es
suficiente con /sbin/modprobe usbserial vendor=0×12d1 product=0×1003 o bien
/sbin/modprobe usbserial vendor=0×12d1 product=0×1001 dependiendo de si el modem es
1001 (169,k3520, e270,etc…) o es 1003 (e220…). A veces también entran en conflicto
con el driver de option resolviendose añadiendo al blacklist el módulo ”option”. Si aun
así sigue intentando cargar puede intentar resolverse eliminando el fichero option.ko y
ejecutando un depmod después.
304
Los puertos ttyUSBx que se crean al conectar el modem tienen que tener permiso de
lectura y escritura para el usuario que ejecuta Asterisk, si no es así no será posible que
Asterisk se comunique con el modem. Si no se ejecuta Asterisk como root lo mejor es
agregar el usuario que corre Asterisk al grupo propietario de los puertos que en
función de distros y kernels puede variar (en Fedora es uucp, por ej.).

Algo como esto por ejemplo:

chmod 660 /dev/ttyUSB*
chown asterisk:uucp /dev/ttyUSB*
echo ‘KERNEL==”ttyUSB[0-9*]“, MODE=”0660″, OWNER=”asterisk”, GROUP=”uucp”‘
>> /etc/udev/rules.d/92-sebi.rules

Cumpliendo esto podremos instalar asterisk-addons sobre nuestro asterisk 1.4.x con
chan_sebi incluido.

Al instalarlo y arrancarlo el canal analizará los dispositivos usb que tenemos
conectados y generará un fichero sebi_devices.conf en /etc/asterisk/ que contendrá
algo similar a esto:

[2-1]
data = /dev/ttyUSB2
voice = /dev/ttyUSB1
imei = 35413702XXXXXXX

A partir de aquí sabemos que el modem está siendo detectado correctamente y
pasaremos a generar el fichero de configuración sebi.conf. Si hicimos un make samples
al instalar asterisk-addons ya tendremos un fichero sebi.conf en /etc/asterisk/ que
tendremos que adaptar.

[huawei1]
imei=35xxxxxxxxxxx ; imei of modem
;pin=1234 ; pin (use only if sim card has pin request enabled)
csca=+34607003110 ; sms centre number (vodafone es – example)
sms=yes ; enable sms send/receive
voice=yes ; enable voice for calls
context=from-pstn ; dialplan context for incoming calls
group=1 ; this phone is in channel group 1
volume=5 ; modem volume (1-5)
language=es ; channel language
;nocallsetup=yes ; set this only if you want override call status notifications

El campo imei del canal es el que combina la información de configuración del modem
con el equipo físico. No olviden que el número de puerto ttyUSB depende del orden en
que se cargan o de la cantidad de dispositivos usb que están conectados en cada
momento. Los demás campos de configuración creo que están claros, prácticamente
se describen solos. Es interesante hacer notar que el nombre del canal lo asignamos
nosotros libremente en el identificador de sección (en el ejemplo [huawei1])

Si reiniciamos Asterisk y todo ha ido bien tras cargar ejecutaremos el comando sebi
show devices y obtendremos algo parecido a esto:
305
*CLI> sebi show devices

Id Imei Group Provider Connected State Voice SMS
huawei1 3541370xxxxxxxx 1 vodafone es yes free yes yes

A partir de aquí podemos usar el modem como una canal de voz realizando y
recibiendo llamadas y como gateway sms. Cabe observar que en los modelos que no
soporten voz el resultado será como este:

*CLI> sebi show devices

Id Imei Group Provider Connected State Voice SMS
huawei1 3541370xxxxxxxx 1 vodafone es yes free no yes

Nos dirá que no tenemos servicios de voz en ese dispositivo, y lo usaremos solo como
gateway sms.

Para enviar y recibir sms, usaremos convenciones muy similares a las de chan_mobile.
Para recibir un sms y guardarlo en la base de datos tendremos las instruccciones
correspondientes en el Dialplan (por cierto, solo procesa sms recibidos mientras está
activo, por el momento).

[from-pstn]
exten => sms,1,verbose(incoming sms from ${smssrc} ${smstxt})
exten => sms,n,set(db(sms/${smssrc})=${smstxt})
exten => sms,n,hangup

Para enviar un sms:

originate sip/109 application sebisendsms huawei1|6xxxxxxxx|”texto de prueba del sms”

Para revisar si el canal está libre antes de enviar el sms tenemos la aplicación
SebiStatus:

SebiStatus(device,variable)
Device : Id del dispositivo en sebi.conf
Variable: Variable donde almacenamos el estado (1-3)

1-Desconectado
2-Disponible
3-Ocupado
306
Pruebas realizadas con un Modem Huawei K3520



Tras introducir en el modem Huawei K3520 una tarjeta Orange y conectarlo a nuestro
servidor por un puerto USB, instalamos como se indica en los apartados anteriores el
chan_sebi y lo siguiente que tenemos que hacer es comprobar que Asterisk a captado
el modem, para esto comprobamos el contenido del fichero de configuración situado
en la carpeta /etc/asterisk/ sebi_devices.conf:

[6-1]
data = /dev/ttyUSB2
imei = 353284021181626
voice = /dev/ttyUSB1

Si no lo hemos hecho antes, damos a los dispositivos USB los permisos adecuados:

chmod a+x /dev/ttyUSB*

Confuramos el chan_sebi desde el fichero de configuración sebi.conf:

[huawei1]
dataport=/dev/ttyUSB2
voiceport=/dev/ttyUSB1
imei=35328XXXXXXXXXX
pin=1626
csca=+34644109030 ; SMS centre number (SYMYO)
sms=yes voice=yes
context=from-sebi
group=1
volume=5
language=es

Reiniciamos Asterisk y comprobamos que la configuración realizada es la correcta:

*CLI> sebi show devices
ID IMEI Group Provider Connected State Voice SMS
huawei1 353284021181626 1 Orange Yes Free Yes Yes


Las 3 pruebas realizadas con el chan_sebi serán recepción y envio de SMS y realización
de llamadas a través de este canal.

Prueba 1) Llamada con chan_sebi

Configuración del fichero extensions.conf:

[from-sebi]

;LLamadas con Chan_Sebi
exten => 650664616,1,NoOp(Outgoing call through the SEBI device to ${EXTEN})
exten => 650664616,n,Dial(Sebi/g1/${EXTEN},60)
exten => 650664616,n,Hangup
307
Miramos el log en el CLI de Asterisk al hacer una llamada:

-- Executing [650664616@acceso2:1] NoOp("SIP/100-08bedc70", "Outgoing call through the SEBI device
to 650664616") in new stack
-- Executing [650664616@acceso2:2] Dial("SIP/100-08bedc70", "Sebi/g1/650664616|60") in new stack
-- Called g1/650664616
-- Sebi/huawei1-4b5e is making progress passing it to SIP/100-08bedc70
== Spawn extension (acceso2, 650664616, 2) exited non-zero on 'SIP/100-08bedc70



Prueba 2) Envio de SMS con chan_sebi:

Configuración del fichero extensions.conf:

[from-sebi]
include => acceso2
exten => 1111,1,NoOp(Envio de Sms)
exten => 1111,n,SebiSendSMS(huawei1,650664616,"sms prueba")
exten => 1111,n,Hangup
[acceso2]

exten => 100,1,Dial(SIP/100,30,Ttm)
exten => 100,n,Hangup

Hacemos la prueba marcando 1111 y vemos el log del CLI:


-- Executing [1111@acceso2:1] NoOp("SIP/100-08bf7548", "Envio de Sms") in new stack
-- Executing [1111@acceso2:2] SebiSendSMS("SIP/100-08bf7548", "huawei1|650664616|"sms
prueba"") in new stack
-- Executing [1111@acceso2:3] Hangup("SIP/100-08bf7548", "") in new stack
== Spawn extension (acceso2, 1111, 3) exited non-zero on 'SIP/100-08bf7548'

El sms ha llegado al instante.

También se puede realizar esta prueba desde el CLI directamente, pero de esta forma
suena la extensión que le indicas, en este caso la 100, y al contestar se envía el SMS:

*CLI> originate sip/100 application SebiSendSMS huawei1|650664616|"SMS DE PRUEBA"
-- Launching SebiSendSMS(huawei1|650664616|SMS DE PRUEBA) on SIP/100-b7780b98

Prueba 3) Recepción de SMS desde el chan_sebi:


Configuración del fichero extensions.conf:

[from-sebi]
exten => sms,1,NoOp(Incoming SMS from ${SMSSRC})
exten => sms,n,System(/usr/src/recvSMS.sh "${SMSSRC}" "${SMSTXT}")
exten => sms,n,Hangup


Para esta prueba hacemos uso de un ejecutable que enviará un email a una dirección
indicada al recibir el SMS, el código de este archivo es:
308
#!/bin/bash

if [ $# -ne 2 ]
then
echo "Invalid parameters."
exit 0
fi

echo $2 | mail -s "SMS from $1" [email protected]


Miramos el log en el CLI de Asterisk al hacer una llamada:

-- Executing [sms@from-sebi:1] NoOp("Sebi/huawei1-1de3", "Incoming SMS from +34650664616") in
new stack
-- Executing [sms@from-sebi:2] System("Sebi/huawei1-1de3", "/usr/src/recvSMS.sh "+34650664616"
"Prueba recepcion de SMS."") in new stack
-- Executing [sms@from-sebi:3] Hangup("Sebi/huawei1-1de3", "") in new stack
== Spawn extension (from-sebi, sms, 3) exited non-zero on 'Sebi/huawei1-1de3'
309
Flash Operator Panel 2 (FOP 2)

¿Qué es FOP2?

Flash Operator Panel 2 es una aplicación de tipo panel de control para las PBX Asterisk.
Se ejecuta en un navegador web con el plugin de flash. Es capaz de mostrar
información sobre su actividad PBX en tiempo real. El diseño es configurable (tamaño y
color de los botones, etc.).

Su creador, Nicolas Gudiño, fue ganador hace unos meses del premio que otorga
Digium, Digium Innovation Awards, y es que FOP 2 es un producto ideal y muy
recomendable.

Características

Acciones

o Iniciar llamadas
o Acceso telefónico a cualquier número
o Acceso a la agenda de llamadas
o Notificación de entrada de llamadas
o Agenda de Contactos (Visual Phonebook)
o Transferencia de llamadas
o Transferencia al buzón de voz
o Registro de llamadas
o Atención de llamadas directas (Pick Up)
o Colgar llamadas
o Funcionalida Spy & Whisper (Escuchar llamada y comunicarse con uno de
los hablantes sin que el otro escuche)

Botones de Extensión

o 2 líneas por botón
o Callerid y temporizador
o Indicador de pausa
o Indicador de pertenencia a una cola
o Indicador de grabación

Botones Trunk

o Muestra una lista con los trunks establecidos o configurados

Botones de Conferencia

o Lista de miembros de la conferencia
o Bloqueo / Desbloqueo de conferencias
o Silenciar / Activar audio a los miembros
o Silenciar / Activar a todos los miembros
o Expulsar miembros de la conferencia
310
Botones de Cola

o Lista de agentes/miembros
o Lista de llamadas en espera
o Miembros en pausa
o Miembros ocupados
o Miembros disponibles
o Miembros invalidos

¿A quién va dirigido FOP 2?

A los recepcionistas:

Desarrollado con una recepcionista en la mente. Todas las acciones están disponibles
en dos clics del ratón.

Ver quién está disponible o no.
Transferencia en forma directa a la extensión de destino o al buzón de voz.
Habilitar los permisos de PickUp.
Búsqueda en tiempo real y filtro de extensiones (ideal para las grandes
empresas con cientos de extensiones).

A los supervisores del centro de llamadas:

No sólo puede ver el estado de la extensión, sino también una rápida visión de las
colas:

Ver agentes registrados en una cola.
Ver estado del agente (en pausa, ocupado, disponible, no válido).
Ver todas las llamadas en espera en la cola con su temporizador.
Espiar y/o susurrar a sus agentes.

A los usuarios finales:

Usted no necesita ser un recepcionista o tener un centro de llamadas para aprovechar
las características de FOP2, ya que este permite controlar sus propias llamadas, incluso
antes de cogerlas.

Notificaciones de llamadas (número y nombre de callerid, llamada de la cola).
Búsqueda de llamada o marcarción a cualquier número escrito.
Control de llamadas: Trasferencia, Colgar, etc.
311
Instalación

Requisitos del Sistema

El programa consta de dos componentes, un demonio del lado del servidor que se
conecta a la interfaz de Asterisk y será el mediador entre Asterisk y los clientes Web.

Si tiene instalada una distribución de Linux Red Hat y va a instalar el panel desde un
tarball(.tar), tendrá que obtener el tarball correcto dependiendo de su versión de glibc.
Puede averiguar la versión de glibc escribiendo en la consola:

#> /lib/libc.so.6

La respuesta será similar a esta:

GNU C Library stable release version 2.3.6, by Roland McGrath et al.
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 3.4.4 20050721 (Red Hat 3.4.4-2).
Compiled on a Linux 2.4.20 system on 2005-11-03.
Available extensions:
GNU libio by Per Bothner
crypt add-on version 2.1 by Michael Glad and others
linuxthreads-0.10 by Xavier Leroy
The C stubs add-on version 2.1.2.
BIND-8.2.3-T5B
NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
Glibc-2.0 compatibility add-on by Cristian Gafton
GNU Libidn by Simon Josefsson
libthread_db work sponsored by Alpha Processor Inc
Thread-local storage support included.
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.

El otro componente es la aplicación web, que consiste en su mayoría en Javascript,
HTML, CSS y un componente Flash. Por esa razón se necesita un servidor web
corriendo para servir a estos archivos. Para la agenda de llamadas necesita soporte
para PHP en el servidor web y base de datos MySQL instalada.

Por último, su navegador necesita Adobe Flash Player (versión 9) y el Javascript
activado.

Instalación desde tarball

Después de descargar el paquete adecuado, tendrá que extraerlo y comenzar la
instalación:

#> tar zxvf fop2-001-i386-glibc2.5-centos5.tgz
#> cd fop2
#> make install
312
La instalación copiará los archivos del servidor en / usr/local/fop2 y las páginas web
bajo / var/www/html/fop2.

Before starting the service, some basic configuration is required in fop2.cfg and
probably in /etc/asterisk/manager.conf, because the FOP2 daemon connects via TCP
to the Asterisk Manager Interface (AMI) using a username and secret. Antes de iniciar
el servicio, es necesaria la configuración básica de fop2.cfg y de manager.conf en /etc
/asterisk/, porque el demonio FOP2 se conecta a través de TCP a la interfaz de Asterisk
Manager (IAM), utilizando un nombre de usuario y una clave.

Una vez configurado esto habrá que iniciar el servicio.

#> cd / usr/local/fop2
#> ./fop2_server

Configuración

El archivo principal de configuración del servidor es / usr/local/fop2/fop2.cfg. Los
parámetros más importantes y necesarios para este fichero son los establecidos en el
manager.conf.

Ejemplos de configuración:

/usr/local/fop2/fop2.cfg

[general]
; AMI definitions
manager_host = 127.0.0.1
manager_port = 5038
manager_user = admin
manager_secret = amp111

/etc / asterisk / manager.conf

[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1

[admin]
secret = amp111
deny = 0.0.0.0/0.0.0.0
permit = 127.0.0.1/255.255.255.0
read = system,call,command,agent,user,originate
write = system,call,command,agent,user,originate

También es recomendable la configuración siguiente:

/etc/asterisk/sip.conf

callevents=yes
313
Para que se efectue el envio de eventos al FOP2.

/etc/asterisk/queues.conf

[testqueue]
eventwhencalled=yes
Para que efectue el envio de eventos relacionados con las colas y los agentes.
Configuración de botones

Además de la configuración del servidor, es importante la configuración de los botones
que desea mostrar.

Los botones de configuración se realizan en distintos archivos de configuración para
que sean más fáciles de mantener y organizar. En el fichero / usr/local/fop2/fop2.cfg
hay que especificar el parámetro buttonfile, que apunta al archivo que contendrá las
definiciones de los botones.

/usr/local/fop2/fop2.cfg

... ...
buttonfile= buttons.cfg

Botones de Extensión

Este tipo de botones representan una extension. Se mostrarán dos líneas para cada
botón y algunos datos específicos, como la presencia, estado de pausa, etc.

/usr/local/fop2/ buttons.cfg

[SIP/600]
type=extension
extension=600
context=from-internal
label=John
mailbox=600@default
extenvoicemail=*600@default

Botones de cola

Similares a los botones de extensión, los botones de cola hacen uso de los mismos
parámetros con la diferencia que no sólo el tipo se debe establecer en la cola, sino
también el nombre, entre paréntesis, debe estar precedido de "QUEUE /".

/usr/local/fop2/buttons.cfg

[QUEUE/101]
type=queue
label=Sales
314
extension=101
context=from-internal

Los botones de cola no aceptan los parámetros mailbox o extenvoicemail, ya que sólo
se aplican a los botones de extensión.

Botones de Conferencia

Al igual que los botones de cola, los botones de conferencia tienen que ser definidos
como type=conference y el contexto debe empezar con el prefijo "CONFERENCE/".

/usr/local/fop2/buttons.cfg

[CONFERENCE/1000]
type=conference
label=Main Conference
extension=1000
context=from-internal

Botones Trunk

Para los trunks que hay muy pocos parámetros que establecer. Un trunk no se puede
marcar, por esa razón no es necesario especificar la extensión ni el contexto. Sólo el
type que sería “trunk” debe ser especificado, junto con la etiqueta del botón.

/usr/local/fop2/buttons.cfg

[DAHDI/1]
type=trunk
label=DAHDI 1-4
server=1

Tenga en cuenta que también hay que establecer el parámetro server, ya que si se
supervisa más de un servidor, y tiene DAHDI / 1 definido sin especificar el servidor,
usted experimentará una colisión por el canal, y la situación no será correcta.

Configuración de Visual Phonebook

La agenda requiere php y mysql para ser instalada y funcionar. Es necesario crear una
base de datos con una tabla y dar los adecuados permisos. También tienes que
configurar el idioma de la aplicación PHP. Con el fin de empezar, asegúrese de crear
una base de datos MySQL utilizando la contraseña correcta (sustituir XXXXX con su
contraseña de root de MySQL):

#> cd /var/www/html/fop2
#> mysqladmin -u root -pXXXXX create fop2
#> mysql -u root -pXXXXX < mysql.db

Después de crear una base de datos y la tabla, dar permisos:
315
#> mysql -u root -pXXXXX -e \"grant all privileges on fop2.* to root@localhost \"
identified by 'myPassw0rd'"

Por último hay que editar el archivo de configuración y seleccionar el idioma
adecuado:

/var/www/html/fop2/config.php

<?
// Database connection details
$DBHOST = 'localhost';
$DBNAME = 'fop2';
$DBUSER = 'fop2';
$DBPASS = ' myPassw0rd ';

$language=’’en ‘’;

// --------------------------------------------------------- / / ------------------------------------------------ --
-------
// Do not modify below this line
// --------------------------------------------------------- / / ------------------------------------------------ --
-------
.. ..

Para tener una información amplia revise el Manual de uso de FOP 2.
316
Practicas de la aplicación con FOP 2

1) Acceso a FOP 2: http://192.168.1.200/fop2





Panel Principal de FOP 2:





















2) Configurar el archivo principal del FOP 2 (fop2.cfg)


[general]
; AMI definitions
manager_host=localhost
manager_port=5038
manager_user=admin
manager_secret=amp111
;event_mask=call,agent
; Daemon definitios
listen_port = 4445
restrict_host = www.asternic.org
web_dir = /var/www/html/fop2

; Global Config
language = en
317
poll_interval = 86400
poll_voicemail = 1
monitor_ipaddress = 0
;master_key = 5678
user=2000:1234:all
user=2001:1234:all
user=2002:1234:all
user=2003:1234:all
user=2004:1234:all
user=2005:1234:all
user=2006:1234:all
buttonfile=autobuttons.cfg
#exec autoconfig-users-freepbx.sh

Configurar el archive de botones (autobuttons.cfg)

[SIP/2000]
type=extensión
extension=2000
context=acceso
label=Mikel
mailbox=2000@default
extenvoicemail=20008@acceso

[SIP/2001]
type=extensión
extension=2001
context=acceso
label=Eduardo
mailbox=2001@default
extenvoicemail=20018@acceso

[SIP/2002]
type=extensión
extension=2002
context=acceso
label=Josean
mailbox=2002@default
extenvoicemail=20028@acceso

[SIP/2003]
type=extensión
extension=2003
context=acceso
label=David
mailbox=2003@default
extenvoicemail=20038@acceso

[SIP/2004]
type=extensión
extension=2004
context=acceso
label=Josemi
mailbox=2004@default
extenvoicemail=20048@acceso

[SIP/2005]
type=extensión
318
extension=2005
context=acceso
label=Usuario1
mailbox=2005@default
extenvoicemail=20058@acceso

[SIP/2006]
type=extensión
extension=2006
context=acceso
label=Usuario2
mailbox=2006@default
extenvoicemail=20068@acceso

[QUEUE/ soportequeue]
type=queue
label= soportequeue
extension=784
context= soportelaboral

[DAHDI/2]
type=trunk
label=DAHDI

[CONFERENCE/600]
type=conference
label=Conferencia Estatica
server=1
extension=600
context=meetme


3) Agregar usuarios/clientes a la Visual phonebook para que al recibir una llamada
aparezca el perfil de dicho usuario/cliente en vez de la imagen siguiente:





Con el usuario/cliente que llama agregado a la agenda la llamada sería así:



319
Tras rellenar la agenda queda de la siguiente forma:



























4) Pruebas de la barra de herramientas de FOP 2:




! Botón de llamada:


La realización de llamadas desde FOP 2 se realiza como se describe en el
siguiente ejemplo, en el cual la llamada se realizará entre la extensión 2003,
con la que nos logueamos en FOP 2, y la extensión 2005.








El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

> Channel SIP/2003-09349390 was answered.
-- Executing [2005@acceso:1] Macro("SIP/2003-09349390", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/2003-09349390", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/2003-09349390
-- SIP/2005-09346740 is ringing
-- SIP/2005-09346740 answered SIP/2003-09349390
-- Stopped music on hold on SIP/2003-09349390
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/2003-09349390' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/2003-09349390'


! Botón de transferencia:




Cuando se está llevando a cabo
una llamada el receptor de
esta, usuario de la centralita,
puede transferir la llamada a
otro usuario.

En el ejemplo siguiente la
llamada entre el usuario 4000 y
el 2003 es transferida por este
último a la extensión 2005,
como se puede ver en la
siguiente imagen.









320
321
El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:


-- Executing [2003@acceso:1] Macro("SIP/4000-08b81180", "acceso|2003") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2003|30|Ttm") in new stack
-- Called 2003
-- Started music on hold, class 'default', on SIP/4000-08b81180
-- SIP/2003-08b8b550 is ringing
-- SIP/2003-08b8b550 answered SIP/4000-08b81180
-- Stopped music on hold on SIP/4000-08b81180
== Spawn extension (acceso, 2005, 0) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso'
== Spawn extension (acceso, 2005, 0) exited non-zero on 'SIP/4000-08b81180'
-- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b81180
-- SIP/2005-08b99410 is ringing
-- SIP/2005-08b99410 answered SIP/4000-08b81180
-- Stopped music on hold on SIP/4000-08b81180
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b81180'


! Botón de transferencia a voicemail:


Cuando se está llevando a cabo una llamada el receptor de esta, usuario de la
centralita, puede transferir la llamada a su buzón de voz.

En el ejemplo siguiente la llamada entre el usuario 4000 y el 2003 es transferida
por este último a su buzón de voz, como se puede ver en la siguiente imagen.


El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2003@acceso:1] Macro("SIP/4000-08b87368", "acceso|2003") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b87368", "SIP/2003|30|Ttm") in new stack
-- Called 2003
-- Started music on hold, class 'default', on SIP/4000-08b87368
-- SIP/2003-08b8f570 is ringing
-- SIP/2003-08b8f570 answered SIP/4000-08b87368
-- Stopped music on hold on SIP/4000-08b87368
== Spawn extension (acceso, 20038, 0) exited non-zero on 'SIP/4000-08b87368' in macro 'acceso'
== Spawn extension (acceso, 20038, 0) exited non-zero on 'SIP/4000-08b87368'
-- Executing [20038@acceso:1] VoiceMail("SIP/4000-08b87368", "2003") in new stack
322
-- <SIP/4000-08b87368> Playing 'vm-intro' (language 'es')
-- <SIP/4000-08b87368> Playing 'beep' (language 'es')
-- Recording the message
-- x=0, open writing: /var/spool/asterisk/voicemail/default/2003/tmp/RMyVLR format: gsm, 0x8b70578
-- x=1, open writing: /var/spool/asterisk/voicemail/default/2003/tmp/RMyVLR format: wav, 0x8b23bb8
-- User hung up
== Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found
== Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found
== Parsing '/var/spool/asterisk/voicemail/default/2003/INBOX/msg0000.txt': Found
== Spawn extension (acceso, 20038, 1) exited non-zero on 'SIP/4000-08b87368'

! Botón de PickUp de llamadas:


Cuando una extensión está llamando a otra, el usuario con el que te registraste
en FOP 2, si es del mismo grupo de la extensión llamada puede contestarla.

En el ejemplo siguiente la extensión 4000 está llamando a la 2005 y como este
no la acepta, la extensión con la que nos registramos acepta la llamada..


El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b87368", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b87368", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b87368
-- SIP/2005-08b8df48 is ringing
> Channel SIP/2003-08b81180 was answered.
> Launching Pickup(2005@acceso) on SIP/2003-08b81180
-- SIP/2003-08b81180 answered SIP/4000-08b87368
-- Stopped music on hold on SIP/4000-08b87368
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b87368' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b87368'
323

! Botón de escucha de llamadas:


Cuando se está llevando a cabo una llamada, la extensión con la que nos
registramos en FOP 2 puede escucharla sin que ambas extensiones lo sepan.

En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es escuchada
por la 2003, como se puede ver en la siguiente imagen.




El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b81180
-- SIP/2005-08b8b550 is ringing
-- SIP/2005-08b8b550 answered SIP/4000-08b81180
-- Stopped music on hold on SIP/4000-08b81180
> Channel SIP/2003-08b8f570 was answered.
> Launching ChanSpy(SIP/2005) on SIP/2003-08b8f570
-- <SIP/2003-08b8f570> Playing 'beep' (language 'es')
-- <SIP/2003-08b8f570> Playing 'spy-sip' (language 'es')
-- <SIP/2003-08b8f570> Playing 'digits/2' (language 'es')
-- <SIP/2003-08b8f570> Playing 'digits/0' (language 'es')
-- <SIP/2003-08b8f570> Playing 'digits/0' (language 'es')
-- <SIP/2003-08b8f570> Playing 'digits/5' (language 'es')
== Spying on channel SIP/2005-08b8b550
[Dec 17 04:58:48] NOTICE[8836]: app_chanspy.c:218 start_spying: Attaching SIP/2003-08b8f570 to
SIP/2005-08b8b550
== Done Spying on channel SIP/2005-08b8b550
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b81180' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b81180'
324

! Botón de escucha y susurro en llamadas:


Cuando se está llevando a cabo una llamada entre dos extensiones, la
extensión con la que nos registramos en FOP 2 puede escuchar e incluso
susurrar a una de las partes sin que la otra oiga nada.

En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es escuchada
por la extensión 2003 que puede hablar a la extensión 2005 sin que la 4000 se
entere.



El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b81180", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b81180", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b81180
-- SIP/2005-08b8b550 is ringing
-- SIP/2005-08b8b550 answered SIP/4000-08b81180
-- Stopped music on hold on SIP/4000-08b81180
> Channel SIP/2003-08b90b98 was answered.
> Launching ChanSpy(SIP/2005|w) on SIP/2003-08b90b98
-- <SIP/2003-08b90b98> Playing 'beep' (language 'es')
-- <SIP/2003-08b90b98> Playing 'spy-sip' (language 'es')
-- <SIP/2003-08b90b98> Playing 'digits/2' (language 'es')
-- <SIP/2003-08b90b98> Playing 'digits/0' (language 'es')
-- <SIP/2003-08b90b98> Playing 'digits/0' (language 'es')
-- <SIP/2003-08b90b98> Playing 'digits/5' (language 'es')
== Spying on channel SIP/2005-08b8b550

La extensión 2005 escucha a la 2003 pero la 4000 no.
325

! Botón de colgar llamadas:


Cuando se está llevando a cabo una llamada entre dos extensiones, la
extensión con la que nos registramos puede colgar dicha llamada sin que
ambas partes sepan quien fue.

En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es colgada
por la 2003, como se puede ver en la siguiente imagen.


El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b872d8", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b872d8", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b872d8
-- SIP/2005-08b8df48 is ringing
-- SIP/2005-08b8df48 answered SIP/4000-08b872d8
-- Stopped music on hold on SIP/4000-08b872d8
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b872d8' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b872d8'

Cabe destacar que en el CLI no se ve si cuelga uno u otro, simplemente se acaba
la llamada.
326

! Botón de grabar llamadas:


Cuando se está llevando a cabo una llamada entre dos extensiones, la
extensión que se registró en el FOP 2 puede grabar dicha llamada.

En el ejemplo siguiente la llamada entre el usuario 4000 y el 2005 es grabada
por la extensión 2003, como se puede ver en la siguiente imagen.




El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [2005@acceso:1] Macro("SIP/4000-08b872d8", "acceso|2005") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/4000-08b872d8", "SIP/2005|30|Ttm") in new stack
-- Called 2005
-- Started music on hold, class 'default', on SIP/4000-08b872d8
-- SIP/2005-08b8df48 is ringing
-- SIP/2005-08b8df48 answered SIP/4000-08b872d8
-- Stopped music on hold on SIP/4000-08b872d8
[Dec 17 05:23:21] DEBUG[9112]: res_monitor.c:328 ast_monitor_stop: monitor executing ( nice -n 19 sox -
m "/var/spool/asterisk/monitor/1261023719.156-2005-in.wav"
"/var/spool/asterisk/monitor/1261023719.156-2005-out.wav"
"/var/spool/asterisk/monitor/1261023719.156-2005.wav" && rm -f
"/var/spool/asterisk/monitor/1261023719.156-2005-"* ) &
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/4000-08b872d8' in macro 'acceso'
== Spawn extension (acceso, 2005, 1) exited non-zero on 'SIP/4000-08b872d8'

Se generan dos archivos:


1261023719.156-2005-in.wav
1261023719.156-2005-out.wav
327
Escuchamos los dos archives de grabación:

exten => 1122,1,Playback(/var/spool/asterisk/monitor/1261023719.156-2005-in)
exten => 1123,1,Playback(/var/spool/asterisk/monitor/1261023719.156-2005-out)

-- Executing [1122@acceso:1] Playback("SIP/2003-08b872d8",
"/var/spool/asterisk/monitor/1261023719.156-2005-in") in new stack
-- <SIP/2003-08b872d8> Playing '/var/spool/asterisk/monitor/1261023719.156-2005-in' (language 'es')
-- Executing [1123@acceso:1] Playback("SIP/2003-08b872d8",
"/var/spool/asterisk/monitor/1261023719.156-2005-out") in new stack
-- <SIP/2003-08b872d8> Playing '/var/spool/asterisk/monitor/1261023719.156-2005-out' (language 'es')

5) Pruebas de funcionamiento de botones de colas, conferencias y trunks


! Botón de Colas:


El código utilizado en estas pruebas es:


[soportelaboral]
exten => 784,1,Queue(${QS}|tThH)
exten => _XXXX22,1,PauseQueueMember(${QS}|SIP/${EXTEN:0:4})
exten => _XXXX22,n,Hangup

Pausamos los miembros 2000 y 2001 de la cola soportequeue y vemos el aspecto
de estos en FOP 2 y el de la cola:

-- Executing [200122@acceso:1] PauseQueueMember("SIP/2003-b6800a38",
"soportequeue|SIP/2001") in new stack
-- Executing [200122@acceso:2] Hangup("SIP/2003-b6800a38", "") in new stack
== Spawn extension (acceso, 200122, 2) exited non-zero on 'SIP/2003-b6800a38'
-- Executing [200022@acceso:1] PauseQueueMember("SIP/2003-b6800a38",
"soportequeue|SIP/2000") in new stack
-- Executing [200022@acceso:2] Hangup("SIP/2003-b6800a38", "") in new stack
== Spawn extension (acceso, 200022, 2) exited non-zero on 'SIP/2003-b6800a38'





328
Vemos cual es el comportamiento visual del boton de cola de FOP2 al realizarse
una llamada a la cola desde la extensión 4000 que será cogida por el miembro
2004 (Josemi):




El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [784@acceso:1] Queue("SIP/4000-08b88260", "soportequeue|r") in new stack
-- Called SIP/2004
-- Called SIP/2000
-- Called SIP/2005
-- SIP/2000-08b9a368 is ringing
-- SIP/2005-08ba85f0 is ringing
-- SIP/2004-08b89f28 is ringing
-- Nobody picked up in 1000 ms
-- SIP/2004-08b89f28 answered SIP/4000-08b88260
-- Native bridging SIP/4000-08b88260 and SIP/2004-08b89f28
329
! Botón de Trunks:


Como hemos visto en la configuración del fichero de botones del FOP 2. Es
posible generar botones de Trunk.


En la aplicación para la realización de pruebas se configuró el botón del canal 2
de la tarjeta de telefonía anteriormente instalada (ENLACEEE).


De esta forma tras configurar la extensión 783 para llamar a ese canal:

exten => 783,1,Dial(DAHDI/2,30,tTm)
exten => 783,n,Hangup

Al realizar una llamada a esta extensión desde la 2003 el resultado obtenido es el
siguiente:



El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [783@acceso:1] Dial("SIP/2003-08b89f98", "DAHDI/2|30|tTm") in new stack
-- Called 2
-- Started music on hold, class 'default', on SIP/2003-08b89f98
-- DAHDI/2-1 is ringing
-- DAHDI/2-1 is ringing
-- Stopped music on hold on SIP/2003-08b89f98
-- Hungup 'DAHDI/2-1'
== Spawn extension (acceso, 783, 1) exited non-zero on 'SIP/2003-08b89f98'



! Botón de Conferencias

Como hemos visto en la configuración del fichero de botones del FOP 2. Es
también es posible generar botones de Conferencia. Se ha configurado un botón y
vamos a ver su funcionamiento frente a llamadas a la conferencia.


Registramos dos extensiones en la conferencia y vemos el efecto en el botón
de conferencia.
330



El log que muestra el CLI de Asterisk mientras se desarrolla el ejemplo es:

-- Executing [600@acceso:1] MeetMe("SIP/2005-08b876a8", "600|i|1234") in new stack
== Parsing '/etc/asterisk/meetme.conf': Found
-- Created MeetMe conference 1023 for conference '600'
-- Recording
-- <SIP/2005-08b876a8> Playing 'vm-rec-name' (language 'es')
-- <SIP/2005-08b876a8> Playing 'beep' (language 'es')
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-1 format: sln, 0x8b7b718
-- User ended message by pressing #
-- <SIP/2005-08b876a8> Playing 'auth-thankyou' (language 'es')
-- <SIP/2005-08b876a8> Playing 'vm-review' (language 'es')
-- <SIP/2005-08b876a8> Playing 'vm-msgsaved' (language es')
-- <SIP/2005-08b876a8> Playing 'conf-onlyperson' (language 'es')
-- Executing [600@acceso:1] MeetMe("SIP/2003-08b8df48", "600|i|1234") in new stack
-- Recording
-- <SIP/2003-08b8df48> Playing 'vm-rec-name' (language 'es')
-- <SIP/2003-08b8df48> Playing 'beep' (language 'es')
-- x=0, open writing: /var/spool/asterisk/meetme/meetme-username-600-2 format: sln, 0x8b2e168
-- User ended message by pressing #
-- <SIP/2003-08b8df48> Playing 'auth-thankyou' (language 'es')
-- <SIP/2003-08b8df48> Playing 'vm-review' (language 'es')
-- <SIP/2003-08b8df48> Playing 'vm-msgsaved' (language 'es')
-- <DAHDI/pseudo-1935991902> Playing '/var/spool/asteriskmeetme/meetme-username-600-2' (language 'es')
-- <DAHDI/pseudo-1935991902> Playing 'conf-hasjoin' (language 'es')
== Spawn extension (acceso, 600, 1) exited non-zero on 'SIP/2003-08b8df48'
-- <DAHDI/pseudo-1935991902> Playing '/var/spool/asterisk/meetme/meetme-username-600-2' (language 'es')
-- <DAHDI/pseudo-1935991902> Playing 'conf-hasleft' (language 'es')
-- Hungup 'DAHDI/pseudo-1935991902'
== Spawn extension (acceso, 600, 1) exited non-zero on 'SIP/2005-08b876a8'
331
Asternic Call Center Stats

¿Qué es Asternic Call Center Stats?

Esta sencilla y poderosa herramienta le permitirá analizar los registros de cola de su
centralita Asterisk y mostrarlos de manera amigable en su navegador web. Es de los
creadores de FOP 2.

Características

Reportes detallados: Los reportes muestran información exacta sobre la
activdad de su call center en tablas amistosas y gráficos flash vistosos.También
puede exportar los reportes a pdf o csv (Excel). Hay una gran cantidad de
métricas disponibles: nivel de servicio, nivel de abandonos, distribución de
llamados, actividad de agentes, y mucho más.


Asequible: Asternic Call Center Stats viene en dos versiones, una gratuita con
capacidad limitada que se distribuye bajo la licencia GPL v3, y una versión
comercial con un montón de características adicionales e informes. La
concesión de licencias se realiza por servidor, no hay licencias por puesto, y el
código fuente completo se incluye en ambas versiones.


Estado en tiempo real: Tanto la version Lite como la Pro le permiten ver el
estado de sus colas y agentes en tiempo real.


Sólido y probado: La herramienta está siendo utilizada en pequeñas oficinas y
en grandes call centers por igual, reportando cientos de miles de llamadas de
forma consistente.

Requisitos:

En el servidor

1. Servidor web con soporte PHP.
2. Base de datos MySQL.
3. Asterisk 1.2, 1.4 o 1.6.

En el cliente

1. Navegador web con soporte javascript.
2. Plugin Flash para los gráficos.
332
Instalación

Estas instrucciones se aplican para la versión Lite del Asternic Call Center Stats.

- Descargamos la aplicación:

cd /usr/src
wget http://www.asternic.org/stats/asternic-stats-1.0.1.tgz

- Descomprimimos:

tar zvxf asternic-stats-1.0.1.tgz
cd asternic-stats

- Creamos la base de datos:

mysqladmin create qstats

- Cargamos la estructura de la base de datos:

mysql -u root < sql/qstat.sql

- Editamos /usr/src/asternic-stats/html/config.php e ingresamos la información
referente a la base de datos:

$dbhost = 'localhost';
$dbname = 'qstat';
$dbuser = 'root';
$dbpass = '';

$language = "es";

- Editar /usr/src/asternic-stats/html/config_realtime.php la información
referente a Asterisk Manager, esta la podemos encontrar en el archivo
/etc/asterisk/manager.conf :

<?
$manager_host = "127.0.0.1";
$manager_user = "admin";
$manager_secret = "amp111";
session_start();
session_register("QSTATS");
?>

- Editamos /usr/src/asternic-stats/parselog/config.php con información
referente a la base de datos y manager de asterisk:

$queue_log_dir = '/var/log/asterisk/';
$queue_log_file = 'queue_log';

$dbhost = 'localhost';
$dbname = 'qstat';
333
$dbuser = 'root';
$dbpass = '';

- Copiamos la carpeta html a /var/www/:

cp -Rf /usr/src/asternic-stats /var/www/queue-stats
cp -Rf /usr/src/asternic-stats/parselog /var/www/queue-stats

- Creamos una tarea programada para consolidar la información del archivo
queue_log:

php -q /var/www/queue-stats/parselog/parselog.php

- Visualizamos unas bonitas y completas estadísiticas de cada una de las colas
disponibles desde:

http://ip.asterisk/queue_stats
334
Practicas de la aplicación con Asternic Call Center Stats

Tras el acceso a la aplicación ( http://192.168.1.200/stats/ ) elegimos las colas, los
agentes y el intervalo de tiempo del que realizaremos el reporte.




























Pulsamos el botón “Mostrar Reporte” y vemos las llamadas atendidas por cada cola y
agente seleccionados y las no atendidas.
335

Atenddi a

Nro

De ta
1
•io
Dentro de 15 segs 8 llamadas

80.00%
Dentro de 30 segs 9 llamadas +1 90.00 %
Dentro de 45 segs 9 llamadas o 90.00%
Dentro de 60 segs 10 llamadas +1 100.00 %
Dentro de 75 segs 10 llamadas o 100.00 %
Dentro de 90 segs 10 llamadas o 100.00%
Dentro de 91+ segs 10 llamadas o 100.00%

Numero de llamadas sin atender: 2111amadas
Promedio de. espera antes de Qesconectar: 23 segs
Posicion promedio en cola al desconectar:

Posicion inicial promedio en cola:


Causa Nro %
Abandonada por Usuario 12111amadas 1 100.00%

.
:
)
' _ / ·-
+ Nivel de Servicio











+ llamadas Atendidas por Co la

Cola Nro


Nivelde Servido

.¡.

http://www.asternic.org - Astemic Stats - by Nicolás Gudlño

soportequeue

+ Causa de Desconexion

Causa

10 llamadas 100.00%



Nro





N
r
o




Causa de Osconexton

Corto elagente:
Corto elusuario:

1 6 11amadas 1 0.00%
1 4 11amadas 10.00%

,.e, ..$'
'b :;-a

http://www.asternlco. rg - Asterncl Stats - by Nicolás Gudlño




Inicio 1 Atendidas 11 Sin atender u D_ís_tr_ib_u_c_ói n .JL._R_ea_lt_im_e _l,_ -1
Ca sa de Desconexion Llamadas sni Atender por Cola


Detalles del Reporte llamadas sin Atender

Cola: 'soportequeue'
Inicio: 2009-12-01
Final: 2009-12-31
Periodo: 31dias

4:- Causa de Desconexion

Causa de Oesconexion


Expirado 1 o llamadas 1 0.00%







fl. llamadas sin Atender por Cola
#':>'b 1:)<)
# .
http://wwwÍsternic.org - Asternic Stats by Nicolás Gudiño
1 Cola Nro %
j
Uamadas sln Atender por Cola

soportequeue j 21calls j 100.00%





.<f'
. .
http://www.astermc.org- A rmc Sta- by N•colas Gudmo
336
Numero de llamadas atendidas: 10 llamadas
Numero de llamadas sin atender: 2111amadas
Ingresos de Agentes: o
Egresos de Agentes: o

Fecha
1
Atendidas
r
% Atend
r
Sin atender % Desat
1
Duracion media
r
Espera media Ingresos Egresos
2009-12-16 1 10.00 'Jo 5 23.81% 0:06 min 4 segs

2009-12-17 7 70.00% 8 38.10% 1:17min 14 segs

2009-12-18 o 0.00% 4 19.05% 0:00 min O segs

2009-12-22 2 20.00 °/o 4 19.05% O:12 min 6 segs



Hora Atendidas
1
% Atend
l
Sin atender 1
% Desat
1
Ouracion media
1
Espera media
1
Ingresos
1
Egresos
00 o 0.00% o 0.00% O segs O segs o o
01 o 0.00% 1 4.76% O segs O segs o o
02 o 0.00% o 0.00% O segs O segs o o
03 o 0.00% o 0.00% o segs o segs o o
04 o 0.00% o 0.00% O segs O segs o o
05 1 10.00% 2 9.52% 94 segs 46 segs o o
06 6 60.00% 5 23.81% 74 segs 9 segs o o
07 o 0.00% o 0.00% O segs O segs o o
08 o 0.00% o 0.00% o segs o segs o o
09 o 0.00% o 0.00% O segs O segs o o
10 o 0.00% o 0.00% O segs O segs o o
11 o 0.00% o 0.00% O segs O segs o o
12 o 0.00% o 0.00% O segs O segs o o
13 o 0.00% o 0.00% O segs O segs o o
14 o 0.00% o 0.00% O segs O segs o o
15 o 0.00% o 0.00% O segs O segs o o
16 o 0.00% o 0.00% o segs o segs o o
17 o 0.00% o 0.00% O segs O segs o o
18 o 0.00% o 0.00% O segs O segs o o
19 o 0.00% o 0.00% O segs o segs o o
20 o 0.00% o 0.00% O segs O segs o o
21 o 0.00% 3 14.29% O segs O segs o o
22 3 30.00% 4 19.05% 10 segs 5 segs o o
23 o 0.00% 6 28.57% O segs O segs o o

Exoortar tabla:

A continuación vemos las llamadas atendidas por hora,día y por día de la semana.



Inicio
1
Atendidas
1
Sin atender
11
Distribución
11
Realtime
1

Distribucion de Llamados por día Distribucion de Llamados por hora Distribucion de Llamados por día de semana


Detalles del Reporte Totales
Cola: 'soportequeue'
Inicio: 2009-12-01
Final: 2009-12-31
Periodo: 31dias

Distribucion de Llamados por dia







Exportar tabla:





Distribucion de Llamados por hora


































Para una mejor visualización vemos 3 gráficas:


• La relación entre llamadas atendidas y desatendidas por hora.
337
Uamad Atendidas madas
sin Ate
der
• Número de horas desatendidas de las recibidas.
• Tiempo de espera por hora.



Atendidas/Desatendidas por Hora
111 as 111Ua n

lo-· · -- -· - --- ------- ----- ------= =-..

8---------------------------------------------

6---------------------------------------------







Duracion promedio de llamadas por hora
los- = --- -- ------ -- -------=-.

84---------


63---------


42---------


21---------









Duracion promedio de espera por hora

501- ==--··-- -·---


40---------


30---------


20---------


10---------
338
Vemos la distribución de llamadas por día de la semana:














































Vemos a tiempo real que sucede cuando se está haciendo una llamada a la cola.
339

















Cuando se contesta la llamada la aplicación lo refleja de la siguiente forma:
340
Asternic CDR Reports

¿Qué es Asternic CDR Reports?

Es una herramienta de fácil manejo que le permitirá analizar los registros de llamadas
de cada uno de los usuarios de la centralita Asterisk y mostrarlos a través de diversas
tablas y gráficos en su navegador web.Es de los creadores de FOP 2 y Asternic Call
Center Stats.

Características

Versión de Prueba: Para obtener esta aplicación y probarla es necesario
ponerse en contacto con los creadores de esta.


Referencias: El éxito de FOP 2 y lo consistente y solida que es la aplicación
Asternic Call Center Stats nos da un punto de confianza.


Estado en tiempo real: Esta versión permite ver el estado de una llamada en
tiempo real.


Reportes Detallados: La herramienta permite ver reportes de las llamadas
entrantes y salientes por usuario y duración total de todas estas, también es
posible ver la distribución en minutos mensual de cada usuario.

Requisitos:

En el servidor

4. Servidor web con soporte PHP.
5. Base de datos MySQL.
6. Asterisk 1.2, 1.4 o 1.6.

En el cliente

3. Navegador web con soporte javascript.
4. Plugin Flash para los gráficos.
341
Instalación

Con estas simples instrucciones instalaremos la aplicación en nuestro servidor:

- Obtenemos la aplicación:

En este caso gracias a Nicolas Gudiño.

- Descomprimimos en /var/www/html/ y cambiamos de nombre a la carpeta a "cdr":

tar zvxf asternic-cdr-free.tgz
mv asternic-cdr-free cdr
cd cdr

- Agregamos el contenido de el fichero db.sql a la base de datos "cdr" anteriormente
creada para llevar los registros de llamadas desde MySQL:


service mysqld start
mysql -u root -p root
use cdr;

Pegamos el contenido del fichero db.sql.

- Editamos el archivo config.php de la siguiente manera:

// Credentials for MYSQL databases
$dbhost = 'localhost';
$dbname = 'cdr';
$dbuser = 'root';
$dbpass = 'root';

// Credentials for AMI (for the realtime tab to work)
// See /etc/asterisk/manager.conf

$manager_host = "localhost";
$manager_user = "admin";
$manager_secret = "amp111";

// Available languages "es", "en", "ru", "de", "fr"
$language = "es";

- Visualizamos el registro de llamadas desde:

http://ip.asterisk/cdr

















342
Practicas de la aplicación con Asternic CDR Reports

Tras el acceso a la aplicación ( http://192.168.1.200/cdr/ ) configuramos los usuarios y
establecemos el intervalo de tiempo del que realizaremos el reporte.






















Agregamos uno a uno los usuarios de los que registraremos las llamadas.






















Tras agregar todos los usuarios este es el aspecto de la aplicación y ya podemos hacer
el reporte.
343
Elegimos el intervalo de tiempo y pulsamos el botón “Mostrar Reporte”.




























Tras hacer el reporte empezamos a observar las tablas y gráficos que se realizan
empezando por las llamadas salientes por usuario.






























A partir de esa tabla se generan las siguientes gráficas:
344





















































Ahora vemos las llamadas entrantes recibidas por usuario:
345



























A partir de la tabla de llamadas entrantes se generan las siguientes gráficas:
346


















Vemos la distribución de llamadas en los 23 dias de los que se ha hecho el reporte:


















347
Por último se visualiza como se muestra una llamada a tiempo real:



Inicio
1
Salientes
1
Entrantes
1
Distribución 1 Configuración 11 Realtime

1



llamadas Activas


Usuario Nro CLID Dur. Acción
David 1 4000 0:04 mins Espiar
SIP/4000 1 2003 0:04 mins Espiar

Hora en el servidor: 2009-12-23 22:47:02
PHP procesó la página en 0.0072338581085205 segundos
Copyright 2008 by Nicolás Gudiño - Asternic Asterisk Tools Licensed under GPL3
348
Verbio



Verbio Technologies S.L. es una empresa
especializada en el desarrollo de tecnologías del
habla, básicamente síntesis y reconocimiento de voz.

Verbio diseña, desarrolla y comercializa productos software de tecnologías del habla y
ofrece los servicios asociados de soporte técnico, consultoría, desarrollos I+D a
medida, ajuste y tuning de aplicaciones de voz y mantenimiento.

Por suerte nos han concedido una versión de prueba para aplicar y probar el
funcionamiento del reconocimiento y síntesis de voz a nuestra centralita Asterisk.



¿Qué es Verbio TTS?



Verbio TTS es el motor de síntesis de voz o
conversión de texto en voz de Verbio.


¿Qué es la Conversión de texto en voz?

La conversión de texto en habla o síntesis de voz (TTS - Text-to-Speech) es la
tecnología que permite convertir, de forma automática, un texto escrito en una
locución de voz natural, con la mejor naturalidad e inteligibilidad. Permite al
sistema que dispone de dicho motor "leer en voz alta" un texto escrito.


¿Cuándo es indicado utilizarlo?

- Es una herramienta imprescindible en aplicaciones cuyo texto a pasar a
voz, a priori, es desconocido o muy cambiante y por lo tanto hay que
comunicar información dinámica.

- La síntesis no pretende sustituir nunca a la calidad de una grabación
profesional hecha en un estudio de grabación, pero sí que se dispone de
calidad suficiente como para sustituir temporalmente cuando se
necesitan de forma inmediata mensajes o locuciones estáticas o
definitivamente cuando lo que se pretende es un ahorro directo de
costes.

- Cuando se persigue mayor calidad que lo que representa la simple
concatenación directa de ficheros .wav de pequeñas locuciones
grabadas en estudio, ya que con ellas se perdería la entonación
dinámica necesaria en un idioma concreto. Un ejemplo típico de ello es
la locución de cantidades numéricas.
349
¿Qué es Verbio ASR?

Verbio ASR es el motor de reconocimiento del habla de
Verbio muy orientado a aplicaciones telefónicas e
independientes del locutor, si bien es aplicable también en
muchas otras aplicaciones microfónicas y multimedia.

¿Qué es el Reconocimiento del habla?

El reconocimiento del habla (ASR - Automatic Speech Recognition) es la
tecnología que permite convertir, de forma automática, una locución de voz
natural en un texto que se corresponda con ésta con la máxima fiabilidad
posible. Permite al sistema que dispone de dicho motor "entender" o
interpretar el contenido de una locución con independencia de la voz del
locutor.

¿Cuándo es indicado utilizarlo?

- Verbio ASR es una herramienta imprescindible en aplicaciones
interactivas entre usuarios y sistemas automáticos o de control por voz,
ya sean IVR, Portales de voz o dispositivos en general.

- Muy orientado para el entorno telefónico, si bien el canal de voz forma
parte de otros muchos sistemas multicanal o multimodal que requieren
ASR para ser automatizados.

- Cuando se requiere una navegación más flexible, con iniciativa y control
por parte del usuario.

- Para ahorrar tiempos de interacción y evitar memorización de menús
muy largos.

- En aplicaciones en las que el teléfono, o simplemente la voz, sigue
siendo el único canal o medio de interacción.


Introducción a Verbio-Asterisk

Para poder poner en marcha el sistema Verbio-Asterisk, deberemos disponer de los
siguientes componentes:


Servidor Verbio (voxserver).
Servidor Asterisk con las aplicaciones Verbio instaladas.
Ambos componentes pueden estar instalados en el mismo equipo.
350


Servidor Asterisk

Mediante las aplicaciones (Dialplan)
Verbio, se realizan peticiones de
síntesis y reconocimiento al voxserver.
















Servidor Verbio (voxserver)

Proporciona recursos de sintesis y
reconocimiento.





Listado de paquetes de Verbio:

El listado de paquetes disponibles es el siguiente:

• Motor de síntesis/recnocimiento (servidor voxserver (verbiod)):

verbio-engines: Este paquete es de obligada instalación cuando estamos
montando el servidor de síntesis/reconocimiento.

En este caso el paquete necesario es: verbio-engines-8.02-0.i386.rpm

• Cliente verbio (Verbio Developer):

verbio-clients: Contiene las librerías, ejemplos y documentación necesaria, para
el desarrollo de aplicaciones de voz.

En este caso el paquete necesario es: verbio-clients-8.02-0.i386.rpm

• Text To Speech (síntesis):



Id. Locutor Nombre del paquete Descripción
esAO verbio-tts-laura-esao locutor de síntesis español (mujer -Laura-) 8KHz
esAO verbio-tts-laura-esao-16k locutor de síntesis español (mujer -Laura-) 16KHz
esEB verbio-tts-carlos-eseb locutor de síntesis español (hombre -Carlos-) 8KHz
351

esEB verbio-tts-carlos-eseb-16k locutor de síntesis español (hombre -Carlos-) 16KHz
esVA verbio-tts-amaya-esva locutor de síntesis español (mujer -Amaya-) 8KHz
esVA verbio-tts-amaya-esva-16k locutor de síntesis español (mujer -Amaya-) 16KHz
ca-c0CD verbio-tts-pau-ca-c0cd locutor de síntesis catalán (hombre -Pau-) 8KHz
ca-c0CD verbio-tts-pau-ca-c0cd-16k locutor de síntesis catalán (hombre -Pau-) 16KHz
ca-c0FE verbio-tts-meritxell-ca-c0fe locutor de síntesis catalán (mujer -Meritxell-) 8KHz
ca-c0FE verbio-tts-meritxell-ca-c0fe -16k locutor de síntesis catalán (mujer -Meritxell-) 16KHz
caJO verbio-tts-oriol-cajo locutor de síntesis catalán (hombre -Oriol-) 8KHz
caJO verbio-tts-oriol-cajo-16k locutor de síntesis catalán (hombre -Oriol-) 16KHz
euSK verbio-tts-ainhoa-eusk locutor de síntesis euskera (mujer -Ainhoa-) 8KHz
euSK verbio-tts-ainhoa-eusk-16k locutor de síntesis euskera (mujer -Ainhoa-) 16KHz
euVZ verbio-tts-amaia-euvz locutor de síntesis euskera (mujer -Amaia-) 8KHz
euVZ verbio-tts-amaia-euvz-16k locutor de síntesis euskera (mujer -Amaia-) 16KHz
ca-v0EM verbio-tts-empar-ca-v0em locutor de síntesis valenciano (mujer -Empar-) a 8KHz
ca-v0EM verbio-tts-empar-ca-v0em-16k locutor de síntesis valenciano (mujer -Empar-) a 16KHz
gaFR verbio-tts-freire-gafr locutor de síntesis gallego (hombre -Freire-) 8KHz/16KHz
es-mxYO verbio-tts-celia-es-mxyo locutor de síntesis mexicano (mujer -Celia-) 8KHz
es-mxYO verbio-tts-celia-es-mxyo-16k locutor de síntesis mexicano (mujer -Celia-) 16KHz
ptMU verbio-tts-adriana-ptmu locutor de síntesis portugués (mujer -Adriana-) 8KHz
ptMU verbio-tts-adriana-ptmu-16k locutor de síntesis portugués (mujer -Adriana-) 16KHz
pt-brPA verbio-tts-julia-pt-brpa locutor de síntesis portugués brasileño (mujer -Julia-) 8KHz
pt-brPA verbio-tts-julia-pt-brpa-16k locutor de síntesis portugués brasileño (mujer -Julia-) 16KHz
frIF verbio-tts-brigitte-frif locutor de síntesis francés (mujer -Brigitte-) 8KHz
frIF verbio-tts-brigitte-frif-16k locutor de síntesis francés (mujer -Brigitte-) 16KHz
en-usJA verbio-tts-jane-en-usja locutor de síntesis inglés (mujer -Jane-) 8KHz
en-usJA verbio-tts-jane-en-usja-16k locutor de síntesis inglés (mujer -Jane-) 16KHz
es-arLO verbio-tts-javier-es-arlo locutor de síntesis argentino (hombre -Javier-) 8KHz
es-arLO verbio-tts-javier-es-arlo-16k locutor de síntesis argentino (hombre -Javier-) 16KHz

Se instalarán los paquetes según los locutores que necesitemos.
Hay que tener en cuenta que, a la hora de realizar la instalación de los locutores (TTS)
de Verbio, deberemos usar la versión a 8Khz de los mismos.

En este caso los paquetes necesarios son: verbio-tts-amaia-euvz-8.02-0.i386.rpm
y verbio-tts-amaya-esva-8.02-0.i386.rpm

• Configuraciones de reconocimiento (ASR):



Id. configuración

Nombre del paquete

Descripción (lenguajes que proporciona)
es verbio-asr-es reconocimiento español (es).
es_ca verbio-asr-es_ca reconocimiento español + catalán (es,ca)
es_eu verbio-asr-es_eu reconocimiento español + euskera (es,eu)
es_ga verbio-asr-es_ga reconocimiento español + gallego (es,ga)

es_ca_eu_ga

verbio-asr-es_ca_eu_ga
reconocimiento español + catalán + euskera + gallego
(es,ca,eu,ga)
es-ar verbio-asr-es-ar reconocimiento argentino/uruguayo/paraguayo (es-ar)
es-cl verbio-asr-es-cl reconocimiento chileno (es-cl)
es-co verbio-asr-es-co reconocimiento Colombiano/panameño (es-co)
es-mx verbio-asr-es-mx reconocimiento mexicano (es-mx)

es-ve

verbio-asr-es-ve
reconocimiento venezolano/portorriqueño/cubano/
dominicano (es-ve)
pt verbio-asr-pt reconocimiento portugués (pt)
352

pt-br verbio-asr-pt-br reconocimiento portugués brasileño (pt-br)
fr verbio-asr-fr reconocimiento francés (fr)
en-us verbio-asr-en-us reconocimiento inglés americano (en-us)
es16k verbio-asr-es16k reconocimiento español 16Khz (es16k).
ca16k verbio-asr-ca16k reconocimiento catalán 16Khz (ca16k).


Se instalarán los paquetes según los locutores que necesitemos.

En este caso el paquete necesario es: verbio-asr-es_eu-8.02-0.i386.

Instalación de Verbio

1. Desinstalar (si tenemos alguna instalación previa) todos los paquetes Verbio:


Encontrar los paquetes Verbio que tengamos instalados en nuestro
sistema.
# rpm -qa | grep -i verbio
verbio-tts-*
verbio-engines
verbio-asr-*
verbio-clients
[...]

Desinstalar los paquetes encontrados (verbio-engines deberá ser el
último).

[...]
# rpm -e verbio-tts-*
# rpm -e verbio-asr-*
# rpm -e verbio-clients
# rpm -e verbio-engines

2. Instalar los nuevos paquetes Verbio (verbio-engines deberá ser el primero)

# rpm -ivh verbio-engines-x.yy.i386.rpm
# rpm -ivh --force verbio-clients-x.yy.i386.rpm
# rpm -ivh --force verbio-tts-*-x.yy.i386.rpm
# rpm -ivh --force verbio-asr-*-x.yy.i386.rpm

3. Si disponemos de una mochila con licencia, deberemos instalar el paquete (que
encontraremos en: /usr/share/doc/verbio/) que contiene el driver de dicho
dispositivo:

# rpm -ivh sntl-sud-x.y.z.i386.rpm

Si disponemos de una licencia en fichero, copiarla en: /opt/verbio/lic/

4. Copiar el directorio /usr/share/doc/verbio/samples/ a nuestra 'home' (por
ejemplo),para poder compilar y ejecutar algunos ejemplos que allí
encontraremos.
353
5. La documentación de verbio la podemos encontrar en: /usr/share/doc/verbio/:


library-sdk_es.pdf (documentación sdk verbio).
guide_es.pdf (capítulos 4 y 5 para aprender sobre reconocimiento y
síntesis del habla)

Configuración y puesta en marcha del sevidor voxserver (verbiod)

La configuración del servidor voxserver, reside en el fichero:

/etc/software-verbio-server.

Los parámetros más importantes de dicho fichero son:

VERBIO_ASR_CONF : debe contener todas las configuraciones de ASR
instaladas.
VERBIO_START_CONF : debe contener todas las configuraciones ASR que
queremos arrancar.
VERBIO_START_LANG : lenguaje por defecto.
VERBIO_TTS_SPK : debe contener todos los locutores TTS instalados.
VERBIO_START_SPK : debe contener los locutores TTS que queremos tener
disponibles.
VERBIO_IN_MEMORY : 1 --> cargar todo el locutor en memoria, 0 --> carga
parcial.
FREQUENCY : 8000 o 16000 (según la version que hayamos
instalado)

Nota: podemos usar la aplicación 'verbioconf' (como root desde un terminal) para
llevar a cabo la configuración del fichero '/etc/software-verbio-server'.

Cada vez que instalemos/eliminemos un paquete de síntesis y/o reconocimiento,
deberemos ejecutar 'verbioconf' para reflejar los cambios en el fichero /etc/software-
verbio-server.

Puesta en marcha del servidor Verbio:

Comprobamos el correcto funcionamiento del servidor verbio ejecutando (como
'root'):

# verbiod -d (con -d indicamos modo debug)

Si todo está correctamente instalado deberemos obtener una salida similar a:

verbiod-6: StartUp TTS Speakers: esEB,esAO
verbiod-3: Serial number = H9D1CCE7
verbiod-3: ERROR mc_libinit(, , 262144) failed: NO LICENSE FILE WAS FOUND

Si disponemos de licencia, y el servidor está correctamente instalado y configurado, el
mensaje "NO LICENSE FILE WAS FOUND" no aparecerá y 'verbiod' quedará arrancado.
354
Si no tenemos licencia, una vez comprobada la correcta instalación de 'verbiod',
podemos arrancar en modo evaluación, para realizar las pruebas que consideremos
oportunas.

Para ello ejecutaremos (como 'root'):

# verbiod -e

El servidor quedará arrancado (ejecutar 'pgrep verbiod' para comprobar).
También podemos comprobar el estado del servidor 'verbiod' ejecutando (como
'root'):

# grep verbiod /var/log/syslog o # grep verbiod /var/log/messages

Nota: en modo evaluación, 'verbiod' permanecerá arrancado durante, únicamente,
30/60 minutos. Esta opción de evaluación únicamente es válida para comprobar el
correcto funcionamiento del sistema. Se recomienda adquirir una licencia de
evaluación una vez comprobado el correcto funcionamiento de verbio.

Los parámetros que acepta verbiod son: -d (modo debug), -e (modo evaluación) o
ningún parámetro para iniciar en modo 'normal'.

Instalación de las aplicaciones de Verbio en Asterisk


Para instalar las aplicaciones Asterisk de Verbio, hay que seguir los siguientes pasos:

1.) Copiar el fichero 'app_verbio_speech.c' a la carpeta 'apps' de las fuentes de
Asterisk.

2.) Editar el fichero 'Makefile' de dicha ubicacion (carpeta 'apps') y añadir:
Si usamos Asterisk 1.4 o 1.6 (añadir justo antes de la etiqueta 'all:')
MENUSELECT_DEPENDS_app_verbio_speech+=VOX
VOX_LIB=-lvoxlib
Nota: para que la aplicación compile y linkee correctamente deberemos tener,
como mínimo, el paquete 'verbio-clients' instalado.

3.) Ejecutar 'make install' (desde el directorio principal de nuestras fuentes de
Asterisk).


4.) Crear las siguientes carpetas (si conviene):

/var/lib/asterisk/verbio/text
/var/lib/asterisk/verbio/gram
/var/lib/asterisk/verbio/audio

5.) Copiar el fichero 'verbio.conf' (que encontramos en el paquete verbio-
asterisk)a: /etc/asterisk/.
355
Carga y descarga de las aplicaciones de Verbio en Asterisk.

Las aplicaciones Verbio se cargan y descargan automáticamente al iniciar o parar
Asterisk. Si, desde el CLI de Asterisk, queremos cargar las aplicaciones Verbio pedemos
ejecutar:

*CLI> module load app_verbio_speech.so

Para la descarga de las aplicaciones Verbio podemos ejecutar:

*CLI> module unload app_verbio_speech.so

Si hay algún error de configuración/conexión se nos reportará por pantalla.

Nota: al cargar las aplicaciones Verbio (bien cuando arranca Asterisk o bien cuando
cargamos manualmente con '(module) load app_verbio_speech.so'). Se intentará
establecer la conexión con el servidor Verbio por lo cual, es muy importante que
tengamos el servidor de síntesis/ reconocimiento arrancado.

La conexión con el servidor Verbio se mantiene abierta hasta que paremos Asterisk o
ejecutemos '(module) unload app_verbio_speech.so'.


Configuración de verbio.conf (en /etc/asterisk/)

;; Verbio ASR and TTS engines Configuration
;;;;;;;;;;;;;;;;;;;;;;
;General options ;
;;;;;;;;;;;;;;;;;;;;;;
[general]
primary_vox_server = 127.0.0.1
backup_vox_server = 127.0.0.1
; default 5
net_timeout = 5
;;;;;;;;;;;;;;;;;;;;;;
; TTS Engine Options ;
;;;;;;;;;;;;;;;;;;;;;;
[tts]
default_language = es ; es (español)
;default_language = eu ; eu (euskera)
default_speaker = amaya
;default_speaker = amaia
text_prompts_path =/var/lib/asterisk/verbio/text
init_delay = 300
end_delay = 20
;;;;;;;;;;;;;;;;;;;;;;
; ASR Engine Options ;
;;;;;;;;;;;;;;;;;;;;;;
[asr]
;default_config = es
default_config = es_eu ;(español, euskera)
default_language = es
grammar_path = /var/lib/asterisk/verbio/gran
; default: 300
356
init_sil = 300
; default: 200
max_sil = 200
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; VAD (client-side) options ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[vad]
;min_ref = 5
;mode = standard
;default: 2.5
;low_factor = 2.5
;default: 4.5
;high_factor = 4.5
; default: 0.8
;final_factor = 0.8
; default: 2.5
;final_high_factor = 2.5
; default: 500.0
;min_high_thresh = 500.0
; default: 50
;aam_min = 50
; default: 200
;aam_max = 200
;;;;;;;;;;;;;;;;;;;;;;
; Debug options ;
;;;;;;;;;;;;;;;;;;;;;;
[debug]
verbose = 1
extended_verbose = 1
keep_recorded_files = 1
recorded_files_path = /var/lib/asterisk/verbio/audio
recorded_files_exten = pcm
mark_recorded_files = 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Wordspotting options (future application) ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[ws]
;path = /var/lib/asterisk/verbio/ws
;silence = 500
;threshold = 30
;command = /var/lib/asterisk/verbio/ws/ws.sh


Descripcion de las diferentes aplicaciones.

Nota: Si los parámetros marcados como opcionales se omiten, estos tomaran los
valores del fichero /etc/asterisk/verbio.conf.

o VerbioLoadVcb
o VerbioUnloadVcb
o VerbioRec
o VerbioPrompt
o VerbioPromptAndRec
o VerbioStreamAndRec
o VerbioLastErr
357
o VerbioInfo
o VerbioFreeChannel

o VerbioLoadVcb(gram_file|gram_type[|config][|lang][|options])

Descripción: Esta funcion carga una gramatica (sobre un puerto verbio asociado al
canal Asterisk).

Parametros: gram_file : fichero de gramatica.
gram_type : tipo de gramatica ((ISOLATED, CONNECTED, ABNF o
BUILTIN)).
config : configuracion de reconocimiento (opcional).
lang : lenguaje a utilizar (opcional).
options : opciones. Las opciones disponibles son:
- v (verbose)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio)

Una vez cargada la gramatica, se establecera una variable de canal (VVCB_HANDLE) la
cual contiene el identificador de la gramatica cargada.

o VerbioUnloadVcb(vcb_handle[|config][|lang][|options])

Descripción: Descarga una gramatica.

Parametros: vcb_handle : identificador de gramatica (-1 para descargar todas)
config : configuracion de reconocimiento (opcional).
lang : lenguaje a utilizar (opcional).
options : opciones. Las opciones disponibles son:
- v (verbose)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio).

o VerbioRec([|config][|lang][|initsil][|maxsil][|abs_timeout][|options])

Descripcion: Lanza el reconocimiento. Antes de hacer cualquier llamada a esta
aplicación, deberemos haber cargado alguna gramatica con la función
'VerbioLoadVcb'.

Parametros: config : configuracion de reconocimiento (opcional).
lang : lenguaje a utilizar (opcional).
initsil : maxima duracion de silencio de inicio (unidades de 10ms). maxsil :
maxima duracion de silencio final (unidades de 10ms). abs_timeout :
timeout absoluto de reconocimiento (segundos)(opcional) options :
opciones. Las opciones disponibles son:
- b (beep antes de lanzar el reconocimiento)
- v (verbose)
- a (descolgar el canal)
358
- d (habilitar la deteccion de dtmf)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio)

Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de
Asterisk) las siguientes variables de canal:

VASR_WORDS : Numero de palabras reconocidas (n).
VASR_INDEXn : Indice (dentro de la gramatica) de la palabra-n reconocida.
VASR_RESULTn : Resultado-n del reconocimiento.
VASR_SCOREn : Score-n (confianza) del reconocimiento.
VASR_UTTERANCEn : Utterance el resultado n.
VASR_WEIGHTn : Peso del resultado n dentro de la gramatica.
VASR_RULEn : Regla a la que pertenece el resultado n.
Para compatibilidad con anteriores versiones:
VASR_INDEX = VASR_INDEX0
VASR_RESULT = VASR_RESULT0
VASR_SCORE = VASR_SCORE0
VASR_UTTERANCE = VASR_UTTERANCE0
VASR_WEIGHT = VASR_WEIGHT0
VASR_RULE = VASR_RULE0

Si la deteccion de dtmf (opcion 'd') está habilitada, podemos consultar su estado con
las siguientes variables de canal:

VDTMF_DETECTED:TRUE (se ha detectado un tono) o FALSE (no se ha
detectado tono)
VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el
valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-.

Se puede configurar el número maximo de dtmf a detectar y el dtmf de terminación,
configurando (set) las siguientes variables del dialplan:

VERBIO_DTMF_MAXLEN
VERBIO_DTMF_TERMINATOR

Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos
consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha
terminado), mediante la siguiente variable del dialplan: VASR_REC_FILE.

o VerbioPrompt(text_or_file[|lang][|speaker][|options])

Descripción: Sintetiza un texto o fichero de texto.

Parámetros: text_or_file : texto (o fichero - ver opciones -) a sintetizar.
lang : lenguaje a utilizar (opcional).
359
speaker : locutor a utilizar (opcional).
options : opciones. Las opciones disponibles son:
- f (tratar el parametro fichero_o_texto como si fuera un fichero)
- v (verbose)
- p (habilitar pausa/reproduccion mediante dtmf -tecla por
defecto '#'.Para especificar una tecla: p0,p1,..,p*,p#. p. para
cualquier tecla)
- s (habilitar parada del prompt mediante dtmf -tecla por defecto
'#'. Para especificar una tecla: s0,s1,..,s*,s#. s. para cualquier
tecla)
- a (descolgar el canal)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio)

Si la opcion de parar el prompt ('s') esta habilitada, podemos consultar su estado con
las siguientes variables de canal:

VDTMF_DETECTED (TRUE -si el usuario ha pulsado la tecla de parada del
prompt- or FALSE)
VDTMF_RESULT (si VDTMF_DETECTED = TRUE, contiene el valor de la
tecla pulsada)

Al trabajar con la opcion 'f', los ficheros de texto a sintetizar, se buscaron en la ruta
definida por el parametro 'text_prompts_path', del fichero de configuracion
('/etc/asterisk/verbio.conf').

Si queremos sintetizar un fichero de texto que se encuentre en una ubicacion distinta,
deberemos introducir el path completo al fichero.

No olvidarse de escapar las comas (',') del texto que queremos sintetizar (ejemplo:
"Hola\, buenas tardes.").(Si usamos un fichero de texto -opcion 'f'-esto último no
aplica).

o VerbioPromptAndRec(text_or_file[|initsil][|maxsil][|tts_lang][|tts_spkr][|asr
_conf][|asr_lang][|abs_timeout][|options])

Descripción: Lanza (al mismo tiempo) una sintesis y un reconocimiento. Dicha
aplicacion permite, si la opcion bargein esta activada, que el usuario
interrumpa la maquina (si durante la locucion el reconocedor detecta
que el usuario ha dicho algo, se parara la sintesis y la aplicacion
terminara. Permitiendonos, así, consultar el resultado del
reconocimiento efectuado).

Parametros: text_or_file : texto (o fichero - ver opciones -) a sintetizar.
initsil : maxima duracion de silencio de inicio (unidades de 10ms)
(opcional).
maxsil : maxima duracion de silencio final (unidades de 10ms) (opcional)
360
tts_lang : lenguaje (del sintetizador) a utilizar (opcional).
tts_spkr : locutor (del sintetizador) a utilizar (opcional).
asr_conf : configuracion de reconocimiento (opcional).
asr_lang : lenguaje (del reconocedor) a utilizar (opcional).
abs_timeout : timeout absoluto de reconocimiento (segundos)(opcional)
options : opciones. Las opciones disponibles son:
- f (tratar el parametro fichero_o_texto como si fuera un fichero)
- v (verbose)
- a (descolgar el canal)
- b (beep antes de reconocer)
- g (activar bargein. Permitir al usuario interrumpir a la maquina.
Esta opción desactivara 'b'.)
- i (interrumpir de manera inmediata el prompt al detectar voz.
Esta opción activara 'g'.)
- d (habilitar la deteccion de dtmf)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio).

Al trabajar con la opcion 'f', los ficheros de texto a sintetizar, se buscaran en la ruta
definida por el parametro 'text_prompts_path' del fichero de configuración
(/etc/asterisk/verbio.conf).

Si queremos sintetizar un fichero de texto que se encuentre en una ubicacion distinta,
deberemos introducir el path completo al fichero.

No olvidarse de escapar las comas (',') del texto que queremos sintetizar (ejemplo:
"Hola\, buenas tardes.").(Si usamos un fichero de texto -opcion 'f'- esto ultimo no se
aplica).

Cuando usemos bargein, hay que tener mucho cuidado al seleccionar los parametros
'initsil', 'maxsil' y 'abs_timeout'.

Si, por ejemplo, seleccionamos un 'initsil' o 'abs_timeout' demasiado pequeño, no le
daremos suficiente tiempo de escucha al usuario, y nuestro mensaje (prompt) se vera
interrumpido.

Si no indicamos un valor para 'initsil', 'maxsil' o 'abs_timeout', se utilizaran los valores
indicados en el fichero de configuracion (verbio.conf).

Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de
Asterisk) las siguientes variables de canal (una vez la aplicacion 'VerbioPromptAndRec'
haya terminado):

VASR_WORDS : Numero de palabras reconocidas (n).
VASR_INDEXn : indice (dentro de la gramatica) de la palabra-n reconocida.
VASR_RESULTn : Resultado-n del reconocimiento.
VASR_SCOREn : Score-n (confianza) del reconocimiento.
361
VASR_UTTERANCEn : Utterance el resultado n.
VASR_WEIGHTn : Peso del resultado n dentro de la gramatica.
VASR_RULEn : Regla a la que pertenece el resultado n.
Para compatibilidad con anteriores versiones:
VASR_INDEX = VASR_INDEX0
VASR_RESULT = VASR_RESULT0
VASR_SCORE = VASR_SCORE0
VASR_UTTERANCE = VASR_UTTERANCE0
VASR_WEIGHT = VASR_WEIGHT0
VASR_RULE = VASR_RULE0

Si la deteccion de dtmf (opcion 'd') esta habilitada, podemos consultar su estado con
las siguientes variables de canal:

VDTMF_DETECTED :TRUE (se ha detectado un tono) o FALSE (no se ha
detectado tono)
VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el
valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-.

Se puede configurar el numero maximo de dtmf a detectar y el dtmf de terminacion,
configurando (set) las siguientes variables del dialplan:

VERBIO_DTMF_MAXLEN
VERBIO_DTMF_TERMINATOR

Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos
consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha
terminado), mediante la siguiente variable del Dialplan: VASR_REC_FILE.

o VerbioStreamAndRec(audio_file[|initsil][|maxsil][|asr_conf][|asr_lang][|abs
_timeout][|options])

Descripcion: Lanza (al mismo tiempo) la reproduccion de un fichero de sonido y un
reconocimiento. Esta aplicacion, igual que la anterior, nos permite
realizar 'bargein'.

Parametros: audio_file : fichero a reproducir.
initsil : maxima duracion de silencio de inicio (unidades de 10ms)
(opcional)
maxsil : maxima duracion de silencio final (unidades de 10ms) (opcional)
asr_conf : configuracion de reconocimiento (opcional).
asr_lang : lenguaje (del reconocedor) a utilizar (opcional).
abs_timeout : timeout absoluto de reconocimiento (segundos)(opcional)
options : opciones.Las opciones disponibles son:
- v (verbose)
- a (descolgar el canal)
362
- b (beep antes de reconocer)
- g (activar bargein. Permitir al usuario interrumpir a la maquina.
Esta opción desactivara 'b'.)
- i (interrumpir de manera inmediata el stream al detectar voz.
Esta opción activara 'g'.)
- d (habilitar la deteccion de dtmf)
- n (no ejecutar colgado cuando se produzca un error referente a
Verbio)

Cuando usemos bargein, hay que tener mucho cuidado al seleccionar los parametros
'initsil', 'maxsil' y 'abs_timeout'. Si, por ejemplo, seleccionamos un 'initsil' o
'abs_timeout' demasiado pequeno, no le daremos suficiente tiempo de escucha al
usuario, y nuestro fichero a reproducir se vera interrumpido.

Si no indicamos un valor para 'initsil', 'maxsil' o 'abs_timeout', se utilizaran los valores
indicados en el fichero de configuracion (verbio.conf).

Para acceder al resultado del reconocimiento, podemos consultar (desde el dialplan de
Asterisk)las siguientes variables de canal (una vez la aplicacion 'VerbioPromptAndRec'
haya terminado):

VASR_WORDS : Numero de palabras reconocidas (n).
VASR_INDEXn : indice (dentro de la gramatica) de la palabra-n reconocida.
VASR_RESULTn : Resultado-n del reconocimiento.
VASR_SCOREn : Score-n (confianza) del reconocimiento.
VASR_UTTERANCEn : Utterance el resultado n.
VASR_WEIGHTn : Peso del resultado n dentro de la gramatica.
VASR_RULEn : Regla a la que pertenece el resultado n.
Para compatibilidad con anteriores versiones:
VASR_INDEX = VASR_INDEX0
VASR_RESULT = VASR_RESULT0
VASR_SCORE = VASR_SCORE0
VASR_UTTERANCE = VASR_UTTERANCE0
VASR_WEIGHT = VASR_WEIGHT0
VASR_RULE = VASR_RULE0

Si la deteccion de dtmf (opcion 'd') esta habilitada, podemos consultar su estado con
las siguientes variables de canal:

VDTMF_DETECTED :TRUE (se ha detectado un tono) o FALSE (no se ha
detectado tono)
VDTMF_RESULT :si VDTMF_DETECTED = TRUE, VDTMF_RESULT contiene el
valor de la tecla pulsada -0,1,2,3,4,5,6,7,8,9,*,#...-.
363
Se puede configurar el numero maximo de dtmf a detectar y el dtmf de terminacion,
configurando (set) las siguientes variables del dialplan:

- VERBIO_DTMF_MAXLEN
- VERBIO_DTMF_TERMINATOR

Nota: si la opcion 'keep_recorded_files' esta activada en 'verbio.conf', podemos
consultar el nombre del fichero generado (una vez la aplicacion de reconocimiento ha
terminado), mediante la siguiente variable del dialplan: VASR_REC_FILE.

o VerbioLastErr(var)

Descripcion: Esta aplicacion permite consultar el último mensaje de error referente a
las funciones Verbio.

Parametros: var: variable de canal donde guardaremos el mensaje de error. Las
aplicaciones Verbio deberan ser ejecutadas con la opcion 'n' (para
evitar,cuando se produzca un error por parte de las funciones de
Verbio, el cuelgue de la llamada).
Codigos de error:
EVX_NOERROR NO ERROR
EVX_INVSETUP Vox ERROR (Files may be corrupted.Check disk and
repeat Vox Setup) EVX_NOMEM OUT OF
MEMORY. (Check memory leakages). EVX_VCBFILE THE VOCABULARY
FILE NAME IS NOT VALID. (Check the
vocabulary file name and
path writing permission).
EVX_INVWORD THE VOCABULARY CONTAINS AN INVALID WORD. (Check
and correct invalid words).
EVX_NOLICFILE NO LICENSE FILE WAS FOUND. (Use Setup and CheckOut
to obtain the Vox
directory structure and
the license file).
EVX_INVLIC THE LICENSE FILE IS NOT VALID. (Use CheckOut to obtain a
valid license file).
EVX_SYSTEM SYSTEM ERROR (Check errno).
EVX_NOLIBINIT VOXLIB WAS NOT SUCCESSFULLY LOADED. (Call
vox_libinit() before using any Vox function).
EVX_NOLIC NO LICENSE
EVX_NOSETVCB NO ACTIVE VOCABULARY. (Use vox_setvcb() to set the
active vocabulary).
EVX_NORECSTR NO RECOGNITION. (Use vox_recstr() to init recognition).
EVX_NOLINE NO MORE LINES ARE AVAILABLE FOR THE SPECIFIED
CHANNEL DEVICE
EVX_BADPARM INVALID PARAMETER IN FUNCTION CALL
364
EVX_NOTIMP NOT IMPLEMENTED
EVX_NORECIND NO RECIND OR NBEST. (Call vox_recind() before calling
ATVOX_NIND()).
EVX_INVFILE INVALID FILENAME
EVX_NETWORK NETWORK ERROR
EVX_DICFILE THE DICTIONARY FILE NAME IS NOT VALID
EVX_PARSER ABNF PARSER ERROR
EVX_INVVER THE VOXSERVER VERSION DOES NOT MATCH THE CLIENT
VERSION
EVX_UNKNOWN Unknown error

o VerbioInfo()

Descripcion: Esta aplicacion imprimira informacion diversa sobre la configuracion de
Verbio (locutores instalados,configuraciones de reconocimiento
instaladas, versiones, licencias, etc...).
Esta aplicacion creara las siguientes variables de canal:
VTTS_SPEAKERS : locutores disponibles (formato:
'id1:name1:gender1:age1:lang1;
id2:name2:gender2:age2:lang2;')
VASR_CONFIGS : configuraciones de reconocimiento disponibles.

o VerbioFreeChannel()

Descripcion: Esta aplicacion liberara los recursos (licencias y memoria) del servidor
Verbio para el canal actual. Esta aplicacion debera ser ejecutada SIEMPRE,
antes de terminar una llamada que haga uso de las aplicaciones Verbio.
Esta aplicacion es equivalente a ejecutar VerbioUnloadVcb con el
parametro vcb_handle a -1.
365
Pruebas con Verbio



Prueba 1) En la prueba siguiente se utiliza Verbio para saber el número de incidencia
del llamante para que, por ejemplo en un horario no laboral, se compruebe este con
una base de datos con los diferentes códigos de incidencia y se le informe.

Lo primero que se hace es carga el diccionario, en este caso es el archivo david.txt cuyo
contenido es el siguiente:

0 cero
1 uno
2 dos
3 tres
4 cuatro
5 cinco
6 seis
7 siete
8 ocho
9 nueve
SI si
NO no

Despues se indica que al llamante que deletree el número de incidencia que tiene 4
dígitos, se comprueba que se ha dicho algo que este por encima de un umbral
determinado de acierto y se consulta con el llamante lo captado.Si este indica que es
correcto se le dice “Gracias” y lo siguiente sería revisar en la base de datos.

Al tratarse de una versión “no Premium” de Verbio, al finalizar la llamada bien sea
colganda por el Dialplan o por el llamante se debe descargar el diccionario y dejar libre
el canal, para esto se ha dejado la extensión 8091.

El código utilizado es el siguiente:

[verbio]
include => acceso

exten => 8000,1,Answer()
exten => 8000,n,Set(UMBRAL=90)
exten => 8000,n,VerbioLoadVcb(david.txt,connected,,,v)
exten => 8000,n,Goto(8090,1)
exten => 8090,1,VerbioPromptAndRec(Indique el numero de incidencia para consultar su
estado.Recuerde que tiene cuatro digitos.)
exten => 8090,n,NoOp(“PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT0}
${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}. Score: ${VASR_SCORE} Umbral:
${UMBR$}”)
exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] &
$[${VASR_SCORE}>${UMBRAL}]]?si:no)
exten => 8090,n(si),VerbioPromptAndRec(Su numero de incidencia es: ${VASR_RESULT0}
${VASR_RESULT1} ${VASR_RESULT2} ${VASR_RESULT3}\, no?)
exten => 8090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score:
${VASR_SCORE} Umbral: ${UMBRAL}",,,v)
366
exten => 8090,n,GotoIf($[$[${VASR_RESULT} != ERROR] &
$[${VASR_SCORE}>${UMBRAL}]]?si2:no2)
exten => 8090,n(si2),VerbioPrompt(Gracias.)
exten => 8090,n,Hangup
exten => 8090,n,VerbioFreeChannel()

exten => 8090,n(no),VerbioPrompt(Repita por favor.)
exten => 8090,n,Goto(8090,1)
exten => 8090,n(no2),VerbioPrompt(Repita por favor.)
exten => 8090,n,Goto(8090,1)

exten => 8091,1,VerbioFreeChannel()



El resultado que se visualiza en el CLI de Asterisk tras llamar a la extensión 8000 es la
siguiente:

-- Executing [8000@acceso:1] Answer("SIP/2003-0a1926d0", "") in new stack
-- Executing [8000@acceso:2] Set("SIP/2003-0a1926d0", "UMBRAL=90") in new stack
-- Executing [8000@acceso:3] VerbioLoadVcb("SIP/2003-0a1926d0", "david.txt|connected|||v") in
new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3774]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file.
NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3
NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3
NOTICE[3774]: app_verbio_speech.c:4597 verbio_load_vcb: --------------------------
NOTICE[3774]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary:
NOTICE[3774]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path :
/var/lib/asterisk/verbio/gram/david.txt
NOTICE[3774]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu
NOTICE[3774]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es
NOTICE[3774]: app_verbio_speech.c:4607 verbio_load_vcb: Grammar type: CONNECTED
NOTICE[3774]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 3
NOTICE[3774]: app_verbio_speech.c:4616 verbio_load_vcb: --------------------------
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3774]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar
/var/lib/asterisk/verbio/gram/david.txt exists in cache
(/var/lib/asterisk/verbio/gram/.cache/9488d95d905801b3ece8a8a7d4cdc88a).
NOTICE[3774]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 0
-- Executing [8000@acceso:4] Goto("SIP/2003-0a1926d0", "8090|1") in new stack
-- Goto (acceso,8090,1)
-- Executing [8090@acceso:1] VerbioPromptAndRec("SIP/2003-0a1926d0", "Indique el numero de
incidencia para consultar su estado.Recuerde que tiene cuatro digitos.") in new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3774]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file.
NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3
NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3
NOTICE[3774]: app_verbio_speech.c:2800 verbio_prompt_and_rec: --------------------------
NOTICE[3774]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param
summary:
NOTICE[3774]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es
NOTICE[3774]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya
367
NOTICE[3774]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Indique el numero
de incidencia para consultar su estado.Recuerde que tiene cuatro digitos.
NOTICE[3774]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300
NOTICE[3774]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20
NOTICE[3774]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu
NOTICE[3774]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es
NOTICE[3774]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300
NOTICE[3774]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200
NOTICE[3774]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30
NOTICE[3774]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file
:/var/lib/asterisk/verbio/audio/verbio-rec-126259827-1262598275.3.alaw
NOTICE[3774]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 3
NOTICE[3774]: app_verbio_speech.c:2844 verbio_prompt_and_rec: --------------------------
-- Executing [8090@acceso:2] NoOp("SIP/2003-0a1926d0", ""PALABRAS 4. Resultado: 1 1 1 1. Score:
95 Umbral: 90"|||v") in new stack
-- Executing [8090@acceso:3] GotoIf("SIP/2003-0a1926d0", "1?si:no") in new stack
-- Goto (acceso,8090,4)
-- Executing [8090@acceso:4] VerbioPromptAndRec("SIP/2003-0a1926d0", "Su numero de incidencia
es: 1 1 1 1, no?") in new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3774]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file.
NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3
NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3
NOTICE[3774]: app_verbio_speech.c:2800 verbio_prompt_and_rec: --------------------------
NOTICE[3774]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param
summary:
NOTICE[3774]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es
NOTICE[3774]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya
NOTICE[3774]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Su numero de
incidencia es: 1 1 1 1, no?
NOTICE[3774]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300
NOTICE[3774]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20
NOTICE[3774]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu
NOTICE[3774]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es
NOTICE[3774]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300
NOTICE[3774]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200
NOTICE[3774]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30
NOTICE[3774]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file
:/var/lib/asterisk/verbio/audio/verbio-rec-126259828-1262598275.3.alaw
NOTICE[3774]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 3
NOTICE[3774]: app_verbio_speech.c:2844 verbio_prompt_and_rec: --------------------------
-- Executing [8090@acceso:5] NoOp("SIP/2003-0a1926d0", ""PALABRAS 1. Resultado: 6. Score: 99
Umbral: 90"|||v") in new stack
-- Executing [8090@acceso:6] GotoIf("SIP/2003-0a1926d0", "1?si2:no2") in new stack
-- Goto (acceso,8090,7)
-- Executing [8090@acceso:7] VerbioPrompt("SIP/2003-0a1926d0", "Gracias.") in new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3774]: app_verbio_speech.c:1298 verbio_prompt: Verbose enabled in config file.
NOTICE[3774]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598275.3
NOTICE[3774]: app_verbio_speech.c:746 verbio_get_dev: dev: 3
NOTICE[3774]: app_verbio_speech.c:1371 verbio_prompt: --------------------------
NOTICE[3774]: app_verbio_speech.c:1372 verbio_prompt: VerbioPrompt param summary:
NOTICE[3774]: app_verbio_speech.c:1373 verbio_prompt: Prim vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:1374 verbio_prompt: Bckp vox srv : 127.0.0.1
NOTICE[3774]: app_verbio_speech.c:1375 verbio_prompt: TTS language : es
368
NOTICE[3774]: app_verbio_speech.c:1376 verbio_prompt: TTS speaker : amaya
NOTICE[3774]: app_verbio_speech.c:1379 verbio_prompt: Text to synth: Gracias.
NOTICE[3774]: app_verbio_speech.c:1380 verbio_prompt: Init delay : 300
NOTICE[3774]: app_verbio_speech.c:1381 verbio_prompt: End delay : 20
NOTICE[3774]: app_verbio_speech.c:1394 verbio_prompt: Voxlib device: 3
NOTICE[3774]: app_verbio_speech.c:1395 verbio_prompt: --------------------------
-- Executing [8090@acceso:8] Hangup("SIP/2003-0a1926d0", "") in new stack
== Spawn extension (acceso, 8090, 8) exited non-zero on 'SIP/2003-0a1926d0'



Prueba 2) En la prueba siguiente se utiliza Verbio para saber el Dpto con el que desea
hablar el llamante para que, por ejemplo, se le redireccione directamente sin pasar por
Administración.

De nuevo lo primero que se realiza es cargar el diccionario, en este caso el archivo
datos.txt cuyo contenido es:

SOPORTE soporte
ADMINISTRACION administracion
COMERCIAL comercial
TWISTER twister

A continuación se le dan las posibilidades a elegir al llamante y se comprueba que lo
dicho por este, es muy parecido a alguna palabra del diccionario dependiendo del
umbral establecido, si es así, tras cargar otro archivo con las palabras si y no se le
indica el resultado al llamante para que acepte o no si es el Dpto correcto. Despues de
esto se le redireccionaria al Dpto adecuado o se le haría repetir lo dicho.

El código utilizado en el ejemplo es el siguiente:

[verbio]
include => acceso

exten => 7000,1,Answer()
exten => 7000,n,Set(UMBRAL=20)
exten => 7000,n,VerbioLoadVcb(datos.txt,isolated,,,v)
exten => 7000,n,Goto(7090,1)
exten => 7090,1,VerbioPromptAndRec(Bienvenido a Yet Informatica \, de los siguientes
departamentos indiquenos con cual desea hablar\, Soporte\, Administracio$
exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score:
${VASR_SCORE} Umbral: ${UMBRAL}",,,v)
exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] &
$[${VASR_SCORE}>${UMBRAL}]]?si:no)
exten => 7090,n,VerbioFreeChannel()
exten => 7090,n(si),VerbioLoadVcb(sino.txt,isolated,,,v)
exten => 7090,n,Set(DPTO= ${VASR_RESULT})
exten => 7090,n,VerbioPromptAndRec(El departamento elegido es: ${VASR_RESULT} \, no?)
exten => 7090,n,NoOp("PALABRAS ${VASR_WORDS}. Resultado: ${VASR_RESULT}. Score:
${VASR_SCORE} Umbral: ${UMBRAL}",,,v)
exten => 7090,n,GotoIf($[$[${VASR_RESULT} != ERROR] &
$[${VASR_SCORE}>${UMBRAL}]]?si2:no2)
exten => 7090,n(si2),NoOp(" Vamos a llamar: ${DPTO}")
exten => 7090,n,GotoIf($[${DPTO} = SOPORTE ]?soporte:otro)
369
exten => 7090,n(soporte),Dial(SIP/2000,30,Ttm)
exten => 7090,n,Hangup
exten => 7090,n,VerbioFreeChannel()
exten => 7090,n(otro),GotoIf($[${DPTO} = TWISTER ]?twister:otro1)
exten => 7090,n(twister),Dial(SIP/2003,30,Ttm)
exten => 7090,n,Hangup
exten => 7090,n,VerbioFreeChannel()
exten => 7090,n(otro1),GotoIf($[${DPTO} = COMERCIAL ]?comercial:otro2)
exten => 7090,n(comercial),Dial(SIP/4000,30,Ttm)
exten => 7090,n,Hangup
exten => 7090,n,VerbioFreeChannel()
exten => 7090,n(otro2),Dial(SIP/5000,30,Ttm)
exten => 7090,n,Hangup
exten => 7090,n,VerbioFreeChannel()

exten => 7090,n(no),VerbioPrompt(Repita por favor.)
exten => 7090,n,Goto(7090,1)

exten => 7090,n(no2),VerbioPrompt(Repita por favor.)
exten => 7090,n,Goto(7090,si)

El resultado visualizado en el CLI al llamar a la extensión 7000 es:

-- Executing [7000@acceso:1] Answer("SIP/2003-0a197d18", "") in new stack
-- Executing [7000@acceso:2] Set("SIP/2003-0a197d18", "UMBRAL=20") in new stack
-- Executing [7000@acceso:3] VerbioLoadVcb("SIP/2003-0a197d18", "datos.txt|isolated|||v") in new
stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file.
NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5
NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5
NOTICE[3797]: app_verbio_speech.c:4597 verbio_load_vcb: --------------------------
NOTICE[3797]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary:
NOTICE[3797]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path :
/var/lib/asterisk/verbio/gram/datos.txt
NOTICE[3797]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu
NOTICE[3797]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es
NOTICE[3797]: app_verbio_speech.c:4605 verbio_load_vcb: Grammar type: ISOLATED
NOTICE[3797]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 5
NOTICE[3797]: app_verbio_speech.c:4616 verbio_load_vcb: --------------------------
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar
/var/lib/asterisk/verbio/gram/datos.txt exists in cache
(/var/lib/asterisk/verbio/gram/.cache/893dfb11158fc1ad4aa7d5e09fc1605f).
NOTICE[3797]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 0
-- Executing [7000@acceso:4] Goto("SIP/2003-0a197d18", "7090|1") in new stack
-- Goto (acceso,7090,1)
-- Executing [7090@acceso:1] VerbioPromptAndRec("SIP/2003-0a197d18", "Bienvenido a Yet
Informatica , de los siguientes departamentos indiquenos con cual desea hablar, Soporte,
Administracion, Twister, Comercial.") in new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file.
NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5
NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5
NOTICE[3797]: app_verbio_speech.c:2800 verbio_prompt_and_rec: --------------------------
370
NOTICE[3797]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param
summary:
NOTICE[3797]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es
NOTICE[3797]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya
NOTICE[3797]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: Bienvenido a Yet
Informatica , de los siguientes departamentos indiquenos con cual desea hablar, Soporte,
Administracion, Twister, Comercial.
NOTICE[3797]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300
NOTICE[3797]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20
NOTICE[3797]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu
NOTICE[3797]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es
NOTICE[3797]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300
NOTICE[3797]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200
NOTICE[3797]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30
NOTICE[3797]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file
:/var/lib/asterisk/verbio/audio/verbio-rec-126259839-1262598382.5.alaw
NOTICE[3797]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 5
NOTICE[3797]: app_verbio_speech.c:2844 verbio_prompt_and_rec: --------------------------
-- Executing [7090@acceso:2] NoOp("SIP/2003-0a197d18", ""PALABRAS 1. Resultado: SOPORTE.
Score: 58 Umbral: 20"|||v") in new stack
-- Executing [7090@acceso:3] GotoIf("SIP/2003-0a197d18", "1?si:no") in new stack
-- Goto (acceso,7090,5)
-- Executing [7090@acceso:5] VerbioLoadVcb("SIP/2003-0a197d18", "sino.txt|isolated|||v") in new
stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:4549 verbio_load_vcb: Verbose enabled in config file.
NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5
NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5
NOTICE[3797]: app_verbio_speech.c:4597 verbio_load_vcb: --------------------------
NOTICE[3797]: app_verbio_speech.c:4598 verbio_load_vcb: VerbioLoadVcb param summary:
NOTICE[3797]: app_verbio_speech.c:4599 verbio_load_vcb: Prim vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:4600 verbio_load_vcb: Bckp vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:4601 verbio_load_vcb: Gram path :
/var/lib/asterisk/verbio/gram/sino.txt
NOTICE[3797]: app_verbio_speech.c:4602 verbio_load_vcb: ASR config : es_eu
NOTICE[3797]: app_verbio_speech.c:4603 verbio_load_vcb: ASR lang : es
NOTICE[3797]: app_verbio_speech.c:4605 verbio_load_vcb: Grammar type: ISOLATED
NOTICE[3797]: app_verbio_speech.c:4615 verbio_load_vcb: Voxlib device: 5
NOTICE[3797]: app_verbio_speech.c:4616 verbio_load_vcb: --------------------------
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:501 verbio_md5_grammar_exists: Grammar
/var/lib/asterisk/verbio/gram/sino.txt exists in cache
(/var/lib/asterisk/verbio/gram/.cache/6343121acb03e3e93cf7cbf7ff3b38ba).
NOTICE[3797]: app_verbio_speech.c:4747 verbio_load_vcb: vc_handle 1
-- Executing [7090@acceso:6] Set("SIP/2003-0a197d18", "DPTO= SOPORTE") in new stack
-- Executing [7090@acceso:7] VerbioPromptAndRec("SIP/2003-0a197d18", "El departamento elegido
es: SOPORTE , no?") in new stack
== Parsing '/etc/asterisk/verbio.conf': Found
NOTICE[3797]: app_verbio_speech.c:2585 verbio_prompt_and_rec: Verbose enabled in config file.
NOTICE[3797]: app_verbio_speech.c:735 verbio_get_dev: chan->uniqueid: 1262598382.5
NOTICE[3797]: app_verbio_speech.c:746 verbio_get_dev: dev: 5
NOTICE[3797]: app_verbio_speech.c:2800 verbio_prompt_and_rec: --------------------------
NOTICE[3797]: app_verbio_speech.c:2801 verbio_prompt_and_rec: VerbioPromptAndRec param
summary:
NOTICE[3797]: app_verbio_speech.c:2802 verbio_prompt_and_rec: Prim vox srv : 127.0.0.1
371
NOTICE[3797]: app_verbio_speech.c:2803 verbio_prompt_and_rec: Bckp vox srv : 127.0.0.1
NOTICE[3797]: app_verbio_speech.c:2804 verbio_prompt_and_rec: TTS language : es
NOTICE[3797]: app_verbio_speech.c:2805 verbio_prompt_and_rec: TTS speaker : amaya
NOTICE[3797]: app_verbio_speech.c:2808 verbio_prompt_and_rec: Text to synth: El departamento
elegido es: SOPORTE , no?
NOTICE[3797]: app_verbio_speech.c:2809 verbio_prompt_and_rec: Init delay : 300
NOTICE[3797]: app_verbio_speech.c:2810 verbio_prompt_and_rec: End delay : 20
NOTICE[3797]: app_verbio_speech.c:2813 verbio_prompt_and_rec: ASR config : es_eu
NOTICE[3797]: app_verbio_speech.c:2814 verbio_prompt_and_rec: ASR lang : es
NOTICE[3797]: app_verbio_speech.c:2815 verbio_prompt_and_rec: Init sil : 300
NOTICE[3797]: app_verbio_speech.c:2816 verbio_prompt_and_rec: Max sil : 200
NOTICE[3797]: app_verbio_speech.c:2817 verbio_prompt_and_rec: Abs timeout : 30
NOTICE[3797]: app_verbio_speech.c:2842 verbio_prompt_and_rec: Rec ASR file
:/var/lib/asterisk/verbio/audio/verbio-rec-126259841-1262598382.5.alaw
NOTICE[3797]: app_verbio_speech.c:2843 verbio_prompt_and_rec: Voxlib device: 5
NOTICE[3797]: app_verbio_speech.c:2844 verbio_prompt_and_rec: --------------------------
-- Executing [7090@acceso:8] NoOp("SIP/2003-0a197d18", ""PALABRAS 1. Resultado: SI. Score: 93
Umbral: 20"|||v") in new stack
-- Executing [7090@acceso:9] GotoIf("SIP/2003-0a197d18", "1?si2:no2") in new stack
-- Goto (acceso,7090,10)
-- Executing [7090@acceso:10] NoOp("SIP/2003-0a197d18", "" Vamos a llamar: SOPORTE"") in new
stack
-- Executing [7090@acceso:11] GotoIf("SIP/2003-0a197d18", "1?soporte:otro") in new stack
-- Goto (acceso,7090,12)
-- Executing [7090@acceso:12] Dial("SIP/2003-0a197d18", "SIP/2000|30|Ttm") in new stack
-- Called 2000
-- Started music on hold, class 'default', on SIP/2003-0a197d18
-- SIP/2000-0a1926d0 is circuit-busy
== Everyone is busy/congested at this time (1:0/1/0)
-- Stopped music on hold on SIP/2003-0a197d18
-- Executing [7090@acceso:13] Hangup("SIP/2003-0a197d18", "") in new stack
== Spawn extension (acceso, 7090, 13) exited non-zero on 'SIP/2003-0a197d18'
372
Skype


¿Qué es Skype?

Es el más conocido de los SoftPhones y quizás un responsable importante de la
popularización de la VozIP. Creado por los fundadores de Kazaa: Zennström y Friis.

Según su página web www.skype.com ha sido descargado 236.259.232 veces.

Skype fue comprado por la firma de subastas por Internet EBay por 2.100 millones de
dolares.

Las comunicaciones de Voz viajan cifradas por la red y utiliza un protocolo propietario.

Ventajas

Disponible para muchas plataformas: Windows, Mac OSX, GNU Linux.
Codificación de audio con mucha calidad y gran compresión: 3-16 kbytes/seg.
Conferencias de llamadas. Envío de Video (V2.x).
Firewall / Nat discover: En casi todas las situaciones funciona sin necesidad de
configurar PNAT.

Problemas: Protocolo cerrado

¿Qué están haciendo con mis paquetes de voz?

Los creadores de la Red Kazaa están bajo sospecha de distribuir spyware de
forma intencionada.


¿Qué están haciendo con mi ancho de banda?
Utilizarlo para otros clientes de Skype.
No es posible programar nuevos clientes a medida.


Interconexión con otras redes: el salto a la red telefónica pública solo puede
realizarse con el sistema SkypeOut, lo cual no favorece la competencia.


Integración profesional: No existen centralitas (exceptuando Asterisk) que
soporten el protocolo de Skype, tampoco teléfonos puros (USB sí).
373

Alternativas a Skype



Gizmo Project (http://www.gizmoproject.com/):

– Multiplataforma.
– Interconexión con Asterisk.
– Protocolo SIP.



Open Wengo (http://www.openwengo.org/):

– #include gizmo.h
– Posibilidad de usarlo solo como softphone.

Servidor Asterisk:

– Extensiones SIP o IAX2.
– Varios proveedores IP.
– Conexión con la PSTN.

Skype para Asterisk (SfA)

Digium en Septiembre de 2009 sacó
un modulo de Skype para Asterisk,
y es que este “controvertido”
módulo dio y está dando bastante
de qué hablar, tanto a favor como
en contra entre los seguidores y
usuarios de Asterisk.

Como tanto los drivers como la estructura de Asterisk son libres (cualquiera puede ver
cómo es por dentro el comportamiento de los módulos que dan soporte al hardware
para hacerlo compatible con Asterisk), muchas otras empresas cuando surgió crearon
otras tarjetas para aprovechar el tirón de esta aplicación, por lo que Digium continúa
pensando nuevas formas de conseguir beneficios. Una de estas formas es
compatibilizando una aplicación conocida y muy utilizada como es Skype, con Asterisk.

No obstante, lo que Skype (como protocolo cerrado y como empresa monopolizadora
del concepto ‘VoIP‘) representa, provoca que muchas personas de la comunidad
Asterisk no vean este producto con buenos ojos. Quizá lo que menos ha gustado ha
sido que Digium empleara recursos en crear un canal para Skype en lugar de mejorar el
canal SIP. Quizá desde el punto de vista de la comunidad sea esta acción algo
reprochable, aunque desde el punto de vista empresarial (y al contrario de lo que
pensaba en un principio), ha sido todo un éxito.
374
Skype es un buen SoftPhone, utiliza un protocolo propio, pero no hay duda que su
sencillez de configuración y la forma de “saltarse” los problemas de NAT lo hacen un
candidato excelente para aquellas extensiones tanto locales como externas a la vez
que aporta características de mensajería instantánea (chat, compartición de archivos,
etc.) algo que también existe en otros SoftPhones compatibles con SIP, pero que al
requerir introducir determinados valores (códecs a utilizar, servidor SIP, dominio, tipo
de NAT, etc.) lo hace una aplicación “difícil” y “anti-intuitiva” para muchas personas.

En todo buen proyecto existen dos formas de ver el desarrollo y la evolución de este:

- Cómo proyecto de software libre: donde todo lo que se desarrolle debe ser
libre y gratis (algo únicamente libre no causa buena impresión).

- Cómo proyecto empresarial: donde la obtención de un beneficio económico es
el principal objetivo.

Ambas visiones son irreconciliables: o se desarrolla algo pensando en la comunidad
(donde otras empresas sacarán tajada tanto como puedan mientras tú te centras en
desarrollar el producto que luego ofrecerás) o creas un producto cerrado (donde tú
seas el único que saques provecho del tiempo invertido).

Son muchas las voces que defienden un modelo de desarrollo basado en software libre
basado en la venta de servicios (soporte, documentación, formación, etc.) pero
muchas de estas voces son las que defienden el “soporte gratuito” mediante foros y
listas, “aprender por cuenta propia” con lo que se encuentra por Internet, y ahorrar
hasta el último céntimo si otro servicio similar puede salir más barato que un servicio
confiable. Es decir… lo gratuito, o si no lo hay, lo más económico. Por desgracia, el
concepto de “Software libre” sigue siendo el de “Software gratis” y con esta
mentalidad, se termina dando la razón a las empresas de software comercial.

Skype para Asterisk (SFA) es el primer y único controlador de canal nativo que conecta
Asterisk a la red de Skype. El controlador de canal soporta un número ilimitado de
usuarios simultáneos y un número ilimitado de llamadas simultáneas por usuario.

SFA es un producto que ofrecerá una solución a muchas empresas que utilizan Skype y
a las que no les interesa cambiar de SoftPhone porque su personal ya conoce esta
aplicación y lo usan en su casa “como Windows“. Uno puede estar más o menos de
acuerdo con que Digium se haya metido a desarrollar esta solución en lugar de mejorar
los protocolos IAX2 y SIP, pero mejorar esto no da de comer y crear un canal para
Skype, sí.
El canal Skype cuesta 66$ e incluye las licencias G.729 para poder utilizarlo.
Ventajas:

- Llamadas salientes: llama más, por más tiempo y paga menos.

Llama a usuarios de Skype directamente desde una centralita Asterisk.
375
Reduce los gastos en comunicaciones a teléfonos fijos y móviles de todo
el mundo gracias a las tarifas económicas para llamadas de Skype.
Skype para Asterisk complementa tu sistema de comunicación actual.
Añade Skype a tus tablas de enrutamiento de llamadas para optimizar
los gastos de llamadas internacionales.

- Llamadas entrantes: integra tu empresa a la comunidad de Skype.

Clientes

Con botones para hacer clic y llamar, los clientes pueden comunicarse
contigo directamente desde tu sitio o correo electrónico.
Los clientes pueden llamar gratis a tu empresa desde Skype.
Función de volver a llamar al cliente a través de Skype.
Permite que los clientes te llamen a través de un número de Internet
local.
Tu empresa estará presente en una comunidad de más de 440 millones
de usuarios registrados de Skype.

Empleados que trabajan a distancia y personas que lo hacen desde el hogar

Llamadas gratis de Skype a la oficina mientras viajas.
Para quienes trabajan desde el hogar, la actividad empresarial no
cambia, ya que la oficina está a un solo clic.
El estado de conexión de Skype permite trabajar de manera más
inteligente, traspasa zonas horarias y posibilita el trabajo a distancia.

Proveedores y socios

Se visible y accesible internacionalmente para la comunidad de Skype y
para socios potenciales.
Mejora tus relaciones comerciales a larga distancia con llamadas
entrantes gratis.

No se necesita PC

Aprovecha las llamadas a tarifas formidables sin necesidad de usar un
equipo de PC.

Facil integración

Implementa Skype para Asterisk fácilmente dentro de tu infraestructura
actual.
376
Inconvenientes

- Las versiones de Asterisk 1.4 anteriores a 1.4.25 tienen un error que hace que
Skype no funcione correctamente. No utilice dichas versiones con SFA.

La versión de nuestro servidor es 1.4.26.2 lo que nos permite usarlo sin
problemas, no obstante las versiones más estables de la rama 1.4 están por
debajo de la 1.4.25.

- Sólo los usuarios de Skype que se crean en Skype Business Control Panel
(http://skype.com/business/) se pueden utilizar con Skype para Asterisk. La
cuenta utilizada para administrar el BCP y los miembros que se han añadido a
través de invitaciones a los nombres de Skype o dirección de correo electrónico
no se podrán utilizar con Skype para Asterisk por el momento.

Lo que puedes hacer con Skype para Asterisk

Cuando complementas tu centralita Asterisk con Skype puedes hacer lo siguiente:

Hacer llamadas entre usuarios de Skype a teléfonos fijos y móviles.
Recibir llamadas de Skype.
Habilitar llamadas múltiples y simultáneas de Skype desde la misma cuenta de
Skype.
Transferir llamadas de Skype.
Usar asistencia para DTMF (multifrecuencia bitonal) para llamadas salientes y
entrantes.
Leer los campos del perfil de usuario de Skype de llamadas entrantes.
Recuperar el saldo del crédito de Skype de cuentas que iniciaron sesión en
Asterisk.
Establecer y recuperar el estado de conexión.
Establecer la configuración de privacidad.
Usar los códecs G.711 y G.729.

Instalación

1. Adquirir la licencia del canal Skype.
2. Descarga de paquetes necesarios:

http://downloads.digium.com/pub/telephony/skypeforasterisk/asterisk-1.4/x86-
32/skypeforasterisk-1.4_1.0.6-x86_32.tar.gz

http://downloads.digium.com/pub/register/x86-32/register

3. Instalar el chan_skype en Asterisk para ello descomprimiremos el paquete
tar.gz:

tar xvzf skypeforasterisk-1.4_1.0.6-x86_32.tar.gz
cd skypeforasterisk-1.4_1.0.6-x86_3
make && make install && make samples
377
4. Dar permisos de ejecución a la aplicación register y ejecutarla:

chmod a+x register
./register


[root@localhost skypeasterisk]# ./register

Digium Product Registration - Version 3.0.4
Copyright (C) 2004-2007, Digium, Inc.
Use the '-l' option to see license information for software
included in this program.

Please select a category

1 - Digium Products
2 - Cepstral Products
0 - Quit

Your Choice: 1
You selected 1, Digium Products
Please select a product

1 - Asterisk Business Edition
2 - Asterisk Business Edition C Expansion
3 - Asterisk For Smart Cube
4 - Asterisk For Smart Cube Expansion
5 - G.729 Codec
6 - High Performance Echo Can
7 - Skype For Asterisk
8 - Fax for Asterisk
9 - Free Fax for Asterisk
10 - Vestec Speech Engine
0 - Quit

Your Choice: 7
You selected 7, Skype For Asterisk
Please enter your Key-ID: S4A-YE76MXLEJW7W
Product available to be registered.

Do you want to register this key now(y/n) y

5. Con esto ya tendremos instalado Skype para Asterisk en Asterisk 1.4.26.2 y
sólo nos faltará cargar los dos módulos:

- res_skypeforasterisk.so

Este módulo contiene el motor de Skype, junto con varias librerias
y otros componentes necesarios para hablar con el motor de Skype y
administrar cuentas de usuario, las llamadas, etc.

- chan_skype.so
378
Este módulo es el controlador del canal Asterisk que ofrece los servicios de
llamadas desde y hacia la red de Skype, utilizando laqs librerías
proporcionadas por res_skypeforasterisk.so.

Si su archivo modules.conf Asterisk contiene 'autoload=yes', estos módulos
serán cargados automáticamente la próxima vez que se reinicie Asterisk. Si no,
tendrá que añadir las siguientes líneas a modules.conf:

load = res_skypeforasterisk.so
load = chan_skype.so

Cargamos los módulos:

*CLI> module load res_skypeforasterisk.so

Loading Skype For Asterisk engine
NOTICE[4957]: res_skypeforasterisk.c:17 load_module: Skype For Asterisk module,
Copyright (C) 2008-2009 Digium, Inc.
NOTICE[4957]: res_skypeforasterisk.c:18 load_module: This module is supplied under a
commercial license granted by Digium, Inc.
NOTICE[4957]: res_skypeforasterisk.c:19 load_module: Please see the full license text
supplied by the accompanying
NOTICE[4957]: res_skypeforasterisk.c:20 load_module: "register" utility, or ask for a
copy from Digium.
NOTICE[4957]: res_skypeforasterisk.c:23 load_module: This product includes software
developed by the OpenSSL Project
NOTICE[4957]: res_skypeforasterisk.c:24 load_module: for use in the OpenSSL Toolkit.
(http://www.openssl.org/)
NOTICE[4957]: res_skypeforasterisk.c:25 load_module: Copyright (C) 1998-2008 The
OpenSSL Project
Loaded res_skypeforasterisk.so => (Skype For Asterisk Engine)

*CLI> module load chan_skype.so

== Parsing '/etc/asterisk/chan_skype.conf': Found
DEBUG[4957]: core.cpp:1285 sfa_startup: License directory set to:
/var/lib/asterisk/licenses
NOTICE[4957]: core.cpp:1122 skype_cp_handler: Found license 'S4A-YE76MXLEJW7W'
providing 1 concurrent calls
NOTICE[4957]: core.cpp:963 display_host: Skype For Asterisk Host-ID:
6c:cf:7a:1b:1a:f0:29:43:11:2d:06:8c:d9:65:76:4b:81:50:f3:ed
NOTICE[4957]: core.cpp:1299 sfa_startup: Found a total of 1 Skype For Asterisk licenses
DEBUG[4989]: core.cpp:1403 sfa_startup: starting skyhost as: skypeforasterisk -z -f
/var/spool/asterisk/skype/data
DEBUG[4989]: core.cpp:1405 sfa_startup: [Jan 11 13:37:51] DEBUG[4988]:
core.cpp:1491 sfa_startup: skyhost environment is : HOME=/var/spool/asterisk/skype
starting skypewatcher as: skypewatcher 4989
DEBUG[4987]: core.cpp:440 skyhost_watcher: got SkyHost Copyright (C) 2003-2008
Skype Technologies S.A.
DEBUG[4987]: core.cpp:440 skyhost_watcher: got Proprietary and confidential, do not
share this application.
DEBUG[4987]: core.cpp:440 skyhost_watcher: got Ready to accept connections
DEBUG[4987]: core.cpp:445 skyhost_watcher: skyhost is ready!
== Registered channel type 'Skype' (Skype For Asterisk Channel Driver)
== Manager registered action SkypeBuddies
379
== Manager registered action SkypeBuddy
== Manager registered action SkypeAccountProperty
== Manager registered action SkypeAddBuddy
== Manager registered action SkypeRemoveBuddy
== Manager registered action SkypeLicenseStatus
== Manager registered action SkypeLicenseList
== Registered custom function SKYPE_CALL_PROPERTY
== Registered custom function SKYPE_ACCOUNT_PROPERTY
== Registered custom function SKYPE_BUDDIES
== Registered custom function SKYPE_BUDDY_FETCH
Loaded chan_skype.so => (Skype For Asterisk Channel Driver)

6. Configurar la cuenta de Skype.


Skype necesita que los usuarios que vayan a hacer uso de Skype para Asterisk ,
esten dados de alta en una cuenta Skype Business.


Por lo que tendréis que hacer login en https://secure.skype.com/business/
info/login con vuestra cuenta actual de Skype o bien si queréis dar de alta otra
podéis darla en ese mismo momento usando el cliente de Skype.


A continuación pulsamos el botón de agregar persona:
380
Creamos una cuenta comercial:


































7. Probamos la correcta instalación del chan_skype:
Comprobamos la versión de SFA:
*CLI> skype show version
Skype For Asterisk Components:
Channel Driver: 1.4_1.0.6
Library: 1.4_1.0.6

Comprobamos la configuración general:

*CLI> skype show settings
Skype For Asterisk Settings:
engine_directory: /tmp
data_directory: /var/spool/asterisk/skype
defaultuser:
bind_address: 0.0.0.0
bind_port: 0
rtp_address: 127.0.0.1
https_proxy:
https_proxy_user:
https_proxy_password:
socks5_proxy:
socks5_proxy_user:
socks5_proxy_password:
disable_tcpauto: no
disable_udp: no
381
debug: no

Comprobamos si hemos activado la licencia correctamente:

*CLI> skype show licenses
Skype For Asterisk Licensing Information
========================================
Total licensed channels: 1

Licenses Found:
File: S4A-YE76MXLEJW7W.lic -- Key: S4A-YE76MXLEJW7W -- Expires: 2030-01-11 -
- Host-ID: 6c:cf:7a:1b:1a:f0:29:43:11:2d:06:8c:d9:65:76:4b:81:50:f3:ed --
Channels: 1 (OK)

8. Configuramos el fichero chan_skype.conf situado en /etc/asterisk/:

[general]
engine_directory=/usr/src/skypeengine
default_user=davidea11
debug=yes
bind_address=0.0.0.0
bind_port=0

[davidea11]
secret=pkxarc11
context=incoming
exten=7000
disallow=all
allow=ulaw
direction=both
auth_policy=accept

Comprobamos tras reiniciar Asterisk que se han configurado bien los
usuarios:

*CLI> skype show users
Skype Users
davidea11: Logged In

Para acceder a Asterisk desde cualquier cuenta Skype comunicaremos la
cuenta de Skype con la que se ha creado en Skype Business de forma que las
llamadas serán gratuitas. Para hacer las pruebas con SFA creamos una cuenta
de Skype: davidin99.

Configuramos el Dialplan de Asterisk (extensions.conf) para recibir las
llamadas en el teléfono de extensión 3000 y hacer llamadas a la cuenta de
Skype creada:

[skype]
include => acceso

exten => 7000,1,Goto(acceso,3000,1)
exten => 8000,1,Dial(Skype/davidin99,30,tT)
382
Hacemos una llamada desde la extensión 5000 a la cuenta de Skype
davidin99:

El log del CLI muestra lo siguiente:



-- Executing [8000@acceso:1] Dial("SIP/5000-09936608", "Skype/davidin99|30|tT") in new
stack
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
NOTICE[29792]: core.cpp:2096 sfa_call_ring: calling create_control_socket for oid 32
DEBUG[29792]: core.cpp:265 create_control_socket: creating socket sfa-control-0x96a0f78-
00000020
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
-- Called davidin99
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 3.
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
-- Skype/davidea11-098e0218 is ringing
DEBUG[29792]: core.cpp:1642 sfa_call_process: accepting socket connection from voice
engine
DEBUG[29792]: core.cpp:1615 process_ve_frame: received audio socket address
127.0.0.1:38065
DEBUG[29792]: core.cpp:1752 sfa_call_set_audio_socket_address: sending audio socket
address 127.0.0.1:14568
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 4.
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
-- Skype/davidea11-098e0218 answered SIP/5000-09936608
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[29792]: chan_skype.c:3433 unlink_client_call: channel 0x98e0218
NOTICE[29792]: core.cpp:2126 sfa_call_hangup: ending call
DEBUG[29792]: chan_skype.c:3447 destroy_client_call: channel 0x98e0218
== Spawn extension (acceso, 8000, 1) exited non-zero on 'SIP/5000-09936608'
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: ACallMember.cpp:209 OnDelete: call member deleted
DEBUG[26468]: ACall.cpp:71 OnDelete: call deleted
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
383
En la cuenta de Skype se ve asi:































Llamamos desde la cuenta de Skype davidin99 a la cuenta creada en Skype Business
davidea11 registrada en SFA:

El log del CLI de Asterisk muestra:

-- Executing [7000@incoming:1] Goto("Skype/davidea11-b7d7e3c8", "acceso|3000|1") in
new stack
-- Goto (acceso,3000,1)
-- Executing [3000@acceso:1] Macro("Skype/davidea11-b7d7e3c8", "acceso|3000") in
new stack
-- Executing [s@macro-acceso:1] Dial("Skype/davidea11-b7d7e3c8", "SIP/3000|30|Ttm")
in new stack
-- Called 3000
-- Started music on hold, class 'default', on Skype/davidea11-b7d7e3c8
-- SIP/3000-098ee660 is ringing
-- SIP/3000-098ee660 answered Skype/davidea11-b7d7e3c8
-- Stopped music on hold on Skype/davidea11-b7d7e3c8
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[28850]: core.cpp:1642 sfa_call_process: accepting socket connection from voice
engine
DEBUG[28850]: core.cpp:1615 process_ve_frame: received audio socket address
127.0.0.1:57238
DEBUG[28850]: core.cpp:1752 sfa_call_set_audio_socket_address: sending audio socket
address 127.0.0.1:14690
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
384
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:790 queue_event: got control event type 4 with subclass 4.
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'Skype/davidea11-b7d7e3c8' in
macro 'acceso'
== Spawn extension (acceso, 3000, 1) exited non-zero on 'Skype/davidea11-b7d7e3c8'
DEBUG[28850]: chan_skype.c:3433 unlink_client_call: channel 0xb7d7e3c8
NOTICE[28850]: core.cpp:2126 sfa_call_hangup: ending call
DEBUG[28850]: chan_skype.c:3447 destroy_client_call: channel 0xb7d7e3c8
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
DEBUG[26468]: chan_skype.c:3350 do_monitor: poll returned 1
DEBUG[26468]: chan_skype.c:3340 do_monitor: entering poll for 2 fds
385
Nagios

¿Qué es Nagios?

Nagios es un software de monitorización de redes. Con Nagios podremos saber en
cada momento, que máquinas y dispositivos de la red están encendidas, cuales están
apagadas, cuales están fallando, cuales funcionan correctamente, que servicios van
bien y cuáles van mal, en definitiva, sirve para mirar el estado casi en tiempo real de
una red, sea grande o pequeña.

Originalmente se llamaba Netsaint, fue creado y es mantenido actualmente por Ethan
Galstad, junto con un grupo de desarrolladores de Software que mantienen también
varios plugins.

Nagios fue diseñado para ser ejecutado en Linux, pero también se ejecuta bien en
variantes de Unix.

Nagios está licenciada bajo la GNU (General Public License Version 2 ) publicada por la
Free Software Fundation.

¿Qué podemos realizar con Nagios?

- Monitoreo de servicios de red (SMTP, POP3, HTTP, NTTP, ICMP, SNMP).
- Monitoreo de los recursos de un host (carga del procesador, uso de los
discos, logs del sistema) en varios sistemas operativos, incluso Microsoft
Windows con el plugin NRPE_NT.
- Monitoreo remoto, a través de túneles SSL cifrados o SSH.
- Diseño simple de plugins, que permiten a los usuarios desarrollar sus
propios chequeos de servicios dependiendo de sus necesidades, usando sus
herramientas preferidas (Bash, C++, Perl, Ruby, Python, PHP, C#, etc.).
- Chequeo de servicios paralizados.
- Posibilidad de definir la jerarquía de la red, permitiendo distinguir entre
host caídos y host inaccesibles.
- Notificaciones a los contactos cuando ocurren problemas en servicios o
hosts, así como cuando son resueltos (via email, pager, SMS, o cualquier
método definido por el usuario junto con su correspondiente plugin).
- Posibilidad de definir manejadores de eventos que ejecuten al ocurrir un
evento de un servicio o host para resoluciones de problemas proactivas.
- Rotación automática del archive de log.
- Soporte para implementar host de monitores redundantes.
- Interfaz web opcional, para observar el estado de la red actual,
notificaciones, historial de problemas, archivos de logs, etc.
386
Descarga de Nagios

http://sourceforge.net/projects/nagios/files/nagios-3.x/nagios-3.2.0/nagios-
3.2.0.tar.gz/download

http://sourceforge.net/projects/nagiosplug/files/nagiosplug/1.4.14/nagios-plugins-
1.4.14.tar.gz/download

http://sourceforge.net/projects/nagios/files/nrpe-2.x/nrpe-2.12/nrpe-2.12.tar.gz/download

http://sourceforge.net/projects/nagios/files/nsca-2.x/nsca-2.7.2/nsca-2.7.2.tar.gz/download

http://sourceforge.net/projects/nagios/files/ndoutils-1.x/ndoutils-1.4b9/ndoutils-
1.4b9.tar.gz/download

Instalación de Nagios

Descomprimimos el tar:

tar xvf nagios.3.2.0.tar.gz

Creamos los usuarios y grupos para Nagios:

useradd nagios
groupadd nagios
groupadd nagcmd

Nos ubicamos dentro de la carpeta Nagios, y procedemos a compilarlo:

./configure --with-command-group=nagcmd
make all
make install
make-webconf
make install-init (no necesario)
make install-config (no necesario)
make install-commandmode (no necesario)

Ahora vamos a compilar los plugins para Nagios (descomprirlo dentro de la carpeta
donde se encuentra Nagios):

./configure --with-nagios-user=nagios --with-nagios-group=nagios
make
make install

Ahora agregaremos el usuario nagios para la autenticación vía web:

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Reiniciamos servicios e iniciamos otros:

service httpd restart
service nagios start
387
Accedemos a Nagios:

http://localhost/nagios

Configuración de Nagios

Configurando nagios.cfg

Por defecto no hace falta tocar este fichero, tal y como viene de "serie" funciona
perfectamente. Posteriormente, deberás cambiar cosas si quieres aprovechar al
máximo el poder de Nagios.

Deberemos asegurarnos de tener bien configurados las líneas referentes a los ficheros
principales de configuración:

# LOG FILE
log_file=/usr/local/nagios/var/nagios.log

# OBJECT CONFIGURATION FILE(S)
cfg_file=/usr/local/nagios/etc/objects/commands.cfg
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg

.....

Configurando cgi.cfg

Configuramos las siguientes líneas para que "nagiosadmin" tenga acceso total a
Nagios. No queremos que nadie más tenga acceso a él.

# MAIN CONFIGURATION FILE
main_config_file=/usr/local/nagios/etc/nagios.cfg

# PHYSICAL HTML PATH
physical_html_path=/usr/local/nagios/share

# URL HTML PATH
url_html_path=/nagios

# SYSTEM/PROCESS INFORMATION ACCESS
authorized_for_system_information=nagiosadmin

# CONFIGURATION INFORMATION ACCESS
authorized_for_configuration_information=nagiosadmin

# SYSTEM/PROCESS COMMAND ACCESS
authorized_for_system_commands=nagiosadmin

# GLOBAL HOST/SERVICE VIEW ACCESS
authorized_for_all_services=nagiosadmin
authorized_for_all_hosts=nagiosadmin
388
# GLOBAL HOST/SERVICE COMMAND ACCESS
authorized_for_all_service_commands=nagiosadmin
authorized_for_all_host_commands=nagiosadmin

......

Configurando localhost.cfg

En el fichero hosts.cfg deberemos incluir todas las máquinas que queremos
monitorizar. Cada máquina debe tener al menos un servicio.Puede funcionar también
sin configurarle ningún servicio, pero no obtendríamos un resultado "profesional", lo
único que haríamos sería añadir la maquina o dispositivo al MAPA de RED.

define host{
use linux-server ; Name of host template to use
; This host definition will inherit all variables that are defined
; in (or inherited by) the linux-server host template definition.
host_name localhost
alias localhost
address 127.0.0.1
}

Cada host, debe pertenecer a un hostgroups.

define hostgroup{
hostgroup_name linux-servers ; The name of the hostgroup
alias Linux Servers ; Long name of the group
members localhost ; Comma separated list of hosts that belong to this group
}
Más adelante veremos como se configuran los servicios de monitorización de Asterisk.
Configurando contacts.cfg

Los contactos, son las personas a las que se les notificará de las posibles incidencias de
las máquinas de la Red. En nuestro caso, como solo somos un único administrador,
nagios y se le notificará mediante un e-mail.

define contact{
contact_name nagiosadmin
use generic-contact
alias David
email [email protected]
}

Cada contacto, debe pertenecer a un grupo de contacto.

define contactgroup{
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin
}
389
Configurando commands.cfg

Este es posiblemente el fichero de configuración más importante, ya que en él, vamos
a definir absolutamente todos los servicios que queremos monitorizar.En nuestro caso
sólo serán servicios de Asterisk, más adelante veremos dicha configuración.

Verificando la configuración

Una vez configurados todos los ficheros de Nagios, hay que verificar la configuración:

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios/nagios.cfg

Si todo sale bien, deberemos obtener un total de CERO errores. Puede que tengamos
algún warning, pero funcionará .

Arrancamos el demonio

# service nagios restart

Configuración para entrar a Nagios via Web:

ln -s /usr/share/nagios/htdocs/ /var/www/nagios/

Monitorizando Asterisk

Lo que nos interesa conseguir con la monitorización de Asterisk con Nagios es lo
siguiente:

./ Saber si Asterisk esta arrancado o no
./ Estado de la tarjeta
./ Estado del proveedor IP Gizmo 5
./ Estado del Chan_sebi
./ Estado del Chan_skype
./ Comprobar si hay usuarios SIP registrados
./ Comprobar si hay usuarios IAX registrados

La configuración para conseguir esto será la configuración de cada comando, de cada
servicio y de los scripts Perl que obtendrán la información a través de comandos CLI.

Como ejemplo la configuración de la obtención del estado del chan_skype es la
siguiente:

commands.cfg

define command{
command_name check_asterisk_skype
command_line /usr/src/SCRIPTS/skype.pl
}
390
localhost.cfg

define service{
use local-service
host_name localhost
service_description Chan_skype
check_command check_asterisk_skype
}

skype.pl

#!/usr/bin/perl -w

use Getopt::Std;
use strict;

my $asterisk_bin="/usr/bin/sudo /usr/sbin/asterisk";
my $asterisk_option="-rx";
my $asterisk_skype="skype show version";
my $return;

my $cmd = qq($asterisk_bin $asterisk_option "$asterisk_skype" );
foreach (`($cmd)`) {
if (/Skype\ For\ Asterisk/) {
$return = 0;
}
}
if($return==0){
print(" Chan_skype activado. \n");
exit($return);
}
else{
print(" Chan_skype desconectado. \n ");
exit(1);
}

Tras la configuración en la interfaz de Nagios podemos ver lo siguiente:
Despues de configurar el archivo contacts.cfg:










391
Despues de configurar el archivo contactgroups.cfg:





Despues de configurar los archivos localhost.cfg y commands.cfg:





Teniendo Asterisk en marcha y sin conectar el chan_sebi veremos esto:





























Si Asterisk no está arrancado lo que veremos será:


392

Duration Attempt · Status lnformation
Od Oh 2m 44s 3/4 Asterisk no esta arrancado
Ud1t:ln 4:Lm :Ltls 4/4 cnan_sebldesconectado.
Od Oh Om 14s 4/4 Chan_skype desconectado.
Od Oh 2m Ss 3/4 Asterisk no esta arrancado
Od Oh 3m 35s 4/4 Elproveedor Gizmo 5 no esta registrado en este momento.
Od Oh1m 48s 2/4 Asterisk no esta arrancado
Od Oh 3m 22s 4/4 Revisar elestado de la tarjeta V\Aidcard TDM400P.
393
Actualización de firmware del Teléfono Cisco 7941 de SCCP a SIP

Tenemos un Teléfono Cisco 7941 de la centralita actual, uno de los requisitos para la
implantación de una centralita nueva, en este caso Asterisk, es el aprovechamiento de
Hardware. Teniendo en cuenta el coste de los teléfonos Cisco por la serie de
funcionalidades que traen el traspaso del protocolo Skynny Client Control Protocol
(SCCP) al SIP es lo más adecuado para poder usarlos.



Para hacer este cambio de protocolo hay que tener en cuenta la configuración del
teléfono que se centra en un fichero XML llamado SEP<MAC-del-Teléfono>.conf.xml.
De este fichero se realizará el registro con la centralita por eso es importante.
El contenido en nuestro caso es el siguiente:

<device xsi:type="axl:XIPPhone" ctiid="1566023366">
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>5000</sshUserId>
<sshPassword>1234</sshPassword>
<devicePool>
<dateTimeSetting>
<dateTemplate>D/M/Y</dateTemplate>
<timeZone>W. Europe Standard/Daylight Time</timeZone>
<ntps>
<ntp>


</ntp>
</ntps>
<name>192.168.1.200</name>
<ntpMode>Unicast</ntpMode>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>192.168.1.200</processNodeName>
</callManager>
</member>
</members>
394
</callManagerGroup>
</devicePool>
<commonProfile>
<phonePassword>1234</phonePassword>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<vendorConfig>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<pcPort>0</pcPort>
<settingsAccess>1</settingsAccess>
<garp>1</garp>
<voiceVlanAccess>0</voiceVlanAccess>
<videoCapability>0</videoCapability>
<autoSelectLineEnable>0</autoSelectLineEnable>
<webAccess>1</webAccess>
<spanToPCPort>1</spanToPCPort>
<loggingDisplay>1</loggingDisplay>
<loadServer></loadServer>
</vendorConfig>
<userLocale>
<name>Spanish</name>
<uid>1</uid>
<langCode>es</langCode>
<version>4.1(3)</version>
<winCharSet>iso-8859-1</winCharSet>
</userLocale>
<networkLocale>Spain</networkLocale>
<networkLocaleInfo>
<name>Spain</name>
<uid>64</uid>
<version>4.1(3)</version>
</networkLocaleInfo>
<deviceSecurityMode>1</deviceSecurityMode>
<sipProfile>
<sipProxies>
<registerWithProxy>true</registerWithProxy>
</sipProxies>
<enableVad>false</enableVad>
<preferredCodec>g711ulaw</preferredCodec>
<natEnabled></natEnabled>
<phoneLabel>Usuario 5000</phoneLabel>
<stutterMsgWaiting>1</stutterMsgWaiting>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
<callStats>false</callStats>
<silentPeriodBetweenCallWaitingBursts>10
</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<callHoldRingback>2</callHoldRingback>
<localCfwdEnable>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>1</dndControl>
<remoteCcEnable>true</remoteCcEnable>
<startMediaPort>10000</startMediaPort>
395
<stopMediaPort>20000</stopMediaPort>
<sipLines>
<line button="1">
<featureID>9</featureID>
<featureLabel>Usuario 5000</featureLabel>
<proxy>192.168.1.200</proxy>
<name>5000</name>
<displayName>Valentin</displayName>
<authName>5000</authName>
<authPassword>1234</authPassword>
<messagesNumber>50008</messagesNumber>
</line>
</sipLines>
<dialTemplate>dialplan.xml</dialTemplate>
</sipProfile>
<loadInformation>SIP41.8-4-2S</loadInformation>
<versionStamp>1143565489-a3cbf294-7526-4c29-8791-c4fce4ce4c37</versionStamp>
<directoryURL></directoryURL>
<servicesURL></servicesURL>
</device>

También es necesaria la configuración de otro fichero XML llamado dialplan.xml.
En este archivo se especifica el tiempo de espera a llamar que tendrán los diferentes
patrones. El contenido de este fichero es el siguiente:

<DIALTEMPLATE>
<TEMPLATE MATCH="3..." TIMEOUT="0"/>
<TEMPLATE MATCH="9........" TIMEOUT="0"/>
<TEMPLATE MATCH="6........" TIMEOUT="0"/>
<TEMPLATE MATCH="*" TIMEOUT="4"/>
</DIALTEMPLATE>

Todos los números que empiecen por 3 y tengan 4 dígitos.
Todos los números que empiecen por 9 y tengan 9 dígitos.
Todos los números que empiecen por 6 y tengan 9 dígitos.
El resto, espera 4 segundos a marcar, a menos que le des al botón de llamada.

Lo siguiente será la actualización del firmware del teléfono a un firmware SIP para eso
debemos seguir los siguientes pasos:

1) Debemos tener instalado un servidor TFTP, al que los teléfonos se conectarán
para descargarse la versión más moderna del firmware.

En la configuración del servidor DHCP debe estar la IP del servidor TFTP:


subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.3;
option subnet-mask 255.255.255.0;
range 192.168.1.201 192.168.1.203;
default-lease-time 86400;
max-lease-time 608400;
option domain-name-servers 194.179.1.100;
option tftp-server-name "192.168.1.210"; }
396
2) Obtener el firmware adecuado para la actualización.

La versión de firmware que utilizaremos es la jar41sip.8-4-1-23 y consta de
diversos archivos entre ellos uno llamado term41.default donde tendremos
que nombrar los 5 archivos .sbn que se instalarán, concretamente son:

- apps41.8-4-1-23
- cnu41.8-4-1-23
- cvm41sip.8-4-1-23
- dsp41.8-4-1-23
- jar41sip.8-4-1-23

Estos archivos componen la imagen que se instalará el teléfono cuando
actualice su firmware.

Ahora ya tenemos listos todos los archivos que necesitaremos para actualizar el
firmware del telefono, por lo que pasaremos a “formatear” el teléfono.

3) Metemos los ficheros del firmware y los dos anteriormente configurados en la
carpeta del servidor TFTP, por defecto es /tftpboot/.

4) Si queremos restaurar el teléfono a los valores de fabrica tenemos que
encender el teléfono con la tecla # pulsada, en unos segundos el teléfono
pasará a modo “actualización”, hecho que veremos por un parpadeo alterno de
los dos “leds” superiores del teléfono (los de línea).

El parpadeo indica que el teléfono espera la secuencia de “reseteo” para
llevarlo a cabo. Esta secuencia es “123456789*0#”.

Una vez hayamos pulsado esta combinación debemos esperar, veremos como
el teléfono se “ resetea”, quedándose con sus valores de fábrica. Luego el solo
ira a buscar su archivo de actualización term41.default y se descargará la
imagen que este indica mediante TFTP.

Una vez se haya terminado este proceso, el teléfono se reiniciará con el nuevo
firmware y buscara su SEP<MAC-del-telefono>.conf.xml.


Si tras la descarga y posterior instalación del firmware en la pantalla del
teléfono aparece la palabra UNPROVISIONED significa que no se ha
registrado el teléfono contra la centralita Asterisk, la parte del fichero de
configuración del teléfono que no está bien configurada es la de los botones
de línea, el featureID es muy importante:

<line button="1">
<featureID>9</featureID>
<featureLabel>Usuario 5000</featureLabel>
<proxy>192.168.1.200</proxy>
<name>5000</name>
<displayName>Valentin</displayName>
<authName>5000</authName>
397



</line>
<authPassword>1234</authPassword>
<messagesNumber>50008</messagesNumber>

Tras estos pasos vamos a comprobar que funcionan las llamadas salientes y entrantes
al teléfono a través de unas pruebas:

La configuración de los archivos sip.conf y voicemail.conf para las extensiones del
teléfono es la misma que para otros teléfonos, la configuración del archivo
extensions.conf es:

[cisco]
include => acceso
exten => 5000,1,Dial(SIP/5000)
exten => 5000,n,Hangup()

Comprobamos que se ha registrado correctamente:

localhost*CLI> sip show peers
Name/username Host Dyn Nat ACL Port Status
5000/5000 192.168.1.202 D 5060 Unmonitored

Llamada de un teléfono IP ALL Net 7960 a Cisco 7941 reconvertido a SIP:

-- Executing [5000@acceso:1] Dial("SIP/2003-08e0ffb0", "SIP/5000") in new stack
-- Called 5000
-- SIP/5000-08e85c98 is ringing
-- SIP/5000-08e85c98 answered SIP/2003-08e0ffb0
-- Native bridging SIP/2003-08e0ffb0 and SIP/5000-08e85c98
== Spawn extension (acceso, 5000, 1) exited non-zero on 'SIP/2003-08e0ffb0'

Llamada de teléfono IP Cisco 7941 reconvertido a SIP a Sipura 841:

-- Executing [4000@acceso:1] Macro("SIP/5000-08e0ffb0", "acceso|4000") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/5000-08e0ffb0", "SIP/4000|30|Ttm") in new
stack
-- Called 4000
-- Started music on hold, class 'default', on SIP/5000-08e0ffb0
-- SIP/4000-08e85c98 is ringing
-- SIP/4000-08e85c98 answered SIP/5000-08e0ffb0
-- Stopped music on hold on SIP/5000-08e0ffb0
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/5000-08e0ffb0' in macro
'acceso'
== Spawn extension (acceso, 4000, 1) exited non-zero on 'SIP/5000-08e0ffb0'
398
Actualización de firmware del Teléfono Cisco 7905 de SCCP a SIP

Esta vez el teléfono es un Cisco 7905, de gama más baja que el anterior, pero igual de
importante su aprovechamiento en la nueva centralita.

Tras la configuración detallada del proceso de cambio de
firmware del teléfono anterior evitaremos la repetición pasando
directamente, tras obtener el firmware SIP para este modelo, a
la configuración de los ficheros que introduciremos en la carpeta
del servidor TFTP /tftp/:

- CP7905080001SIP060412A.sbin
- CP7905080001SIP060412A.zup
- ld00127fae8c7c.cfg
- SEP00127FAE8C7C.cnf
- XMLDefault.cnf

Los dos últimos son los ficheros de configuración, a continuación vemos el código de
estos dos ficheros.

SEP0012FAE8C7C.cnf.xml: (Fichero por teléfono)

<device xsi:type="axl:XIPPhone" ctiid="1566023366">
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>3000</sshUserId>
<sshPassword>1234</sshPassword>
<devicePool>
<dateTimeSetting>
<dateTemplate>D/M/Y</dateTemplate>
<timeZone>W. Europe Standard/Daylight Time</timeZone>
<ntps>
<ntp>
<name>192.168.1.200</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>192.168.1.200</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
</devicePool>
399
<commonProfile>
<phonePassword>1234</phonePassword>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<vendorConfig>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<pcPort>0</pcPort>
<settingsAccess>1</settingsAccess>
<garp>1</garp>
<voiceVlanAccess>0</voiceVlanAccess>
<videoCapability>0</videoCapability>
<autoSelectLineEnable>0</autoSelectLineEnable>
<webAccess>1</webAccess>
<spanToPCPort>1</spanToPCPort>
<loggingDisplay>1</loggingDisplay>
<loadServer></loadServer>
</vendorConfig>
<loadInformation>CP7905080001SIP060412A</loadInformation>
<versionStamp>1143565489-a3cbf294-7526-4c29-8791-c4fce4ce4c37</versionStamp>
<directoryURL></directoryURL>
<servicesURL></servicesURL>
</device>

XMLDefault.cnf.xml: (Fichero para varios teléfonos)

<Default>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
</ports>
<processNodeName>192.168.1.200</processNodeName>
</callManager>
</member>
</members>
</callManagerGroup>
<loadInformation20000 model="IP Phone 7905">
CP7905080001SIP060412A
</loadInformation20000>
</Default>

Encendemos el teléfono y tras obtener la IP del servidor DHCP se descargará la nueva
versión del firmware del servidor TFTP y se actualizará.

El cambio de versión de firmware es el siguiente:

Y CP7905080001SCCP061117A
Y CP7905080001SIP060412A
400
Lo siguiente será configurar la extensión que tendrá el teléfono desde la configuración
SIP del mismo. Para poder actualizar los valores que haiga por defecto se deben pulsar
las teclas “**#”.

Comprobamos el registro de la extensión en Asterisk:

localhost*CLI> sip show peers
3000/3000 192.168.1.204 D 5060 Unmonitored

Llamamos del Cisco 7941 (5000) a este teléfono (3000):

-- Executing [3000@acceso:1] Macro("SIP/5000-09f1fcf8", "acceso|3000") in new stack
-- Executing [s@macro-acceso:1] Dial("SIP/5000-09f1fcf8", "SIP/3000|30|Ttm") in new stack
-- Called 3000
-- Started music on hold, class 'default', on SIP/5000-09f1fcf8
-- SIP/3000-09f3c250 is ringing
-- SIP/3000-09f3c250 answered SIP/5000-09f1fcf8
-- Stopped music on hold on SIP/5000-09f1fcf8
== Spawn extension (macro-acceso, s, 1) exited non-zero on 'SIP/5000-09f1fcf8' in macro
'acceso'
== Spawn extension (acceso, 3000, 1) exited non-zero on 'SIP/5000-09f1fcf8'

Llamamos de este teléfono (3000) al Cisco 7941 (5000):

-- Executing [5000@acceso:1] Dial("SIP/3000-09f35eb0", "SIP/5000") in new stack
-- Called 5000
-- SIP/5000-09f47448 is ringing
-- SIP/5000-09f47448 answered SIP/3000-09f35eb0
-- Native bridging SIP/3000-09f35eb0 and SIP/5000-09f47448
== Spawn extension (acceso, 5000, 1) exited non-zero on 'SIP/3000-09f35eb0'
401
Descripción breve de la centralita actual: Cisco y mejoras
realizadas en la nueva.

Esquema Conceptual de la centralita actual: Cisco





OPTO DESARROLLO OPTO SOPORTE OPTO COMERCIAL















SECRETARÍA
DIRECCIÓN






PSTN


SAlA CONFERENCIAS





SERVIDORES
CISCO ISR 2821


PU NTOS DE ACCESO



FI REWALL ROUTER
YET INFORMÁTICA S.L.


OFICINA DE ELCHE


SWITCH





INTERNET
402
Mejoras de la nueva centralita Asterisk:

Agenda de clientes

La empresa requiere una agenda de contactos con posibilidad de añadir a más de 100
clientes, en la actual centralita el Call Manager posee una agenda de clientes limitada.

La centralita Asterisk soluciona esto a través de dos aplicaciones: FOP 2 que posee una
agenda de contactos de forma que cuando te llaman se ve la etiqueta de dicho cliente,
y la agenda creada para la clasificación de los clientes según mantenimiento, YetBook,
dándoles de esta forma una atención especial en caso de ser clientes VIP.

Usuarios o extensiones remotas

Para posibilitar el teletrabajo y la conexión con la oficina de Elche son necesarias las
extensiones remotas, algo que en la central actual supondría la compra de Softphones
Cisco o Telefonos IP, mientras que en la central Asterisk con cualquier Softphone con
posibilidad de extensiones IAX el problema estaría solucionado.

Gestión de horarios y festivos con calendarios

Algo de lo que no se dispone en la actualidad es la gestión y posterior redirección de
llamadas en días festivos o en horarios no laborales por ejemplo a la oficina de Elche
en caso de ser festivo sólo en el País Vasco o la redirección en horario no laboral de
clientes VIP.

Conferencias

En la central actual no es posible la realización de conferencias mientras que con
Asterisk la configuración del fichero meetme.conf soluciona este problema.

Sistema de Colas

Por el mal funcionamiento del sistema de colas de la central Cisco no se pudo
implantar un IVR, problema solucionado de forma sencilla en la centralita Asterisk con
la configuración a medida de las colas en el fichero queues.conf, pudiendo además
priorizar la posición de entrada a las colas en función del contrato de mantenimiento.

Grabaciones por defecto

Hay una mayor cantidad de grabaciones castellanizadas en Asterisk que en las
centralitas Cisco lo que nos evitará la realización de bastantes grabaciones.

Reporting de llamadas y estadísticas de Colas

Otras funcionalidades necesarias y muy requeridas por el Dpto Contable de la empresa,
son la realización de un listado detallado de llamadas y la obtención de estadísticas de
las colas como la duración de las llamadas de todo el día o que agente atendió a un






























403
mayor número de llamadas. Estas funcionalidades no son satisfechas por la centralita
actual y por el contrario en la central Asterisk serán solucionadas con la integración con
las aplicaciones Asternic Call Center Stats y Asternic CDR Reports.

Implantación en la empresa

Esquema Conceptual de la centralita para Yet Informática S.L.
404
Tipo de Implantación y Análisis de Riesgos

La implantación de la centralita en la empresa, por su reducido tamaño, será por
sustitución, teniendo en cuenta que con las pruebas realizadas en el Demo, una
formación adecuada al personal, con una serie de clases prácticas explicando las
nuevas funcionalidades, y habiendo hecho un estudio sobre el funcionamiento de la
centralita vieja, modificando ligeramente, si así fuera el caso, la configuración de la
nueva para que el cambio fuese lo menos brusco posible los problemas pequeños
problemas que se pudieran llegar a dar son:

Y Problemas de Funcionamiento por fallo de configuración: Posible por falta del
trato en la configuración de algún detalle del funcionamiento requerido.


Y Problemas de aprovisionamiento del personal: Posible por la falta de fluidez en el
manejo de las nuevas aplicaciones integradas con la centralita o las nuevas
funcionalidades.

Ambos tipos de problemas son sencillos de detectar y solucionar con un simple
periodo de prueba de funcionamiento y corrección de errores.

Hardware y Software necesario para la implantación de la centralita:


Recurso

Descripción

Precio

Unidades

Suma

Hardware

Cisco 7941

Teléfono IP (SCCP)

163,85 €

20 **

3.277,00 €

Cargador Cisco

Cargador PA100

12,95 €

20

259,00 €

UPS
Suministrador de
energía eléctrica.

250,00 €

2

500,00 €



4.036,00 €

Software

Licencia FOP 2

Licencia

27,83 €

1

27,83 €
Licencia Call
Center Stats

Licencia

347,87 €

1

347,87 €
Licencia CDR
Reports

Licencia

00,00 €

1

00,00 €
405


Licencia Verbio

Licencia *

-

-

-

375,70 €




Concepto

Importe (€)

PRESUPUESTO

1.847,28 €

Hw de Implantación

4.036,00 €

Sw de Implantación

375,70 €

PRESUPUESTO DE IMPLANTACIÓN

6.258,98 €



* - El número de teléfonos Cisco 7941 dependerá de la rapidez por implantar la
centralita y de la posibilidad de pasar a SIP otros modelos de teléfono Cisco de la
actual centralita.

** -No se ha especificado el precio de la licencia de Verbio ya que finalmente no se
adquirá por las dimensiones de la empresa y por la cantidad de llamadas que se
reciben a diario.

Estos dos apuntes hacen que el presupuesto de implantación sea poco fiable pero si
representativo en cuanto a la importancia del Hardware en una centralita teléfonica
propietaria.

Líneas Futuras y Conclusión


Una vez realizado lo expuesto hasta ahora lo siguiente a hacer sería un estudio
exahustivo sobre el funcionamiento de la central Cisco actual, y es que por las
dimensiones de la empresa, como ya he comentado, el tipo de implantación será de
sustitución de una centralita por la otra y uno de los factores fundamentales es que el
personal que utilice habitualmente dicha centralita no note un peor funcionamiento
del que había, se trata de que las funcionalidades que si recoge la centralita actual se
lleven a cabo aparentemente igual en la nueva y sólo se noten avances en aquellas
funcionalidades nuevas.

De esta forma se puede evitar parte del rechazo habitual a lo nuevo.
406
A parte de esto y antes de la implantación se debería seguir intentando cambiar al
protocolo SIP los teléfonos IP CISCO de la centralita actual para evitarnos hacer una
inversión inútil.

Una vez establecidos estos dos puntos se elegiría una etapa del año de menos trabajo
para realizar la implantación y así poder solucionar cualquier contratiempo con mayor
fluidez.

Por último algo que también se podría llevar a cabo es un servidor de Fax según los
requerimientos y necesidades de la empresa.

Como conclusión cabe destacar que está centralita Asterisk es una solución ejemplar
para efectuar una mejora en la empresa por su flexibilidad y por el simple hecho de no
requerir Hardware propietario especifico y por tanto poder aprovechar este en caso de
que se necesite.Y es que en la actualidad Asterisk es considerado el futuro de la
telefonía.
407

Sponsor Documents

Or use your account on DocShare.tips

Hide

Forgot your password?

Or register your new account on DocShare.tips

Hide

Lost your password? Please enter your email address. You will receive a link to create a new password.

Back to log-in

Close