UNIVERSIDAD DE GUAYAQUIL FACULTAD DE CIENCIAS MATEMÁTICAS Y FÍSICAS CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES IMPLEMENTACIÓN DE UN IVR PARA ATENCIÓN TELEFÓNICA A ESTUDIANTES EN LA CARRERA DE INGENIERÍA EN SISTEMAS COMPUTACIONALES DE LA UNIVERSIDAD DE GUAYAQUIL TESIS DE GRADO MANUAL TÉCNICO Previa a la obtención del Título de: INGENIERO EN SISTEMAS COMPUTACIONALES AUTORES: EMILIA ESTEFANIA RAMÍREZ SAVERIO FREDDY ANDRES NOBOA ORRALA TUTOR: ING. DAVID BENAVIDES GUAYAQUIL – ECUADOR 2011 1 Contenido 1. ARQUITECTURA DE LA SOLUCIÓN.......................................................................................... 3 2. ARQUITECTURA DEL DESARROLLO ........................................................................................ 4 2.1. Tecnologías de la Solución ................................................................................................. 4 3. 4. 2.1.1. El Asterisk .............................................................................................................. 4 2.1.2. Lenguaje de Programación..................................................................................... 4 2.1.3. Asterisk - Java ........................................................................................................ 5 2.1.4. Diseño AGI del paquete ASTERISK-JAVA ......................................................... 6 2.1.5. JasperReports ......................................................................................................... 7 2.1.6. IReports .................................................................................................................. 7 2.1.7. JavaMail ................................................................................................................. 9 2.1.8. SoftPhone (WebPhone MIZU) ............................................................................... 9 2.1.9. Base de Datos del Sistema ................................................................................... 12 2.1.10. Servidor de Aplicaciones ..................................................................................... 12 2.1.11. Servidor TTS ........................................................................................................ 13 2.1.12. GUI ...................................................................................................................... 13 DICCIONARIO DE LIBRERIAS. ................................................................................................ 15 3.1. INFORMACION GENERAL ...................................................................................... 15 3.2. INFORMACION FUNCIONES. ................................................................................. 15 3.2.1. CISCAGI-AGI ..................................................................................................... 15 3.2.2. CISCAGI-AMI .................................................................................................... 34 3.2.3. CISCAGIVIEWER .............................................................................................. 53 3.2.4. CISCAGILIBRARY ............................................................................................ 54 3.2.5. ModuloIVR .......................................................................................................... 55 DIAGRAMAS DE LA APLICACIÓN .......................................................................................... 57 4.1. Diagrama de desarrollo CISCAGI ............................................................................... 57 4.2. Diagrama general de secuencia CISACAGI IVR. ....................................................... 58 2 5. 4.3. Diagrama general de secuencia CISACAGI administrador. ........................................ 59 4.4. Diagramas UML .......................................................................................................... 60 4.6.1. UML AGISCRIPT. .............................................................................................. 60 4.4.2. UML CISCAGI AMI1 ......................................................................................... 61 4.6.3. UML CISCAGI AMI2 ......................................................................................... 62 INSTALACIONES Y CONFIGURACIONES. ............................................................................... 63 5.1. Instalación Asterisk (Distribución Elastix). ................................................................ 63 5.2. Instalación Festival. (TTS [Conversor de texto a voz]). .............................................. 67 5.3. Instalación Cacti (Monitorizador de Servidores). ........................................................ 69 Configurando Apache .......................................................................................................... 71 Configurando Mysql ............................................................................................................. 71 Instalando Cacti.................................................................................................................... 71 Creación de base de datos MYSQL para datos de cacti ...................................................... 73 Asignando permisos necesarios ........................................................................................... 74 Graficando la Red ................................................................................................................. 77 Viendo las graficas ............................................................................................................... 79 5.4. Configuration AMI (Asterisk Manager Interface) ....................................................... 80 5.5. Configuración CDR ..................................................................................................... 83 Campos del CDR ................................................................................................................... 83 5.6. Configurando Asterisk para guardar los registros del CDR en MySQL ...................... 85 5.7. Configuración FAST-AGI ........................................................................................... 91 ARCHIVO EXTENSIONS.CONF ............................................................................................... 92 ARCHIVO FASTAGI-MAPING.PROPERTIES ............................................................................ 92 ARCHIVO CISCAGIROUTER:XML ........................................................................................... 93 5.8. Configuración de la Base de seguridad CISCAGISEGU ............................................ 96 3 1. ARQUITECTURA DE LA SOLUCIÓN La Arquitectura propuesta contará de tres elementos: • El servidor Asterisk • El servidor de aplicaciones • La Base de Datos El servidor de aplicaciones se encargará de hacer las conexiones a base de datos y de recibir la información de entrada que dará el usuario al sistema IVR así como también procesar la información para brindar una respuesta adecuada, albergando el script del IVR mismo. El servidor de aplicaciones se encargará también de alojar el sistema web y requerimiento de información de la base de datos. El servidor Asterisk será el encargado de contener la central telefónica y todas sus bondades, contendrá el TTS (Festival) para las conversiones de texto a voz, también CACTI (Monitorización de servidores para verificar el estado del servidor), el AGI para la comunicación con las aplicaciones, también el CDR para reportes sobre la central telefónica. La base de datos el cual contendrá la información de los estudiantes de la carrera. 4 2. ARQUITECTURA DEL DESARROLLO 2.1. Tecnologías de la Solución A continuación se detallarán las herramientas para el diseño e implementación del sistema, indicando la justificación de la debida elección. 2.1.1. El Asterisk Asterisk soporta muchos protocolos de VoIP, presenta capacidades que anteriormente sólo eran encontradas en equipos propietarios, llevadas a cabo por medio de implementaciones en software y arquitecturas funcionales. Para el desarrollo del proyecto de tesis, se utilizará Asterisk en su versión dada la capacidad de esta versión de interactuar con paquetes de software como Asterisk – Java, ha ser descritos posteriormente. 2.1.2. Lenguaje de Programación El lenguaje de programación elegido es Java. Se ha convertido en un lenguaje de programación muy popular dada su robustez, simple sintaxis e interoperabilidad. Entre las características principales de Java tenemos: • Lenguaje de programación Orientado a objetos (POO) que permite la reutilización de código, agilizando el desarrollo de software en la creación de sistemas de mayor complejidad. • Lenguaje multiplataforma: Funciona de manera similar en diferentes sistemas operativos. 5 Esto se debe a la interpretación del lenguaje realizado por la máquina virtual Java JVM; dado que normalmente un lenguaje compilado es traducido y adaptado a un archivo ejecutable para una determinada plataforma. • Tiene capacidades de extender funcionalidades de un servidor web. 2.1.3. Asterisk - Java El API Asterisk – Java ofrece un conjunto de clases que permite la creación de aplicaciones que puedan controlar y monitorear centrales PBX basadas en Asterisk 1.0, 1.2 y trabajos futuros en gestión de la versión 1.4. Actualmente este paquete está en su versión 0.3 y está registrado bajo licencia Apache Versión 2.0. El paquete Asterisk – Java está desarrollado mediante el protocolo FastAGI, por lo que se permite poner en funcionamiento un servidor de requerimientos que recibirá y mandará comandos por un socket TCP. Para esto será necesaria la configuración del archivo extensions.conf ubicado en /etc/asterisk del servidor PBX. A continuación se describirá el diseño del soporte de FastAGI del API Asterisk-Java en su paquete org.asteriskjava.fastagi. Éste se basa en tres importantes interfaces: AgiServer, AgiScript y MappingStrategy. • La interfaz AgiServer tiene como responsabilidad escuchar los requerimientos AGI provenientes de un servidor Asterisk y luego elegir el proceso para ese requerimiento, invocarlos para proveer los medios para enviar comandos a Asterisk y recibir la 6 respuesta correspondiente. El API Asterisk-Java incluye ya la implementación de esta interfaz en DefaultAgiServer. (Método utilizado en el proyecto) • AgiServer usa una estrategia de mapeo (MappingStrategy) para la selección del proceso, y esto se basa en la lectura del recurso y verificando la URL, esto es llamado ResourceBundleMappingStrategy. 2.1.4. Diseño AGI del paquete ASTERISK-JAVA • La tercera interfaz es el AgiScript, el cual se refiere al código mismo invocado para atender un requerimiento. AgiScript es para Asterisk-Java lo que un servlet es para un contenedor de servlets (servlet container). La interfaz AgiScript es bastante simple, usa un método llamado service () al cual se le pasan el AgiRequest y el AgiChannel, permitiendo enviar comandos Agi hacia Asterisk. Para el desarrollo del presente proyecto se utilizarán principalmente los métodos definidos en la clase BaseAgiScript, la cual nos ofrece control sobre acciones de la propia central para pedir y brindar información necesaria para la implementación del sistema IVR. Esta clase está ubicada en org.asteriskjava.fastagi y sus método son el reflejo de los comandos AGI como métodos de una clase extensible en Java, lo que nos permitirá ya en este ambiente generar otras clases necesarias para la interacción con la base de datos. Algunos de los métodos de la clase BASEAGISCIPT 7 Tipo Nombre Descripción Void Answer() Contesta el canal Int Exec(String aplicacion) Ejecuta un comando de una aplicación dada. String getData(String archivo) Reproduce y espera datos para almacenar. Void StreamFile(String archivo) Reproduce un archivo dado Void sayDigits(String cadena) Reproduce una cadena de digitos 2.1.5. JasperReports JasperReports es una fuente abierta de Java de presentación de informes herramienta que puede escribir en la pantalla, una impresora o en PDF ,HTML , Microsoft Excel , RTF , ODT , valores separados por comas y XML archivos. Puede ser utilizado en aplicaciones Java habilitado, incluyendo Java EE o aplicaciones Web, para generar contenido dinámico. Se lee las instrucciones de un XML o archivo. Jaspe. 2.1.6. IReports La herramienta iReport es un constructor / diseñador de informes visual, poderoso, intuitivo y fácil de usar para JasperReports escrito en Java. Este instrumento permite que los usuarios corrijan visualmente informes complejos con cartas, imágenes, sub informes, etc. iReport está además integrado con JFreeChart, una de la biblioteca gráficas Open Source más difundida para Java. Los datos para imprimir pueden ser 8 recuperados por varios caminos incluso múltiples uniones JDBC, TableModels, JavaBeans, XML, etc. Características de iReport La lista siguiente describe algunas de las características importantes de iReport: 100% escrito en JAVA y además OPENSOURCE y gratuito. Maneja el 98% de las etiquetas de JasperReports Permite diseñar con sus propias herramientas: rectángulos, líneas, elipses, campos de los textfields, cartas, subreportes (subreportes). Soporta internacionalización nativamente. Browser de la estructura del documento. Recopilador y exportador integrados. Soporta JDBC. Soporta JavaBeans como orígenes de datos (éstos deben implementar la interface JRDataSource). Incluye Wizard‟s (asistentes) para crear automáticamente informes. Tiene asistentes para generar los subreportes Tiene asistentes para las plantillas. Facilidad de instalación. 9 2.1.7. JavaMail JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. El JavaMail API no es parte del núcleo de Java SE, sino una extensión opcional. Además, se requiere en Java Enterprise Edition. Los paquetes de JavaMail se puede acceder de dos maneras: mediante la colocación de j2ee.jar en la ruta de clases o, mediante la colocación de dos mail.jar y activation.jar en la ruta de clases El javax.mail API utiliza un archivo de propiedades para los nombres de servidor de lectura y de configuración relacionados. Esta configuración anula cualquier defecto del sistema. Por otra parte, la configuración se puede ajustar directamente en el código, usando la API JavaMail. 2.1.8. SoftPhone (WebPhone MIZU) El Mizu-Teléfono Web es un peso ligero estándar de VoIP de teléfono basado en software que puede ser ejecutado desde páginas web . Basado en el estándar SIP protocolo de la industria, es compatible con todos los dispositivos de VoIP y servicios. Se puede llamar a cualquier otro teléfono SIP suave / teléfono IP (para la carga gratis) o cualquier teléfono fijo y número de teléfono móvil a través de un proveedor de servicios de VoIP de su elección. 10 El teléfono se implementa como un applet de Java o la aplicación y es totalmente independiente de la plataforma que se ejecutan en cualquier navegador habilitado para Java en todos los sistemas operativos (Windows, MAC, Linux, Solaris). Puede ser utilizado como un softphone normal de funcionamiento en su sitio web o como-como los botones de Skype (Haga clic aquí para llamar). La persona que llama puede aceptar la llamada en un dispositivo VoIP (softphone, teléfono IP, aplicaciones de call-centers) o puede ser contactado directamente a su teléfono fijo o móvil. Todas las llamadas habituales características de enrutamiento se puede habilitar (desvío de llamadas, transferencia de llamadas, etc) Con Mizu-Teléfono Web puede agregar rápidamente las capacidades de VoIP para su sitio web. (Página web, blog, foro, soporte / página de las ventas, sitio de redes sociales, call center, etc.) El resto depende de tu imaginación. Características WebPhone SIP y RTP pila (compatible con cualquier servidor de VoIP o un dispositivo como Cisco, Astérix, softphone, ATA y otros) Norma applet de Java (no requiere instalación de software, se ejecuta directamente desde todos los navegadores) Las llamadas de VoIP con auto QoS Protocolos de transporte: UDP, TCP, TLS, HTTP túnel 11 NAT / Firewall de apoyo, estable SIP y los puertos de RTP, la luz del protocolo STUN y configuración automática Protocolos de los medios de comunicación: mensajería instantánea (chat) y capacidad de presencia RFC: 2543, 3261, 2976, 3892, 2778, 2779, 3428, 3265, 3515, 3311, 3911, 3581, 3842, 1889, 2327, 3550, 3960, 4028, 3824, 3966, 2663, 3022 métodos compatibles: INVITE, ACK, PRACK, BYE, CANCELAR, UPDATE MENSAJE, INFO, OPCIONES, suscribir, NOTIFICAR, CONSULTE Codec: PCMU, PCMA, G.729 , GSM, Speex, iLBC Banda ancha y banda ultra-ancha codec y salida estéreo DTMF (método INFO en la señalización) Volver a marcar, llamada espera , silencio y la transferencia (con operador y automáticas) Conferencia de llamadas (integrado en el mezclador RTP) Llame al parque y recogida Unlimited líneas Balance de la pantalla, temporizador de llamadas Grabación de voz (local y / o ftp upload) Señalización y los medios de comunicación cifrado Haga clic para llamar 12 Servidor de integración lado usando PHP,. NET, J2EE, etc JavaScript API Construido con su propia marca Personalizable interfaz gráfica de usuario e idiomas Funciones personalizadas 2.1.9. Base de Datos del Sistema La base de datos elegida para el sistema IVR es Mysql, sistema de base de datos relacional orientado a funcionar más en sincronía con las necesidades del Internet; por lo que es el sistema preferido por las empresas dada su robustez y fidelidad. Para la interacción con la base de datos desde los Scripts generados en Java para el funcionamiento del Sistema IVR y su interacción con el sistema de base de datos se utilizará el paquete mysql-conector-java-5.1.7.jar de MySQL compatible con JDK. Para una mejor organización de las sentencias SQL (Structured Query Language) se utilizarán paquetes y procedimientos almacenados en el mismo servidor de base de datos con el fin de poder hacer transacciones para el desarrollo del sistema. 2.1.10. Servidor de Aplicaciones El servidor de aplicaciones elegido para albergar la aplicación web de inscripción inicial del flujo del servicio IVR es el BlazeDS que no es más que un Tomcat 5.5.12, el cual se encuentra bajo licencia Open Source (Código Abierto) y fue creado en conjunto por 13 Apache Software Foundation y Sun Microsystems y que permite interactuar con aplicaciones Flex y AIR enviando las consultas mediante protocolos AMF. Una de las ventajas del uso de BlazeDS es que al estar desarrollado en Java, sólo requerirá de una máquina virtual Java JVM para funcionar correctamente indistintamente de la plataforma operativa en la que se encuentre. 2.1.11. Servidor TTS Como parte de la tecnología anexa usada en los sistemas IVR, descritos en el capítulo anterior, se ha visto necesaria la inclusión de un servidor TTS (Text to Speech) en el desarrollo del presente proyecto. Para esto se ha elegido el sistema “Festival”, desarrollado por el CSTR (The Centre for Speech Technology Research) de la Universidad de Edimburgo, Inglaterra. “Festival” es un marco de trabajo que permite construir sistemas de síntesis de voz. La versión actual de este sistema es el 2.0 y que está disponible para descarga, ofreciendo soporte tanto en inglés americano y británico así también como en español. 2.1.12. GUI El diseño de la interfaz gráfica del aplicativo web que acompaña al servicio telefónico es un juego de páginas en FLEX - AIR dada la sencillez de este lenguaje y la necesidad de 14 tan sólo un navegador web el único requerimiento seria que estas navegadores soporten flash. La arquitectura MVC o Modelo-Vista-Controlador se encarga de separar la presentación, la lógica de control y el estado de la aplicación con el objetivo de hacer el sistema modular; es decir, una parte puede ser cambiada sin alterar la otra. El “controlador” será el encargado de recibir los requerimientos y es el responsable de tomar acciones apropiadas en respuesta a cada requerimiento. El “modelo” está referido a la representación del estado de la aplicación en la base de datos y los DAOS; Finalmente la “vista” tomará la información provista por el “controlador” y el “modelo” y la presenta al usuario. Cabe notar que la vista del proyecto está formada por un modelo Factory method el cual nos permite crear pantallas genéricas de manera sencilla y sin tener que crear clases lo hace dinámicamente obteniendo la forma de las pantallas de una plantilla XML guardada en una base de datos. 15 3. DICCIONARIO DE LIBRERIAS. 3.1. INFORMACION GENERAL Documentación técnica de las funciones del servidor java de conexiones AMI y AGI. Para esto tenemos dos proyectos: CISCAGI – AMI: encargado de conectarse con el manager de Asterisk e interactuar con las diversas líneas de comando y con los archivos de configuración. CISCAGI – AGI: Encargado de mantener levantado un servidor AGI para que este reciba las reciba y envié procesos por voz siendo este un Dial Plan. 3.2. INFORMACION FUNCIONES. 3.2.1. CISCAGI-AGI Class Summary Clase encargada levantar un servidor fastagi Constructor Detail CiscAgiScriptIVR public CiscAgiScriptIVR() CiscAgiScriptIVR Method Detail ivrRespuesta public java.lang.String ivrRespuesta(java.lang.String routerSoundsIVR, 16 org.asteriskjava.fastagi.AgiChannel channel, long time, int maximoNumeroDigits) throws java.lang.Exception Ivr de bienvenidas estos archivos de sonido no pueden ser interrunpidos hasta que se termine el audio. Parameters: routerSoundsIVR channel Throws: java.lang.Exception candado public java.lang.String candado(java.lang.String routerSoundsIVR, java.lang.Long time, int maximoNumDigits) throws java.lang.Exception Candado de seguridad [ingreso de cedula] 17 Returns: Throws: java.lang.Exception readAccion public void readAccion(java.lang.String accion, org.asteriskjava.fastagi.AgiChannel channel, java.lang.String modo) throws java.lang.Exception Throws: java.lang.Exception cerrarLlamada public void cerrarLlamada() throws org.asteriskjava.fastagi.AgiException Throws: org.asteriskjava.fastagi.AgiException inicializador public int inicializador() 18 ivrSinInterrupcion public boolean ivrSinInterrupcion() ivrConInterrupcionTiempo public boolean ivrConInterrupcionTiempo() verificaSiTieneCandado public boolean verificaSiTieneCandado() verificaDtmfTienedata public boolean verificaDtmfTienedata() verificaAccionEnOpcion public boolean verificaAccionEnOpcion() service public void service(org.asteriskjava.fastagi.AgiRequest request, org.asteriskjava.fastagi.AgiChannel channel) 19 Clase encargada de manejar las distintas funciones e interpretarlas para la clase agiscript encargada de retornar el IVR (dialplan) Methods inherited from class com.ciscagi.dao.SecuryDao consultaItem, consultaItems, consultaOpciones, getLogon, proce dimientoAlmacenado, procedimientoAlmacenadoItems,procedi mientoAlmacenadoItemsPorMenu, procedimientoAlmacenadoO pcionesPorMenuItems FuncionalidadesAgi Script Methods inherited from class com.ciscagi.utilitarios.Utils anidarXml, convertstring, diferenciaDias, differenceTime, esCe dulaValida, fechaHoraActual, formarFormasxml,formarJournalx ml, formarSignxml, generarDate, generarHora, generarNumero ConCeros, getVersion, leerDocDOM, loadXml, main,messagex ml, messagexml, messagexml1, messageXmlPrinter, obtenerCan tidadDigitos, obtenerFechaDeFormateoEspecial,readDocDOM, readNodosxml, redondeoDecimalDouble, validarNulo, verificar Cedula, verificarXml 20 Methods inherited from class com.ciscagi.utilitarios.Formateador fechaStringValue, generarDateSql, generarDateTimeUtil, genera rDateUtil Methods inherited from class java.lang.Object equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Field Detail items public int items privates **************************** ivr public java.lang.String ivr timeout public java.lang.Long timeout 21 digits public int digits candado public java.lang.String candado digitsLock public int digitsLock opc public int opc ivrLock public java.lang.String ivrLock idopc public int idopc idivr 22 public int idivr accion public java.lang.String accion send public java.lang.String send avanza public boolean avanza mailEstud public java.lang.String mailEstud Method Detail getIdopc public int getIdopc() setIdopc public void setIdopc(int idopc) 23 getIdivr public int getIdivr() setIdivr public void setIdivr(int idivr) getAccion public java.lang.String getAccion() setAccion public void setAccion(java.lang.String accion) getSend public java.lang.String getSend() setSend public void setSend(java.lang.String send) getIvrLock public java.lang.String getIvrLock() 24 setIvrLock public void setIvrLock(java.lang.String ivrLock) getItems public int getItems() setItems public void setItems(int items) getIvr public java.lang.String getIvr() setIvr public void setIvr(java.lang.String ivr) getTimeout public java.lang.Long getTimeout() setTimeout 25 public void setTimeout(java.lang.Long timeout) getDigits public int getDigits() setDigits public void setDigits(int digits) getCandado public java.lang.String getCandado() setCandado public void setCandado(java.lang.String candado) getDigitsLock public int getDigitsLock() getDigitsLock public void getDigitsLock(int digitsLock) 26 getOpc public int getOpc() setOpc public void setOpc(int opc) items public void items(ReadXMLIVR readm) throws java.lang.Exception Throws: java.lang.Exception opcion public void opcion(ReadXMLIVR readm, int opc) nextItemsIvr public void nextItemsIvr(int it, ReadXMLIVR readm) Determina el siguiente items 27 Parameters: items readm Throws: java.lang.Exception sayTTS public void sayTTS(java.lang.String string, org.asteriskjava.fastagi.AgiChannel channel) throws java.lang.Exception Función encargada de transformar texto a voz en español usando tts festival Parameters: string channel Throws: java.lang.Exception envioMail public int envioMail(java.lang.String messages, 28 java.lang.String destinatario, java.lang.String cedula) stringConvertSounds public java.lang.String stringConvertSounds(java.lang.String string, org.asteriskjava.fastagi.AgiChannel channel) throws java.lang.Exception Funcion encargada de convertir una determinada cadena a un archivo de sonido devolviendo su ubicacion y nombre Parameters: string channel Returns: String (ubicacion y nombre del archivo) Throws: java.lang.Exception eliminarUlaw 29 public void eliminarUlaw(java.lang.String ruta, org.asteriskjava.fastagi.AgiChannel channel) throws java.lang.Exception Elimina los archivos de audio creados por el tts y despues reproducidos en la llamada esperando un digito de respuesta para acceder una respuesta IVR Parameters: ruta channel Throws: java.lang.Exception verificaDataCandado public boolean verificaDataCandado(java.lang.String candado, org.asteriskjava.fastagi.AgiChannel channel) ReadXMLConsulta Constructor Detail 30 ReadXMLConsulta public ReadXMLConsulta(java.lang.String archivo) cosntructor **************************** Method Detail GetOpcionesMS public java.util.List<java.util.Vector> getOpcionesMS() getters and setters **************************** setOpcionesMS public void setOpcionesMS(java.util.List<java.util.Vector> opcionesMS) getOpcionesTS public java.util.List<java.util.Vector> getOpcionesTS() setOpcionesTS public void setOpcionesTS(java.util.List<java.util.Vector> opcionesTS) 31 getOpcionesHC public java.util.List<java.util.Vector> getOpcionesHC() setOpcionesHC public void setOpcionesHC(java.util.List<java.util.Vector> opcionesHC) crearDocDOM public org.w3c.dom.Document crearDocDOM(java.lang.String fichero) Busca file dentro de repositorio Parameters: fichero Returns: Document leerDocDOM public void leerDocDOM(org.w3c.dom.Document docDOM) Lee file tipo Document el debe tener un xml y es recorrido uno a uno sus nodos para setear campos de conexion 32 Parameters: docDOM - Constructor Detail ReadXMLIVR public ReadXMLIVR(java.lang.String archivo) cosntructor **************************** Method Detail GetItems public java.util.List<java.util.Vector> getItems() ReadXMLIVR getters and setters **************************** setItems public void setItems(java.util.List<java.util.Vector> items) getOpciones public java.util.List<java.util.Vector> getOpciones() setOpciones 33 public void setOpciones(java.util.List<java.util.Vector> opciones) crearDocDOM public org.w3c.dom.Document crearDocDOM(java.lang.String fichero) Busca file dentro de repositorio Parameters: fichero Returns: Document leerDocDOM public void leerDocDOM(org.w3c.dom.Document docDOM) Lee file tipo Document el debe tener un xml y es recorrido uno a uno sus nodos para setear campos de conexion Parameters: docDOM - 34 3.2.2. CISCAGI-AMI Class Summary Clase que permite la comunicacion con la base de datos. Constructor Summary BaseDatosManager() Constructor que permite iniciar la comunicación con la base de datos. Method Summary BaseDatosManage java.lang.String[] listarExtensiones() r Permite obtener una lista de las extensiones asignadas a usuarios en la base de datos. static void main(java.lang.String[] args) Methods inherited from class java.lang.Object equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, 35 wait Constructor Detail BaseDatosManager public BaseDatosManager() Constructor que permite iniciar la comunicación con la base de datos. Method Detail listarExtensiones public java.lang.String[] listarExtensiones() Permite obtener una lista de las extensiones asignadas a usuarios en la base de datos. Returns: El array con las extensiones Clase que permite establecer y terminar una conexión con la API ConexionManager Manager de Asterisk. Field Summary 36 org.asteriskjava.manager.ManagerConnect managerConnectio ion n Identificador lara la conexión con la API Manager que se establecerá Constructor Summary ConexionManager() Permite crear la ManagerConnection necesaria para conectarse a la API Manager. Method Summary void finalizarConexion() Finaliza la conexión a la API Manager. void iniciarConexion() Inicia la conexión a la API Manager. 37 Methods inherited from class org.asteriskjava.manager.AbstractManagerEventListener OnManagerEvent Methods inherited from class java.lang.Object equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Field Detail managerConnection public org.asteriskjava.manager.ManagerConnection managerConnection Identificador lara la conexión con la API Manager que se establecerá Constructor Detail ConexionManager public ConexionManager() throws java.io.IOException Permite crear la ManagerConnection necesaria para 38 conectarse a la API Manager. Throws: java.io.IOException - Si la conexión de red falla Method Detail iniciarConexion public void iniciarConexion() throws java.io.IOException, org.asteriskjava.manager.AuthenticationFailedException, org.asteriskjava.manager.TimeoutException Inicia la conexión a la API Manager. Throws: java.io.IOException - Si la conexión de red falla org.asteriskjava.manager.AuthenticationFailedException Si falla la autenticación en Asterisk org.asteriskjava.manager.TimeoutException - Si se excede del Timeout finalizarConexion public void finalizarConexion() 39 Finaliza la conexión a la API Manager. Clase que permite leer y escribir en los archivos de configuración de la centralita PBX Asterisk. Constructor Detail ConfiguracionFicheros public ConfiguracionFicheros(java.lang.String file) throws java.io.IOException, ConfiguracionFich org.asteriskjava.manager.AuthenticationFailedException, org.asteriskjava.manager.TimeoutException eros Constructor que permite inicializar la conexión a la API Manager de Asterisk, así como los campos de la clase. Parameters: file - Nombre del archivo de configuración a leer/escribir Throws: java.io.IOException - Si la conexión de red falla org.asteriskjava.manager.AuthenticationFailedException Si falla la autenticación en Asterisk 40 org.asteriskjava.manager.TimeoutException - Si se excede del Timeout ConfiguracionFicheros public ConfiguracionFicheros(java.lang.String file, ConexionManager con) throws java.io.IOException, org.asteriskjava.manager.AuthenticationFailedException, org.asteriskjava.manager.TimeoutException Constructor que permite asociar este servicio a una conexión a la API Manager de Asterisk ya creada e inicializada. Parameters: file - Nombre del archivo de configuración a leer/escribir con - ConexionManager ya inicializada Throws: java.io.IOException - Si la conexión de red falla org.asteriskjava.manager.AuthenticationFailedException Si falla la autenticación en Asterisk 41 org.asteriskjava.manager.TimeoutException - Si se excede del Timeout Method Detail listarCategorias public void listarCategorias() Permite lanzar la acción GetConfigAction para el archivo de configuración cuyo nombre sea el que figura en el campo archivo. Además, después obtiene una lista de las categorías disponibles y la almacena en el campo cat. Throws: java.io.IOException - Si la conexión de red falla org.asteriskjava.manager.TimeoutException - Si se excede del Timeout buscarCategoria public int buscarCategoria(java.lang.String categ) Permite buscar una categoría determinada dentro de un archivo de configuración de Asterisk. 42 Previamente debe haberse ejecutado el código listarCategorias(). Parameters: categ - El nombre de la categoría a buscar Returns: -1 si no lo encontró. Un valor mayor que 0 indicará la posición que ocupa la categoría en la variable cat See Also: org.yournamehere.server.ConfiguracionFicheros#listarCate gorias() listarCaracteristicas public java.lang.String[][] listarCaracteristicas(int index) Obtiene las características de una categoría concreta, indicada con su índice (lugar que ocupa en el campo cat. Si no se conociera el índice del mismo, pero sí el nombre de la categoría, hay que usar primero el código buscarCategoria(String), el cual devolverá el índice deseado. Parameters: 43 index - El índice que ocupa la categoría de la que queremos extraer las características Returns: La lista de características, separando en la primera columna el nombre de la característica y en la segunda el valor de la misma. Por filas, las diferentes características See Also: org.tutatisk.server.ConfiguracionFicheros#buscarCategoria (java.lang.String) buscarCaracteristica public int buscarCaracteristica(java.lang.String[][] lista, java.lang.String carac) Permite buscar una característica determinada dentro del array de características pasado como argumento. Previamente se recomienda haber ejecutado el código listarCaracteristicas(int) para obtener el array que pasar como argumento. Parameters: carac - El nombre de la característica a buscar 44 Returns: -1 si no lo encontró. Un valor mayor que 0 indicará la posición que ocupa la característica en la variable lista See Also: org.yournamehere.server.ConfiguracionFicheros#listarCara cteristicas(int) crearAccionEscritura public MyUpdateConfigAction crearAccionEscritura() Permite crear la acción MyUpdateConfigAction para poder realizar la escritura en los archivos de configuración de Asterisk. Posteriormente a este código, habrá que añadir los comandos a enviar y enviar la acción. Para ello ver incluirComandos(String[], String[], String[], String[], String[], MyUpdateConfigAction) y enviarAccionEscritura(MyUpda teConfigAction). Returns: La acción MyUpdateConfigAction creada 45 incluirComandos public void incluirComandos(java.lang.String[] com, java.lang.String[] cat, java.lang.String[] var, java.lang.String[] val, java.lang.String[] mat, MyUpdateConfigAction accion) Permite añadir a una acción MyUpdateConfigAction múltiples comandos para escribir.Cada comando completo estará formado por un elemento de cada array de String pasado como argumento. Por ejemplo, para enviar dos comandos, cada uno de esos 5 arrays tendrá una longitud de 2, y en el índice 0 estará el primer comando y en el índice 1 estará el segundo. Parameters: com - Array con todos los comandos a enviar sucesivamente. Para ello, ver los comandos en los campos estáticos de MyUpdateConfigAction cat - Array con todas las categorías a las que se referirán 46 cada uno de los comandos anteriores var - Array con las variables para cada comando val - Array con los valores de las variables anteriores mat - Array con los valores match para los anteriores comandos accion - Acción MyUpdateConfigAction sobre la que añadir los comandos enviarAccionEscritura public void enviarAccionEscritura(MyUpdateConfigAction accion) throws java.io.IOException, org.asteriskjava.manager.TimeoutException Permite enviar la acción ya completa MyUpdateConfigAction a la conexión a la API Manager. Parameters: accion - La acción MyUpdateConfigAction a enviar Throws: java.io.IOException - Si la conexión de red falla org.asteriskjava.manager.TimeoutException - Si se excede 47 del Timeout getArchivo public java.lang.String getArchivo() Devuelve el campo archivo Returns: El nombre del archivo de configuración a leer/escribir setArchivo public void setArchivo(java.lang.String arc) Modifica el campo archivo Parameters: arc - El nombre del archivo de configuración a leer/escribir Clase que permite gestionar todo lo relacionado con usuarios: Registro Modificación de datos Eliminación de usuario GestionUsuarios Constructor Detail GestionUsuarios public GestionUsuarios(java.lang.String usuario, 48 java.lang.String password, java.lang.String dni, java.lang.String extension, java.lang.String nombre, java.lang.String apellido1, java.lang.String apellido2, java.lang.String email, java.lang.String telefono, java.lang.String tipo, BaseDatosManager bbdd) Inicializa un objeto. Inicializa el usuario. Se le pasa como argumento la manager de la base de datos. Parameters: usuario - El nick de usuario password - La contraseña para el acceso web dni - El DNI de la persona en formato 11111111A. A su vez, la clave por defecto para la conexión SIP será el DNI sin la letra, en este caso, 11111111 (al querer que sea numérico) extension - La extensión escogida por el usuario 49 nombre - El nombre del usuario apellido1 - El primer apellido apellido2 - El segundo apellido email - El email telefono - El teléfono de contacto del usuario (ajeno al sistema) tipo - El tipo de usuario que es. Hay tres disponibles: Alumno, Profesor y Administrador bbdd - La manager de la base de datos Method Detail Registrar public java.lang.String registrar() Permite registrar un usuario en el sistema, tanto en la base de datos como en la centralita asterisk. Returns: Mensaje de éxito/fracaso al registrar usuario setUsuario public void setUsuario(Usuario us) 50 Modifica el usuario sobre el que se realiza la gestión Parameters: us - CiscagiUsuario a gestionar eliminar public java.lang.String eliminar() Permite eliminar un usuario en el sistema, tanto en la base de datos como en la centralita asterisk. Returns: Mensaje de éxito/fracaso al eliminar usuario modificar public java.lang.String modificar(Usuario us, java.lang.String passAsterisk) Permite modificar los datos de un usuario ya registrado. Además, da la opción de que la contraseña web sea diferente de la contraseña de la extensión del usuario y de su buzón de voz. Al crear el usuario, por defecto se habà an cogido los números del DNI (la letra no). Parameters: 51 us - Los datos del nuevo usuario, dentro de un objeto de la clase CiscagiUsuario passAsterisk - La contraseña que queremos poner a la extensión y buzón de voz Returns: Mensaje de éxito/fracaso al modificar usuario Clase encargada de ejecutar las distinas acciones con el AMI Constructor Detail MyUpdateConfigAction public MyUpdateConfigAction() MyUpdateConfig MyUpdateConfigAction Action public MyUpdateConfigAction(java.lang.String srcFilename, java.lang.String dstFilename, boolean reload) Method Detail addCommand public void addCommand(java.lang.String action, 52 java.lang.String cat, java.lang.String var, java.lang.String value, java.lang.String match) Overrides: addCommand in class org.asteriskjava.manager.action.UpdateConfigAction ghostActionString public java.lang.String ghostActionString() getReload public java.lang.String getReload() Overrides: getReload in class org.asteriskjava.manager.action.UpdateConfigAction Documentación técnico de clases de cliente Flex y sus distintas paqueterías. En el aplicativo cliente AIR/Flex esta dividido en tres proyectos: 53 CISCAGI VIEWER : Proyecto AIR/Flex encargado de proveer la interfaz grafica y principal del proyecto. CISCAGI LIBRARY: Proyecto tipo Modules encargado de proveer las diferentes librerías y clases utilitarios para el resto del proyecto. ModuloIVR: Modulo encargado de generar interfaz grafica para consulta de menú IVR estas no se generan de manera genérica ya que su i nterfaz en un poco más compleja pero el proyecto AIR/Flex permite generar formas genéricas así también permite el ingreso de módulos de extensión swf. Estos ingresos si son de manera fácil solo bastaría con ingresarlo dentro de la base objetos. 3.2.3. CISCAGIVIEWER Packages src.default Contiene las distintos utilitarios utilizados tales como definiciones src.assets de hojas de estilo, imágenes, skins, fonts. Contiene paquetes tales como: ciscagi: Contiene clases principales del proyecto tales como: src.com Clases de conexiones a SQL Lite Clases de conexiones via com. 54 Clases de mapeo para los distintos eventos. Clases de manejo de interfaces GUI genéricas, objeto abierto y modules de extensión swf. flexmdi: Contiene clases actiosnscripts para los manejo de diseños de las distintas GUI, tales como el uso de reflejos, manejo de las hojas de estilo y skins. 3.2.4. CISCAGILIBRARY Packages Contiene las distintos utilitarios utilizados tales como definiciones assets.images de hojas de estilo, imágenes. Contiene paquetes tales como: Constants:Contiene el definiciones de contantes utilizados en los proyectos. alexsoft.common Controls: Contiene clases actiosnscripts para los distintos controles generales de las GUI. Log :Contiene las constantes de clase Logs. Utilis: Contiene los distintos clases que ayudaran con utilitarios 55 básicos tales como las diferentes validaciones tanto de identificación , fechas, formatos etc. Contiene las distintas clases de manejo de eventos para las alexsoft.events diferentes formas. Contiene las clases tipo entidades para el manejo de objetos alexsoft.vo predeterminados para este proyecto. 3.2.5. ModuloIVR Packages Contiene la clase: Class moduloivr.mxml See Also: src.default Clase encargada de presentar la GUI principal que invocara a los distintos mxml para funciones de consulta de totales y de transacciones. src.modules Contiene paquetes tales como: 56 events: Contiene la definiciones manejo de eventos. maps: Contiene las rutas de los eventos sucitados en el proyecto GUI. model :Contiene las clases manejadoras de funciones trascendentales para el modulo. ui: Contiene los distintos clases GUI para transacciones y consulta de totales. 57 4. DIAGRAMAS DE LA APLICACIÓN 4.1. Diagrama de desarrollo CISCAGI Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 58 4.2. Diagrama general de secuencia CISACAGI IVR. Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 59 4.3. Diagrama general de secuencia CISACAGI administrador. Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 60 4.4. Diagramas UML 4.6.1. UML AGISCRIPT. Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 61 4.4.2. UML CISCAGI AMI1 Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 62 4.6.3. UML CISCAGI AMI2 Fuente: Datos de la Investigación Elaborado: Autores de la Tesis 63 5. INSTALACIONES Y CONFIGURACIONES. 5.1. Instalación Asterisk (Distribución Elastix). Inserte el CD de instalación de Elastix al momento de encender su máquina. Una vez hecho esto aparecerá una pantalla como la siguiente: Si usted es un usuario experto puede ingresar en modo avanzado digitando el comando: advanced Caso contrario espere, el CD de instalación iniciará la instalación automáticamente ó presione enter. Proceda a escoger el tipo de teclado de acuerdo al idioma. Si su teclado es de idioma español seleccione la opción es: 64 Seleccione la hora zona horaria de su región: Digite la contraseña que será usada por el administrador de Elastix. Recuerde que esta es una parte crítica para la seguridad del sistema. 65 Nota: Los procedimientos a continuación los realizará el CD de instalación de manera automática. Primero se buscará las dependencias necesarias para la instalación: 66 Luego se procede con la instalación, inicialmente usted verá algo como esto: Imagen del proceso de instalación por finalizar: Una vez se realice la instalación completa, se procede a reiniciar el sistema. Luego de reiniciar el sistema usted podrá escoger entre las opciones de boot la distro de Elastix. Ingrese como usuario root y la contraseña digitada al momento de la instalación. 67 5.2. Instalación Festival. (TTS [Conversor de texto a voz]). Una vez instalado Asterisk, se procederá a la instalación de los paquetes adicionales para el funcionamiento del sistema e iniciaremos con el Festival, software usado para las funciones del TTS. Para esto se ejecutamos en el promt del root el comando “yum install festival”, esta sentencia descargará, descomprimirá e instalará el paquete festival que de manera predeterminada viene en inglés, así que ahora procedemos a instalar el paquete de español disponible en [FES2007], descargando el archivo de extensión .tar.gz y descomprimiéndolo para un mejor desempeño en nuestro entorno. Para programar el lenguaje a ser utilizado, alteraremos el archivo festival.scm, ubicado en /usr/share/festival, al cual le agregaremos el siguiente script para usar por defecto el lenguaje español en modo servidor: ARCHIVO FESTIVAL.SCM – LENGUAJE ESPAÑOL (language_spanish) (set! voice_default 'voice_pc_diphone) Una vez hecho esto, agregaremos un script en el mismo archivo que permitirá que Asterisk interactúe directamente con Festival, el cual define la forma en que Asterisk pasará las cadenas de texto a ser reproducidas: ARCHIVO FESTIVAL.SCM – INTERACCION ASTERISK ;; Command for Asterisk begin 68 (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." (utt.send.wave.client (utt.wave.resample (utt.wave.rescale (utt.synth (eval (list 'Utterance 'Text string))) 5) 8000))) ;;; Command for Asterisk end Finalmente se crea un usuario en el archivo festival.conf ubicado en /etc/asterisk en el cual indicaremos las características de la conexión entre Asterisk y Festival, indicando la ubicación del host Festival, en el caso de este proyecto encontrándose juntos: el puerto y el comando, entre otros: ARCHIVO /ETC/ASTERISK/FESTIVAL.CONF [general] host=localhost port=1314 usecache=yes cachedir=/var/cache/asterisk/festival/ festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n 69 5.3. Instalación Cacti (Monitorizador de Servidores). Esta herramienta gráfica de red que extrae los datos desde el snmp para poder monitorizar de manera gráficas los recursos de nuestros servidores y otros equipos en la red. Dependencias a instalar: MySQL: Almacenar datos cacti. Servidor de NET-SNMP - SNMP (Simple Network Management Protocol). PHP con el módulo Net-SNMP - SNMP de datos de Access mediante PHP. Apache / lighttpd / ngnix servidor web: servidor web para mostrar gráficos creados con PHP y RRDtool. Luego de instaladas estas dependencias, ejecutamos el comando “php –m | less” para verificar que PHP tenga los siguientes módulos externos: -mysql -snmp -xml -session -sockets El siguiente paso será editar el archivo de configuración “/etc/php.ini” y modificar el siguiente parámetro: extensión_dir = /etc/php.d 70 En ese directorio se encuentran mayormente las librerías necesarias, pero en caso de CentOs y otras distribuciones, estas librerías se encuentran en “/usr/lib/php/modules” así que necesitaremos copiar las librerías ubicadas en ese directorio y copiarlas a “/etc/php.d”, con el siguiente comando lo hacemos: cp /usr/lib/php/modules/* /etc/php.d/ Y verificamos, modificamos o creamos los siguientes archivos del directorio /etc/php.d/ En /etc/php.d/mysql.ini ; Enable mysql extension module extension=mysql.so En /etc/php.d/snmp.ini ; Enable snmp extension module extension=snmp.so Luego de verificar que este todo correcto hasta el momento, debemos modificar el archivo /etc/php.ini, verificando que este parámetro este de la siguiente manera: file_upload = on ::: Para permitir la importación de plantillas ::: 71 Configurando Apache Editamos el archivo de configuración /etc/httpd/conf.d/php.conf y verificamos que los siguientes parámetros estén de la siguiente manera: LoadModule php5_module modules/libphp5.so AddHandler php5-script .php AddType text/html .php DirectoryIndex index.php Configurando Mysql Subimos el servicio de mysql, con el comando ''service mysqld start'' Le damos una password a root: mysqladmin –-user=root password „contraseña‟ Instalando Cacti Para instalar cacti en CentOS es necesario tener los repositorios RPMforge, para su instalación: Descargamos los repositorios dependiendo de su arquitectura: X86: wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm 72 X86_64: Wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.11.el5.rf.x86_64.rpm Importamos las llaves Públicas: rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt Instalamos el paquete: rpm –i rpmforge-release-XXX.XXX.XXX.rpm Y verificamos que se instalaron los repositorios con: yum check-update Luego podemos instalar Cacti, con todas las dependencias necesarias. yum install cacti Entre las dependencias que se instalaran están: -rrdtool -perl-rrdtool 73 Cuando finalice la instalación, podemos verificar que Cacti se instalo en /var/www/cacti, y que creó un alias en /etc/http/conf.d/ llamado cacti.conf Creación de base de datos MYSQL para datos de cacti Nos ubicamos en /var/www/cacti, y usamos mysql para crear nuestra base de datos para cacti. Shell>mysqladmin –-user=root –p create cacti shell> mysql --user=root -p cacti < cacti.sql shell> mysql --user=root -p mysql mysql> GRANT ALL ON cacti.* TO cacti@localhost IDENTIFIED BY „Contraseña‟; mysql> flush privileges; mysql> exit Editamos el archivo /var/www/cacti/include/config.php, y verificamos que los siguientes parámetros estén de la siguiente manera: $database_type = "mysql"; $database_default = "cacti"; $database_hostname = "127.0.0.1"; 74 $database_username = "cacti"; $database_password = "contraseña"; Asignando permisos necesarios Nos ubicamos en el directorio /var/www/, y le cambiamos el propietario a la carpeta cacti, le ponemos como propietario a apache. chown –R apache.apache cacti/ Entramos al directorio cacti, y le cambiamos el usuario a las carpetas rra y log. chown –R cacti rra/ log/ Agregamos a /etc/crontab, lo siguiente: */5 * * * * cacti php /var/www/html/cacti/poller.php > /dev/null 2>&1 Reiniciamos los servicios service httpd restart service snmpd restart service mysqld restart 75 Y entramos desde nuestro explorador a htto://localhost/cacti/ Elegimos nueva instalación 76 3er Paso – Confirmamos todas las rutas En caso de falta de paquetes, instalar net-snmp-utils 4to Paso – Ingresar a Cacti El UserName y el Password son admin, luego nos pedirá que escribamos la nueva contraseña. 77 Graficando la Red El primer paso para crear gráficas de la red es agregando un host por cada host en la red que se desea crear gráficas. Un host especifica detalles importantes como el nombre del host, parámetros SNMP y el tipo de host. Para manejar equipos dentro de Cacti, haga click en Devices en el menú de la izquierda. Luego haga click en Add para llenar el formulario de una nuevo equipo. Los primeros dos campos, Description y Hostname son los únicos campos que requieren entrada más allá de las por defecto. Si su tipo de host está definido bajo el menú desplegable, asegúrese de seleccionar este en el menú. Usted siempre puede elegir “Generic SNMPenables host” si solo va a graficar tráfico o “None” si no está seguro. Ahora que ha creado nuevos equipos, es tiempo de crear gráficas para el mismo. Para hacer esto, selección del menú de la izquierda la opción “New Graphs”. Si aun está en la 78 pantalla de editar el equipo, seleccione “Create Graphs for this Host” para ver una pantalla similar a la siguiente imagen mostrada mas abajo. El menú desplegable que contiene cada equipo debe ser usado para seleccionar el equipo al cual usted quiere crear nuevas gráficas. El concepto básico en esta página es simple, seleccione el cuadro de verificación en cada columna que usted quiere crear una grafica y haga click en “Create”. Si usted está creando gráficas dentro de la caja “Data Query”, hay algunas cosas adicionales para tener en mente. Primero es que se puede encontrar con la situación mostrada en la grafica mostrada más arriba con la consulta de datos “SNMP – Interface Statistics”. Si esto ocurre usted quizás quiera consultar la sección en consultas de datos en depuración para ver porque su consulta de datos no está retornando ningún resultado. También, usted quiera ver el menú desplegable debajo de algunas cajas de consulta de datos. Cambiando el valor de este menú afecta cual tipo de grafica Cacti construirá 79 después de hacer click en el botón “Create”. Cacti solo muestra este menú cuando hay más de un tipo de donde escoger, así que puede que no se muestre en todos los casos. Una vez ha seleccionado las gráficas que quiere crear, simplemente haga click en el botón “Create” al final de la página. Usted será llevado a una nueva página que le permite especificar información adicional sobre las gráficas que esta por crear. Solo vera los campos que no son parte de cada plantilla, de todas formas el valor viene automáticamente de la plantilla. Cuando todos los valores en esta página parezcan correctos, haga click en el botón “Create” una última vez para crear finalmente las gráficas. Si le gustaría editar o eliminar gráficas después de haberlas creado, use el enlace “Graph Management” en el menú de la izquierda de la pagina. Viendo las graficas En la parte superior de la página haga click en el boton “graphs” para ver las graficas. 80 5.4. Configuration AMI (Asterisk Manager Interface) La Interface de Administración de Asterisk, cuando se encuentra habilitada, abre un socket TCP/IP (utiliza como puerto por defecto el 5038), éste es utilizado por un programa cliente que se conecta a Asterisk y con ello tiene la facultad de ejecutar comandos y leer las respuestas y eventos generados por el PBX. Para poder utilizar esta característica es necesario establecer una sesión de administrador (Manager Sesión) y autenticarse como tal. Para tal efecto debemos crear una cuenta de administración (nombre de usuario y contraseña) en el archivo /etc/asterisk/manager.conf. En este mismo archivo se establecerán los permisos y atribuciones a los que cada cuenta tiene derecho. Esta interfaz permite a las aplicaciones externas la capacidad de crear, monitorizar y gestionar Asterisk. Es decir que permite la manipulación de los archivos de configuración de los contextos de los distintos archivos de configuración del Asterisk. Para esto debemos acceder al asterisk y ubicarnos en la siguiente ruta /etc/asterisk/manager.conf Este archivo deberá contener lo siguiente: 81 [general] displaysystemname = yes enabled = yes port = 5038 bindaddr = 127.0.0.1 displayconnects = yes ; Cuenta de usuario astmanproxy [usuario] secret = supersegura ; Contraseña deny=0.0.0.0/0.0.0.0 ; Host's a los que se les niega conexión permit=127.0.0.1/255.255.255.255 ; Host's a los que se les permite conexión (localhost en este caso) ; Permisos de lectura y escritura para 'usuario' read = system,call,log,verbose,command,agent,user,config write = system,call,log,verbose,command,agent,user,config Para nuestro proyecto quedaría así: 82 ; ; Asterisk Call Management support ; [general] enabled = yes port = 5038 bindaddr = 0.0.0.0 [admin] secret = elastix456 ;deny=0.0.0.0/0.0.0.0 ;permit=127.0.0.1/255.255.255.0 permit=0.0.0.0/0.0.0.0 read =all,system,call,log,verbose,command,agent,user,agi,config,originate,a write =all,system,call,log,verbose,command,agent,user,agi,config,originate,a #include manager_additional.conf #include manager_custom.conf El puerto por defecto es el 5038 se deberá dar permisos de IP permit=0.0.0.0/0.0.0.0 En las siguientes líneas se dará permisos de escritura y lectura al AMI read =all,system,call,log,verbose,command,agent,user,agi,config,originate,a 83 write =all,system,call,log,verbose,command,agent,user,agi,config,originate,a Las líneas resaltadas son los permisos agregados siendo los más importantes agi, originate para manipular el AMI. El user y Password para ingresar al AMI mediante una aplicación para este caso es user=admin Password=elastix456 (la clave varia segun la distribución asterisk a usar esto es para Elastix.). 5.5. Configuración CDR CDR (Call Detail Records) Un registro de detalle de llamadas (CDR) es el registro informático producido por una central telefónica con los detalles de una llamada originada, interna o externa del lugar de operaciones del PBX. Asterisk normalmente almacena el Registro de Detalles de Llamadas en valores separados por coma en el archivo (CSV). Si desea que el CDR sea almacenado en una base de datos, tendrá que cargar el módulo apropiado y definir el archivo en cuestión. Campos del CDR 1. accountcode: ¿Qué número de cuenta de usar: cuenta de facturación de Asterisk, 2. src: Caller * número de identificación. 3. dst: Extensión de destino. 4. dcontext: Contexto de destino. 5. clid: Caller * ID con el texto. 6. Channel: Canal utilizado. 84 7. dstchannel: Canal de destino, si procede. 8. lastapp: La última aplicación en su caso. 9. lastdata: La última solicitud de datos. 10. start: Inicio de la llamada (fecha/hora). 11. answer: Respuesta de la llamada (fecha/hora). 12. end: Fin de la llamada (fecha/hora). 13. duration: Tiempo total en el sistema, en segundos (entero), de marcar para colgar. 14. billsec: Llamada en tiempo total es, en cuestión de segundos (entero), de respuesta a Colgar. 15. disposition: ¿Qué pasó con la llamada? RESPONDIDAS, NO RESPONDIDAS, OCUPADA, FALLIDA (en algunos backends CDR, por ejemplo, ODBC, estos pueden ser números enteros; en cuenta que información más detallada se puede encontrar en la variable HANGUPCAUSE). 16. amaflags: ¿Qué parámetros de uso? FACTURACIÓN, IGNORAR, etc. Especificado en una base por canal como accountcode. 17. user field: Un usuario definido por el campo. $ dialplan 85 5.6. Configurando Asterisk para guardar los registros del CDR en MySQL Por default Asterisk guarda los registros de llamadas en un archivo llamado Master.csv el cuál es un archivo de texto separado por comas, pero para otros fines a veces es necesario tenerlo en una base de datos para su posterior consulta, por ello pongo aquí un tutorial de como conectar Asterisk a MySQL para guardar los CDRs. Por cuestión de licencias de MySQL, Asterisk ya no incluye la opción de guardar los registros en una base de datos de MySQL, por lo que ahora esa opción viene en Asterisk-addons el cuál se tiene que bajar para la versión de Asterisk a usar y compilarla. wgethttp://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-addons1.4.9.tar.gz sudo tar -xzvf asterisk-addons-1.4.9.tar.gz cd asterisk-addons-1.4.9 #Luego de que se descargue y se descomprima la versión de Asterisk Addons se tendrán que editar los siguientes archivos sudo editor cdr/cdr_addon_mysql.c #agregar al principio la siguiente línea tal como está #define MYSQL_LOGUNIQUEID sudo editor cdr/Makefile 86 #agregar al final la siguiente línea tal como está CFLAGS+=-DMYSQL_LOGUNIQUEID #ahora si compilamos asterisk-addons sudo make clean && sudo ./configure && sudo make && sudo make install #si es una instalación nueva tendrías que ejecutar despues sudo make samples, si no, no es recomendable para que no borre configuraciones ya realizadas. #si todo salió bien en la compilación ahora edita el archivo sudo editor /etc/asterisk/modules.conf # y agrega al final load => cdr_addon_mysql.so #ahora crea un usuario con su password y una base de datos de mysql que será para el cdr de asterisk mysql -u root -p create database asteriskcdrdb; grant all privileges on asterisk.* to asterisk@localhost identified by"password"; flush privileges; exit; sudo editor asterisk.sql # crea un archivo y agrega lo siguiente 87 CREATE TABLE `cdr` ( `calldate` datetime NOT NULL default '0000-00-00 00:00:00', `clid` varchar(80) NOT NULL default , `SRC` V A R C HA R (80) NOT NULL DE FA UL T , `dst` varchar(80) NOT NULL default , ` D C ON T E X T ` V A R C HA R (80) NOT NULL D E FA UL T , `channel` varchar(80) NOT NULL default , `DSTCHANNEL ` V A R C HA R (80) NOT NULL DE F AU L T , `lastapp` varchar(80) NOT NULL default , `LASTDATA` V A R C H A R (80) NOT NULL D E FA UL T , `duration` int(11) NOT NULL default '0', `billsec` int(11) NOT NULL default '0', `disposition` varchar(45) NOT NULL default , ` AM A F L A GS ` I N T (11) ` A C C O U N T C OD E ` NOT NULL V A R C HA R (20) DE FA UL T NOT NULL '0', DE FA UL T `uniqueid` varchar(32) NOT NULL default , ` U S E R FI E L D ` V A R C H A R (255) NOT NULL DE F AU L T ); ALTER TABLE `cdr` ADD INDEX ( `calldate` ); ALTER TABLE `cdr` ADD INDEX ( `dst` ); , 88 ALTER TABLE `cdr` ADD INDEX ( `accountcode` ); #ahora ejecutemos el script de sql mysql -u asterisk -p asteriskcdrdb < asterisk.sql #ahora solo falta editar la conexión de asterisk a mysql, para eso editar el siguiente archivo sudo editor /etc/asterisk/cdr_mysql.conf #aqui editar los siguientes valores [global] hostname = localhost dbname=asteriskcdrdb table=cdr password = password user = Asterisk port=3306 sock=/var/run/mysqld/mysqld.sock userfield=1 #es importante que en sock= asignes dónde mysql coloca ese arhivo en Debian y ubuntu por default lo pone en /var/run/mysqld/mysqld.sock 89 #Ahora ya teniendo casi todo listo solo inicia asterisk sudo asterisk start #si usas freepbx entonces sudo amportal restart #verificamos que se haya cargado el módulo de mysql para Asterisk sudo asterisk -rvvv PhylevnMobile*CLI> module show like mysql #y debería mostrar algo como lo siguiente Module Description Use cdr_addon_mysql.so MySQL CDR Backend 0 Interface 0 Driver 0 app_addon_sql_mysql.so res_config_mysql.so Simple Mysql MySQL RealTime Configuration 3 modules loadedI> #ahora vemos el status de la conexión de MySQL PhylevnMobile*CLI> cdr mysql status #y mostraría algo como lo siguiente Count 90 Connected to asteriskcdrdb@localhost, port 3306 using table cdr for 1hours, 1 minutes, 0 seconds. Wrote 1 records since last restart. -- Registered IAX2 '300' (AUTHENTICATED) at 127.0.0.1:32768 #Si dice Not Connected entonces verificar los parámetros de conexión a la base de datos e igual checar que la base de datos esté dada de alta. #salimos PhylevnMobile*CLI> exit #ahora marcamos algún número desde un Softphone o teléfono IP para verificar que esté trabajando. #Checamos el registro de la base de datos mysql .u asterisk -p asteriskcdrdb mysql> select * from cdr; +---------------------+-------------+-----+--------+-----------+------------------+ | calldate | clid | src | dst | dcontext | channel +---------------------+-------------+-----+--------+-----------+------------------+ | 2009-07-21 21:36:44 | "1103" <Support> | 1103 | vmu101 91 +---------------------+-------------+-----+--------+-----------+------------------+ 1 row in set (0.00 sec) 5.7. Configuración FAST-AGI El archivo extensions.conf, el cual se encuentra en “/etc/asterisk” y contiene el plan de discado (dialplan) del contexto “sistema”, será configurado asignando un número al sistema IVR, el cuál será la extensión 601. Esta extensión hará referencia al servidor AGI y al nombre mapeado en fastagi-mapping.properties, archivo de propiedades que será explicado más adelante. Adicionalmente se implementaron 2 extensiones llamadas “usuario0” y “usuario1” en los archivos iax.conf y sip.conf respectivamente para pruebas iniciales en el mismo contexto. Adicionalmente se creó la carpeta “tesis” en la ruta /home/ivrciscagi/error, /home/ivrciscagi/general, /home/ivrciscagi/menu para almacenar las locuciones grabadas. Nota: Estas rutas también se deben configura en la base ciscagisegu en la definición del dial plan ahí se definen las rutas donde están los archivos de sonido. 92 ARCHIVO EXTENSIONS.CONF [sistema] exten => 1234,1,Dial(IAX2/usuario0) exten => 1234,2,Hangup() exten => 1235,1,Dial(SIP/usuario1) exten => 1235,2,Hangup() exten => 600,1,Answer exten => 600,2,SetMusicOnHold(default) exten => 600,5,Background(/tesis/en/00) [outbound-allroutes] exten => #TELEFONICO,1,Agi(agi:// 127.0.0.1/hello.agi) exten => #TELEFONICO,2,Hangup [INbound-allroutes] exten => #TELEFONICO,1,Agi(agi://127.0.0.1/hello.agi) exten => #TELEFONICO,2,Hangup ARCHIVO FASTAGI-MAPING.PROPERTIES hello.agi = com.ciscagifastagi.fastagi.CiscAgiScriptIVR Para esto debemos contar con el paquete Asterisk-Java en una ubicación del sistema de archivos, y el archivo fastagi-mapping.properties, el cual será el encargado de mapear el 93 script realizado en Java correspondiente a la lógica del negocio del IVR a una extensión “.agi” , la cual será empleada para invocar el script remotamente, utilizando el socket ya explicado previamente. El archivo antes mencionado referencia al código propio del IVR llamado CiscAgiScriptIVR.java, el cual se colocará también en la misma ubicación del sistema de archivos que el archivo de mapeo, o en su defecto se colocará la ruta entera de la ubicación de CiscAgiScriptIVR.java en el archivo fastagi-mapping.properties. Con esto realizado sólo queda levantar el servidor, ejecutando org.asteriskjava.fastagi.DefaultAgiServer, el cual levantará el hilo respectivo para recibir los requerimientos FASTAGI vía el puerto 4573. Para la manipulación de ésta variable, se generó el archivo fastagi-mapping.properties, ciscagirouter.xml y se colocó en el Classpath al momento de la ejecución. ARCHIVO CISCAGIROUTER:XML <?xml version="1.0" encoding="UTF-8"?> <configuracion> <!--* Archivo de configuración que me permite setear las distintas bases con la que interactuara el proyecto CiscAgi-Voice entre las cuales están los login y direcciones ip para ingreso a base de seguridades, base de datos de respuesta según ivr (en este caso 94 base de estudiantes de la carrera ingeniería en sistemas), manager del asterisk (para permisos de acceso creación y lectura de archivos en las rutas /etc/asterisk/).******* example: Conexión a base sql <base>sql</base> <url>jdbc:sqlserver://</url> <url>jdbc:microsoft:sqlserver://</url> <serverName>asserver</serverName> <portNumber>1492</portNumber> <databaseName>Fenix</databaseName> <userName>sa</userName> <password>alexsoft</password> <selectMethod>cursor</selectMethod> --> <!-- Conexión a MangerAsterisk; quien proporciona los permisos de conexión al Asterisk y sus distintos archivos para su manipulación tanto lectura y escritura. --> <managerserver>192.168.188.129</managerserver> <managerlogin>admin</managerlogin> <managerpass>elastix456</managerpass> 95 <!-- Conexion a Asterisk --> <urlAsterisk>jdbc:mysql://</urlAsterisk> <serverNameAsterisk>192.168.188.129</serverNameAsterisk> <portNumberAsterisk>3306</portNumberAsterisk> <databaseNameAsterisk>asterisk</databaseNameAsterisk> <userNameAsterisk>root</userNameAsterisk> <passwordAsterisk>123456</passwordAsterisk> <selectMethod>cursor</selectMethod> <!-- Conexion a Base Seguridad --> <urlSecury>jdbc:mysql://</urlSecury> <serverNameSecury>127.0.0.1</serverNameSecury> <portNumberSecury>3306</portNumberSecury> <databaseNameSecury>ciscagisegu</databaseNameSecury> <userNameSecury>root</userNameSecury> <passwordSecury>alexsoftsa</passwordSecury> <selectMethod>cursor</selectMethod> <!-- Conexion a Base Estudiantes --> <urlCisc>jdbc:mysql://</urlCisc> 96 <serverNameCisc>127.0.0.1</serverNameCisc> <portNumberCisc>3306</portNumberCisc> <databaseNameCisc>ciscbd</databaseNameCisc> <userNameCisc>root</userNameCisc> <passwordCisc>alexsoftsa</passwordCisc> <selectMethod>cursor</selectMethod> <tiempoBase>10</tiempoBase> </configuracion> Este archivo contiene las rutas user y password de las base de datos con las que se va a obtener el dialplan y la información a presentar en este caso el de la base de estudiantes. Ahora solo queda correr el jar generado desde la consola java –jar CiscAgiFastAgi.jar. Y está listo para escuchar inBounds u OutBounds según sean los requerimientos y generar el dial plan para responder con la operadora automática. Nota. Este jar se lo puede dejar corriendo como demonio o servicio según sean los requerimientos. 5.8. Configuración de la Base de seguridad CISCAGISEGU Esta base maneja los niveles de seguridad del aplicativo web así como también guarda el dial plan que se generara en la central esta base contiene las rutas de los archivos de 97 sonido así como también las acciones a seguir dependiendo del ingreso DTMF al realizar una consulta. Aquí una breve explicación del contenido de sus tablas y procedimientos: Contiene 7 tablas y 4 procedimientos. Tables: Items: Contiene los ítems es decir todas las líneas dialplan MenuIvr: Contiene las descripciones de los diferentes dialplan y define el principal y con que ítems está ligado. 98 MenuOpcion: Contiene las diferentes acciones a tomar dependiendo de la línea escogida. Permisos: Permiso de visualización en el administrador web. Screen: Pantallas con las que interactuara el administrador web es de donde tomara las diversas pantallas a utilizar. Sesiones User: Permisos de usuario para el administrador web. Procedures: ConsultaItems 99 ConsultaItemsPorMenu ConsultaOpcionesPorItem ConsultaOpcionesPorMenuItem Las tablas contiene la información que se visualice más abajo el Proyecto lo que realice es transformar esta información obtenida desde la base y transformarla en un XML el cual es cargado en una variable y guardado cuando inicie el aplicativo.(No realiza una consulta a la base por cada llamada para extraer la información del dialplan lo hace una sola vez para no cargar demasiado al servidor lo hace al subir el servicio Fastagi). <?xml version='1.0' encoding='iso-8859-1'?> <ivr> <items ivr='/home/ivrciscagi/general/bienvenida' id='1' timeout='0' digits='0' candado='" "' digitsLock='0' ivrLock='" "' ></items> <items ivr='/home/ivrciscagi/menu/001001000' id='2' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' > <opciones opc='1' accion='' idivr='3' send='v' /> <opciones opc='2' accion='' idivr='9' send='v' /> <opciones opc='0' accion='EXT' idivr='0' send='o' /> <opciones opc='3' accion='EXT' idivr='0' send='e' /> </items> 100 <items ivr='/home/ivrciscagi/menu/001002000' id='3' timeout='20000' digits='1' candado='c' digitsLock='10' ivrLock='/home/ivrciscagi/general/candado' > <opciones opc='1' accion='' idivr='4' send='v' /> <opciones opc='2' accion='' idivr='6' send='v' /> <opciones opc='3' accion='' idivr='5' send='v' /> <opciones opc='4' accion='' idivr='7' send='v' /> <opciones opc='0' accion='' idivr='2' send='v' /> </items> <items ivr='/home/ivrciscagi/menu/001003000' id='4' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' > <opciones opc='1' accion='NP1' idivr='0' send='v' /> <opciones opc='2' accion='NP2' idivr='0' send='v' /> <opciones opc='3' accion='REC' idivr='0' send='v' /> <opciones opc='0' accion='' idivr='3' send='v' /> </items> <items ivr='/home/ivrciscagi/menu/001004000' id='5' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' ></items> <items ivr='/home/ivrciscagi/menu/001005000' id='6' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' > <opciones opc='1' accion='CNH' idivr='0' send='m' /> 101 <opciones opc='2' accion='CNH' idivr='0' send='m' /> <opciones opc='0' accion='' idivr='3' send='v' /> </items> <items ivr='/home/ivrciscagi/menu/001006000' id='7' timeout='0' digits='0' candado='" "' digitsLock='0' ivrLock='" "' ></items> <items ivr='/home/ivrciscagi/menu/001007000' id='8' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' ></items> <items ivr='/home/ivrciscagi/menu/001008000' id='9' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' > <opciones opc='1' accion='' idivr='8' send='v' /> <opciones opc='2' accion='' idivr='11' send='v' /> <opciones opc='3' accion='' idivr='10' send='v' /> <opciones opc='0' accion='' idivr='3' send='v' /> </items> <items ivr='/home/ivrciscagi/menu/001009000' id='10' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' ></items> <items ivr='/home/ivrciscagi/menu/001010000' id='11' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' ></items> </ivr> Aquí interpretaremos un ítem para su mejor comprensión: 102 <items ivr='/home/ivrciscagi/general/bienvenida' id='1' timeout='0' digits='0' candado='" "' digitsLock='0' ivrLock='" "' ></items> Items = dialplan Propiedades Ivr: Esta propiedad contiene la ruta del archive de sonido a invocar (recordar que estos archivos de sonido deben estar en una ruta del servidor Asterisk). Id: Esta propiedad indica el número del sonido a interpretar es decir la línea que se emitirá por sonido. Timeout: Esta propiedad es encargada de determinar si tiene un tiempo espera para terminar la locución completa caso contrario si es igual a 0 esta se cortaría en caso de escuchar un tono DTMF. Recordar que los valores de Timeout están en milisegundos. Digits: indica cuantos tonos DTMF va escuchar para generar una orden, ejemplo en el caso del candado digital se deberá ingresar 10 dígitos que forman el número de cédula, por tanto esperará 10 tonos DTMF para enviar a una acción. Pero por default será 1. Candado: Si se va a habilitar un candado digital por defecto será el numero de cedula y se pondrá c caso contrario será un espacio en blanco. <items ivr='/home/ivrciscagi/menu/001002000' id='3' timeout='20000' candado='c' digitsLock='10' ivrLock='/home/ivrciscagi/general/candado' > <opciones opc='1' accion='' idivr='4' send='v' /> digits='1' 103 <opciones opc='2' accion='' idivr='6' send='v' /> <opciones opc='3' accion='' idivr='5' send='v' /> <opciones opc='4' accion='' idivr='7' send='v' /> <opciones opc='0' accion='' idivr='2' send='v' /> </items> Aquí por ejemplo primero emitirá ivrLock='/home/ivrciscagi/general/candado' el sonido que este en y esperara tantos tonos DTMF como indique digitsLock='10' una vez realizado el candado si es correcta la validación entonces emitirá el sonido grabado en ivr='/home/ivrciscagi/menu/001002000' y según el digito marcado escogerá una opción: <opciones opc='1' accion='' idivr='4' send='v' /> <opciones opc='2' accion='' idivr='6' send='v' /> <opciones opc='3' accion='' idivr='5' send='v' /> <opciones opc='4' accion='' idivr='7' send='v' /> <opciones opc='0' accion='' idivr='2' send='v' /> DigitsLock: Esta propiedad va amarrada al candado digital aquí se definen el numero de tonos DTMF escuchara para efectuar una acción. 104 IvrLock: Esta propiedad se encarga de contener la ruta de un archivo de sonido a escuchar antes de ingresar el candado digital. Opciones <items ivr='/home/ivrciscagi/menu/001008000' id='9' timeout='20000' digits='1' candado='" "' digitsLock='0' ivrLock='" "' > <opciones opc='1' accion='' idivr='8' send='v' /> <opciones opc='2' accion='' idivr='11' send='v' /> <opciones opc='3' accion='' idivr='10' send='v' /> <opciones opc='0' accion='' idivr='3' send='v' /> </items> Una vez escuchado el sonido de determinada línea si el digito DTMF es igual a uno definido dentro de opciones entonces genera una acción. Aquí definimos el significado de las propiedades. Opc: numero de tono DTMF escogido si es igual al definido en opc entonces tiene una acción caso contrario no existe esa opción. Accion: Esta propiedad genera una acción definida por unas variables Accion =CNH Consulta de notas de estudiantes por parcial. Accion =NP1 Consulta de notas de estudiantes parcial 1. Accion =NP2 Consulta de notas de estudiantes parcial 2. 105 Accion =REC Consulta de notas de estudiantes mejoramiento. Accion =PRO Consulta de notas de estudiantes promedio. Send: Este indica el tipo de acción que se generara es decir solo hay dos eventos envió por mail o enviar las notas vía sonido. send =m Envió por mail send = m Envió por sonido Idivr: Indica a que línea o ítems deberá ser accesada y enviada vía sonido para esto la propiedad acción deberá estar vacía.