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.

1

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 2

;ú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. Operadoresbooleanos 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 3

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 {=,>,> =, 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. 121

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. 122

-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: 123

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: 124

[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éusosedadelosCódecsdeaudioenAsterisk? Sirven para digitalizar la voz humana. Cuando dos dispositivos van a establecer una comunicación, acuerdan el códec a utilizar. Factoresimportantesalahoradeseleccionaruncódec: – Calidad de audio. – Coste computacional. – Gasto de ancho de banda. Comparacióndeanchodebandautilizadoporloscó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 125

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. Definirunidioma 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. CastellanizarAsterisk 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] 126

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ónparalagrabació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 autoincremental, para no sobrescribir grabaciones. El nombre del fichero queda guardado en la variable ${RECORDED_FILE}. exten => ext1,n,Record(sonido-asterisk%d.alaw) Legalidadenlagrabacióndellamadas 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:

127

“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, 128

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

129

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

130

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.

131

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

132

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 …………… 133

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

134

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.

135

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

136

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,

137

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.

138

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} 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. 139

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: Ayuda a reducir los turnos de los operadores y sus costes asociados. Incrementa las horas de servicio. Disminuye la tasa de llamadas perdidas. Incrementa la disponibilidad de los operadores. 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. Y Y Y Y Y

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.

140

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: Volver atrás. Menú principal. Repetir. Ayuda (si lo necesita la aplicación). Si existe una opción de paso al operador, debe ser la última. 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. Y Y Y Y Y Y

Preguntas Si/No: Y Se usan para recuperar errores y para confirmar acciones. 141

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: ; La extensión que queremos llamar. Callerid: ; El identificativo de llamada que queremos enviar a la ;extensión llamada. WaitTime: ; Cuantos segundos esperamos antes de considerar la ;llamada sin éxito. Maxretries: ; Numero de veces que intentaremos llamar la ;extensión RetryTime: ; Cuantos segundos debe esperar asterisk para volver a ; marcar 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: ; la aplicación que queremos utilizar Data:

; aquí podemos definir las opciones de la aplicación

142

Ejecutar un punto exacto del plan de llamadas (Dialplan): Context: ; El contexto en el dial plan Extension: ; La extensión que queremos usar en el contexto ; especificado. Priority:

; El numero de la prioridad o la etiqueta si definida

Setvar:

; 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. 143

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?

144

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]. Prioridad2: 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 145

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}" _00.,3,Set(counter=$[${counter}+1]) exten => _00.,4,Dial(SIP/${ENUMLOOKUP(+${EXTEN:2},sip,,${counter})}) exten => _00.,5,GotoIf($["${counter}" _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:

146

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.

147

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

148

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:

149

; 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. 150

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.). 151

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: 152

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); bre ak; defa Noop(Algo raro ult: pasado); Hangup;

ha

} }

}

