DESARROLLO E IMPLEMENTACION DE UNA APLICACIÓN PARA EL ENVIO DE MENSAJES CORTOS A CORREO ELECTRONICO, MEDIANTE DISPOSITIVOS MOVILES CELULARES LEONARDO ERNESTO VALDERRAMA MESA SAMUEL RICARDO SANCHEZ GUEVARA UNIVERSIDAD DE SAN BUENAVENTURA BOGOTA FACULTADA DE INGENIERIA PROGRAMA INGENIERIA DE SISTEMAS BOGOTA D.C. 2006 DESARROLLO E IMPLEMENTACION DE UNA APLICACIÓN PARA EL ENVIO DE MENSAJES CORTOS A CORREO ELECTRONICO, MEDIANTE DISPOSITIVOS MOVILES CELULARES LEONARDO ERNESTO VALDERRAMA MESA SAMUEL RICARDO SANCHEZ GUEVARA UNIVERSIDAD DE SAN BUENAVENTURA BOGOTA FACULTADA DE INGENIERIA PROGRAMA INGENIERIA DE SISTEMAS BOGOTA D.C. 2006 DESARROLLO E IMPLEMENTACION DE UNA APLICACIÓN PARA EL ENVIO DE MENSAJES CORTOS A CORREO ELECTRONICO, MEDIANTE DISPOSITIVOS MOVILES CELULARES LEONARDO ERNESTO VALDERRAMA MESA SAMUEL RICARDO SANCHEZ GUEVARA Tesis de grado para optar por el titulo de Ingeniero de Sistemas Asesor PROFESOR ING. OSCAR FIGUEREDO UNIVERSIDAD DE SAN BUENAVENTURA BOGOTA FACULTADA DE INGENIERIA PROGRAMA INGENIERIA DE SISTEMAS BOGOTA D.C. 2006 Nota de aceptación _____________________________ _____________________________ _____________________________ _____________________________ Presidente del Jurado ______________________________ Jurado ______________________________ Jurado ______________________________ Bogotá D.C., Enero 16 de 2006 AGRADECIMIENTOS “A todos los que nos han apoyado durante el transcurso de nuestros estudios, a nuestras familias por su apoyo incondicional, a nuestro director de carrera por guiarnos en este largo camino, a nuestro asesor por compartir su experiencia y cocimiento con nosotros y finalmente a todos los grandes ingenieros, científicos y profesionales que han sido nuestra mayor inspiración para realizar este proyecto”. CONTENIDO Página INTRODUCCION 1 1. PLANTEAMIENTO DEL PROBLEMA 2 1.1 Antecedentes 2 1.1.1 INSTASMS 2 1.1.2 EXCELL 3 1.2 Descripción y Formulación del Problema 4 1.3 Justificación 5 1.4 Objetivos de la Investigación 7 1.4.1 Objetivo General 7 1.4.2 Objetivos específicos 7 1.5 Alcances y Limitaciones del Proyecto 7 1.5.1 Alcances 7 1.5.2 Limitaciones 7 2. MARCO DE REFERENCIA 8 2.1 Marco Conceptual 8 2.1.1 SMS (Short Message Service) 8 2.1.2 Pasarela SMS (SMS Gateway) 9 2.1.3 Servlets 11 2.1.3.1 Otros usos de los servlets 12 2.1.4 Sockets 12 2.1.5 J2ME 13 2.1.6 MIDlets 13 2.1.6.1 Ciclo de vida de un MIDlet 14 2.1.7 Comunicaciones http 15 2.1.8 PHP 15 2.1.8.1 Usos de PHP 15 2.1.8.2 Características de un lenguaje de scripts 16 2.1.9 Servidor Web 17 2.1.10 Servidor de Correo 18 2.1.11 Bases de Datos 18 2.1.11.1Componentes de una Base de Datos 19 2.1.11.2 Mysql Server 19 2.2 Marco Teórico 20 2.2.1 Aplicaciones de una pasarela de mensajería SMS 20 2.2.2 Kannel 23 2.2.2.1 Arquitectura Kannel 24 2.2.3 Alamin 26 2.2.3.1 Arquitectura Alamin 27 2.2.4 SMS Link 29 2.2.5 SMS Tools 29 2.2.6 Oxygen SMS Gateway 30 2.2.7 Now SMS E-mail Gateway 30 3. METODOLOGIA 32 3.1 Extreme Programming 32 3.1.1 Ciclo de Vida de un proyecto XP 38 3.2 Enfoque de la investigación 41 3.3 Línea de Investigación de la USB 41 3.4 Hipótesis 41 4. PRESENTACION Y ANALISIS DE RESULTADOS 42 5. DESARROLLO INGENIERIL 44 5.1 Fase de Exploración 44 5.1.1 Historias de Usuario (Requerimientos del Sistema) 44 5.1.2 Casos de uso del sistema 45 5.1.3 Herramientas 47 5.1.4 Desarrollo 47 5.1.5 Entorno de Ejecución 47 5.1.6 Tecnología y Plataformas 47 5.2 Planificación de Entregas 48 5.2.1 Estimación de Esfuerzo 48 5.2.1.1 Implementación del entorno de Ejecución 48 5.2.1.2 Desarrollo de Funcionalidad General 49 5.2.1.3 Gestión de Usuarios y listas de Distribución 49 5.2.2 Planificación 50 5.3 Iteraciones 51 5.3.1 Primera Iteración: Entorno de Ejecución 51 5.3.1.1 Test de Aceptación Primera Iteración: Entorno de Ejecución 57 5.3.2 Segunda Iteración: Lógica del Sistema 59 5.3.2.1 Test de Aceptación Segunda Iteración: Lógica del Sistema 67 5.3.3 Tercera Iteración: Aplicativo Web 68 5.3.3.1 Test de Aceptación Tercera Iteración: Aplicativo Web 72 5.4 Producción 73 6. CONCLUSIONES 74 7. RECOMENDACIONES 75 GLOSARIO 76 BIBLIOGRAFIA 81 ANEXOS 83 A. Script Base de Datos 83 B. Servlet 87 C. MIDlet 93 D. Configuración XML 99 E. Diagrama de Procesos 100 F. Diagrama de Secuencia 101 G. Diagrama de Flujo de Datos 102 H. Diagrama de Despliegue SMS 103 I. Fuente Aplicación WEB 104 J. Manual de Usuario 142 INDICE DE FIGURAS Figura 1. Diagrama de Pasarela SMS Figura 2. Descripción de la Arquitectura de Servlets Figura 3. Ciclo de vida de un MIDlet Figura 4. Arquitectura Kannel Figura 5. Arquitectura Alamin Figura 6. Ciclos de Planeación y Retroalimentación Figura 7. Consola de MDemon Figura 8. Configuración Dominio MDaemon Figura 9. Configuración DNS MDaemon Figura 10. Configuración Pasarela SMS Figura 11. Socket Midlet en espera Figura 12. Socket Midlet Invocando al servlet Figura 13. Envío a un solo destino Figura 14. Envío a grupo Figura 15. Entrada al Aplicativo Web sms2mail Figura 16. Gestión de Listas de Distribución INDICE DE DIAGRAMAS Diagrama 1. Funcionamiento Físico sms2mail Diagrama 2. Caso de uso de Envió de sms2mail Diagrama 3. Casos de uso Aplicativo Web Diagrama 4. Diagrama de Base de Datos Diagrama 5. Esquema lógico de sms2mail Diagrama 6. Diagrama de clases de Socket Midlet Diagrama 7. Funcionamiento con SMS Gateway Diagrama 8. Esquema Funcionamiento utilizando un Socket-Midlet Diagrama 9. Diagrama de transacción web Diagrama 10. Diagrama de despliegue de componentes INDICE DE TABLAS Tabla 1. Abonados Móviles en Colombia. Tabla 2. Estimación de Esfuerzo Entorno de Ejecución Tabla 3. Estimación de Esfuerzo Funcionalidad General Tabla 4. Estimación de Esfuerzo Gestión de Usuarios y listas de Distribución Tabla 5. Planificación de entregas e iteraciones Tabla 6. Primera Iteración Tabla 7. Tareas desarrolladas Primera Iteración Tabla 8. Aspectos evaluados Primera Iteración Tabla 9. Segunda Iteración Tabla 10. Parámetros de Salida de Pasarela SMS Tabla 11. Tareas desarrolladas Segunda Iteración Tabla 12. Aspectos evaluados Segunda Iteración Tabla 13. Tercera Iteración Tabla 14. Tareas desarrolladas Tercera Iteración Tabla 15. Aspectos evaluados Tercera Iteración INTRODUCCIÓN En los últimos años y a medida que el número de abonados de las empresas de telefonía celular crece en el país, estas se ven en la necesidad de ofrecer más y mejores servicios debido a la competencia. Uno de estos servicios que esta siendo impulsado actualmente en Colombia, aunque ya hace algún tiempo esta disponible, es el de mensajes cortos o SMS (Short Message Service). El cual permite, en un limitado espacio, enviar pequeños comunicados de gran urgencia o por lo contrario información que no tiene que ser comunicada por voz; inmediatamente, hacia otro dispositivo celular receptor. La gran desventaja es la cantidad de caracteres y limitación del servicio, es decir solo puede ser enviado a otro celular, pero ¿y si fuera posible enviar desde un dispositivo móvil un mensaje a una cuenta de correo cualquiera? Por supuesto sería una gran innovación que captaría de inmediato la atención de los usuarios celulares y agregaría un servicio más al portafolio de las empresas de telefonía celular, lo cual se traduciría en un mayor beneficio económico. Por esta razón nace la idea de este proyecto que busca hacer esto posible pasando por las fases de investigación, desarrollo, prueba, implementación e implantación. 1. PLANTEAMIENTO DEL PROBLEMA 1.1 Antecedentes En el mundo actualmente se vive la tendencia de la convergencia de servicios. Se busca que desde un mismo dispositivo la persona tenga muchas posibilidades de interacción. Existen servicios similares al que propone este proyecto, principalmente en Europa y Asia, implementados con éxito por algunos operadores celulares así como empresas pequeñas que ofrecen al servicio a través de los operadores. A continuación se muestran las características y funcionamiento de algunos de estos servicios. 1.1.1 INSTASMS Instasms hace parte de la empresa de telefonía móvil InstaPhone que opera principalmente en Pakistán, y ofrece el servicio de envió de correos electrónicos a través de sms y viceversa. Cualquier abonado de la compañía tiene acceso a este servicio, no es necesario ningún tipo de inscripción previa. Cobra aproximadamente 100 pesos por cada mensaje de texto saliente. Tiene un funcionamiento muy sencillo. El usuario debe enviar el mensaje de texto a un número predeterminado (en este caso 320) con un formato especial, que permite identificar la dirección de correo electrónico aparte del cuerpo del mensaje. 1.1.2 EXCELL eXcell es un proyecto desarrollado por la compañía italiana Bware Technologies en el año 2000 aproximadamente que ofrece la posibilidad de enviar y recibir correos electrónicos por medio de mensajes de texto. El usuario móvil debe registrarse en la página para acceder al servicio, que opera con redes de diferentes países y compañías de Europa. El mensaje de texto debe tener un formato especial y ser enviado a un número predeterminado. Actualmente cuenta con 217.019 usuarios registrados, pero el servicio perdió credibilidad y aceptación debido a problemas técnicos así como cierto nivel de complejidad en el envío del mensaje, ya que el formato de este demandaba mucha atención y cuidado del usuario. También presentaron problemas con el envío de los mensajes a cuentas de usuarios de Hotmail. Actualmente varios de los servicios de esta compañía se encuentran deshabilitados. 1.2 Descripción y Formulación del problema Actualmente el mundo de la tecnología está dirigiendo gran parte de sus esfuerzos hacia el área de los dispositivos móviles. Debido a que el ciudadano actual busca tener la mayor cantidad de servicios a la mano, de forma tal que no este no malgaste su tiempo en tareas comunes que podría realizar estando en cualquier lugar y en cualquier momento. Una de estas tareas es el envió de correos electrónicos, para lo cual, debe disponer de un computador con acceso a Internet, algo que no se encuentra al alcance de una persona en todo momento. Esto se podría solucionar utilizando para este fin un dispositivo que la persona puede llevar consigo a todas partes, como es el teléfono móvil. Tomando como referencia la experiencia de países más desarrollados en lo que a tecnología y servicios móviles se refiere, se sabe que es un área que actualmente ofrece muchas posibilidades y que su aplicación puede darse en una gran diversidad de campos. Uno de estos es lograr el envío de correos electrónicos desde un dispositivo móvil celular cualquiera a través de SMS, utilizando una pasarela SMS. Lo que representaría para las compañías de servicios móviles un nuevo campo de acción y por consiguiente mayores beneficios económicos. El mercado Colombiano de telefonía celular, es un campo que se encuentra en expansión actualmente donde la competencia genera la necesidad de ofrecer cada vez nuevos y mejores servicios a los usuarios. Esta es un área con capacidad de desarrollo ilimitado debido al mejoramiento tecnológico tanto de sus redes como de los dispositivos, que ahora ofrecen integración total de servicios. En un país como Colombia el acceso a estos dispositivos de parte de la gente del común es muy limitado debido a los costos; por esto se busca aprovechar las posibilidades que dan equipos desde la gama más baja como lo es el envió de mensajes cortos SMS. ¿Cómo enviar correos electrónicos desde un dispositivo móvil celular a través de SMS? 1.3 Justificación La importancia de esta investigación y posterior desarrollo de la aplicación radica en los beneficios que puede implicar para una empresa o una persona del común tener acceso barato y desde cualquier lugar para algo tan cotidiano como lo es el envío de un correo electrónico. El prestador del servicio se verá beneficiado económicamente debido a que este actualmente está dirigido únicamente hacia el sector de grandes empresas que son las únicas que pueden adquirirlo debido a su elevado costo, lo que hace que muy pocas personas se muestren interesadas en el producto. Esta aplicación logrará que el servicio sea accesible a todas las personas que posean un teléfono celular y/o un computador, logrando que la facilidad de adquisición cree un interés generalizado; asimismo el usuario final se verá beneficiado por las múltiples bondades del producto, aumentando sus posibilidades de comunicación con las demás personas, tan importante para los empresarios actuales, reduciendo la perdida de información y aprovechando su tiempo de disponibilidad al máximo. Las personas del común verán que la oferta de tecnologías para la comunicación crece, expandiendo cada vez más su campo de acción logrando que la atracción por la telefonía móvil aumente, y por consiguiente logrando un nuevo crecimiento del nivel tecnológico del país. En nuestro caso específicamente encontramos que por falta de investigación y de apoyo local e institucional, el acceso a nuevas tecnologías de comunicación se ha visto truncado por aspectos económicos y posiciónales. Dentro del entorno tecnológico, es importante desarrollar nuevas tecnologías al alcance de nuestra economía y desarrollo informático. Por eso se propone el diseño e implementación de un sistema que acople estos dos ambientes (Telefonía móvil y correo electrónico) para agilizar de una forma fácil y confiable el proceso de envió de mail desde n-plataforma celular. Colombia no cuenta con infraestructura tecnológica como para dar cobertura total o en su mayoría sobre nuevas tecnologías de comunicación, está demostrado que solo una fracción de la población tiene acceso a un computador personal y menos a Internet pero es creciente la adquisición de nuevas líneas celulares en Colombia como lo muestra la siguiente tabla. Tabla 1. Abonados Móviles en Colombia. Abonados en 2001 2002 2003 2004 2005* Movistar(Bellsouth) 1.187 1.526 2.082 3.297 5.225 Comcel 2.078 3.071 3.674 5.814 11.333 Colombia Móvil - - 430 1.300 1.827 Total 3.265 4.597 6.186 10.400 18.385 servicio * Cifras a Septiembre 2005. Se ha llegado a un crecimiento tal, que ha superado el número de líneas fijas en Colombia lo que nos lleva a pensar que el futuro de la comunicación está en este campo. 1.4. Objetivos de la Investigación 1.4.1. Objetivo General Diseñar e implementar una aplicación que permita el envió de un SMS desde un dispositivo móvil celular a un correo electrónico. 1.4.2. Objetivos Específicos Determinar la viabilidad técnica de la aplicación. Seleccionar las tecnologías necesarias para el desarrollo de la aplicación. Diseñar e implementar la aplicación que logrará la interacción entre las dos plataformas. Realizar pruebas en un entorno simulado. 1.5 Alcances y Limitaciones del Proyecto 1.5.1 Alcances Diseño e implementación de la aplicación. Lograr el envió de un mail por medio de pruebas en un ambiente simulado. 1.5.2 Limitaciones Existe una limitación técnica, debido a que los equipos necesarios para las pruebas en un ambiente real de la aplicación solo los poseen las empresas de telefonía móvil, por lo cual deberíamos conseguir el apoyo de una de estas, que nos permita utilizar dichos equipos o trabajar en cooperación para lograr el desarrollo final. Los mensajes SMS, como su nombre lo indica, son cortos, por consiguiente el cuerpo del correo electrónico tendrá una longitud de aproximadamente 130 caracteres. 2. MARCO DE REFERENCIA 2.1 Marco Conceptual Para esta investigación, se deben tener en claro varios conceptos, que darán el inicio conceptual de lo que se quiere y hacia donde se va. Primero se explicarán conceptos básicos de mensajera corta (SMS), dando algunas definiciones de términos que se utilizaran durante el proyecto, luego pasando por tecnologías cliente servidor para peticiones http, ya que en este concepto se basa gran parte del proyecto, involucrando conceptos de JAVA en su arquitectura empresarial J2EE, la que soporta la plataforma de inteligencia de negocio en su porción más interna, la cual se explicará más a fondo en el transcurso de este documento. Otra parte importante, es que sms2mail no sólo es un desarrollo dentro de una arquitectura lógica, sino también involucra una implementación física y un desarrollo en entorno web, que facilita la interacción entre usuario y sistema. 2.1.1 SMS (Short Message Service) Los mensajes SMS son herederos directos de los mensajes de los equipos localizadores de personas, los buscapersonas, pero extendiendo su funcionalidad para permitir que desde cualquier dispositivo de telefonía móvil se pueda realizar un envío a otro equipo sin mediar comunicación vocal con un operador. El éxito de este servicio, el SMS, parece provenir de la sencillez y facilidad de manejo, por un lado, y de que "hay alguien al otro lado" con quien realizar el acto de la comunicación. Estos dos factores han provocado dicho éxito, aún teniendo en contra el precio del servicio en algunos casos y las limitadas características de esta comunicación. Las posibilidades de comunicación mediante (SMS) son muchas y muy variadas, pero siempre limitadas por las características de estos mensajes, 160 caracteres, muy baja velocidad (en comparación con las líneas telefónicas convencionales), duración limitada (24 ó 48 horas normalmente, si no se entregan antes son cancelados), no es un servicio garantizado (el mensaje suele llegar pero no hay garantía de ello, ni que lleguen en el orden en que se han enviado) y posibilidad de comunicación sólo entre teléfonos celulares entre los que haya "visibilidad" (que los operadores de los dos teléfonos, emisor y receptor, tengan convenio de intercambio de mensajes). Existen muchas especificaciones de formato de mensaje para los servicios prestados a través de SMS que les dotan de gran potencia y complejidad. Pero es en el uso básico con un sistema de enlace sencillo donde se están obteniendo los mejores resultados, tanto de cantidad de mensajes enviados como de servicios que se están utilizando. En todo caso, estas posibilidades resultan suficientes aprovechadas de forma adecuada, y una de esas formas es tener uno de los lados de la comunicación manejado por un servicio automático que se encargue de responder a las peticiones recibidas desde múltiples teléfonos celulares. La automatización de la recepción de los mensajes SMS, su procesado y posterior respuesta es lo que conforma la funcionalidad de una pasarela SMS. 2.1.2 Pasarela SMS (SMS Gateway) El acceso a la red GSM se puede obtener de diferentes formas. El método más sencillo es utilizando directamente un terminal GSM conectado al computador que actúa de pasarela. En realidad este terminal puede ser un teléfono GSM normal con su kit de conexión a PC (cable y software) o un modem GSM (igual que los módems convencionales de red telefónica básica pero su medio de transmisión es la red GSM, no el par de hilos de cobre). Figura 1. Diagrama de Pasarela SMS La comunicación entre el computador y el terminal se suele realizar por un puerto de comunicaciones serie. Casi todos los teléfonos móviles actuales incluyen un modem GSM en su interior, de manera que la forma de comunicar computador y teléfono/modem GSM es la misma que con un MODEM convencional. Si el teléfono no incluye un modem GSM en su interior, es necesario comunicarse con el teléfono utilizando las especificaciones del protocolo que el fabricante haya utilizado (normalmente se trata de protocolos propietarios, aunque cada vez menos). En GNU/Linux se puede utilizar el proyecto Gnokii, que trata de implementar el paquete de software Nokia Data Suite para la comunicación con estos teléfonos que implementan un protocolo propietario de Nokia. El otro método más habitual para acceder a la red GSM es contactar directamente con un centro servidor de mensajes (SMSC) del operador de telefonía. Los SMSC de cada fabricante incorporan también protocolos propietarios, por lo que es necesario realizar en cada caso un diálogo diferente con cada tipo de SMSC, además de que el medio de conexión también puede variar de unos a otros (IP, Frame Relay, X.25, RDSI). 2.1.3 Servlets Los Servlets son módulos que extienden los servidores orientados a peticiónrespuesta, como los servidores web compatibles con Java. Por ejemplo, un servlet podría ser responsable de tomar los datos de un formulario de entrada de pedidos en HTML y aplicarle la lógica de negocios utilizada para actualizar la base de datos de pedidos de la compañía. Figura 2. Descripción de la Arquitectura de Servlets Los servlets pueden ser incluidos en muchos servidores diferentes porque el API Servlet, el que se utiliza para escribir Servlets, no asume nada sobre el entorno o protocolo del servidor. Los servlets se están utilizando ampliamente dentro de servidores HTTP. Los Servlets son un reemplazo efectivo para los scripts CGI. Proporcionan una forma de generar documentos dinámicos que son fáciles de escribir y rápidos en ejecutarse. Los Servlets también solucionan el problema de hacer la programación del lado del servidor con APIs específicos de la plataforma: están desarrollados con el API Java Servlet, una extensión estándar de Java. Por eso se utilizan los servlets para manejar peticiones de cliente HTTP. Por ejemplo, tener un servlet procesando datos enviados por POST sobre HTTP utilizando un formulario HTML. 2.1.3.1 Otros usos de los Servlets Permitir la colaboración entre la gente. Un servlet puede manejar múltiples peticiones concurrentes, y puede sincronizarlas. Esto permite a los servlets soportar sistemas como conferencias on-line. Reenviar peticiones. Los Servlets pueden reenviar peticiones a otros servidores y servlets. Con esto los servlets pueden ser utilizados para cargar balances desde varios servidores que reflejan el mismo contenido, y para particionar un único servicio lógico en varios servidores, de acuerdo con los tipos de tareas o la organización compartida. 2.1.4 Sockets Java proporciona mecanismos potentes y a la vez sencillos para construir programas para redes tales como Internet. Entre las clases que permiten la comunicación tenemos la clase URL en un nivel superior y las clases Socket y ServerSocket a un nivel más bajo. Mediante la clase Socket incluida en el paquete java.net se pueden crear conexiones de flujo, que son las que utilizan el protocolo TCP, entre dos ordenadores. El tipo de datos en la comunicación puede ser cualquiera, y por ello el protocolo TCP es usado por http, ftp, telnet, etc. Los Sockets o enchufes son semejantes a conexiones telefónicas entre dos ordenadores remotos, la comunicación es continúa y finaliza cuando uno de los dos ordenadores cierra su conexión. La clase ServerSocket es una clase incluida en java.net que sirve para atender peticiones de conexiones, lo cual es útil a la hora de crear un servidor. En un servidor hay un bucle infinito donde se llama al método accept de la clase ServerSocket quedando a la espera de aceptar una conexión. Cuando esta conexión se produce esta clase devuelve un objeto de tipo socket que es el que utiliza el servidor para comunicarse con el cliente, de este socket se puede conseguir una corriente de entrada y otra de salida. 2.1.5 J2ME Esta versión de Java está enfocada a la aplicación de la tecnología Java en dispositivos electrónicos con capacidades computacionales y gráficas muy reducidas, tales como teléfonos móviles, PDAs o electrodomésticos inteligentes. Esta edición tiene unos componentes básicos que la diferencian de las otras versiones, como el uso de una máquina virtual denominada KVM (Kilo Virtual Machine), debido a que requiere sólo unos pocos Kilobytes de memoria para funcionar) en vez del uso de la JVM clásica, inclusión de un pequeño y rápido recolector de basura. Todas las tecnologías Java comparten un conjunto más o menos amplio de APIs básicas del lenguaje, agrupadas principalmente en los paquetes java.lang y java.io. J2ME contiene una mínima parte de las APIs de Java. Esto es debido a que la edición estándar de APIs de Java ocupa 20 Mb, y los dispositivos pequeños disponen de una cantidad de memoria mucho más reducida. En concreto, J2ME usa 37 clases de la plataforma J2SE provenientes de los paquetes java.lang, java.io, java.util. Esta parte de la API que se mantiene fija forma parte de lo que se denomina configuración. Otras diferencias con la plataforma J2SE vienen dadas por el uso de una máquina virtual distinta de la clásica JVM denominada KVM. Esta KVM tiene unas restricciones que hacen que no posea todas las capacidades incluidas en la JVM. 2.1.6 MIDlets Los MIDlets son aplicaciones creadas usando la especificación MIDP. Están diseñados para ser ejecutados, en dispositivos con poca capacidad gráfica, de cómputo y de memoria. En estos dispositivos no se dispone de líneas de comandos donde poder ejecutar las aplicaciones, si no que reside en él un software que es el encargado de ejecutar los MIDlets y gestionar los recursos que éstos ocupan. 2.1.6.1 Ciclo de vida de un MIDlet El ciclo de vida de un MIDlet esta compuesto por 3 estados durante su ejecución, activo, pausa y destruido. Figura 3. Ciclo de vida de un MIDlet • Activo: El MIDlet está actualmente en ejecución. • Pausa: El MIDlet no está actualmente en ejecución. En este estado el MIDlet no debe usar ningún recurso compartido. Para volver a pasar a ejecución tiene que cambiar su estado a Activo. • Destruido: El MIDlet no está en ejecución ni puede transitar a otro estado. Además se liberan todos los recursos ocupados por el MIDlet. Un MIDlet puede cambiar de estado mediante una llamada a los métodos MIDlet.startApp(), MIDlet.pauseApp() o MIDlet.destroyApp(). El gestor de aplicaciones cambia el estado de los MIDlets haciendo una llamada a cualquiera de los métodos anteriores. Un MIDlet también puede cambiar de estado por sí mismo. 2.1.7 Comunicaciones HTTP El protocolo HTTP es un protocolo de tipo petición/respuesta. El funcionamiento de este protocolo es el siguiente: El cliente realiza una petición al servidor y espera a que éste le envíe una respuesta. Normalmente, esta comunicación es la que suele realizarse entre un navegador web (cliente) y un servidor web (servidor). Este protocolo es implementado en java por la interfaz HttpConnection. 2.1.8 PHP PHP significa (siglas que originalmente significaban Personal Home Page) y actualmente significa Hypertext Preprocessor, fue primero escrito por Rasmus Lerdorf como un simple conjunto de scripts de Perl para guiar a los usuarios en sus páginas. Luego para satisfacer inquietudes del mismo tipo por parte de otra gente lo reescribe, pero esta vez como un lenguaje de script agregándole entre otras características soporte para formularios. Al ver como la popularidad del lenguaje aumenta, un grupo de desarrolladores crea para él un API, convirtiéndose así en el PHP3. Fue en ese momento cuando el parser de scripts PHP es completamente reescrito (el Zend Engine) dando vida al PHP4 mucho mas rápido, tal y como lo conocemos en la actualidad. 2.1.8.1 Usos de PHP Programación de páginas web dinámicas, habitualmente en combinación con el motor de base datos MySQL, aunque cuenta con soporte nativo para otros motores, incluyendo el estándar ODBC, lo que amplia en gran medida sus posibilidades de conexión. Programación en consola, al estilo de Perl, en Linux, Windows y Macintosh. Creación de aplicaciones gráficas independientes del navegador, por medio de la combinación de PHP y GTK (GIMP Tool Kit), que permite desarrollar aplicaciones de escritorio tanto para los sistemas operativos basados en Unix, como para Windows y Mac OS X. 2.1.8.2 Características de un lenguaje de scripts Velocidad: No sólo la velocidad de ejecución, que es importante, sino además no crear demoras en la máquina. Por esta razón no debe requerir demasiados recursos de sistema. PHP se integra muy bien junto a otro software, especialmente bajo ambientes Unix, cuando se configura como módulo de Apache. Estabilidad: La velocidad no sirve de mucho si el sistema se cae cada cierta cantidad de ejecuciones. PHP utiliza su propio sistema de administración de recursos y dispone de un sofisticado método de manejo de variables, conformando un sistema robusto y estable. Seguridad: El sistema debe poseer protecciones contra ataques. PHP provee diferentes niveles de seguridad, estos pueden ser configurados desde el archivo .ini. Simplicidad: Permite a los programadores generar código productivamente en el menor tiempo posible. PHP dispone de una amplia gama de librerías, y agregarle extensiones es muy fácil. Esto le permite al PHP ser utilizado en muchas áreas diferentes, tales como encriptado, gráficos, XML y otras. 2.1.9 Servidor Web Un servidor web es un programa que implementa el protocolo HTTP (hypertext transfer protocol). Este protocolo está diseñado para transferir hipertextos, páginas web o páginas HTML (hypertext markup language): textos complejos con enlaces, figuras, formularios, botones y objetos incrustados como animaciones o reproductores de sonidos. Sin embargo, el hecho de que HTTP y HTML estén íntimamente ligados no debe dar lugar a confundir ambos términos. HTML es un formato de archivo y HTTP es un protocolo. Un servidor web se encarga de mantenerse a la espera de peticiones HTTP llevada a cabo por un cliente HTTP que suele conocerse como navegador. El navegador realiza una petición al servidor y éste le responde con el contenido que el cliente solicita. Sobre el servicio web clásico se puede disponer de aplicaciones web. Éstas son fragmentos de código que se ejecutan cuando se realizan ciertas peticiones o respuestas HTTP. Es necesario distinguir entre las aplicaciones del cliente y las del servidor. Aplicaciones en el lado del cliente, donde el cliente web es el encargado de ejecutarlas en la máquina del usuario. Son las aplicaciones tipo Java o Javascript, el servidor proporciona el código de las aplicaciones al cliente y éste, mediante el navegador, las ejecuta. Es necesario, por tanto, que el cliente disponga de un navegador con capacidad para ejecutar aplicaciones (también llamadas scripts). Normalmente, los navegadores permiten ejecutar aplicaciones escritas en lenguaje javascript y java, aunque pueden añadirse más lenguajes mediante el uso de plugins. Aplicaciones en el lado del servidor: el servidor web ejecuta la aplicación; ésta, una vez ejecutada, genera cierto código HTML; el servidor toma este código recién creado y lo envía al cliente por medio del protocolo HTTP. Las aplicaciones de servidor suelen ser la opción por la que se opta en la mayoría de las ocasiones para realizar aplicaciones web. La razón es que, al ejecutarse ésta en el servidor y no en la máquina del cliente, éste no necesita ninguna capacidad adicional, como sí ocurre en el caso de querer ejecutar aplicaciones javascript o java. Así pues, cualquier cliente dotado de un navegador web básico puede utilizar este tipo de aplicaciones. 2.1.10 Servidor de Correo Un servidor de correo es una aplicación que permite enviar mensajes (correos) de unos usuarios a otros con independencia de la red que dichos usuarios estén utilizando. Para lograrlo se definen una serie de protocolos, cada uno con una finalidad concreta: SMTP, Simple Mail Transfer Protocol: Es el protocolo que se utiliza para que dos servidores de correo intercambien mensajes. POP, Post Office Protocol: Se utiliza para obtener los mensajes guardados en el servidor y pasárselos al usuario. IMAP, Internet Message Access Protocol: Protocolo de red de acceso a mensajes electrónicos almacenados en un servidor. Mediante IMAP se puede tener acceso al correo electrónico desde cualquier equipo que tenga una conexión a Internet. Una vez configurada la cuenta IMAP, puede especificar las carpetas que desea mostrar y las que desea ocultar, esta característica lo hace diferente del protocolo POP. Así pues, un servidor de correo consta en realidad de dos servidores: un servidor SMTP que es el encargado de enviar y recibir mensajes, y un servidor POP/IMAP que es el que permite a los usuarios obtener sus mensajes. Para obtener los mensajes del servidor, los usuarios se sirven de clientes, es decir, programas que implementan un protocolo POP/IMAP. 2.1.11 Bases de Datos Una base de datos es una colección de datos integrados, con redundancia controlada y con una estructura que refleje las interrelaciones y restricciones existentes en el mundo real; los datos, que han de ser compartidos por diferentes usuarios y aplicaciones, deben mantenerse independientes de éstas, y su definición y descripción, únicas para cada tipo de datos, han de estar almacenadas junto con los mismos. Los procedimientos de actualización y recuperación, comunes y bien determinados, habrán de ser capaces de conservar la integridad, seguridad y confidencialidad del conjunto de los datos. 2.1.11.1 Componentes de una BD Un sistema de bases de datos contempla los siguientes componentes: La base de datos. El Sistema de Gestión de Bases de Datos (SGBD, DBMS) o motor, tal como Oracle, Sybase, Mysql etc. Programas de aplicación. Un conjunto de usuarios (finales, DBA, programadores de aplicaciones, etc.) Máquinas de producción. Programas utilitarios (generadores de informes, de interfaces, herramientas de desarrollo, de administración, etc.) 2.1.11.2 Mysql Server MySQL es un gestor de base de datos sencillo de usar y rápido. También es uno de los motores de base de datos más usados en Internet, la principal razón de esto es que es de uso libre para aplicaciones no comerciales. Características principales de MySQL : Es un gestor de base de datos. Una base de datos es un conjunto de datos y un gestor de base de datos es una aplicación capaz de manejar este conjunto de datos de manera eficiente y cómoda. Es una base de datos relacional. Una base de datos relacional es un conjunto de datos que están almacenados en tablas que establecen unas relaciones para manejar los datos de una forma eficiente y segura. Para usar y gestionar una base de datos relacional se usa el lenguaje estándar de programación SQL. Es Open Source. El código fuente de MySQL se puede descargar y está accesible a cualquiera, por otra parte, usa la licencia GPL para aplicaciones no comerciales. Es una base de datos muy rápida, segura y fácil de usar. es una de las bases de datos más usadas en Internet. 2.2 Marco Teórico En el mundo se han desarrollado varios proyectos enfocados al uso de las pasarelas SMS, algunos se encuentran actualmente en funcionamiento y otros nunca llegaron a ser implantados. En Colombia organizaciones como W@P Colombia, de la Universidad del Cauca, apoyan la investigación y desarrollo de aplicaciones dirigidas a dispositivos móviles, dedicándose también en parte a la utilización de SMS Gateways. 2.2.1 Aplicaciones de una pasarela de mensajería SMS Los posibles usos que se pueden dar a una pasarela SMS entre las redes celulares son muy extensos. Distribución de mensajes SMS. Al igual que funcionan las listas de correo electrónico, en las que un mensaje es reenviado a lo suscriptores de la lista, en la lista de distribución de mensajes SMS, la pasarela permite el mantenimiento (alta/baja/consulta) de suscriptores y envía al resto de suscriptores de la lista los mensajes que no son comandos de actuación sobre la propia pasarela. Recepción de alarmas de los sistemas de monitoreo de servicios. Aplicaciones como "mon", "hearthbeat", agentes "snmp", etc. generan avisos cuando se alcanzan ciertos eventos. Estos avisos pueden ser encaminados mediante mensaje SMS dependiendo de su importancia, para que ciertas personas sean avisadas inmediatamente. Transporte de contenidos Web. El SMS es utilizado como paquete de transporte para hacer llegar desde el móvil al servidor la petición de una página Web y desde el servidor al móvil el contenido de dicha página una vez filtrada para eliminar imágenes, tags html, cabeceras de página, etc. Concursos de preguntas y respuestas. Ante una solicitud desde el teléfono móvil para comenzar el concurso, la pasarela envía mensajes con preguntas, recibe respuestas y mantiene un contador de resultados para cada participante, de manera que se pueden generar clasificaciones. Sistemas de seguimiento de flotas de vehículos. Un teléfono celular unido a un módulo GPS permite enviar información acerca de la posición exacta del portador del teléfono, de manera que para flotas de vehículos se reciben sus notificaciones de posición en la pasarela y ésta actualiza una base de datos consultable por otras aplicaciones que pueden mostrar la situación de cada elemento de la flota. Notificación de estado de dispositivos aislados. Máquinas de vending, dispositivos de control de temperatura y presencia, etc. que se encuentren aislados y sin comunicación con una red mediante enlace físico pueden hacer uso de los mensajes SMS para recibir ordenes y para notificar su estado (queda poca bebida, la temperatura ha superado los 45 grados, etc.). Normalmente esta comunicación se realiza sin intervención manual, por lo que realmente se conectan equipos automáticos en ambos lados. Es lo que Nokia denomina M2M (machine to machine). Además, de inmediato, a cada persona le surgen nuevas aplicaciones, orientadas a su área de conocimiento: Consulta de bases de datos. Mantenimiento de sistemas. Consultas de estado de servicios, reinicio de los mismos, reinicio de equipos. Notificación de informaciones académicas. Notas, convocatorias de examen, etc. Banca GSM. Servicios financieros y alarmas para el seguimiento de operaciones de valores. Cualquier otro tipo de alarmas debido a caídas de tensión, detección de intrusos en firewalls, etc. Domótica1. Control y consulta de dispositivos a distancia. Avisos de intervención para equipos médicos, mantenimiento, rescate, etc. Dadas las características de la red GSM que permiten la movilidad de los terminales (teléfonos) en su zona de cobertura, su pueden imaginar aplicaciones que aprovechen la posibilidad de localización de un teléfono, en base a la estación base de la red que en ese momento tiene conexión con él. Sin embargo, esta información no es directamente accesible desde el exterior de la red del operador de telefonía, por lo que, salvo aplicaciones fuertemente integradas con la red del operador, no es posible su utilización. Podría imaginarse una aplicación que permitiera emitir mensajes SMS a teléfonos móviles entre las 2 y las 3 de la tarde en la zona de cobertura de una estación base situada junto a un restaurante que contratará los servicios de publicidad que un operador pudiera ofrecer, para que todos los que por allí cerca pasaran supieran donde está dicho restaurante. Al margen de la aplicación, podrían surgir problemas con la utilización de la posición de los terminales para operaciones no solicitadas por el propietario del terminal, ya que al fin y al cabo, la situación de cada terminal es información privada del propietario. De cualquier manera, la pasarela de mensajería sólo trata de servir de intermediario y facilitar la labor de desarrollo de las extensiones móviles para una aplicación dada. 1 Domótica: es el conjunto de sistemas automatizados de una vivienda que aportan servicios de gestión energética, seguridad, bienestar y comunicación, y que pueden estar integrados por medio de redes interiores y exteriores de comunicación. La pasarela de mensajería SMS/IP trata de ser como un servidor Web, realiza sus tareas de cambio de formato y ajuste del mensaje, pero precisa de contenidos que realmente le den una utilidad, aunque en este caso los contenidos son pequeñas o grandes aplicaciones que permiten interactuar al usuario móvil con otro programa. También tiene un comportamiento similar al de un Agente de Transferencia de Mensajes de correo (MTA) ya que, de alguna forma, ésa también es su tarea: el encolado, conmutado y entrega de mensajes. Para finalizar con las utilidades de las pasarelas de mensajería SMS/IP, añadir que no hay un estándar para que las aplicaciones comuniquen con las pasarelas, en general, sino que cada una define su propio interfaz, que es diferente en todos los casos. En este aspecto queda mucho camino por recorrer para, quizás, definir un wrapper, un interfaz intermedio, normalizado, que permita la utilización de diferentes pasarelas SMS sin necesidad de realizar cambios en la aplicación. A continuación se muestran las principales características de los proyectos más reconocidos en este campo. 2.2.2 Kannel Kannel utiliza la licencia BSD. Kannel fue en primer lugar una pasarela WAP, pero amplió sus funcionalidades posteriormente para dar soporte a WAP usando SMS como transporte de los datos y para obtener páginas Web. El código ahora es bastante estable, estando reconocido y certificado por el WapForum como una pasarela que se ajusta a los estándares WAP. Detrás de Kannel hay un numeroso grupo de desarrolladores y colaboradores. La empresa que comenzó a desarrollar Kannel se llamaba WapIt. Recientemente tuvo problemas económicos y cerró. Desde entonces, han tratando de crear una fundación que dé apoyo al mantenimiento del desarrollo de Kannel. Kannel es un proyecto grande, con una estructura detallada que le convierte en "demasiado complejo" para algunas instalaciones. Sin embargo, su objetivo principal es la escalabilidad y alta disponibilidad desde su planteamiento inicial. Básicamente, en una instalación mínima, aparece lo que en Kannel denominan "BearerBox", el componente que comunica con el centro servidor de mensajes (SMSC) o un teléfono WAP que puede sustituirlo en parte. Con este BearerBox comunican los otros componentes, "SMSBox" y "WAPBox", que se encargan de acceder a los servidores HTTP que tienen el contenido que se desea acceder, y que realizan las conversiones/compresiones que establece el protocolo WAP para el envío de los mismos a los teléfonos. 2.2.2.1 Arquitectura de Kannel Kannel utiliza la licencia BSD. Kannel fue en primer lugar una pasarela WAP, pero amplió sus funcionalidades posteriormente para dar soporte a WAP usando SMS como transporte de los datos y para obtener páginas Web. El código ahora es bastante estable, estando reconocido y certificado por el WapForum como una pasarela que se ajusta a los estándares WAP. Detrás de Kannel hay un numeroso grupo de desarrolladores y colaboradores. La empresa que comenzó a desarrollar Kannel se llamaba WapIt. Recientemente tuvo problemas económicos y cerró. Desde entonces, han tratando de crear una fundación que dé apoyo al mantenimiento del desarrollo de Kannel, pero las últimas noticias que aparecen en el sitio Web de Kannel no son muy recientes. Kannel es un proyecto grande, con una estructura detallada que le convierte en "demasiado complejo" para algunas instalaciones. Sin embargo, su objetivo principal es la escalabilidad y alta disponibilidad desde su planteamiento inicial. Básicamente, en una instalación mínima, aparece lo que en Kannel denominan "BearerBox", el componente que comunica con el centro servidor de mensajes (SMSC) o un teléfono WAP que puede sustituirlo en parte. Con este BearerBox comunican los otros componentes, "SMSBox" y "WAPBox", que se encargan de acceder a los servidores HTTP que tienen el contenido que se desea acceder, y que realizan las conversiones/compresiones que establece el protocolo WAP para el envío de los mismos a los teléfonos. Figura 4. Arquitectura Kannel En una instalación orientada a SMS, desde el teléfono celular se envía un mensaje que es recibido por el SMSC u otro teléfono móvil, que recibe el mensaje para pasárselo al BearerBox; el mensaje es encaminado al SMSBox, que accede a una página Web (puede ser un cgi que genere la página dinámicamente, para ejecutar comandos o lanzar programas, por ejemplo) y el resultado es devuelto al BearerBox de nuevo para ser devuelto al teléfono. Kannel está orientado principalmente al trabajo directo con centros servidores de mensajes (SMSC) e implementa muchos protocolos de acceso a SMSCs de diferentes fabricantes. Es en la conexión directa con un SMSC cuando se obtienen los mejores resultados de rendimiento; sin embargo, no siempre se tiene disponible una conexión de este tipo con la red GSM, por lo que también implementa conexión mediante modem GSM o teléfono móvil con modem incorporado. 2.2.3 Alamin Alamin utiliza la licencia GPL. Alamin nació inicialmente con el objetivo de poder lanzar sencillas líneas de comando desde un teléfono móvil. En Marzo de 1998 se implementó un servicio que monitorizaba un buzón de correo y recibía sus mensajes, interpretaba su contenido y realizaba alguna acción, devolviendo un resultado también por correo electrónico. El acceso al teléfono móvil se realizaba mediante una pasarela sms/email. Esta pequeña pasarela estaba realizada en Perl y sus especificaciones se pueden encontrar en http://andressh.alamin.org/SSJP/. Este servicio no llegó a ser puesto en marcha en ninguna instalación real. Posteriormente, a mediados de 1999, el proyecto Gnokii permitió acceso directo a la red GSM. Ya existían los módems GSM, pero estaban muy poco extendidos, eran caros y difíciles de conseguir. Alamin utilizó primero Gnokii como medio de acceso a la red GSM, y, al evitar usar otra pasarela a más bajo nivel, se ganó en fiabilidad. En mayo de 2000 se pusieron en marcha las primeras instalaciones en explotación de Alamin. Alamin se compone principalmente de dos componentes: el manejador de mensajes (gsgmdd, Message Distpatcher) y el núcleo que gestiona las peticiones desde la red IP (gsgcmd, Core Module). 2.2.3.1 Arquitectura de Alamin Figura 5. Arquitectura Alamin El Core Module es el que centra la gestión del servicio, el control de acceso de las peticiones desde la red IP, despliega los alias en los números que corresponda y prepara las solicitudes para ser enviadas. La comunicación entre los clientes de la red IP y el Core Module se realiza mediante el protocolo smsqp, que utiliza por defecto el puerto 11201/TCP para su comunicación. Este protocolo no está terminado de especificar, ya que se está desarrollando con Alamin. El Message Dispatcher se encarga de la entrega de los mensajes desde las colas de prioridades al dispositivo GSM, comprueba la existencia de mensajes entrantes y lanza programas externos para el tratamiento de los mensajes que han llegado. Inicialmente, el Message Dispatcher utilizaba Gnokii para realizar estas tareas, pero ahora ya usa comunicación directa con módems GSM mediante comandos AT. En el momento actual de desarrollo, sólo se permite un dispositivo GSM por cada Message Dispatcher. En sucesivas versiones se podrá utilizar múltiples dispositivos GSM, tablas de rutas para decidir por dónde se envía un mensaje, y su arquitectura será cambiada para facilitar que se puedan añadir de forma sencilla nuevos "controladores" para otros dispositivos GSM o para utilizar otras pasarelas en cascada ( http, accesos directos a SMSC, protocolos de otras pasarelas, etc.) Adicionalmente a estos dos componentes van a ser añadidos otros que implementan diferentes protocolos para permitir que otras aplicaciones, directamente, sin cambios, accedan a la red GSM. Uno de ellos, que ya está incluido en la distribución de la pasarela y que implementa el protocolo SMTP, es gsgsmtpd (SMTP interfase). De esta forma, la pasarela traduce directamente mensajes de correo a SMS. Están pendientes de implementación otros protocolos, como POP, que permitirá que desde cualquier cliente de correo se puedan recibir mensajes SMS convertidos a mensajes de correo electrónico. También está pendiente de implementar el modo PDU en el envío de mensajes para módems GSM. Sólo se soporta, temporalmente, el modo texto. El modo PDU en el envío de mensajes SMS mediante comandos AT permite enviar caracteres no imprimibles, es decir, no solo letras, números y algunos caracteres especiales, si no que cualquier valor desde 0 a 255 puede ser utilizado. Es necesario para el envío de mensajes en formatos avanzados o el envío de melodías y logotipos. 2.2.4 SMSLink SMSLink utiliza la licencia GPL; es similar en muchos aspectos a Alamin, pero tiene ciertas diferencias de arquitectura. En principio, sólo hay un proceso corriendo, y lanza nuevos hilos para cada petición de envío de mensaje recibido de la red IP. El acceso concurrente al dispositivo GSM se gestiona mediante un sistema de bloqueos y semáforos. Permite el uso de múltiples dispositivos GSM desde su comienzo. Para la recepción de mensajes, existe la opción de almacenar los mensajes entrantes y enviarlos a un programa que los procese. Los dispositivos GSM soportados son todos los que soporten comandos AT extendidos, esto es, módems GSM y teléfonos con modem incorporado. Tanto el modo PDU como el modo texto están disponibles para el envió de mensajes. En este momento no incorpora todavía gestión de colas, prioridades, usuarios y permisos por usuario. Estas son las deficiencias con respecto a Alamin, sin embargo, Alamin solo puede manejar un dispositivo GSM, y en caso de ser un modem, no puede usar el modo PDU para envío de mensajes con melodías y logotipos. 2.2.5 SMSTools SMSTools utiliza la licencia GPL. La filosofía general de la aplicación es la misma que Alamin y SMSLink. Tan solo hay diferencias en detalles de implementación. Soporta hasta 32 dispositivos GSM simultáneos. Gestiona una cola por cada dispositivo y se pueden establecer rutas de manera que ciertos mensajes se envíen solo por un dispositivo determinado. También permite establecer qué programa debe ser lanzado cada vez que se recibe o se envía un mensaje. No resulta muy flexible en redes con problemas de transmisión o en momentos de mucha carga de la red, ya que la configuración de reintentos no resulta flexible. Tampoco, como SMSLink, incorpora todavía gestión de colas, prioridades, usuarios y permisos por usuario. 2.2.6 Oxygen SMS Gateway Oxygen SMS Gateway permite comunicación continua entre personas sin importar el servicio que utilicen. La versión actual soporta 3 servicios diferentes: SMS, email y ICQ. Esto significa que las personas que posean al menos uno de estos servicios pueden comunicarse con cualquiera de los otros. La ventaja principal de Oxygen SMS Gateway sobre los demás servicios smsemail es que este es bidireccional. La persona puede enviar SMS a una dirección de email, e-mails a una cuenta de ICQ y viceversa. Luego podrá recibir la respuesta, contestar esta respuesta y así sucesivamente. La Oxygen SMS Gateway opera bajo Microsoft Windows 95/98/NT/ME/2000 y soporta los siguientes teléfonos Nokia GSM: 3210, 3310, 3330, 5110, 5130, 5190, 6110, 6130, 6150, 6190, 6210, 6250, 7110, 7190, 8210, 8250, 8290, 8810, 8850,8890. 2.2.7 Now SMS E-Mail Gateway La pasarela SMS/E-mail NOW es un software que proporciona soporte bidireccional de SMS a e-mail, permitiendo que e-mails sean enviados a receptores SMS, y estos respondan por medio de SMS siendo enviados a un buzón de e-mail. Esta pasarela acepta mensajes SMTP y los enruta a receptores SMS, el formato de dirección de e-mail seria numerodetelefono@dominio. NOW permite que el usuario de SMS envíe mensajes de Internet de dos formas, como respuesta a un mensaje recibido por medio de la pasarela, o un mensaje completamente nuevo. Para enviar un nuevo mensaje SMS hacia un buzón de correo, el encabezado del mensaje debe ser la dirección de e-mail que va a recibir el mensaje. La respuesta de un SMS a un e-mail es soportada por dos métodos diferentes, dependiendo de la configuración de la pasarela. Si 20 o más números de teléfono están localizados en la pasarela, cada vez que la pasarela enrute un mensaje hacia un receptor de SMS, un número diferente de teléfono de envío es utilizado. Cuando el usuario responde, basado en el número de teléfono al que respondieron, el mensaje es enrutado a la dirección de e-mail apropiada que género el mensaje que fue respondido. Si un solo número de teléfono está localizado en la pasarela, un código es incluido con cada mensaje enrutado a un receptor SMS por medio de la pasarela. Cuando un usuario responde un mensaje, debe incluir dicho código como el primer texto de la respuesta SMS. Esta pasarela requiere una conexión SMPP(Short Message Peer-to-Peer Protocol) a un SMSC (Short Message Service Center), con la capacidad de enviar y recibir mensajes. 3. METODOLOGIA Para el desarrollo de este proyecto se siguieron las directrices marcadas por la metodología XP (Extreme Programming). 3.1 eXtreme Programming La metodología XP hace parte de las llamadas metodologías ágiles, las cuales se rigen por el siguiente manifiesto. Software que funcione es más importante que documentación exhaustiva. Desarrollar software que funciona más que conseguir una buena documentación. La regla a seguir es no producir documentos a menos que sean necesarios de forma inmediata para tomar un decisión importante. Estos documentos deben ser cortos y centrarse en lo fundamental. La colaboración con el cliente es más importante que la negociación de contratos. Se propone que exista una interacción constante entre el cliente y el equipo de desarrollo. Esta colaboración entre ambos será la que marque la marcha del proyecto y asegure su éxito. La respuesta ante el cambio es más importante que el seguimiento de un plan. Responder a los cambios más que seguir estrictamente un plan. La habilidad de responder a los cambios que puedan surgir a los largo del proyecto (cambios en los requisitos, en la tecnología, en el equipo, etc.) determina también el éxito o fracaso del mismo. Por lo tanto, la planificación no debe ser estricta sino flexible y abierta. XP se fundamenta en doce prácticas, descritas a continuación: Planificación incremental La Programación Extrema asume que la planificación nunca será perfecta, y que variará en función de cómo varíen las necesidades del negocio. Por tanto, el valor real reside en obtener rápidamente un plan inicial, y contar con mecanismos de feedback que permitan conocer con precisión dónde estamos. Como es lógico, la planificación es iterativa: un representante del negocio decide al comienzo de cada iteración qué características concretas se van a implementar. El objetivo de la XP es generar versiones de la aplicación tan pequeñas como sea posible, pero que proporcionen un valor adicional claro, desde el punto de vista del negocio. A estas versiones se las denomina releases. Un release cuenta con un cierto número de historias. La historia es la unidad de funcionalidad en un proyecto XP, y corresponde a la mínima funcionalidad posible que tiene valor desde el punto de vista del negocio. Durante cada iteración se cierran varias historias, lo que hace que toda iteración añada un valor tangible para el cliente. La obtención de feedback que permita llevar a cabo estimaciones precisas es fundamental. Se hacen estimaciones para cada historia, de modo que en cuanto se comienzan a tener datos históricos, éstos se utilizan para hacer que las siguientes estimaciones sean más precisas. Gran parte de la eficacia de este modelo de planificación deriva de una división clara de responsabilidades, que tiene en cuenta las necesidades del negocio en todo momento. Las responsabilidades del equipo de desarrollo son las siguientes: Estimar cuánto tiempo llevará una historia: este feedback es fundamental para el cliente, y puede llevarle a reconsiderar qué historias se deben incluir en una iteración. Proporcionar información sobre el coste de utilizar distintas opciones tecnológicas. Organizar el equipo. Estimar el riesgo de cada historia. Decidir el orden de desarrollo de historias dentro de la iteración. Testing La ejecución automatizada o manual de tests es un elemento clave de la XP. Existen tanto tests internos (o tests de unidad), para garantizar que el mismo es correcto, como tests de aceptación, para garantizar que el código hace lo que debe hacer. El cliente es el responsable de definir los tests de aceptación, no necesariamente de implementarlos. Él es la persona mejor calificada para decidir cuál es la funcionalidad más valiosa. Desde el punto de vista de la XP, si no hay tests, las cosas sólo funcionan en apariencia. El objetivo de los tests no es corregir errores, sino prevenirlos. Elaborar los tests exige pensar por adelantado cuáles son los problemas más graves que se pueden presentar, y cuáles son los puntos dudosos. Esto evita muchos problemas y dudas, en lugar de dejar que aparezcan sobre el desarrollo Un efecto lateral importante de los tests es que dan una gran seguridad a los desarrolladores, es posible llegar a hacer cambios más o menos importantes sin miedo a problemas inesperados. La existencia de tests hace el código muy maleable. Programación en parejas La XP incluye, como una de sus prácticas estándar, la programación en parejas. Nadie programa en solitario, siempre hay dos personas delante de la computadora. Ésta es una de las características que más se cuestiona al comienzo de la adopción de la XP dentro de un equipo, pero en la práctica se acepta rápidamente y de forma entusiasta. El principal argumento contra la programación en parejas es que es improductiva. Esta idea se basa en el hecho de que dos programadores "programan el doble por separado". Esto sería así si no fuera por las siguientes razones: El hecho de que todas las decisiones las tomen al menos dos personas proporciona un mecanismo de seguridad enormemente valioso. Con dos personas responsabilizándose del código en cada momento, es muy difícil que dos personas se salten tareas por descuido o negligencia. El hecho de programar en parejas permite la dispersión de know-how por todo el equipo. Este efecto es difícil de conseguir de otro modo, y hace que la incorporación de nuevos miembros al equipo sea mucho más rápida y eficaz. El código siempre está siendo revisado por otra persona. La revisión de código es el método más eficaz de conseguir código de calidad, algo corroborado por numerosos estudios, muchos de los cuáles son anteriores a la Programación Extrema. En contra de lo que pueda parecer, los dos desarrolladores no hacen lo mismo: mientras el que tiene el teclado adopta un rol más táctico, el otro adopta un rol más estratégico, preguntándose constantemente si lo que se está haciendo tiene sentido desde un punto de vista global. Refactorización A la hora de la verdad, el código de la mayor parte de las aplicaciones empieza en un razonable buen estado, para luego deteriorarse de forma progresiva. El costo desorbitado del mantenimiento, modificación y ampliación de aplicaciones ya existente se debe en gran parte a este hecho. Uno de los objetivos de la XP es mantener la curva de costos tan plana como sea posible, por lo que existen una serie de mecanismos destinados a mantener el código en buen estado, modificándolo activamente para que conserve claridad y sencillez. A este proceso básico para mantener el código en buena forma se le llama refactorización. La refactorización no sólo sirve para mantener el código legible y sencillo: también se utiliza cuando resulta conveniente modificar código existente para hacer más fácil implementar nueva funcionalidad. Diseño simple Otra práctica fundamental de la Programación Extrema es utilizar diseños tan simples como sea posible. El principio es utilizar el diseño más sencillo que consiga que todo funcione. Si no se van a anticipar futuras necesidades, se debe poder modificar el diseño si alguna de estas se materializa. La XP soporta estas modificaciones gracias a los tests. La refactorización, que hace que el código existente sea claro y sencillo, también ayuda a hacer factibles las modificaciones. La XP define un "diseño tan simple como sea posible" como aquél que: Pasa todos los tests. No contiene código duplicado. Deja clara la intención de los programadores (enfatiza el qué, no el cómo) en cada línea de código. Contiene el menor número posible de clases y métodos. Propiedad colectiva del código La XP aboga por la propiedad colectiva del código. En otras palabras, todo el mundo tiene autoridad para hacer cambios a cualquier código, y es responsable de ellos. Esto permite no tener que estar esperando a otros cuando todo lo que hace falta es algún pequeño cambio. Por último, vale la pena tener en cuenta que la existencia de tests impide que se produzca un desarrollo anárquico, al ser cada persona responsable de que todos los tests se ejecuten con éxito al incorporar los cambios que ha introducido al programa. Integración continua En muchos casos la integración de código produce efectos laterales imprevistos, y en ocasiones la integración puede llegar a ser realmente traumática, cuando dejan de funcionar cosas por motivos desconocidos. La Programación Extrema hace que la integración sea permanente, con lo que todos los problemas se manifiestan de forma inmediata, en lugar de durante una fase de integración más o menos remota. Cliente en el equipo La XP intenta resolver este tipo de problemas integrando un representante del negocio dentro del equipo de desarrollo. Ésta persona siempre está disponible para resolver dudas y para decidir qué y qué no se hace en cada momento, en función de los intereses del negocio. Debido a su inmersión dentro del equipo, y a que es él quien decide qué y qué no se hace, junto con los tests que verifican si la funcionalidad es la correcta y deseada, esta persona obtiene un feedback absolutamente realista del estado del proyecto. Releases pequeñas (Entregas pequeñas) Siguiendo la política de la XP de dar el máximo valor posible en cada momento, se intenta liberar nuevas versiones de las aplicaciones con frecuencia. Éstas deben ser tan pequeñas como sea posible, aunque deben añadir suficiente valor como para que resulten valiosas para el cliente. Semanas de 40 horas La Programación Extrema lleva a un modo de trabajo en que el equipo está siempre al 100%. Una semana de 40 horas en las que se dedica la mayor parte del tiempo a tareas que suponen un avance puede dar mucho de sí, y hace innecesario recurrir a sobreesfuerzos -excepto en casos extremos. Además, el sobreesfuerzo continuado pronto lleva a un rendimiento menor y a un deterioro de la moral de todo el equipo. Estándares de codificación Para conseguir que el código se encuentre en buen estado y que cualquier persona del equipo pueda modificar cualquier parte del código es imprescindible que el estilo de codificación sea consistente. Sin embargo, la XP también es pragmática en esto, y apuesta por establecer un número mínimo de reglas: el resto se irán pactando de-facto. Esto evita un ejercicio inicial más o menos estéril. Uso de Metáforas La comunicación fluida es uno de los valores más importantes de la Programación Extrema: la programación en parejas, el hecho de incorporar al equipo una persona que represente los intereses del negocio y otras prácticas son valiosas entre otras cosas porque potencian enormemente la comunicación. 3.1.1 Ciclo de vida de un proyecto XP El ciclo de vida ideal XP consiste de seis fases: Exploración En esta fase, los clientes plantean a grandes rasgos las historias de usuario que son de interés para la primera entrega del producto. Al mismo tiempo el equipo de desarrollo se familiariza con las herramientas, tecnologías y prácticas que se utilizarán en el proyecto. Se prueba la tecnología y se exploran las posibilidades de la arquitectura del sistema construyendo un prototipo. La fase de exploración toma de pocas semanas a pocos meses, dependiendo del tamaño y familiaridad que tengan los programadores con la tecnología. Planificación de la Entrega (Release) En esta fase el cliente establece la prioridad de cada historia de usuario, y correspondientemente, los programadores realizan una estimación del esfuerzo necesario de cada una de ellas. Se toman acuerdos sobre el contenido de la primera entrega y se determina un cronograma en conjunto con el cliente. Una entrega debería obtenerse en no más de tres meses. Esta fase dura unos pocos días. Las estimaciones de esfuerzo asociado a la implementación de las historias la establecen los programadores utilizando como medida el punto. Un punto, equivale a una semana ideal de programación. Las historias generalmente valen de 1 a 3 puntos. La planificación se puede realizar basándose en el tiempo o el alcance. La velocidad del proyecto es utilizada para establecer cuántas historias se pueden implementar antes de una fecha determinada o cuánto tiempo tomará implementar un conjunto de historias. Al planificar por tiempo, se multiplica el número de iteraciones por la velocidad del proyecto, determinándose cuántos puntos se pueden completar. Al planificar según alcance del sistema, se divide la suma de puntos de las historias de usuario seleccionadas entre la velocidad del proyecto, obteniendo el número de iteraciones necesarias para su implementación. Iteraciones Esta fase incluye varias iteraciones sobre el sistema antes de ser entregado. El Plan de Entrega está compuesto por iteraciones de no más de tres semanas. En la primera iteración se puede intentar establecer una arquitectura del sistema que pueda ser utilizada durante el resto del proyecto. Esto se logra escogiendo las historias que fuercen la creación de esta arquitectura, sin embargo, esto no siempre es posible ya que es el cliente quien decide qué historias se implementarán en cada iteración (para maximizar el valor de negocio). Al final de la última iteración el sistema estará listo para entrar en producción. Los elementos que deben tomarse en cuenta durante la elaboración del Plan de la Iteración son: historias de usuario no abordadas, velocidad del proyecto, pruebas de aceptación no superadas en la iteración anterior y tareas no terminadas en la iteración anterior. Todo el trabajo de la iteración es expresado en tareas de programación, cada una de ellas es asignada a un programador como responsable, pero llevadas a cabo por parejas de programadores. Producción La fase de producción requiere de pruebas adicionales y revisiones de rendimiento antes de que el sistema sea trasladado al entorno del cliente. Al mismo tiempo, se deben tomar decisiones sobre la inclusión de nuevas características a la versión actual, debido a cambios durante esta fase. Es posible que se rebaje el tiempo que toma cada iteración, de tres a una semana. Las ideas que han sido propuestas y las sugerencias son documentadas para su posterior implementación (por ejemplo, durante la fase de mantenimiento). Mantenimiento Mientras la primera versión se encuentra en producción, el proyecto XP debe mantener el sistema en funcionamiento al mismo tiempo que desarrolla nuevas iteraciones. Para realizar esto se requiere de tareas de soporte para el cliente. De esta forma, la velocidad de desarrollo puede bajar después de la puesta del sistema en producción. Muerte del Proyecto Es cuando el cliente no tiene más historias para ser incluidas en el sistema. Esto requiere que se satisfagan las necesidades del cliente en otros aspectos como rendimiento y confiabilidad del sistema. Se genera la documentación final del sistema y no se realizan más cambios en la arquitectura. La muerte del proyecto también ocurre cuando el sistema no genera los beneficios esperados por el cliente. Figura 6. Ciclos de Planeación y Retroalimentación 3.2 Enfoque de la Investigación Empírico – analítico El proyecto responde a este enfoque ya que se realizará una investigación técnica con pocos precedentes en el campo, y tiene un impacto en servicios que afectan a la sociedad en común. 3.3 Línea de Investigación de la USB / Sub Línea de Facultad/ Campo Temático del Programa Tecnologías Actuales Y Sociedad / Sistemas de información, comunicación y robótica. / Desarrollo de aplicaciones 3.4 Hipótesis Es posible el envío de correos electrónicos desde un dispositivo móvil celular por medio de SMS. 4. PRESENTACION Y ANALISIS DE RESULTADOS Teniendo en cuenta la hipótesis y objetivos planteados, luego de probar diferentes vías de atacar el problema, se encontró, que es posible lograr el envío de un correo electrónico a través de un mensaje de texto (SMS) convencional desde cualquier dispositivo móvil celular. Luego de pasar por la fase de levantamiento de información e investigación se concluyó que la aplicación era viable técnicamente, debido a que se podía lograr generar un ambiente simulado apropiado para afrontar la fase de pruebas a la que sería sometida. Al ver su viabilidad se seleccionaron las tecnologías de desarrollo más apropiadas y el diseño de la aplicación, el cual quedo definido por un modem GSM conectado a un servidor donde se encuentra la SMS Gateway (pasarela SMS), que invoca mediante un parámetro GET un Java Servlet contenido en el servidor de aplicaciones, el cual luego de validar contra la base de datos los contactos del remitente genera el envió del correo electrónico deseado (Diagrama 1). Antes de llegar a esta solución, se implemento otra que logra su cometido mediante un entorno totalmente simulado, utilizando un Java Socket-Midlet y un Java Servlet, mediante el Java Wireless Toolkit y su consola de WMA (Wireless Messaging API), que simula el remitente del SMS inicial (Diagrama 7). Respetando la metodología y actividades propuestas y superando la fase de pruebas correspondiente al entorno de ejecución para llegar al desarrollo final de la aplicación, se espera que ésta tenga un gran nivel de aceptación debido a su innovación y simplicidad. Diagrama 1. Funcionamiento Físico sms2mal 5. DESARROLLO INGENIERIL 5.1 Fase de Exploración De acuerdo a la metodología (Programación Extrema) acordada para el desarrollo e implementación del sistema, hemos de empezar por la primera fase, que es la exploración, fase en la que se plantean las historias de usuario (user stories) o requisitos del sistema al mismo tiempo que el equipo de desarrollo se familiariza con las herramientas, tecnologías y prácticas que se utilizarán en el proyecto. Se prueba la tecnología y se exploran las posibilidades de la arquitectura del sistema construyendo un prototipo. 5.1.1 Historias de Usuario (Requerimientos del Sistema) Para poder llevar a cabo el desarrollo, empezamos por indagar cuales son los requerimientos del sistema, combinamos este proceso con la documentación de casos de uno de UML para poder documentar bien la aplicación. A continuación se describen brevemente las características que el sistema debe tener desde la perspectiva del usuario. o Enviar un correo electrónico por medio del celular, por el método de SMS. o Poder consultar cuantos correos han sido enviados. o Poder agregar listas distribución a grupos determinados. o Establecer un formato de envió por SMS para reducir error. o Gestión de Listas de distribución por medio de una pagina Web. o Registrarse como usuario del servicio, por medio Web. o Autenticación de usuarios en la Web, para mantener un control sobre el servicio. 5.1.2 Casos de uso del sistema Los casos de uso del sistema, fueron orientados a la funcionalidad, desde el dispositivo móvil en el que se va a enviar el correo por medio de SMS y desde el desarrollo del aplicativo Web, para el registro de listas de distribución. Diagrama 2. Caso de uso de Envió de sms2mail En la figura anterior, se ven los casos de uso para el envió de SMS a correo electrónico. En el cual se identifican, los dos tipos de validación que debe hacer el sistema para el envió del correo. En el siguiente diagrama se detallan los casos de uso para el aplicativo Web que se encargara de la inscripción en el sistema para las listas de distribución. Diagrama 3. Casos de uso Aplicativo Web 5.1.3 Herramientas En el desarrollo de este proyecto las herramientas utilizadas en su mayoría son tecnologías libres, aunque la plataforma esta sobre Windows XP. 5.1.4 Desarrollo Java™ 2 SDK, Standard Edition 1.5 Sun Microsystems Java Wireless ToolKit 2.5 Beta (Emulador para entornos móviles) Marcromedia DreamWeaver MX 2004 PHP Designer 2005 Smart Draw Suite Edition Microsoft Visio 2003 5.1.5 Entorno de Ejecución Apache Tomcat 5.5 Java 2 Platform, Micro Edition (J2ME) AppServer 2.4.4ª Mysql 5.0 Win 32 Now SMS Gateway Mdaemon 8.1 Servidor de Correo 5.1.6 Tecnología y Plataformas PC Pentium 4 3000 HT, 1 Gb RAM PC AMD 64bits 3000, 512 RAM Móvil Siemens c66 5.2 Planificación de Entregas En esta fase, estimaremos las iteraciones necesarias y su frecuencia de entrega, tanto como su estimación de esfuerzo para el equipo desarrollador según algunas métricas explicadas en el punto 3.1 en el apartado que hace referencia a la planificación de entregas. A continuación se muestran las tareas a desarrollar durante el proyecto de a cuerdo a los requerimientos y los casos de uso del sistema expuestos anteriormente. Instalación y Configuración de Servidor de Aplicaciones Implementación de servidor de Correo Implementación de Pasarela SMS Integración entre servicios de SMS con servidor HTTP Desarrollo lógica del Sistema Validación de usuarios Desarrollo socket Midlet Funcionalidad General Creación de Usuarios Gestión de Listas de Distribución Validación de Usuarios 5.2.1 Estimación de Esfuerzo 5.2.1.1 Implementación del entorno de Ejecución Tabla 2. Estimación de Esfuerzo Entorno de Ejecución Instalación y Configuración de Servidor de Aplicaciones 1 Implementación de servidor de Correo 2 Diseño e implementación de la Base de Datos 1 Implementación de Pasarela SMS 2 5.2.1.2 Desarrollo de Funcionalidad General Tabla 3. Estimación de Esfuerzo Funcionalidad General 5.2.1.3 Integración entre servicios de SMS con servidor HTTP 3 Desarrollo lógica del Sistema 3 Validación de usuarios 2 Desarrollo socket Midlet 2 Funcionalidad General 3 Gestión de Usuarios y listas de Distribución Tabla 4. Estimación de Esfuerzo Gestión de Usuarios y listas de Distribución Creación de Usuarios 1 Gestión de Listas de Distribución 2 Validación de Usuarios 1 5.2.2 Planificación Partiendo de los requerimientos anteriores se realiza una planificación en cuatro iteraciones basándose en el tiempo y procurando agrupar la funcionalidad relacionada en la misma iteración. Tabla 5. Planificación de entregas e iteraciones Segunda Primera Tercera Segunda Semana de Semana de Semana de Semana de Octubre Noviembre Noviembre Diciembre 0.1 0.2 0.3 0.1 0.2 0.3 Instalación y Configuración de Servidor de 0.1 Aplicaciones Diseño e implementación de la Base de 0.1 Datos Implementación de servidor de 0.1 0.2 0.1 0.2 Correo Implementación de Pasarela SMS Integración entre servicios de SMS con servidor HTTP Desarrollo lógica del Sistema Validación de usuarios 0.1 0.2 0.1 0.2 0.2 0.3 Móviles Desarrollo socket Midlet Funcionalidad 0.1 General Creación de 0.1 Usuarios Gestión de Listas de 0.1 0.2 Distribución Validación de 0.1 Usuarios WEB 5.3 Iteraciones 5.3.1 Primera Iteración: Entorno de Ejecución En esta iteración, se implementan las herramientas y el entorno de ejecución que permitirá el desarrollo del proyecto. Algunas de las dificultades se vieron en el momento de configurar algunas herramientas que no eran conocidas y tenían necesariamente que pasar por un proceso de aprendizaje. Tabla 6. Primera Iteración Instalación y Configuración de Servidor de Aplicaciones 1 Implementación de servidor de Correo 2 Diseño e implementación de la Base de Datos 1 Implementación de Pasarela SMS 2 ESTIMACION INICIAL 6 ESTIMACION REAL 6 El tiempo de entrega fue óptimo, no se encontraron problemas en la implantación del entorno de ejecución. Instalación y configuración de Servidor de Aplicaciones: Es necesario para el comienzo del proyecto, configurar adecuadamente el servidor de aplicaciones, en el cual va residir la lógica del sistema y la publicación del aplicativo. Tomcat es una poderosa herramienta desarrollada por Apache Foundation para que sea compatible completamente con las plataformas J2EE, En este caso el servlet que será el encargado de mediar entre los servicios de sms gateway con http. Puede verse la configuración de XML para la publicación del servlet a continuación. La ruta de la publicación del servlet es \\apache software foundation\Tomcat 5.5\webapps\correo\WEB INF\classes\correosevlet2. Implementación del Servidor de Correo: MDaemon es un servidor de e-mail estándar SMTP/POP/IMAP que ofrece un amplio rango de funcionalidad. Entre sus funciones principales protege contra el spam, ofrece acceso web al e-mail, permite la administración remota y cuando es combinado con el MDaemon AntiVirus, asegura el sistema contra virus de terminales. MDaemon está probado como un servidor seguro, fiable y versátil. Lo primero que se tiene que hacer es bajar la última versión de MDaemon de http://www.alt-n.com/. El programa es shareware. Figura 7. Consola de MDemon o Instalación y Configuración de MDaemon En la instalación MDaemon pregunta las direcciones de los servidores DNS. Hay que utilizar las del ISP si se tiene uno configurado o sino se puede colocar el nombre del pc en que va a estar instalado. De todos modos se configurara para que siempre intente usar los servidores DNS que en cada momento estén activos en el sistema; así MDaemon funcionará tanto en Internet como en redes locales, incluso si se cambia de ISP. También preguntará, en caso de que tengamos Windows NT o 2000, si queremos ejecutar MDaemon como servicio. Es recomendable decirle que sí, ya que los servicios siempre son más estables que las aplicaciones de segundo plano, salvo que vayamos a ejecutar MDaemon sólo ocasionalmente. Una vez instalado, hay que tener en cuenta que por defecto escucha por los puertos 25 (SMTP), 110 (POP) y 143 (IMAP). Esto es importante por si la plataforma cuenta con firewall. Si se va a usar MDaemon sólo para enviar correo, se puede deshabilitar los servidores POP e IMAP. Para que funcione se tiene que ir a Setup > Primary Domain e introducir los siguientes datos: Primary Domain: "localhost" o "127.0.0.1" o el nombre de la máquina en nuestra red local. Figura 8. Configuración Dominio MDaemon HELO Domain es el nombre de dominio que usa para reconocer a las conexiones entrantes. Domain IP: "127.0.0.1" o bien la dirección IP de la máquina en la red LAN. Para eso se a elegido la opción "Attempt To Send All Mail Direct Without Using An Intermediate Host". También se usa la opción de utilizar los servidores DNS establecidos en la configuración de Windows XP para eso se marca la primera opción, "Try to use DNS servers defined in windows TCP/IP settings". Por último, a Setup > Security settings > Relay y se desactivan todas las opciones. Después queda configurar el cliente de correo electrónico que se utiliza correo saliente SMTP "localhost", "127.0.0.1" . Figura 9. Configuración DNS MDaemon como servidor de Diseño e implementación de la Base de Datos Diagrama 4. Diagrama de Base de Datos Implementación pasarela SMS: NowSMS, es una pasarela que hace de intermediaria entre los servicios de SMS y http, para lo cual se tiene que instalar en el servidor, y configurar con un modem el cual será el receptor de los mensajes de texto entrantes al sistema, la pasarela los recibe y llama a la lógica del sistema para que los despache. Este queda como un servicio, el cual e configura en la pestaña de 2-way, que la encargada de hacer la comunicación entre el dispositivo y la lógica del sistema. Figura 10. Configuración Pasarela SMS 5.3.1.1 Test de Aceptación Primera Iteración: Entorno de Ejecución. Tabla 7. Tareas desarrollada Primera Iteración Instalación y Configuración de Servidor de Aplicaciones 1 Implementación de servidor de Correo 2 Implementación de Pasarela SMS 2 ESTIMACION INICIAL 5 ESTIMACION REAL 5 Checklist Test de Aceptación Primera Iteración: Tabla 8. Aspectos evaluados Primera Iteración SI Apache Tomcat Instalado y Configurado Creación de ficheros de trabajo y configuración de XML en Apache Tomcat MDaemon Instalado y Configurado MDaemon no genera ninguna alerta al iniciarse Es posible el envió local de Correo electrónico por medio de MDaemon Existe la cuenta usuario@sms2mail.com Existen cuentas de administración en MDaemon Creación de reglas de cuentas de usuarios de MDaemon Configuración de Relay en MDaemon Instalacion de Pasarela SMS Comunicación exitosa entre Modem Celular y Pasarela X X X X X X X X X X X NO 5.3.2 Segunda Iteración: Lógica del Sistema En esta iteración, es donde se establece la funcionalidad del sistema, también la validación de listas de distribución de usuarios, cotejando y comparando con la base de datos. Se encontraron algunos tipos de dificultad, al tener que adaptarnos ala curva de aprendizaje del lenguaje de programación utilizado (JAVA). Asimismo se desarrolla un segundo escenario para la implementación del servicio sms2mail, por medio del que es llamado Socket-Midlet, ya que es un componente que reside en el dispositivo móvil receptor de SMS y que también hará la tarea de Pasarela SMS, por medio de una aplicación escrita en J2ME con su perfil MIDP 2.0. Tabla 9. Segunda Iteración Integración entre servicios de SMS con servidor HTTP 3 Desarrollo lógica del Sistema 2 Validación de usuarios 2 Desarrollo socket Midlet 2 Funcionalidad General 3 ESTIMACION INICIAL 12 ESTIMACION REAL 15 Integración entre servicios de SMS con servidor http: Se configura el entorno de funcionamiento, ya descrito en la primera iteración. A base de pruebas realizadas es posible hacer llamado del servlet que se encarga de la lógica, este tiene varios parámetros de entrada que son propios de la pasarela SMS antes configurada. Estos parámetros de entrada son explicados en la siguiente tabla: Tabla 10. Parámetros de Salida de Pasarela SMS El numero de teléfono de donde @@SENDER@@ proviene el SMS origen. @@SMSPREFIX@@ La primera palabra del SMS. El contenido del SMS sin el @@SMS@@ SMSPREFIX. @@FULLSMS@@ Todo el contenido del SMS. El numero celular del teléfono receptor @@RECIP@@ del mensaje. Con estos parámetros se construye una URL que invocara posteriormente al servlet por medio de un parámetro GET. Este parámetro GET en este caso quedaría así: http://192.168.0.16:8080/correo/servlet/correoServlet2?celular=@@SENDE R@@&mensaje=@@FULLSMS@@ Desarrollo lógica del sistema: En este paso se desarrolla el componente que implementa la lógica y soportara la funcionalidad del sistema. Integrando los cuatro componentes o capas de sms2mail, como se muestra en el Diagrama 4. Por un parámetro GET invoca al Java Servlet teniendo como parámetros el número del remitente y el texto completo del mensaje. El servlet captura estos parámetros, abre una conexión con el servidor de base de datos contra el cual valida la existencia del número celular del remitente entre los usuarios inscritos en el aplicativo adelante. Web que se describirá mas Diagrama 5. Esquema lógico de sms2mail Al comprobar su existencia, el parámetro recibido como el mensaje completo, mediante manejo de cadenas, determina si es un mensaje dirigido a un solo destinatario o a un grupo. En el primer caso, el servlet separa la dirección de correo del destino del cuerpo del mensaje, y genera el envío del e-mail el cual se hace a través del servidor de correo. Si la dirección es correcta el remitente recibe un SMS de confirmación con el texto “Email enviado por SMS2MAIL”, o por el contrario un mensaje de error. Validación de Usuarios: El sistema sms2mail puede funcionar tanto si el usuario esta inscrito en el sistema o no. La única diferencia entre si esta o no esta inscrito es que el primero puede mandar a listas de distribución, en cambio el otro tipo de usuario solo puede mandar una cuenta de correo su mensaje, por eso es necesario validar en la base de datos si esta en el sistema para luego ver si tiene una lista de distribución valida. El servlet, también mediante el manejo de cadenas, separa el nombre del grupo del resto del mensaje, y compara este nombre de grupo con los que el usuario inscribió previamente en el servicio Web, si existe, el servlet ejecuta una consulta SQL en la base de datos, y toma los contactos pertenecientes a ese grupo y genera el envío del e-mail a cada uno de ellos. Desarrollo de Socket-Midlet: Una de las mayores ventajas que se encontró en el transcurso del proyecto, fue el hecho de aprovechar la capacidad de los dispositivos móviles actuales que soportan una buena capacidad de procesamiento. Socket-Midlet, es una combinación entre las funciones propias de un socket y el entorno de funcionamiento de un Midlet que se encuentra embebida dentro del mismo dispositivo receptor, programado enteramente con j2me. Diagrama 6. Diagrama de clases de Socket Midlet Figura 11. Socket Midlet en espera Simplemente el midlet abre un puerto por el cual espera que llegue un SMS enviado por un usuario, cuando llega este SMS, lo recibe e invoca el servlet haciendo la vez de SMS gateway. Este método de recepción implementa un objeto runnable, el cual tiene que ser un hilo que instancia el sms recibido con el parámetro GET o POST por el cual será invocado el servlet. En este caso se muestra el envió por medio de la utilidad de envió de SMS de Sun Java Toolkit. Figura 12. Socket Midlet Invocando al servlet La desventaja de este método es que puede estar sujeto a las capacidades de recepción del móvil celular, por lo tanto podría haber un bloqueo de memoria o de procesamiento de SMS´s entrantes y tener una perdida significativa de información. Todo esto sujeto a que en un entorno real de aplicación (operador celular), haya un volumen de datos mucho más grande que en u entorno simulado. Funcionalidad General Se toma como fuente inicial un mensaje de texto (SMS), enviado desde un dispositivo móvil celular de un operador cualquiera hacia un número previamente definido perteneciente a un módem GSM (ya sea simulado o real), a través de la plataforma ya existente, es recibido por el SMSC (Short Message Service Center) del operador y este se encarga de enrutarlo hacia el dispositivo GSM, el cual se encuentra conectado directamente a un servidor de aplicaciones. Figura 13. Envío a un solo destino El mensaje que llega al dispositivo debe tener un formato especial, con la dirección de correo electrónico a la cual se desea enviar el mensaje de ser para un solo destinatario (ver Figura 14), o en su defecto si desea ser enviado a un grupo de direcciones, el nombre del grupo que fue inscrito previamente por el usuario en el servicio Web de sms2mail (ver Figura 15), el cual será detallado a fondo mas adelante(Diagrama 8); y a continuación el texto que desea conforme el cuerpo del e-mail. Figura 14. Envío a grupo El no utilizar este formato provocará que el correo no pueda ser enviado satisfactoriamente y el usuario reciba un mensaje de error. Diagrama 7. Funcionamiento con SMS Gateway Diagrama 8. Esquema Funcionamiento utilizando un Socket-Midlet 5.3.2.1 Test de Aceptación Segunda Iteración: Lógica del Sistema Tabla 11. Tareas desarrolladas Segunda Iteración Integración entre servicios de SMS con servidor HTTP 3 Desarrollo lógica del Sistema 2 Validación de usuarios 2 Desarrollo socked Midlet 2 Funcionalidad General 3 ESTIMACION INICIAL 12 ESTIMACION REAL 15 Checklist Test de Aceptación Segunda Iteración Tabla 12. Aspectos evaluados Segunda Iteración SI NO Existe conexión de doble vía con Apache tomcat y X el Modem GSM Es posible el envió de mail a través de X parámetros GET Existen datos de prueba X en la base de datos El sistema valida listas X de distribución Es posible el envió de correo electrónico desde X un celular cualquiera Ejecución de SocketMidlet en entorno X Simulado Es posible el envió de Correo electrónico a X través de Socket-Midlet 5.3.3 Tercera Iteración: Aplicativo Web En esta iteración se construye el aplicativo Web, que dará a los usuarios un uso más transparente del sistema, los requerimientos de este aplicativo se pueden ver más detalladamente en el diagrama de casos de uso expuesto en la fase de exploración (Diagrama 3). En este diagrama se aprecia claramente la interacción del usuario con el sistema, empezando por su inscripción en el servicio Web, donde tiene la posibilidad de crear listas de contactos, modificarlas y borrarlas. Por otro lado se ve el caso del envío del correo, que inicia con la validación tanto del usuario como de su lista de contactos o dirección de correo al que desea enviar el mensaje y termina con el envío del correo y la respectiva confirmación al usuario en el caso en que el proceso se cumpla satisfactoriamente. Tabla 13. Tercera Iteración Creación de Usuarios 1 Gestión de Listas de Distribución 2 Validación de Usuarios 1 ESTIMACION INICIAL 4 ESTIMACION REAL 4 El aplicativo Web se desarrolla completamente en PHP, por su versatilidad y adaptación, y aprovechando que se tenía alguna base de conocimiento sobre este mismo. Mediante el modelo de transacción web podemos ver más a fondo el funcionamiento del servicio web de inscripción SMS2MAIL (Diagrama 8) que se explicara en el siguiente punto. Creación de Usuarios La aplicacion Web se desarrolla para ofrecer mayor facilidad y más opciones al usuario durante el proceso de envió de correo electrónico desde su celular. Mediante este servicio Web podrá registrar usuarios nuevos, crear listas de distribución y modificarlas a su antojo. Como vemos en el diagrama de despliegue de componente (Diagrama 9), el servicio Web esta distribuido en 3 capas, las cuales están separadas tanto lógica como físicamente. En primer lugar encontramos un servidor Web, encargado de dar publicación al aplicativo Web, este se encuentra ubicado en un hosting para efectos de rapidez y seguridad en la presentación de la Web. Figura 15. Entrada al Aplicativo Web sms2mail La aplicación ofrece seguridad al usuario mediante una validación contra la base de datos de Mysql de su número celular y su contraseña, que permite comprobar su existencia y darle acceso a sus listas ya inscritas, con la posibilidad de editarlas. En el siguiente diagrama se ve completamente el funcionamiento del aplicativo web, mostrando como está conformado, sus métodos y validaciones. Diagrama 9. Diagrama de transacción Web La interacción entre los diferentes componentes que intervienen en el funcionamiento de la aplicación web se puede obsevar en el siguiente diagrama. Diagrama 10. Diagrama de despliegue de componentes Gestión de Listas de Distribución: En este paso se desarrollan las interfaces para que el usuario pueda gestionar sus listas de distribución. Aquí el usuario observa sus listas actualmente inscritas con las opción de modificarlas, o crear una nueva. Figura 16. Gestión de Listas de Distribución 5.3.3.1 Test de aceptación Tercera Iteración: Aplicativo Web Tabla 14. Tareas desarrolladas Tercera Iteración Creación de Usuarios 1 Gestión de Listas de Distribución 2 Validación de Usuarios 1 ESTIMACION INICIAL 4 ESTIMACION REAL 4 Checklist Test de aceptacion Tercera Iteración Tabla 15. Aspectos evaluados Tercera Iteración SI NO Es posible inscripción de usuarios al servicio por X medio del la pagina WEB Es posible la creación y edición de listas de distribución y contactos X por medio de la pagina WEB Es optima la navegación X por el sitio WEB Existe algún tipo de autenticación para los X usuarios Es amigable el entorno X de la pagina WEB 5.4 Producción En esta fase, se ha puesto a disposición el servicio al público en general, con el fin de saber la aceptación del mismo. En el aplicativo Web se darán las instrucciones del manejo de sms2mail y luego la opción de votar si el servicio le ha parecido bueno o malo en su funcionamiento o si satisfizo las expectativas. Es posible que para el futuro, se creen nuevos servicios basados en esta implementación, también se tiene que esperar la retroalimentación de los usuarios para ver las necesidades hacia nuevos horizontes. 6. CONCLUSIONES En el transcurso del proyecto se encontraron varios aspectos importantes a mencionar, y que resultan de la experiencia del equipo de desarrollo en su trabajo. El proyecto sms2mail, proporciona una visión sobre las futuras aplicaciones que podrían estar desarrolladas por medio de este entorno. Los SMS son un método de comunicación muy popular y de bajo costo, por lo cual es un ámbito a explotar. El sistema provee transparencia al usuario que es indiferente a la lógica del mismo. Haciendo fácil la utilización del servicio. Esta claro que el futuro de la informática en general esta en las comunicaciones móviles, por lo cual se enfatiza en la utilización de esta tecnología en el proyecto. La convergencia de tecnologías es una mega tendencia y sms2mail no es ajena a ella. Java proporciona una clara ventaja ante otras tecnologías de desarrollo, por su robustez y gran aplicabilidad en diferentes entornos de producción. Sms2mail es un sistema distribuido en capas con integración de diferentes componentes tales como son, mensajería corta, servicios de correo electrónico y aplicaciones Web, por lo cual lo hace mas que un desarrollo de software típico. La aplicación de la metodología de la programación extrema demostró su efectividad y favorabilidad al utilizarla en proyectos a corto plazo, demostrando por qué actualmente es una de las más utilizadas en este campo. 7. RECOMENDACIONES Para una implantación futura debe considerarse la opción de utilizar la plataforma Linux como una solución para reducir costos y dar mas estabilidad al entorno de ejecución. Sms2mail al ser un servicio que tiene impacto sobre el usuario común de telefonía móvil, se recomienda que pase por una fase de pruebas exhaustivas antes de ser implantado en el mercado y a ser tarifado. GLOSARIO API Application Programming Interface. Especificación de una librería o utilidad que documenta su interfaz y permite su uso sin conocimiento de su interior. ASF Apache Software Foundation, http://www.apache.org. Fundación que proporciona soporte a proyectos open source, formando una comunidad de desarrolladores y usuarios con una gran reputación por la calidad y el éxito de muchos de sus proyectos. Dentro de la comunidad Java participa activamente, formando parte de los comités estandarizadores. CSS Cascading Style Sheets. Tecnología que permite crear páginas web con un diseño más exacto, añadiendo mayores posibilidades a HTML y permitiendo una mayor separación entre la información y la presentación. Framework Conjunto de APIs y herramientas destinadas a la construcción de un determinado tipo de aplicaciones de manera general. HTML Hypertext Markup Language. Lenguage de tags estandarizado para la creación de documentos para la web. HTTP Hypertext Transfer Protocol. Protocolo de nivel extensivamente en Internet para el acceso a documentos. de aplicación usado ISO Federación de alcance mundial integrada por cuerpos de estandarización nacionales de gran número de países, que promueve el desarrollo de la estandarización. J2EE Java 2, Enterprise Edition. Versión avanzada de la plataforma Java de Sun Microsystems, destinada al desarrollo de aplicaciones empresariales. J2SE Java 2, Standard Edition. Versión básica del conjunto de herramientas y APIs de Sun Microsystems destinadas a la creación de aplicaciones en plataforma Java. Java Plataforma para el desarrollo de software creada por Sun Microsystems, ampliamente extendida hoy en día, que otorga independencia de plataforma al software creado en ella y lo provee de una gran cantidad de APIs estandarizados. JavaDoc Documentación HTML embebida en el código Java de una aplicación, que mediante la herramienta del mismo nombre puede ser convertida en un árbol de páginas HTML que muestre la documentación del API de la aplicación de manera detallada. JDBC Java DataBase Connectivity. API de la plataforma Java para el acceso a sistemas gestores de base de datos. Open Source Calificación de software que cumple una serie de requisitos, principalmente aquel que permite una libre redistribución, distribuye el código fuente, y permite modificaciones y trabajos derivados. Shareware Es otra modalidad de comercialización de software todavía más extendida, el programa se distribuye con limitaciones, bien como versión de demostración o evaluación, con funciones o características limitadas o con un uso restringido a un límite de tiempo establecido (por ejemplo 30 días). Así, se le da al usuario la oportunidad de probar el producto antes de comprarlo y, más tarde, adquirir la versión completa del programa. GPL (General Public License o licencia pública general) Es una licencia creada por la Free Software Foundation y orientada principalmente a los términos de distribución, modificación y uso de software. Su propósito es declarar que el software cubierto por esta licencia es software libre. OSI Open Source Initiative, http://www.opensource.org. Organización sin ánimo de lucro dedicada a la gestión y promoción del software open source, específicamente a través del programa de certificación de software open source. SSL Secure Socket Layer. Protocolo que proporciona servicios de seguridad cifrando los datos intercambiados entre el servidor y el cliente. UML Unified Modeling Language. Lenguaje de modelado visual que se usa para especificar, visualizar, construir y documentar artefactos de un sistema de software. XML eXtensible Markup Language. Formato estándar para el intercambio de datos basado en archivos de texto plano con una estructura de tags. XP eXtreme Programming. Metodología de desarrollo de software basada en valores como simplicidad, comunicación, retroalimentación y coraje. Aplicación Sistema independiente que tiene como objetivo realizar tareas específicas para la colaboración con el cumplimiento de un objetivo común. Las aplicaciones son locales cuando estas se encuentran ejecutándose en el computador que las accede, o remotas en caso contrario. Dispositivos Son el hardware que compone la red, y que permite que esta preste el servicio indicado a los usuarios finales. Cuando se utiliza este término en este documento se hace referencia a todo el hardware inteligente y con soporte SNMP que hace parte de la red administrada. Navegación / Navegabilidad Es el proceso compuesto por una o varias pantallas diferentes, presentadas al usuario final, que llevan a una finalidad específica dentro del sistema de administración de red. Transparencia Este término es utilizado dentro de este manual cuando se hace referencia al no conocimiento del usuario final, de cómo el sistema se encuentra trabajando en los servidores que lo componen, ya que cuando este accede desde un equipo con conexión a la red, siempre lo observará y utilizará de la misma forma como lo ha hecho anteriormente. Web Cuando se hace referencia a este término, se busca enfatizar en una de las opciones de acceso remoto que tiene el sistema sms2mail, que en este caso especial es el acceso desde una máquina con soporte de browser. BIBLIOGRAFIA http://wapcolombia.unicauca.edu.co Andrés Seco Hernández, Alamin GSM SMS Gateway, Proyecto Alamin, disponible en http://www.alamin.org Gwenael Le Bodic, Mobile Messaging Technologies and Services: SMS, EMS and MMS Pavel Janik and others, Gnokii, Gnokii project, disponible en http://www.gnokii.org Philippe Andersson, SMS Link, CreoScitex Europe, S.A., disponible en http://smslink.sourceforge.net Mauricio Julio Fernández Pradier y otros, ESMS, disponible en http://esms.sourceforge.net Stefan Frings, SMSTools Christophe Calmejane, SMSSend, disponible en http://zekiller.skytech.org/smssend_menu_en.html Angelo Masci, SMSClient, disponible en http://www.styx.demon.co.uk ETSI, European Telecommunications Standards Institute, disponible en http://www.etsi.org . ISBN 84-205-3151-0 Castro Elizabeth. “XML”. Prentice Hall. Madrid, España. 2001 ISBN 84-8322-002-4 Hansen Gary W., Hansen James V. “Diseño y Administración de Bases de Datos”. Prentice Hall. Madrid, España. 1997 ISBN 84-7829-036-2 Jacobson Ivar, Booch Grady, Rumbaugh James. “El Proceso Unificado de Desarrollo de Software”. Addison Wesley. Madrid, España. 2000 ISBN 84-7829-028-1 Jacobson Ivar, Booch Grady, Rumbaugh James. ”El Lenguaje Unificado de Modelado”. Addison Wesley. Madrid, España. 1999 ANEXOS A. Script Base de Datos CREATE TABLE `contacto` ( `id_contacto` int(6) NOT NULL auto_increment, `correo_contacto` varchar(100) NOT NULL default '', `id_lista` int(11) NOT NULL default '0', PRIMARY KEY (`id_contacto`) ) TYPE=MyISAM AUTO_INCREMENT=8 ; # # Dumping data for table `contacto` # INSERT INTO `contacto` VALUES (1, 'jprcf2002@hotmail.com', 1); INSERT INTO `contacto` VALUES (2, 'redoblon@hotmail.com', 1); INSERT INTO `contacto` VALUES (7, 'sanchezcol@yahoo.com', 1); INSERT INTO `contacto` VALUES (6, 'ojf@hotmail.com', 1); INSERT INTO `contacto` VALUES (5, 'sanchezcol@yahoo.com', 3); # # Table structure for table `historial` # CREATE TABLE `historial` ( `Id_sms` varchar(100) NOT NULL default '', `Celular_usuario` varchar(100) NOT NULL default '', `Destino` varchar(100) NOT NULL default '', `fecha` varchar(100) NOT NULL default '', PRIMARY KEY (`Id_sms`) ) TYPE=MyISAM; # # Dumping data for table `historial` # # Table structure for table `lista` # CREATE TABLE `lista` ( `id_lista` int(11) NOT NULL auto_increment, `nombre_lista` varchar(20) NOT NULL default '', `celular_usuario` varchar(10) NOT NULL default '0', PRIMARY KEY (`id_lista`) ) TYPE=MyISAM AUTO_INCREMENT=9 ; # # Dumping data for table `lista` # INSERT INTO `lista` VALUES (1, 'Amigos', '3157862425'); INSERT INTO `lista` VALUES (2, 'familia', '3157862425'); INSERT INTO `lista` VALUES (8, 'profesores', '3157862425'); INSERT INTO `lista` VALUES (6, 'trabajo', '3157862425'); INSERT INTO `lista` VALUES (7, 'banco', '3157862425'); # Table structure for table `lista_contacto` # CREATE TABLE `lista_contacto` ( `Id_lista` varchar(100) NOT NULL default '', `Id_contacto` varchar(100) NOT NULL default '' ) TYPE=MyISAM; # # Dumping data for table `lista_contacto` # # -------------------------------------------------------- # # Table structure for table `operador` # CREATE TABLE `operador` ( `Cod_operador` varchar(100) NOT NULL default '', `Nombre_operador` varchar(100) NOT NULL default '', PRIMARY KEY (`Cod_operador`) ) TYPE=MyISAM; # # Dumping data for table `operador` # # -------------------------------------------------------- # # Table structure for table `usuario` # CREATE TABLE `usuario` ( `nombre` varchar(20) NOT NULL default '', `celular_usuario` varchar(11) NOT NULL default '', `password` varchar(10) NOT NULL default '', PRIMARY KEY (`celular_usuario`) ) TYPE=MyISAM; # # Dumping data for table `usuario` # INSERT INTO `usuario` VALUES ('Samuel Sanchez', '3157862425', '12345'); INSERT INTO `usuario` VALUES ('Leonardo Valderrama', '3103490078', '123'); INSERT INTO `usuario` VALUES ('Carlos Sanchez', '3101111111', '123'); INSERT INTO `usuario` VALUES ('prueba', '2222222', '123'); INSERT INTO `usuario` VALUES ('prueba2', '3333333333', '123'); B. Servlet import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import sun.net.smtp.SmtpClient; import java.awt.*; import java.awt.event.*; import java.net.*; import java.sql.*; import java.lang.*; public class correoServlet2 extends HttpServlet{ private String de = "usuario@sms2mail.com"; private String celular = null; private String para= null; private String mensaje = null; private String msn = null; private boolean sam=false; private String p=null; public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ doPost(req, res); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ celular = req.getParameter("celular"); mensaje = req.getParameter("mensaje"); para =mensaje.substring(0, mensaje.indexOf(" ", 0)); msn= mensaje.substring(mensaje.indexOf(" ", 0)+1); int a=para.indexOf("@"); System.out.println(a); if(a>=0){ enviarmail(res, para, msn); } else{ conectar(res, celular); System.out.println(sam); } } public void conectar(HttpServletResponse res, String celular) throws IOException{ String url = "jdbc:mysql://192.168.0.1/sms2mail"; String query = "SELECT nombre FROM usuario WHERE celular_usuario="+celular; String query2= "SELECT id_lista FROM lista WHERE nombre_lista='"+para+"' AND celular_usuario="+celular; try{ Class.forName ("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( url, "sms2mail", "" ); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery (query); if(rs.next()){ sam=true; if (sam!=false){ ResultSet rs2=stmt.executeQuery(query2); lista(res, rs2); if(p!=null){ System.out.println(p); String query3= "SELECT contacto.correo_contacto FROM usuario inner join lista on usuario.celular_usuario = lista.celular_usuario inner join contacto on lista.id_lista= contacto.id_lista WHERE lista.id_lista="+p; ResultSet rs3=stmt.executeQuery(query3); contactos(res, rs3); } enviarmail(res, para, msn); } } else{ sam=false; } rs.close(); stmt.close(); con.close(); }catch (SQLException ex) { PrintWriter out = res.getWriter(); res.setContentType("text/html"); while (ex != null) { out.println ("SQL Exception: " + ex.getMessage ()); ex = ex.getNextException (); } // end while } // end catch SQLException catch (java.lang.Exception ex) { PrintWriter out = res.getWriter(); res.setContentType("text/html"); out.println ("Exception: " + ex.getMessage ()); } } public void enviarmail(HttpServletResponse res, String para, String msn)throws IOException{ try { //Pasa un String que contiene el nombre del servidor smtp // como parametro del constructor SmtpClient smtp = new SmtpClient("192.168.0.1"); //Pasa la direccion del remitente smtp.from(de); //Pasa la direccion del destinatario smtp.to(para); //Hace un output stream para el mensaje PrintStream msg = smtp.startMessage(); //Escribe el encabezado del mail en el output stream. msg.println("To: "+para); msg.println("Subject: Mail enviado a traves de SMS2MAIL"); msg.println(); //Escribe el cuerpo del mensaje en el output stream msg.println("Este mail ha sido enviado por: "+celular+" "+msn); msg.println(new java.util.Date());//pone la fecha y hora del envio //Cierra el stream y envia el mensaje smtp.closeServer(); //Notifica a la pasarela el envio del mail res.setContentType("text/plain"); PrintWriter out = res.getWriter(); out.println("Email enviado por SMS2MAIL"); }catch( Exception e ) { e.printStackTrace(); } } public void lista ( HttpServletResponse res, ResultSet rs2 ) throws SQLException { try { int numCols = rs2.getMetaData().getColumnCount (); while ( rs2.next() ) { for (int i=1; i<=numCols; i++) { p=rs2.getString(i); } } // end while }// end try catch ( Exception except) { } // end catch } // end public void contactos ( HttpServletResponse res, ResultSet rs3 ) throws SQLException { para=""; try { int numCols = rs3.getMetaData().getColumnCount (); while ( rs3.next() ) { for (int i=1; i<=numCols; i++) { p=rs3.getString(i); para=para.concat(p+","); } } // end while }// end try catch ( Exception except) { System.out.println(except.getMessage()); } // end catch } // end contactos } C. MIDlet import javax.microedition.midlet.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.wireless.messaging.*; import java.io.*; import java.io.IOException; public class SMS extends MIDlet implements CommandListener, Runnable, MessageListener { Command exitCommand = new Command("Exit", Command.EXIT, 2); /** Permiten mostrar una pantalla de texto durante un tiempo o hasta que se * produzca un comando de tipo OK. Se utiliza para mostrar errores u otro tipo * de mensajes al usuario.*/ Alert contenido; Display display; /**Hilo para la conexion asincrona. */ Thread hilo; /** Conexiones detectadas al inicio. */ String[] conexiones; /** Flag para señalar el final del proceso. */ boolean fin; /** SMS message connection para mensajes de texto entrantes. */ MessageConnection smsconn; /** Mensaje actual de la red. */ Message msg; /** Direccion del remitente */ String remite; String msn; Displayable screen; public SMS() { display = Display.getDisplay(this); contenido = new Alert("SMS"); contenido.setTimeout(Alert.FOREVER); contenido.addCommand(exitCommand); contenido.setCommandListener(this); contenido.setString("Recibiendo..."); screen = contenido; } public void startApp() { /** Conexion SMS a ser leida. */ String smsConnection = "sms://:" + "50000"; /** Abre la conexion del mensaje. */ if (smsconn == null) { try { smsconn = (MessageConnection) Connector.open(smsConnection); smsconn.setMessageListener(this); } catch (IOException ioe) { ioe.printStackTrace(); } } conexiones = PushRegistry.listConnections(true); if (conexiones == null || conexiones.length == 0) { contenido.setString("Esperando SMS en el puerto 50000..."); } fin = false; hilo = new Thread(this); hilo.start(); display.setCurrent(screen); } public void notifyIncomingMessage(MessageConnection conn) { if (hilo == null) { fin = false; hilo = new Thread(this); hilo.start(); } } /** Hilo de lectura del mensaje. */ public void run() { /** Revisa la conexion SMS. */ try { do{ msg = smsconn.receive(); if (msg != null && msg instanceof TextMessage) { remite = msg.getAddress(); msn=((TextMessage)msg).getPayloadText(); contenido.setTitle("De: " + remite); System.out.println(msn); invokeServlet("http://localhost:8080/correo/servlet/correoservlet?celular="+encode url(remite)+"&mensaje="+encodeurl(msn)); contenido.setString(((TextMessage)msg).getPayloadText()); display.setCurrent(contenido); } }while(fin=true); } catch (IOException e) { // e.printStackTrace(); } } public void pauseApp() { fin = true; hilo = null; screen = display.getCurrent(); } public void destroyApp(boolean unconditional) { fin = true; hilo = null; if (smsconn != null) { try { smsconn.close(); } catch (IOException e) { } } } public void commandAction(Command c, Displayable s) { try { if (c == exitCommand || c == Alert.DISMISS_COMMAND) { destroyApp(false); notifyDestroyed(); } } catch (Exception ex) { ex.printStackTrace(); } } void invokeServlet(String url) throws IOException { HttpConnection c = null; InputStream is = null; StringBuffer b = new StringBuffer(); TextBox t = null; try { c = (HttpConnection)Connector.open(url); c.setRequestMethod(HttpConnection.GET); is = c.openDataInputStream(); int ch; while ((ch = is.read()) != -1) { b.append((char) ch); System.out.print((char)ch); } t = new TextBox("Mensaje", b.toString(), 1024, 0); } finally { if(is!= null) { is.close(); } if(c != null) { c.close(); } } } /*Modifica los espacios en el contenido de las cadenas para ser enviadas en el url*/ String encodeurl(String str){ String temp=""; for(int i=0;i<str.length();i++) if(str.charAt(i)==' ') temp+='+'; else temp+=str.charAt(i); return temp; } } D. Configuración XML <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>prueba</display-name> <description>prueba</description> <servlet> <servlet-name> correoservlet2</servlet-name> <servlet-class>correoservlet2</servlet-class> </servlet> <servlet-mapping> <servlet-name> correoservlet2</servlet-name> <url-pattern>/servlet/ correoservlet2</url-pattern> </servlet-mapping> </web-app> E. Diagrama de Procesos F. Diagrama de Secuencia G. Diagrama de Flujo de Datos H. Diagrama de Despliegue SMS I. Fuentes Aplicación WEB Index.php <?php require_once('Connections/sms2mail.php'); ?> <?php session_start(); $loginFormAction = $_SERVER['PHP_SELF']; if (isset($accesscheck)) { $GLOBALS['PrevUrl'] = $accesscheck; session_register('PrevUrl'); } if (isset($_POST['usuario'])) { $loginUsername=$_POST['usuario']; $password=$_POST['contrasena']; $MM_fldUserAuthorization = ""; $MM_redirectLoginSuccess = "usuario.php"; $MM_redirectLoginFailed = "error.php"; $MM_redirecttoReferrer = false; mysql_select_db($database_sms2mail, $sms2mail); $LoginRS__query=sprintf("SELECT celular_usuario, password FROM usuario WHERE celular_usuario='%s' AND password='%s'", get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password)); $LoginRS = mysql_query($LoginRS__query, $sms2mail) or die(mysql_error()); $loginFoundUser = mysql_num_rows($LoginRS); if ($loginFoundUser) { $loginStrGroup = ""; $GLOBALS['MM_Username'] = $loginUsername; $GLOBALS['MM_UserGroup'] = $loginStrGroup; session_register("MM_Username"); session_register("MM_UserGroup"); if (isset($_SESSION['PrevUrl']) && false) { $MM_redirectLoginSuccess = $_SESSION['PrevUrl']; } header("Location: " . $MM_redirectLoginSuccess ); } else { header("Location: ". $MM_redirectLoginFailed ); } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE>SMS2MAIL</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <link rel="stylesheet" href="main.css" type="text/css"> <style type="text/css"> <!-.Estilo1 {font-size: 18px} --> </style> </HEAD> <BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 background="images/bgb.gif"> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="336"><img src="images/index_01.jpg" width=336 height=95 alt=""></td> <td width="444" valign="top" bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_02.gif" height="30">&nbsp;</td> </tr> <tr> <td nowrap background="images/index_09.gif"><a href="index.php"><img src="images/index_04.gif" width=90 height=47 alt="" border="0"></a> <a href="registro.php"><img src="images/index_08.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_06.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_05.gif" width=90 height=47 alt="" border="0"></a> </td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflas h.cab#version=6,0,29,0" width="778" height="153"> <param name="movie" value="banner.swf"> <param name="quality" value="high"> <embed src="banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="778" height="153"></embed></object></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" background="images/index_14.gif"> <tr> <td width="161"><img src="images/index_13.gif" width=161 height=35 alt=""></td> <td width="538">&nbsp;</td> <td width="81"><a href="#"><img src="images/index_16.gif" width=22 height=35 alt="" border="0"></a><a href="#"><img src="images/index_17.gif" width=27 height=35 alt="" border="0"></a><a href="#"><img src="images/index_18.gif" width=23 height=35 alt="" border="0"></a></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr valign="top"> <td width="161" background="images/index_20.gif"> <table width="161" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="161"> &nbsp;&nbsp; <form name="autenticacion" method="POST" action="<?php echo $loginFormAction; ?>"> <p> <span class="t11g">&nbsp;usuario<br> <input name="usuario" type="text" id="usuario" size="12"> </span><span class="t11g"><br> &nbsp;co ntrase&ntilde;a<br> <input name="contrasena" type="password" id="contrasena" size="12"> </span></p> <p><span class="t11g"> <input type="submit" name="Submit" value="Enviar"> </span> </form> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20"><img src="images/index_37.gif" width=161 height=6 alt=""></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><div align="center"><b class="t11g"><img src="images/mysql.gif" width="100" height="52"></b></div></td> </tr> </table> <table width="93%" height="121" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="106"><p align="center"><img src="images/php.jpg" width="99" height="67"> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="right"><div align="center"><img src="images/java_logo.gif" width="98" height="80">&nbsp;&nbsp;&nbsp;</div></td> </tr> </table> <div align="center"><img src="images/siemens.gif" width="129" height="20"></div></td> <td background="images/index_28.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><p><img src="images/index_24.gif" width=335 height=47 alt=""></p> </td> </tr> </table> <table width="619" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="309"> <table width="100%" border="0" cellspacing="0" cellpadding="5"> <tr> <td class="v11r">• 1er paso: Inscribete! </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="10"> <tr> <td class="v11g"> <br> <br> <span class="v11r">• 2do Paso: Agrega tus Listas de Correo </span><br> <br> </td> </tr> </table> </td> <td width="310"> <table width="100%" border="0" cellspacing="0" cellpadding="5"> <tr> <td class="v11r">• Manda Mails a donde quieras </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="10"> <tr> <td valign="top" class="v11g"> <br> <br> <span class="v11r">• 4to Paso: Envia sms2mail </span><br> </td> </tr> </table> </td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="34" background="images/index_48.gif"> <tr> <td>&nbsp;</td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="65" background="images/index_51.gif"> <tr> <td width="390" align="center" class="bottom"> <b><b><a href="#" class="bottom"><font color="#FAA6A6"><span class="v11r">Terminos de Uso </span></font></a><span class="v11r"><font color="#FAA6A6"> | <a href="#" class="v11r">Sobre sms2mail.com</a> | <a href="#" class="v11r">USB</a></font></span></b></b></td> <td width="390" align="center" class="v11r">©2005 sms2mail Universidad de San Buenaventura</td> </tr> </table> </BODY> </HTML> Registro.php <?php require_once('Connections/sms2mail.php'); ?> <?php function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } if (($_POST['conf_pass'])==($_POST['password'])) { $editFormAction = $_SERVER['PHP_SELF']; if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); } if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $insertSQL = sprintf("INSERT INTO usuario (nombre, celular_usuario, password) VALUES (%s, %s, %s)", GetSQLValueString($_POST['nombre'], "text"), GetSQLValueString($_POST['celular_usuario'], "text"), GetSQLValueString($_POST['password'], "text")); mysql_select_db($database_sms2mail, $sms2mail); $Result1 = mysql_query($insertSQL, $sms2mail) or die(mysql_error()); $insertGoTo = "index.php"; if (isset($_SERVER['QUERY_STRING'])) { $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?"; $insertGoTo .= $_SERVER['QUERY_STRING']; } header(sprintf("Location: %s", $insertGoTo)); } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE>SMS2MAIL</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <link rel="stylesheet" href="main.css" type="text/css"> </HEAD> <BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 background="images/bgb.gif"> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="336"><img src="images/index_01.jpg" width=336 height=95 alt=""></td> <td width="444" valign="top" bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_02.gif" height="30">&nbsp;</td> </tr> <tr> <td nowrap background="images/index_09.gif"><a href="index.php"><img src="images/index_04.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_08.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_06.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_05.gif" width=90 height=47 alt="" border="0"></a> </td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflas h.cab#version=6,0,29,0" width="778" height="153"> <param name="movie" value="banner.swf"> <param name="quality" value="high"> <embed src="banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="778" height="153"></embed></object></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" background="images/index_14.gif"> <tr> <td width="161"><img src="images/index_13.gif" width=161 height=35 alt=""></td> <td width="538">&nbsp;</td> <td width="81"><a href="#"><img src="images/index_16.gif" width=22 height=35 alt="" border="0"></a><a href="#"><img src="images/index_17.gif" width=27 height=35 alt="" border="0"></a><a href="#"><img src="images/index_18.gif" width=23 height=35 alt="" border="0"></a></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr valign="top"> <td width="161" background="images/index_20.gif"> <table width="161" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="161"> &nbsp;&nbsp; <form name="autenticacion" method="POST" action="<?php echo $loginFormAction; ?>"> <p> <span class="t11g">&nbsp;usuario<br> <input name="usuario" type="text" id="usuario" size="12"> </span><span class="t11g"><br> &nbsp;co ntrase&ntilde;a<br> <input name="contrasena" type="password" id="contrasena" size="12"> </span></p> <p><span class="t11g"> <input type="submit" name="Submit" value="Enviar"> </span><span class="t11g"> </span> </form> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20"><img src="images/index_37.gif" width=161 height=6 alt=""></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><div align="center"><b class="t11g"><img src="images/mysql.gif" width="100" height="52"></b></div></td> </tr> </table> <table width="93%" height="121" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="106"><p align="center"><img src="images/php.jpg" width="99" height="67"> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="right"><div align="center"><img src="images/java_logo.gif" width="98" height="80">&nbsp;&nbsp;&nbsp;</div></td> </tr> </table> <div align="center"><img src="images/siemens.gif" width="129" height="20"></div></td> <td background="images/index_28.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_25.gif"><p class="v11r">Inscribase como usuario primero, para acceder a nuestros servicios </p> </tr> </table> </td> <form method="post" name="form1" action="<?php echo $editFormAction; ?>"> <table align="left"> <tr valign="baseline"> <td align="right" nowrap class="v11r">Nombre Completo:</td> <td class="v11r"> <input type="text" name="nombre" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Movil Usuario :</td> <td class="v11r"> <input name="celular_usuario" type="text" value="" size="32" maxlength="10"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Password:</td> <td class="v11r"> <input type="password" name="password" value="" size="32"> </td> </tr> <td align="right" nowrap class="v11r">Confirme Password:</td> <td class="v11r"> <input type="password" name="conf_pass" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Edad:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Ciudad:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Sexo:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Operador:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td nowrap align="right">&nbsp;</td> <td class="v11r"> <input name="submit" type="submit" value="Insertar registro"> </td> </tr> </table> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p><span class="v11r">*Estos campos no son requeridos</span> <input type="hidden" name="MM_insert" value="form1"> </p> </form> <p>&nbsp;</p> <td width="150"> <table width="150%" height="435" border="0" cellpadding="10" cellspacing="0"> <tr> <td class="v11g"> <p><img src="images/sms.jpg" width="170" height="231"></p></td> </tr> </table> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="34" background="images/index_48.gif"> <tr> <td>&nbsp;</td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="65" background="images/index_51.gif"> <tr> <td width="390" align="center" class="bottom"> <b><b><a href="#" class="bottom"><font color="#FAA6A6"><span class="v11r">Terminos de Uso </span></font></a><span class="v11r"><font color="#FAA6A6"> | <a href="#" class="v11r">Sobre sms2mail.com</a> | <a href="#" class="v11r">USB</a></font></span></b></b></td> <td width="390" align="center" class="v11r">©2005 sms2mail Universidad de San Buenaventura</td> </tr> </table> </BODY> </HTML> usuario.php <?php require_once('Connections/sms2mail.php'); ?> <?php function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } if (($_POST['conf_pass'])==($_POST['password'])) { $editFormAction = $_SERVER['PHP_SELF']; if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); } if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $insertSQL = sprintf("INSERT INTO usuario (nombre, celular_usuario, password) VALUES (%s, %s, %s)", GetSQLValueString($_POST['nombre'], "text"), GetSQLValueString($_POST['celular_usuario'], "text"), GetSQLValueString($_POST['password'], "text")); mysql_select_db($database_sms2mail, $sms2mail); $Result1 = mysql_query($insertSQL, $sms2mail) or die(mysql_error()); $insertGoTo = "index.php"; if (isset($_SERVER['QUERY_STRING'])) { $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?"; $insertGoTo .= $_SERVER['QUERY_STRING']; } header(sprintf("Location: %s", $insertGoTo)); } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE>SMS2MAIL</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <link rel="stylesheet" href="main.css" type="text/css"> </HEAD> <BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 background="images/bgb.gif"> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="336"><img src="images/index_01.jpg" width=336 height=95 alt=""></td> <td width="444" valign="top" bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_02.gif" height="30">&nbsp;</td> </tr> <tr> <td nowrap background="images/index_09.gif"><a href="index.php"><img src="images/index_04.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_08.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_06.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_05.gif" width=90 height=47 alt="" border="0"></a> </td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflas h.cab#version=6,0,29,0" width="778" height="153"> <param name="movie" value="banner.swf"> <param name="quality" value="high"> <embed src="banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="778" height="153"></embed></object></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" background="images/index_14.gif"> <tr> <td width="161"><img src="images/index_13.gif" width=161 height=35 alt=""></td> <td width="538">&nbsp;</td> <td width="81"><a href="#"><img src="images/index_16.gif" width=22 height=35 alt="" border="0"></a><a href="#"><img src="images/index_17.gif" width=27 height=35 alt="" border="0"></a><a href="#"><img src="images/index_18.gif" width=23 height=35 alt="" border="0"></a></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr valign="top"> <td width="161" background="images/index_20.gif"> <table width="161" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="161"> &nbsp;&nbsp; <form name="autenticacion" method="POST" action="<?php echo $loginFormAction; ?>"> <p> <span class="t11g">&nbsp;usuario<br> <input name="usuario" type="text" id="usuario" size="12"> </span><span class="t11g"><br> &nbsp;co ntrase&ntilde;a<br> <input name="contrasena" type="password" id="contrasena" size="12"> </span></p> <p><span class="t11g"> <input type="submit" name="Submit" value="Enviar"> </span><span class="t11g"> </span> </form> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20"><img src="images/index_37.gif" width=161 height=6 alt=""></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><div align="center"><b class="t11g"><img src="images/mysql.gif" width="100" height="52"></b></div></td> </tr> </table> <table width="93%" height="121" border="0" cellpadding="0" cellspacing="0"> <tr> <td height="106"><p align="center"><img src="images/php.jpg" width="99" height="67"> </p> </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="right"><div align="center"><img src="images/java_logo.gif" width="98" height="80">&nbsp;&nbsp;&nbsp;</div></td> </tr> </table> <div align="center"><img src="images/siemens.gif" width="129" height="20"></div></td> <td background="images/index_28.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_25.gif"><p class="v11r">Inscribase como usuario primero, para acceder a nuestros servicios </p> </td> </tr> </table> <form method="post" name="form1" action="<?php echo $editFormAction; ?>"> <table align="left"> <tr valign="baseline"> <td align="right" nowrap class="v11r">Nombre Completo:</td> <td class="v11r"> <input type="text" name="nombre" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Movil Usuario :</td> <td class="v11r"> <input name="celular_usuario" type="text" value="" size="32" maxlength="10"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Password:</td> <td class="v11r"> <input type="password" name="password" value="" size="32"> </td> </tr> <td align="right" nowrap class="v11r">Confirme Password:</td> <td class="v11r"> <input type="password" name="conf_pass" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Edad:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Ciudad:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">*Sexo:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td align="right" nowrap class="v11r">Operador:</td> <td class="v11r"> <input type="text" name="password" value="" size="32"> </td> </tr> <tr valign="baseline"> <td nowrap align="right">&nbsp;</td> <td class="v11r"> <input name="submit" type="submit" value="Insertar registro"> </td> </tr> </table> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p><span class="v11r">*Estos campos no son requeridos</span> <input type="hidden" name="MM_insert" value="form1"> </p> </form> <p>&nbsp;</p> <td width="150"> <table width="150%" height="435" border="0" cellpadding="10" cellspacing="0"> <tr> <td class="v11g"> <p><img src="images/sms.jpg" width="170" height="231"></p></td> </tr> </table> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="34" background="images/index_48.gif"> <tr> <td>&nbsp;</td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="65" background="images/index_51.gif"> <tr> <td width="390" align="center" class="bottom"> <b><b><a href="#" class="bottom"><font color="#FAA6A6"><span class="v11r">Terminos de Uso </span></font></a><span class="v11r"><font color="#FAA6A6"> | <a href="#" class="v11r">Sobre sms2mail.com</a> | <a href="#" class="v11r">USB</a></font></span></b></b></td> <td width="390" align="center" class="v11r">©2005 sms2mail Universidad de San Buenaventura</td> </tr> </table> </BODY> </HTML> reg_listas.php <?php require_once('Connections/sms2mail.php'); ?> <?php session_start(); $usuario=$MM_Username; function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = (!get_magic_quotes_gpc()) ? addslashes($theValue) : $theValue; switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } $editFormAction = $_SERVER['PHP_SELF']; if (isset($_SERVER['QUERY_STRING'])) { $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']); } $nombre_lista=$_POST['nombre_lista']; if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) { $insertSQL = sprintf("INSERT INTO lista (nombre_lista, celular_usuario) VALUES ('$nombre_lista', '$usuario')"); mysql_select_db($database_sms2mail, $sms2mail); $Result1 = mysql_query($insertSQL, $sms2mail) or die(mysql_error()); } //$datoslista=$_POST["lista_seleccion"]; mysql_select_db($database_sms2mail, $sms2mail); $query_registro_usuario = "SELECT usuario.nombre, usuario.celular_usuario, lista.nombre_lista, lista.id_lista, contacto.correo_contacto FROM usuario inner join lista on usuario.celular_usuario = lista.celular_usuario inner join contacto on lista.id_lista= contacto.id_lista"; $registro_usuario = mysql_query($query_registro_usuario, $sms2mail) or die(mysql_error()); $row_registro_usuario = mysql_fetch_assoc($registro_usuario); $totalRows_registro_usuario = mysql_num_rows($registro_usuario); $maxRows_listas = 10; $pageNum_listas = 0; if (isset($_GET['pageNum_listas'])) { $pageNum_listas = $_GET['pageNum_listas']; } $startRow_listas = $pageNum_listas * $maxRows_listas; mysql_select_db($database_sms2mail, $sms2mail); $query_listas = "SELECT distinct(lista.nombre_lista), lista.id_lista FROM usuario inner join lista on usuario.celular_usuario = lista.celular_usuario WHERE lista.celular_usuario='$usuario'"; //$query_limit_listas = sprintf("%s LIMIT %d, %d", $query_listas, $startRow_listas, $maxRows_listas); $listas = mysql_query($query_listas, $sms2mail) or die(mysql_error()); $row_listas = mysql_fetch_assoc($listas); if (isset($_GET['totalRows_listas'])) { $totalRows_listas = $_GET['totalRows_listas']; } else { $all_listas = mysql_query($query_listas); $totalRows_listas = mysql_num_rows($all_listas); } $totalPages_listas = ceil($totalRows_listas/$maxRows_listas)-1; $Lista_correo=$_POST['lista_seleccion']; mysql_select_db($database_sms2mail, $sms2mail); $query_correos = "SELECT contacto.correo_contacto FROM usuario inner join lista on usuario.celular_usuario = lista.celular_usuario inner join contacto on lista.id_lista= contacto.id_lista WHERE lista.id_lista='$Lista_correo'"; $correos = mysql_query($query_correos, $sms2mail) or die(mysql_error()); $row_correos = mysql_fetch_assoc($correos); $totalRows_correos = mysql_num_rows($correos); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE>SMS2MAIL</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251"> <link rel="stylesheet" href="main.css" type="text/css"> <style type="text/css"> <!-.Estilo1 { color: #6600CC; font-weight: bold; } --> </style> </HEAD> <BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0 background="images/bgb.gif"> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="336"><img src="images/index_01.jpg" width=336 height=95 alt=""></td> <td width="444" valign="top" bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_02.gif" height="30">&nbsp;</td> </tr> <tr> <td nowrap background="images/index_09.gif"><a href="index.php"><img src="images/index_04.gif" width=90 height=47 alt="" border="0"></a> <a href="registro.php"><img src="images/index_08.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_06.gif" width=90 height=47 alt="" border="0"></a> <a href="#"><img src="images/index_05.gif" width=90 height=47 alt="" border="0"></a> </td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr> <td> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflas h.cab#version=6,0,29,0" width="778" height="153"> <param name="movie" value="banner.swf"> <param name="quality" value="high"> <embed src="banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="778" height="153"></embed></object></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" background="images/index_14.gif"> <tr> <td width="161">&nbsp;</td> <td width="538">&nbsp;</td> <td width="81"><a href="#"><img src="images/index_16.gif" width=22 height=35 alt="" border="0"></a><a href="#"><img src="images/index_17.gif" width=27 height=35 alt="" border="0"></a><a href="#"><img src="images/index_18.gif" width=23 height=35 alt="" border="0"></a></td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0"> <tr valign="top"> <td width="161" background="images/index_20.gif"> <table width="161" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="161">&nbsp;&nbsp; </td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td height="20"><img src="images/index_37.gif" width=161 height=6 alt=""></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td><b class="t11g">&nbsp;&nbsp;&nbsp;&nbsp;</b></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="right">&nbsp;&nbsp;&nbsp;</td> </tr> </table> </td> <td background="images/index_28.gif"> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td background="images/index_25.gif"><img src="images/index_24.gif" width=335 height=47 alt=""><?php echo $usuario ?></td> </tr> </table> <table width="619" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="309"> <table width="100%" border="0" cellspacing="0" cellpadding="5"> <tr> <td class="v11r"><p>• Tu Grupos de Contactos... </p> <p>&nbsp; </p> <form method="post" name="form1" action="<?php echo $editFormAction; ?>"> <table align="center"> <tr valign="baseline"> <td nowrap align="right">Nombre de la Lista :</td> <td><input type="text" name="nombre_lista" value="" size="32"></td> </tr> <tr valign="baseline"> <td nowrap align="right">&nbsp;</td> <td><input type="submit" value="Ingresar Lista"></td> </tr> </table> <input type="hidden" name="MM_insert" value="form1"> </form> <p>&nbsp;</p></td> </tr> </table> <table width="100%" border="0" cellspacing="0" cellpadding="10"> <tr> <td class="v11g"><form name="lista" method="post" action=""> <p> Escoja lista o sino cree una... </p> <p> <select name="lista_seleccion"> <?php do { ?> <option value="<?php echo $row_listas['id_lista']?>"><?php echo $row_listas['nombre_lista']?></option> <?php } while ($row_listas = mysql_fetch_assoc($listas)); $rows = mysql_num_rows($listas); if($rows > 0) { mysql_data_seek($listas, 0); $row_listas = mysql_fetch_assoc($listas); } ?> </select> <input type="submit" name="Submit" value="Enviar"> </p> <table border="1"> <tr> <td width="212"><span class="Estilo1">Correos electronicos de la lista </span></td> </tr> <?php do { ?> <tr> <td><?php echo $row_correos['correo_contacto']; ?></td> </tr> <?php } while ($row_correos = mysql_fetch_assoc($correos)); ?> </table> </form></td> </tr> </table> </td> <td width="310"><div align="center"><img src="images/celu2.jpg" width="220" height="242"> </div></td> </tr> </table> </td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="34" background="images/index_48.gif"> <tr> <td>&nbsp;</td> </tr> </table> <table width="780" border="0" cellspacing="0" cellpadding="0" height="65" background="images/index_51.gif"> <tr> <td width="390" align="center" class="bottom"> <b><a href="#" class="bottom"><font color="#FAA6A6"><span class="v11r">Terminos de Uso </span></font></a><span class="v11r"><font color="#FAA6A6"> | <a href="#" class="v11r">Sobre sms2mail.com</a> | <a href="#" class="v11r">USB</a></font></span></b></td> <td width="390" align="center" class="v11r">©2005 sms2mail Universidad de San Buenaventura </td> </tr> </table> </BODY> </HTML> <?php mysql_free_result($registro_usuario); mysql_free_result($listas); mysql_free_result($correos); ?> J. Manual de Usuario Aplicación Web 1. La aplicación inicia por la pantalla principal donde el usuario debe elegir entre dos opciones, registrarse como usuario nuevo o acceder a su cuenta previamente creada. En el primer caso el usuario encuentra un formulario que solicita información básica sobre este, como es su nombre, número celular y contraseña. Al ingresar toda la información correctamente y hacer click en aceptar, recibirá una página que confirma su registro exitoso. En el segundo caso el usuario debe ingresar su número celular y su contraseña que serán validadas en la base de datos y permitirá el acceso a su cuenta. 2. Al ingresar a su cuenta el usuario encuentra una pantalla donde se muestran sus listas de contactos anteriormente creadas, y la opción de crear una nueva. 2. Si el usuario selecciona la opción de crear una nueva lista, ingresa el nombre deseado y ésta se actualiza en la selección de listas para tener las mismas opciones que con las listas existentes. Al elegir la lista deseada se muestra una página con los contactos que conforman dicha lista así como las opciones de modificar, borrar o añadir un contacto. Envío de Mensaje 1. El usuario debe acceder a la opción enviar mensaje de texto en su dispositivo celular. En el número de destino debe escribir 3103490078. Si desea que este mensaje sea enviado a un único correo electrónico, el formato del cuerpo del mensaje debe ser, la dirección de correo electrónico del destinatario seguida de un espacio y a continuación el mensaje deseado, como se puede observar en la imagen de la izquierda. Por lo contrario si desea que el mensaje sea enviado a todos los contactos de una lista previamente creada en su cuenta de la aplicación web, el formato debe ser, el nombre de la lista de contactos seguida de un espacio y a continuación el mensaje deseado como se puede observar en la imagen de la derecha.