Eso seria similar a esto: [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() 153

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 154

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:

155

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 156

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óndeFreePBX 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 libselinuxdevel 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-

157

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

158

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

159

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 160

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 , 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

161

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:

162

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: 163

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

164

-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 ™

SoftwareDigium 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

165

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 caracteristicarica VoIP PBX o sistema. Características: -Soporte de Asterisk Bussiness Ed. -AbsoluteTimeout -AddQueueMember -ADSIprog -AgentCallbackLogin -AgentLogin -AgentMonitorOutgoing -AGI -Answer -AppendCDRUserField -Authenticate -Background -BackgroundDetect -Busy -ChangeMonitor -ChanIsAvail -ChanSpy -CheckGroup -Congestion -ControlPlayback -Cut

-Hangup -HasNewVoicemail -HasVoicemail -IAX2Provision -ImportVar -LookupBlacklist -LookupCIDName -Macro -MacroExit -MacroIf -MailboxExists -Math -MD5 -MD5Check -MeetMe -MeetMeAdmin -MeetMeCount -Milliwatt -Monitor -MP3Player -MusicOnHold

-SayUnixTime -SendDTMF -SetAccount -SetAMAFlags -SetCallerID -SetCallerPres -SetCDRUserField -SetCIDName -SetCIDNum -SetGlobalVar -SetGroup -SetLanguage -SetMusicOnHold -SetRDNIS -SetVar -SIPAddHeader -SIPDtmfMode -SIPGetHeader -SoftHangup -StartMusicOnHold -StopMonitor 166

-DateTime -DBDel -DBdeltree -DBGet -DBPut -Dial -DigitTimeout -Directory -DISA -DumpChan -DUNDiLookup -Echo -Endwhile -EnumLookup -Eval -Exec -ExecIf -ExecIfTime -Flash -ForkCDR -GetCPEID -GetGroupCount -GetGroupMatchCount -Goto -GotoIf -GotoIfTime

-NoCDR -NoOp -Park -ParkAndAnnounce -ParkedCall -PauseQueueMember -Playback -PlayTones -Prefix -PrivacyManager -Progress -Queue -Random -Read -ReadFile -RealTime -RealTimeUpdate -RemoveQueueMember -RetryDial -ResetCDR -ResponseTimeout -Ringing -SayAlpha -SayDigits -SayNumber -SayPhonetic

-StopMusicOnHold -StopPlayTones -StripLSD -StripMSD -Suffix -System -TestClient -TestServer -Transfer -TryServer -TXTCIDName -UnpauseQueueMember -UserEvent -Verbose -VMAuthenticate -VoiceMail -VoiceMailMain -Wait -WaitExten -WaitForRing -WaitForSilence -WaitMusicOnHold -While -Zapteller -ZapBarge -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. 167

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 168

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.

169

¿Qué puedo crear con AsteriskNOW? Entre las muchas aplicaciones que puedes crear con AsteriskNOW son: VoIP Gateway Skype Gateway IP PBX Call Center ACD Conferencia de Puente

Servidor IVR Sistema de buzón de voz Call Recorder Servidor de fax 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.

170

- 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.

171

Una vez instalado TrixBox, el sistema dispone de: Asterisk Apache MySQL SugarCRM ARI FreePBX Principalescaracterí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 172

Protocolosconlosquetrabaja: 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 VersionesdeTrixBox: 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: 173

Standard Edition (SE) Enterprise Edition (EE) Call Center Edition (CCE) Característicasybeneficios: 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óndelasprincipalescaracterísticasdeTrixBoxPro: 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.

174

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 175

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.

176

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: VoIPPBX: 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. 177

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. 178

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. Centrodellamadas: 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íainstantá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. 179

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. Soporteparahardwaredetelefoní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. 180

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.

181

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.

182

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

183

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.

184

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.

185

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.

186

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.

187

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.

188

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. 189

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.

190

191

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.

192

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.

193

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 Iniciarelservicio service httod start chkconfig httpd on

Pararelservicio service httpd stop

Reiniciarelservicio 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 194

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 option subnet-mask

192.168.1.3; 255.255.255.0;

195

;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" ${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

232

[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 -- 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 -- 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: 233

1. Introduzca el numero de conferencia + #: -- Executing [620@acceso:1] MeetMe("SIP/5000-b6902bf0", "|scDM(default)") in new stack -- Playing 'conf-getconfno' (language 'es')

2. Introduzca el pin d ela conferencia -- Playing 'conf-getpin' (language 'es')

3. Crea la conferencia y te pide de nuevo el pin -- Created MeetMe conference 1023 for conference '621' -- Playing 'conf-getpin' (language 'es')

4. Te dice si estas solo o no -- 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 -- Playing 'conf-getconfno' (language 'es') -- 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

234

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 Host ---------------------------proxy01.sipphone.com/1747 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:

235

-- 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:

236

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:

237

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

238

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. 239

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 Mask 6001/6001 192.168.1.50 (D) 255.255.255.255 6000/6000 82.130.246.138 (D) 255.255.255.255 2 iax2 peers [0 online, 0 offline, 2 unmonitored]

Port 4569 45755

Status Unmonitored Unmonitored

240

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:

241

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). Line1

PSTNLine

Vemos la configuración del fichero sip.conf: [9000] type=friend username=9000 secret=1234 host=dynamic context=pstn qualify=yes

242

[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:

243

-- 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'

244

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.

245

Esquema Conceptual del Demo realizado antes de la implantación

Usuario remoto con SoftPhone

Teléfono IP (Sipura 841) Teléfono Analógico

Teléfono IP (Sipura 841)

TDM400P (1FXO,1FXS)

'-----

PSTN

Teléfono IP (All·NET)

IAX2 SIP PC con SoftPhone

@ Astensk

SWITCH Teléfono IP (Sipura 841)

Teléfono Analógico

246

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

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

248

Contexto

En el demo de la a plicación, los ca lendarios de los departamen tos sólo tend rán un tip o de eventos que serán los 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 irección será al contexto po r defecto que tiene el siguiente formato: [dpto+laboral)

Código [recepc ionla boral] exten

=>

902147424,l,Macro(la

borai,${QR}) [comerc ialla boral] exten => 902147424,l,Macro(la 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})

249

No Disponible Opto

Macro No Disponible

Contexto dpto·+laboral

Macro No Disponible

Macro La bora l

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,Voicema 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 Disponible Sop orte es d iferente a l de otros departamen 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 ,

250

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{CALLERO I (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

251

Accesos Directos a usuarios de la Empresa

252

Gestión de Buzones de Voz

Gestión de las Colas de la aplicación

253

254

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.

255

Uso de Conferencias en la aplicación Agregarsealaconferencia600

Sabercuántaspersonashayenlaconferencia

Restringirelnúmerodeparticipantesdeunaconferencia

UsodeConferenciadiná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.

256

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.

257

Funcionamiento de la Funcionalidad DISA Configuración 1) Al llamar a la centralita un determinado número, está le llama y le da tono parallamaratravésdeesta.

Configuración 2) Al llamar a la extensión 333 de la centralita, está le llama y le da tono para llamaratravésdeesta.

258

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úmerodesalidaqueesteenelcontexto “acceso”.

Funcionamiento del desvío de las llamadas de usuarios internos a otro teléfono

Activacióndeldesvíodellamadasdeunaextensióndeunusuariointerno

Desactivacióndeldesvíodellamadasdeunaextensióndeunusuariointerno

259

Pruebaparalaextensión5000trasefectuareldesví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)

260

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

261

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

262

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 -- 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.

263

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

264

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

265

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

266

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

267

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

268

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

269

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

270

Fichero de configuración: MANAGER.CONF

Fichero de configuración: MEETME.CONF

Fichero de configuración: QUEUES.CONF

2 7 1

Fichero de configuración: VOICEMAIL.CONF

272

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.

273

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 BasedeDatos:cdr

Tablas de cdr cdr channels

! Tabla cdr

calldate

clid

src

dst

dcontext

channel

dstchannel

lastapp

2009-12-22 21:44:43

"2000"

2000

2003

acceso

SIP/2000b6800a38

SIP/20030a30b038

VoiceMail

lastdata

duration

billsec

disposition

amaflags

2003

34

3

ANSWERED

3

accountcode

uniqueid

userfield

! Tabla channels

id

channel

1

SIP/2003

2

SIP/2000

accountcode

name

David

274

Mikel 3

SIP/2001

Eduardo

4

SIP/2004

Josemi

5

SIP/2002

Josean

BasedeDatos:fop2

Tablas de cdr visual_phonebook

! Tabla visual_phonebook

id

firstname

1

lastname

company

phone1

Mikel

Yet Informatica

2000

2

Eduardo

Yet Informatica

2001

3

Josean

Yet Informatica

2002

4

David

Yet Informatica

2003

5

Josemi

Yet Informatica

2004

phone2

picture 1-mark.jpg

BasedeDatos:qstats

Tablas de cdr qagent qevent qname queue_stats

275

! 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

276

18

UNPAUSE

! Tabla qname

qname_id

queue

2

recepcionqueue

3

comercialqueue

4

soportequeue

! Table queue_stats

queue_stats_id

1



705

uniqueid SIP/2003

… SIP/2003

datetime

qname

qagent

qevent

2009-11-05 05:01:19

4

4

14









2009-12-22 23:35:20

4

4

9

info1

info2

info3

BasedeDatos:agenda

Tablas de agenda clientes telefono usuarios

! Tabla clientes

id

nameEmp

cliente

mant

1

Calnaba

Yet

VIP

2

Puma

Yet

Completo

277

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

BasedeDatos:nagios

Tablas de nagios nagios_acknowledgements nagios_commands nagios_commenthistory nagios_comments

278

nagios_configfiles nagios_configfilevariables …. nagios_timedeventqueue nagios_timedevents nagios_timeperiod_timeranges nagios_timeperiods

279

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:

280

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.

281

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.

282

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

283

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.

284

En la imagen siguiente vemos el resultado de la modificación:

En este apartado tenemos una visión de los clientes de la expresa.

285

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.

286

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.

287

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:

288

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

289

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.

290

. Dejar mensaje en buzon:

1 extension +

si

. 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

291

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

292

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

293

• 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

e ancelar

desvio:

1 extension =

721

Por último para recordar el acceso a la aplicaciones integradas con la centralita Asterisk:

294

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.

295

• 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

296

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. Pruebasdeexistenciadeeventoenelmomentoenuncalendario El código de la aplicación que comprueba la existencia de eventos es el siguiente:

297

Prueba1) Hayuneventode10:30a11: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"

298

El calendario tiene el siguiente aspecto:

Prueba2) Nohayningunevento [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"

299

El calendario tiene el siguiente aspecto:

Prueba2) Hayuneventodediacompleto [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"

300

El calendario tiene el siguiente aspecto:

PruebasdeenvíoderecordatoriosatravésdeSMSconGoogleCalendar 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:

301

[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 anexocorrespondiente.

302

Chan_Sebi ¿Qué?,¿Cómo?y¿Porqué? 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.9asterisk-addons/

InstalaciónyConfiguracióndechan_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. 303

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: 304

*CLI> sebi show devices Id huawei1

Imei Group 3541370xxxxxxxx 1

Provider vodafone es

Connected State Voice SMS 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 huawei1

Imei Group 3541370xxxxxxxx 1

Provider vodafone es

Connected State Voice SMS 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

305

PruebasrealizadasconunModemHuaweiK3520

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=yes voice=yes context=from-sebi group=1 volume=5 language=es

; SMS centre number (SYMYO)

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. Prueba1)Llamadaconchan_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

306

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

Prueba2)EnviodeSMSconchan_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

Prueba3)RecepcióndeSMSdesdeelchan_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:

307

#!/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'

308

Flash Operator Panel 2 (FOP 2) ¿QuéesFOP2? 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 o o o o o o o o o o

Iniciar llamadas Acceso telefónico a cualquier número Acceso a la agenda de llamadas Notificación de entrada de llamadas Agenda de Contactos (Visual Phonebook) Transferencia de llamadas Transferencia al buzón de voz Registro de llamadas Atención de llamadas directas (Pick Up) Colgar llamadas Funcionalida Spy & Whisper (Escuchar llamada y comunicarse con uno de los hablantes sin que el otro escuche)

Botones de Extensión o o o o o

2 líneas por botón Callerid y temporizador Indicador de pausa Indicador de pertenencia a una cola Indicador de grabación

Botones Trunk o

Muestra una lista con los trunks establecidos o configurados

Botones de Conferencia o o o o o

Lista de miembros de la conferencia Bloqueo / Desbloqueo de conferencias Silenciar / Activar audio a los miembros Silenciar / Activar a todos los miembros Expulsar miembros de la conferencia 309

Botones de Cola o o o o o o

Lista de agentes/miembros Lista de llamadas en espera Miembros en pausa Miembros ocupados Miembros disponibles Miembros invalidos

¿AquiénvadirigidoFOP2? 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.

310

Instalación RequisitosdelSistema 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: .

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óndesdetarball 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

311

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

312

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óndebotones 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

BotonesdeExtensió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

Botonesdecola 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

313

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. BotonesdeConferencia 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

BotonesTrunk 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óndeVisualPhonebook 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:

314

#> 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