L O RAM: L OCATION AND R EMOTE A SSISTANCE FOR M OTOCYCLISTS UNIVERSIDAD DE CASTILLA-LA MANCHA ESCUELA SUPERIOR DE INFORMÁTICA INGENIERÍA EN INFORMÁTICA PROYECTO FIN DE CARRERA LoRAM: Location and Remote Assistance for Motocyclists Israel Téllez García Septiembre, 2013 UNIVERSIDAD DE CASTILLA-LA MANCHA ESCUELA SUPERIOR DE INFORMÁTICA Departamento de Tecnologías y Sistemas de Información PROYECTO FIN DE CARRERA LoRAM: Location and Remote Assistance for Motocyclists Autor: Israel Téllez García Director: David Villa Alises Septiembre, 2013 Israel Téllez García Ciudad Real – Spain E-mail: [email protected], [email protected] Teléfono: 660 173 118 Web site: c 2013 Israel Téllez García Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Se permite la copia, distribución y/o modificación de este documento bajo los términos de la Licencia de Documentación Libre GNU, versión 1.3 o cualquier versión posterior publicada por la Free Software Foundation; sin secciones invariantes. Una copia de esta licencia esta incluida en el apéndice titulado «GNU Free Documentation License». Muchos de los nombres usados por las compañías para diferenciar sus productos y servicios son reclamados como marcas registradas. Allí donde estos nombres aparezcan en este documento, y cuando el autor haya sido informado de esas marcas registradas, los nombres estarán escritos en mayúsculas o como nombres propios. TRIBUNAL: Presidente: Secretario: Vocal: FECHA DE DEFENSA: CALIFICACIÓN: PRESIDENTE Fdo.: SECRETARIO Fdo.: VOCAL Fdo.: Resumen Los accidentes de tráfico constituyen una de las mayores causas de defunción actualmente en nuestro país. Según diversos estudios, la mayor parte de las víctimas mortales en accidentes de tráfico se podría evitar con una intervención rápida (la llamada «hora de oro»). Este hecho ha fomentado el interés de los gobiernos en los sistemas de detección automática de accidentes de tráfico, y tanto es así, que la Comisión Europea ha propuesto hacer obligatoria la incorporación de estos sistemas en los vehículos a partir del 2015 (ver [Eur13]). Los sistemas de detección de accidentes de tráfico consisten en un mecanismo de seguridad reactiva, que permite informar a los servicios de emergencia en el momento en que se produce un accidente. Además, suelen añadir información adicional, como la hora exacta y el lugar en el que se ha producido el suceso, agilizando la respuesta a la hora de intervenir a las víctimas. Sin embargo, este tipo de sistemas suele tener un coste elevado, y están orientados principalmente a vehículos de cuatro ruedas, siendo aún muy escasa su incorporación en motocicletas, por lo que suelen quedar exentas de esa protección. Por otra parte, en los accidentes con motocicleta el problema de localización de las víctimas se ve incrementado, ya que es habitual que aparezcan desplazadas del vehículo, dificultando enormemente las tareas de búsqueda por parte de los servicios de emergencia. Con la idea de aportar una solución práctica a todos estos problemas, se planteó la realización de este proyecto. Con la creación de L O RAM (Location and Remote Assistance for Motocyclists) se espera no solo poder detectar accidentes graves de motocicleta, sino también facilitar la localización de las víctimas en el lugar del accidente. es un sistema distribuido, que consta de tres componentes: uno para el usuario, otro de gestión y otro de rescate. La aplicación de usuario se ejecuta en un smartphone y permite la detección de incidentes y la notificación de éstos al gestor. Por otra parte la aplicación de rescate permite activar elementos luminosos y sonoros en el smartphone del usuario facilitando la localización de la víctima en el lugar del accidente. L O RAM VI Abstract Traffic accidents are a major cause of death in our country today. According to several studies, the majority of fatalities in road accidents could be avoided with prompt intervention. This fact encouraged the government interest in the automatic detection systems for traffic accidents, and so much so, that the European Commission has proposed to compel the incorporation of these systems in vehicles from 2015 (see [Eur13]). The detection systems for traffic accidents are a reactive security mechanism that allows to inform emergency services when an accident occurs. They also tend to add additional information such as the exact time and place in which the event occurred, to thereby improve the speed of intervention to victims. However, these systems often have a high cost, and are oriented mainly for four-wheel vehicles, while is still very low incorporation into motorcycles so they tend to be exempted from such protection. Furthermore, in motorcycle accidents is increased the problem of locating victims, since they are often displaced from the vehicle, making it very difficult search tasks. With the idea of providing a practical solution to all these problems, it raised the completion of this final project. With the creation of L O RAM is expected not only to detect serious motorcycle accidents, but also help locate victims of the crash. L O RAM is a distributed system that consists of three applications, one for user, another for management and another for rescue. The user application runs on a smartphone and allows the detection of incidents and reporting these to manager. Moreover rescue application activates light and sound components in the user application to make it easier to locate victims in the crash site. VII Índice general Resumen VI Abstract VII Índice general VIII Índice de cuadros XII Índice de figuras XIII Índice de listados XV Listado de acrónimos XVI Agradecimientos XVIII 1. Introducción 1 1.1. Sistemas de seguridad de vehículos . . . . . . . . . . . . . . . . . . . . . . 1 1.2. Mecanismos de detección y asistencia en accidentes de tráfico . . . . . . . 2 1.3. Problemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.4. Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2. Antecedentes 5 2.1. Aplicaciones distribuidas . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2. Arquitectura de objetos distribuidos . . . . . . . . . . . . . . . . . . . . . 5 2.2.1. ZeroC Ice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3. El Sistema Operativo Android . . . . . . . . . . . . . . . . . . . . . . . . 9 2.3.1. Componentes de una aplicación . . . . . . . . . . . . . . . . . . . 10 2.3.2. Intents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4. Ice for Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.5. Sensores en smartphone con Android . . . . . . . . . . . . . . . . . . . . . 11 VIII 2.6. Sistemas de localización . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.6.1. Localización en Android . . . . . . . . . . . . . . . . . . . . . . . 14 2.7. Sistemas RC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.7.1. Cerberus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.8. Detección automática de accidentes . . . . . . . . . . . . . . . . . . . . . 16 2.8.1. Detección automática de accidentes basada en smartphone . . . . . 17 2.8.2. WreckWatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3. Objetivos 24 3.1. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2. Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.1. Detección del accidente . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.2. Notificación de incidentes . . . . . . . . . . . . . . . . . . . . . . 25 3.2.3. Asistencia Remota . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.4. Localización de la víctima . . . . . . . . . . . . . . . . . . . . . . 25 3.2.5. Gestión de datos de incidentes . . . . . . . . . . . . . . . . . . . . 25 3.2.6. Basado en smartphone . . . . . . . . . . . . . . . . . . . . . . . . 26 3.2.7. Estándares libres . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4. Método de trabajo 27 4.1. Metodología de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.1. Extreme Programming . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.2. Test Driven Development . . . . . . . . . . . . . . . . . . . . . . . 29 4.2. Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.2.1. Lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.2.2. Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.2.3. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 5. Arquitectura y Desarrollo 34 5.1. Visión general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.1.1. Módulo de Detección . . . . . . . . . . . . . . . . . . . . . . . . . 35 5.1.2. Módulo de RC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 5.1.3. Módulo de Gestión de incidentes . . . . . . . . . . . . . . . . . . . 37 5.1.4. Módulo de control de acceso remoto . . . . . . . . . . . . . . . . . 37 5.1.5. Módulo de Consulta . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.1.6. Módulo de Rescate . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.2. Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 5.2.1. Requisitos funcionales . . . . . . . . . . . . . . . . . . . . . . . . 38 5.2.2. Requisitos no funcionales . . . . . . . . . . . . . . . . . . . . . . 41 5.3. Casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.4. Proceso de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.4.1. Detección y notificación de incidentes . . . . . . . . . . . . . . . . 43 5.4.2. Solicitud de listado de incidentes . . . . . . . . . . . . . . . . . . . 44 5.4.3. Petición de datos de usuario . . . . . . . . . . . . . . . . . . . . . 45 5.4.4. Petición de localización . . . . . . . . . . . . . . . . . . . . . . . 47 5.4.5. Peticiones de activación y desactivación de actuadores . . . . . . . 48 5.4.6. Peticiones de regulación de actuadores . . . . . . . . . . . . . . . . 50 5.4.7. Filtrado de peticiones a actuadores . . . . . . . . . . . . . . . . . . 51 5.4.8. Almacenamiento de información en Base de Datos (BD) . . . . . . 52 5.4.9. Registro y login de usuarios . . . . . . . . . . . . . . . . . . . . . 53 6. Resultados 66 6.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 6.2. Costes y recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.2.1. Repositorio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 7. Conclusiones y trabajo futuro 74 7.1. Objetivos alcanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 7.2. Propuestas de trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . 76 7.3. Conclusión personal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 A. Manual de usuario 80 A.1. Login y Registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 A.2. Iniciar ruta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 A.3. Avisar de accidente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 A.4. Cerrar sesión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 B. Manual de usuario de rescate 85 B.1. Login y Registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 B.2. Selección de Accidente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 B.3. Proceso de rescate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 B.3.1. Asignación del accidente . . . . . . . . . . . . . . . . . . . . . . . 87 B.3.2. Petición de ubicación . . . . . . . . . . . . . . . . . . . . . . . . . 87 B.3.3. Activación de controles remotos . . . . . . . . . . . . . . . . . . . 88 B.4. Cerrar sesión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 C. Hello World, Ice for Android 90 C.1. Specification Language for Ice (S LICE) . . . . . . . . . . . . . . . . . . . . 90 C.2. Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 C.3. Servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Bibliografía 98 Índice de cuadros 2.1. Sensores compatibles con Android . . . . . . . . . . . . . . . . . . . . . . 13 6.1. Coste económico del hardware empleado . . . . . . . . . . . . . . . . . . 73 6.2. Líneas de código por lenguaje de programación . . . . . . . . . . . . . . . 73 6.3. Líneas de código separadas por componentes del sistema . . . . . . . . . . 73 6.4. Coste económico estimado en recursos humanos . . . . . . . . . . . . . . . 73 XII Índice de figuras 2.1. Arquitectura de objetos distribuidos . . . . . . . . . . . . . . . . . . . . . 6 2.2. Estructura C/S en Ice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3. Estructura de ejecución de aplicaciones en Android . . . . . . . . . . . . . 9 2.4. Esquema de funcionamiento de eCall (European Commision [Eurb]) . . . . 18 2.5. Estructura de un sistemas de detección de accidentes basado en Smartphone (WreckWatch [WTT+ 11]) . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.6. Diagrama de arquitectura de WreckWatch [WTT+ 11] . . . . . . . . . . . . 20 2.7. Aceleración registrada durante una caída y una frenada brusca [WTT+ 11] . 23 4.1. Modelo de proceso de XP . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5.1. Estructura esquematizada de L O RAM . . . . . . . . . . . . . . . . . . . . . 35 5.2. Diagrama de secuencia que representa la comunicación entre módulos . . . 36 5.3. Diagrama de Casos de Uso . . . . . . . . . . . . . . . . . . . . . . . . . . 42 5.4. Diagrama de secuencia de la notificación de un incidente . . . . . . . . . . 44 5.5. Diagrama de secuencia de la notificación de un incidente . . . . . . . . . . 46 5.6. Diagrama de secuencia de petición de datos de un usuario . . . . . . . . . . 47 5.7. Diagrama de secuencia de la solicitud de localización . . . . . . . . . . . . 49 5.8. Diagrama de secuencia de la activación del altavoz . . . . . . . . . . . . . 50 5.9. Diagrama de secuencia de intento de activación del vibrador con batería baja 52 5.10. Esquema de la base de datos . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.11. Diagrama de secuencia del proceso de login aceptado . . . . . . . . . . . . 54 6.1. Gráfico de los valores máximos de aceleración en valor absoluto para una frenada de emergencia a 30km/h. El eje vertical expresa la fuerza de aceleración experimentada en m/s2 y el eje horizontal expresa el momento de tiempo en décimas de segundo (ds) . . . . . . . . . . . . . . . . . . . . . . 67 6.2. Gráfico de los valores máximos de aceleración en valor absoluto para una frenada de emergencia a 50km/h. El eje vertical expresa la fuerza de aceleración experimentada en m/s2 y el eje horizontal expresa el momento de tiempo en décimas de segundo (ds) . . . . . . . . . . . . . . . . . . . . . . 68 XIII 6.3. Pantalla de log del gestor tras la recepción de un incidente . . . . . . . . . 69 6.4. Pantalla de listado de incidentes . . . . . . . . . . . . . . . . . . . . . . . 69 6.5. Pantalla de datos de incidente . . . . . . . . . . . . . . . . . . . . . . . . . 70 6.6. Captura de pantalla de LoRAM_Rescue mostrando ubicación de la víctima 71 6.7. Pantalla de log del gestor de la activación de los controles . . . . . . . . . . 71 A.1. Pantalla de inicio de sesión . . . . . . . . . . . . . . . . . . . . . . . . . . 80 A.2. Formulario de registro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 A.3. Pantalla de inicio de ruta . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 A.4. Pantalla de trayecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 A.5. Pantalla de confirmación de aviso . . . . . . . . . . . . . . . . . . . . . . 83 A.6. Pantalla de asistencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 A.7. Diálogo de cierre de sesión . . . . . . . . . . . . . . . . . . . . . . . . . . 84 B.1. Error producido durante el inicio de sesión . . . . . . . . . . . . . . . . . . 86 B.2. Pantalla de listado de incidentes . . . . . . . . . . . . . . . . . . . . . . . 86 B.3. Pantalla de datos de incidente con incidente asignado . . . . . . . . . . . . 87 B.4. Error de localización por incidente no asignado . . . . . . . . . . . . . . . 88 B.5. Panel de control remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 B.6. Panel de control remoto con controles activos . . . . . . . . . . . . . . . . 89 Índice de listados 2.1. Ejemplo de interfaz en S LICE . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2. Ejemplo de obtención de sensor acelerómetro en Android . . . . . . . . . . 12 2.3. Ejemplo de petición de localización en Android con Global Positioning System (GPS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4. Permisos necesarios para uso de GPS en Android . . . . . . . . . . . . . . 15 5.1. Test de integración de la notificación de un incidente . . . . . . . . . . . . 55 5.2. S LICE empleado en la primera iteración . . . . . . . . . . . . . . . . . . . . 56 5.3. Test de integración de la solicitud del listado de incidentes . . . . . . . . . 57 5.4. Cambios realizados en el S LICE de la primera iteración . . . . . . . . . . . 58 5.5. Cambios realizados en el S LICE de la segunda iteración . . . . . . . . . . . 58 5.6. Cambios realizados en el S LICE de la tercera iteración . . . . . . . . . . . . 59 5.7. Test de integración de la solicitud de localización a la víctima . . . . . . . . 60 5.8. Cambios realizados en el S LICE de la cuarta iteración . . . . . . . . . . . . 61 5.9. Cambios realizados en el S LICE de la quinta iteración . . . . . . . . . . . . 62 5.10. Cambios realizados en el S LICE de la sexta iteración . . . . . . . . . . . . . 62 5.11. Test unitario de intento de activación con batería baja . . . . . . . . . . . . 63 5.12. Cambios realizados en el S LICE de la séptima iteración . . . . . . . . . . . 64 5.13. Test de integración de login aceptado . . . . . . . . . . . . . . . . . . . . . 65 C.1. Slice para ejemplo de uso de Ice en Android . . . . . . . . . . . . . . . . . 90 C.2. Cliente de ejemplo de Ice for Android . . . . . . . . . . . . . . . . . . . . 90 C.3. Definición en XML de la interfaz del cliente . . . . . . . . . . . . . . . . . 93 C.4. Servidor de ejemplo de Ice for Android . . . . . . . . . . . . . . . . . . . 93 C.5. Implementación de la interfaz Hello . . . . . . . . . . . . . . . . . . . . . 95 C.6. Definición en XML de la interfaz del servidor . . . . . . . . . . . . . . . . 96 XV Listado de acrónimos LoRAM Location and Remote Assistance for Motocyclists RC Remote Control C/S Cliente-Servidor GPS Global Positioning System CORBA Common Object Request Broker Architecture RMI Remote Method Invocation Ice Internet Communications Engine Slice Specification Language for Ice API Application Programming Interface SO Sistema Operativo XML eXtensible Markup Language URI Uniform Resource Identifier IDE Integrated Development Environment GSM Global System for Mobile Communications ILS Indoor Location Systems RTLS Real Time Location System RFID Radio-Frequency Identification PC Personal Computer SMS Short Message Service SIM Subscriber Identity Module ACN Automatic Crash Notification UI User Interface XP eXtreme Programming TDD Test Driven Development SUT Subject Under Test SDK Software Development Kit XVI BD Base de Datos SGBD Sistema Gestor de Bases de Datos PFC Proyecto Fin de Carrera DGT Dirección General de Tráfico OMS Organización Mundial de la Salud SLOC Source Lines Of Code GNU GNU Is Not Unix Agradecimientos Quisiera aprovechar este pequeño espacio para dar las gracias a todas las personas que de una u otra forma han hecho que sea posible la finalización de estos estudios. En primer lugar, me gustaría dar las gracias a mis padres por creer en mi y darme la oportunidad de estudiar esta carrera, realizando el esfuerzo que sé que han realizado para que esto sea posible. También, agradecer al resto de mis familiares su preocupación constante y todos los consejos que en algún momento me han dado. Debo agradecer también a Blanca el haber estado siempre ahí apoyándome y dándome fuerzas para seguir adelante. A mi amigo y compañero Abraham, gracias por el apoyo y amistad recibido durante todos estos años. Gracias también a todas las personas que he conocido a lo largo de los años de carrera y con los que he compartido tantos buenos momentos, especialmente a Rubén, Alberto, Fran, David y Jesús. También debo agradecerle a David Villa el haberme dado la oportunidad de realizar este proyecto, y el haberme brindado la ocasión de adquirir nuevos y valiosos conocimientos. Por último no puedo olvidar dar las gracias a mis amigos de toda la vida, por su interés y preocupación hacia mí, y por todos los buenos ratos que hemos compartido. Israel Téllez García XVIII A mi familia, novia y amigos Capítulo 1 Introducción E n los accidentes de motocicleta es habitual encontrar problemas para localizar a los motoristas accidentados, ya que estos suelen salir despedidos del vehículo, dificultando las labores de búsqueda y asistencia de las víctimas. En la mayoría de estos accidentes una rápida intervención puede ser vital y puede incluso permitir salvar una vida. Los denominados teléfonos inteligentes o smartphone constituyen una plataforma con múltiples sensores de diversa índole que nos permiten realizar tareas como localización o incluso detectar accidentes. La creciente evolución de estas tecnologías, y el abaratamiento de sus costes, ha hecho posible la aparición de nuevas aplicaciones cada vez más sofisticadas, orientadas tanto a la localización de personas como a la detección de riesgos. La realización de este proyecto pretende hacer uso de estas tecnologías para proporcionar una solución económica a los problemas expuestos. En este capítulo se introducirán los principales conceptos que han intervenido en su realización. 1.1 Sistemas de seguridad de vehículos Desde la aparición de los primeros vehículos a motor su capacidades han ido en aumento, siendo éstos cada vez más potentes y veloces. Este hecho ha supuesto la necesidad de crear mecanismos que garanticen la seguridad y prevengan de posibles accidentes. Las empresas dedicadas a la fabricación de automóviles han ido incorporando en los vehículos cada vez más y mejores tecnologías con el fin de hacer la conducción más segura y reducir el número de accidentes producidos, o en el caso de que estos ocurran, minimizar en la medida de lo posible el número de víctimas mortales. Los sistemas de seguridad de vehículos, se dividen según dos puntos de vista diferentes que abarcan la prevención y la limitación de daños en caso de producirse un accidente, tanto para el vehículo, como para sus ocupantes [Par00]. Estos puntos de vista son los siguientes: Seguridad activa: es la seguridad que nos proporcionan todos los elementos incorporados en el vehículo, incrementando su seguridad durante los desplazamientos, con el fin de disminuir el riesgo de que se produzca un accidente. Los sistemas de seguridad 1 1. I NTRODUCCIÓN activa pueden estar orientados a mejorar la seguridad en diferentes partes del vehículo, como en el motor, la transmisión o los frenos. Entre los mecanismos de seguridad activa encontramos los frenos de disco, sistemas de control de estabilidad (ESP), sistema de control del par motor (ASR) o el sistema de control de frenada (ABS). Seguridad pasiva: es la seguridad que nos proporcionan todos los elementos, que incorporados o no al vehículo, reducen los daños de los ocupantes, en caso de que se produzca el accidente. Entre los mecanismos de seguridad pasiva destacamos el cinturón de seguridad, el airbag o el casco. En los últimos años están apareciendo nuevos sistemas de seguridad basados en detección del entorno. Dichos sistemas están aún poco extendidos y en la mayoría de los casos se presentan como equipamientos opcionales o son solo prototipos. Entre estos nuevos sistemas podemos encontrar sistemas anticolisión como el City Safety de Volvo [Vol12], sistemas de alerta de cambio involuntario de carril como LDWS de Citroen [Cit12] o sistemas de reconocimiento de objetos como ContiGuard [Con11] o EyeSight [Sub12], por destacar algunos. 1.2 Mecanismos de detección y asistencia en accidentes de tráfico Recientemente han surgido un nuevo tipo de sistemas de seguridad para vehículos que podríamos encuadrar en el marco de la seguridad pasiva. Este tipo de sistemas de seguridad detectan mediante sensores cuando se produce un accidente, y notifican este suceso a un centro de emergencias. El interés por este tipo de sistemas ha ido en aumento, llegando hasta el punto de ser obligatoria su incorporación en los vehículos de fabricación nueva, en Europa, a partir del 2015. El funcionamiento de estos sistemas se caracteriza no solo por detectar el accidente, si no también por facilitar la localización de las víctimas. Por ello, suelen incorporar un sistema de posicionamiento, como el GPS, que permita determinar la posición y enviarla al centro de emergencias. Además, pueden añadir información adicional que se considere importante, como la dirección que llevaba el vehículo en la carretera, el estado de vuelco, etc. Entre los sistemas de este tipo podemos destacar OnStar, sobre todo extendido en America, ó eCall, que ha sido el escogido para su uso en Europa. Todos estos sistemas hacen uso de hardware adicional instalado en el vehículo con el fin de detectar el accidente y alertar a emergencias. Sin embargo, los smartphone que encontramos hoy en día, cuentan con las características apropiadas para realizar estas funciones. Como ejemplo de un mecanismo de detección y asistencia basado en smartphone podemos destacar WreckWatch que será estudiado en detalle en la sección 2.8.2 de este documento. 2 1. I NTRODUCCIÓN 1.3 Problemática A pesar de los esfuerzos realizados por los gobiernos, compañías de fabricación de vehículos o instituciones como la Dirección General de Tráfico (DGT)1 , los accidentes siguen apareciendo con frecuencia en las carreteras, constituyendo la octava causa de muerte a nivel mundial según la Organización Mundial de la Salud (OMS)2 , y se prevé que será la quinta para 2030 de no tomar medidas urgentes [Org13]. El problema radica en la localización a tiempo de las víctimas, ya que en muchas ocasiones las víctimas no están en condiciones de avisar del suceso, y pasa cierto tiempo hasta que alguien los localiza y es capaz de avisar a emergencias. En los vehículos de dos ruedas, este problema de localización se ve incrementado, ya que los ocupantes del vehículo suelen salir despedidos y pueden quedar atrapados en algún lugar poco visible, como unos matorrales abruptos. A pesar de que existen diferentes sistemas orientados a detectar accidentes de vehículos y a aportar la ubicación de los ocupantes, los sistemas orientados a vehículos de dos ruedas son muy escasos, y no incorporan mecanismos que permitan realizar la localización de los ocupantes in situ. Todos estos problemas, unidos al alto coste y a las dificultades de instalación, que presentan en algunos casos los sistemas de detección de accidentes disponibles en el mercado, nos llevó a la creación de este trabajo. El objetivo general que se persigue con L O RAM es la creación de un sistema capaz de detectar accidentes de motocicleta y facilitar la localización de las víctimas sobre el lugar del accidente, todo ello haciendo uso exclusivo de las tecnologías incorporadas en un smartphone convencional. 1.4 Estructura del documento La realización de este documento se ha llevado a cabo siguiendo la normativa vigente de la Escuela Superior de Informática de Ciudad Real para la realización de un PFC. La distribución del contenido de este documento por capítulos es la siguiente: Capítulo 1: Introducción En este capítulo se ha mostrado una introducción al ámbito en el que se engloba este trabajo, comentando brevemente la problemática existente. Capítulo 2: Antecedentes El capítulo de antecedentes realiza un estudio sobre los conceptos y tecnologías implicadas en el desarrollo del proyecto. 1 2 http://www.dgt.es/ http://www.who.int/es/ 3 1. I NTRODUCCIÓN Capítulo 3: Objetivos En este capítulo se presenta el objetivo general y los distintos objetivos específicos que se persiguen con la realización del PFC. Capítulo 4: Método de trabajo A lo largo de este capítulo se expone la metodología de desarrollo empleada, y se muestran las herramientas utilizadas en la realización de este trabajo. Capítulo 5: Arquitectura y Desarrollo En este capítulo se muestra la división del sistema, detallando cada una de las partes que lo forman. También se define el listado de requisitos, y se expone el proceso de desarrollo por iteraciones seguido durante la realización del proyecto. Capítulo 6: Resultados A lo largo de este capítulo se analizan los resultados obtenidos con la ejecución del sistema, y los costes derivados de su realización. Capítulo 7: Conclusiones y Trabajo futuro El capítulo de conclusiones y propuestas muestra en qué grado han sido alcanzados los objetivos marcados. También se exponen algunas propuestas de trabajo futuro y se finaliza con una valoración personal sobre lo que ha supuesto la realización de este trabajo. 4 Capítulo 2 Antecedentes E ste capítulo tiene como finalidad explicar al lector los distintos componentes y tecnologías que han tenido lugar en el desarrollo de este proyecto fin de carrera. Debido a la escasa existencia de sistemas similares a L O RAM, basaremos el estudio del estado del arte en mostrar los diferentes aspectos que han tenido lugar para su desarrollo. 2.1 Aplicaciones distribuidas Una aplicación distribuida es aquella en la que existen diferentes componentes, los cuales pueden ser ejecutados en distintas plataformas conectadas a una misma red. La comunicación mas habitual es la que presenta la arquitectura de dos niveles Cliente-Servidor (C/S), aunque podemos encontrar arquitecturas con una división de más niveles. Con el término distribución nos referimos a software construido por varias partes, donde a cada una se le asigna un conjunto específico de responsabilidades dentro del sistema. Para poder realizar una separación física del sistema, se debe tener clara la separación lógica del mismo. Así podemos distinguir entre separación lógica «capas» y física «niveles». La arquitectura de una aplicación distribuida, según su funcionalidad, presenta tres grupos de elementos: Capa de servidor: se encarga de recibir peticiones de acceso a servicios o a datos y de suministrar esta información al solicitante. Capa de negocio: gestiona los procesos internos y el acceso a los datos. Capa de presentación: constituye los mecanismos necesarios para hacer posible la interación con el usuario. A la hora de realizar una aplicación distribuida es importante tener en cuenta varios aspectos como la topología de la red, concurrencia o seguridad, ya que será necesario controlar los tiempos de respuesta y proporcionar mecanismos que impidan accesos no autorizados. 2.2 Arquitectura de objetos distribuidos Una arquitectura de objetos distribuidos [Som05] está compuesta por objetos que proveen servicios a través de una interfaz que ellos mismos facilitan. A diferencia de las arquitec5 2. A NTECEDENTES 6 turas C/S no existe una distinción lógica entre el proveedor y el receptor del servicio (ver figura 2.1). Figura 2.1: Arquitectura de objetos distribuidos Un middleware conocido como intermediario de peticiones de objetos será el encargado de proporcionar los servicios necesarios para realizar la comunicación entre objetos. Además dicho middleware permitirá a los objetos ser añadidos o eliminados del sistema. Existen varias alternativas hoy en día que se ajustan a esta arquitectura. Así tenemos middleware orientados a objetos como CORBA o RMI por citar algunos. A continuación pasamos a estudiar ZeroC Ice por ser el escogido para la realización de este proyecto. 2.2.1 ZeroC Ice El middleware I CE (Internet Communications Engine) [VMA12] desarrollado por ZeroC, Inc.1 , nos permite realizar una comunicación de objetos distribuidos. Este middleware está diseñado para soportar varios lenguajes de programación como C, Java o Python entre otros. Además esta disponible para múltiples plataformas entre las que se encuentran GNU/Linux, Windows o Android. Todo esto lo convierte en una opción muy interesante a la hora de crear un sistema distribuido de objetos, dada su amplia capacidad de adaptación. En I CE podemos destacar las siguientes ventajas: Al utilizar la misma implementación para todos los lenguajes no se añade complejidad al desarrollo de un proyecto multi-lenguaje. Los detalles de configuración de las comunicaciones son completamente ortogonales al desarrollo del software. Presenta una interfaz sencilla, en la que el significado de las operaciones se deduce fácilmente. 1 http://www.zeroc.com 2. A NTECEDENTES 7 Para realizar una comunicación entre dos partes de una aplicación una debe asumir el rol de cliente y la otra el de servidor2 . La parte que asuma el papel de cliente solicitará servicios mediante la invocación a métodos de objetos remotos, y la parte con el rol de servidor proporcionara servicios como respuesta a las solicitudes de los clientes. En la figura 2.2 se muestra el aspecto de esta estructura en I CE. Figura 2.2: Estructura C/S en Ice Para comprender el funcionamiento de I CE se necesitan conocer una serie de conceptos que detallaremos en las siguientes líneas. Objeto En I CE un objeto es una entidad conceptual que tiene un tipo, una identidad e información de direccionamiento. De forma específica podemos caracterizarlo por los siguientes puntos: Es una entidad en el espacio de direcciones remoto o local capaz de responder a las peticiones de los clientes. Un único objeto I CE puede ser instanciado en un único servidor o de manera redundante, en múltiples servidores. Cada objeto tiene una o mas interfaces. Una interfaz es una colección de operaciones soportadas por un objeto. Una operación tiene cero o mas parámetros y un valor de retorno. Parámetros y valores de retorno tienen un tipo específico, y los parámetros además tienen una determinada dirección. 2 Estos roles pueden ser intercambiados entre las distintas partes durante la comunicación 2. A NTECEDENTES Un objeto I CE tiene una interfaz principal diferenciada del resto. Además, puede proporcionar cero o más interfaces alternativas excluyentes, conocidas como facets. Cada objeto tiene una identidad de objeto única que lo distingue del resto de objetos. Proxy Cuando hablamos de un proxy en I CE nos referimos a un representante local de un objeto (generalmente remoto) en el espacio de direcciones del cliente. I CE soporta varios tipos de proxies para cubrir diferentes situaciones: Proxies textuales, la información asociada se representa como una cadena. Proxies directos, encapsulan una identidad de objeto junto con la dirección asociada a su servidor. Proxies indirectos, pueden proporcionar sólo la identidad de un objeto, o bien pueden especificar una identidad junto con un identificador de adaptador de objetos. Proxies fijos, están asociados a una conexión en particular. El proxy contiene un manejador de conexión. Sirviente Un sirviente es el componente de la parte del servidor encargado de proporcionar el comportamiento asociado a la invocación de operaciones. Se trata de una instancia de una clase registrada en el núcleo de ejecución del servidor como sirviente para uno o varios objetos. Las operaciones de la interfaz del objeto I CE se corresponden con los métodos de esta clase, que son los encargados de proporcionar el comportamiento de dichas operaciones. Un único objeto distribuido puede tener múltiples sirvientes, pero también un sirviente puede encarnar uno o varios objetos. La diferencia radica en que si un sirviente encarna a un único objeto, la identidad de este objeto estará implícita en el sirviente, pero si el sirviente encarna varios objetos, el sirviente mantendrá la identidad del objeto con cada solicitud y así podrá decir que objeto encarnar. Slice El lenguaje S LICE (Specification Language for Ice) constituye el mecanismo de abstracción fundamental para la separación de las interfaces de objetos de sus implementaciones. S LICE establece un contrato entre el cliente y el servidor en el que se describen los tipos de objetos e interfaces utilizados por una aplicación. Esta descripción es independiente del lenguaje de implementación, por lo que no importa si el cliente está escrito en el mismo lenguaje que el servidor. En el listado de código 2.1 se muestra un ejemplo de interfaz en S LICE. 8 2. A NTECEDENTES 1 2 3 4 5 9 module Example { interface Hello { void puts ( string message ) ; }; }; Listado 2.1: Ejemplo de interfaz en S LICE Una descripción más amplia de este lenguaje la podemos encontrar en el manual de I CE [Zer11]. Language Mappings Se conoce por language mappings a las reglas que rigen la forma en que cada construcción S LICE se traduce a un lenguaje de programación específico. Estas reglas son simples y regulares, haciendo innecesaria la lectura del código generado para utilizar la API que se genera. 2.3 El Sistema Operativo Android Android3 es un Sistema Operativo (SO) basado en Linux propiedad de la empresa Google y apollado por la Open Handset Alliance. Fue diseñado para trabajar sobre diferentes dispositivos (Tablets, móviles, reproductores multimedia, ...) y actualmente se encuentra en la versión 4.2 «Jelly Bean». En Android las aplicaciones se programan en Java, y son empaquetadas en paquetes «.apk». Cada aplicación se ejecuta en un proceso independiente al que se le asocia una máquina virtual conocida como Dalvik [Anda]. En la figura 2.3 podemos ver un esquema sobre como se ejecutan las aplicaciones en Android. Figura 2.3: Estructura de ejecución de aplicaciones en Android 3 http://www.android.com 2. A NTECEDENTES Este tipo de ejecución presenta importantes ventajas, como por ejemplo, si una aplicación se bloquea, el resto del sistema no se verá afectado y su máquina virtual podrá ser reiniciada. El sistema podrá gestionar la carga de aplicaciones en tiempo real, decidiendo cuales permanecerán en memoria y cuales serán eliminadas. Además cada aplicación será la encargada de gestionar sus propios datos decidiendo que información ofrecer en cada momento. 2.3.1 Componentes de una aplicación Los componentes nos ayudan a definir el comportamiento global de una aplicación en Android. Cada uno de ellos constituye una entidad propia y desempeña un papel específico. En Android cada uno de los componentes definidos por una aplicación podrá ser utilizado por otras aplicaciones. Esto es posible gracias a que no se define un punto único de entrada a la aplicación, a diferencia de otros sistemas donde debe existir un «main». Los componentes de una aplicación Android se pueden clasificar en cuatro tipos con diferentes propósitos y ciclos de vida. Activities Una Activity representa una pantalla con una interfaz de usuario. Las aplicaciones pueden estar compuestas de varias activities, pero sólo una de ellas será la cargada al iniciar la aplicación, considerada activity «principal». En algunas ocasiones, una activity puede estar compuesta por fragments. Un fragment representa una porción de la interfaz de usuario en una activity, de modo que se pueden combinar múltiples fragment para formar una activity. Para hacer uso de este componente se necesita la API level 11 de Android. Services Un servicio es un componente sin interfaz de usuario que se ejecuta en segundo plano «background». Son similares a los servicios presentes en otros sistemas, como por ejemplo los demonios en Linux. Otros componentes como las Activities pueden iniciar estos servicios o unirse a alguno en ejecución. Content providers Gestionan un conjunto de datos de aplicación compartidos. Estos datos pueden estar almacenados en una base de datos SQLite, en la web, o en cualquier otro lugar de almacenamiento persistente al que pueda acceder la aplicación. A través del proveedor de contenidos (content provider) otras aplicaciones podrán consultar o modificar los datos dependiendo de los permisos que se le otorguen. Android nos ofrece algunos proveedores de contenidos, como por ejemplo el que gestiona la información de contacto del usuario o la agenda, aunque también podemos crear nuestro propio content provider y ofrecerlo al sistema. 10 2. A NTECEDENTES Broadcast receivers Un broadcast receiver es un componente sin interfaz de usuario que reacciona a los anuncios broadcast del sistema. Estos anuncios nos informan de que la batería está baja, que se ha capturado una imagen, etc. Las aplicaciones de usuario también pueden iniciar anuncios broadcast para informar de algún evento a otras aplicaciones. En la práctica las aplicaciones pueden tener varios broadcast receiver. Cada uno de ellos deberá implementarse como una subclase de BroadcastReceiver, y cada mensaje de broadcast le llegará como un objeto Intent. 2.3.2 Intents Un Intent es un mensaje asíncrono que nos permite activar otros componentes, ya sean de la misma aplicación que lo solicita o de otra. Los componentes que nos permite activar son los de los tipos Activities, Services o Broadcast receivers. Para las Activities y Services, un intent define la acción a realizar y puede especificar una Uniform Resource Identifier (URI) de datos necesarios. Para los Broadcast receivers el intent simplemente define el tipo de broadcast que quiere recibir. 2.4 Ice for Android Ice for Android [Zera] presenta una solución para crear aplicaciones distribuidas orientadas a objetos para plataformas móviles que usan el SO Android. Soporta las mismas APIs que Ice for Java lo que facilita la reutilización y la experiencia. Para mejorar la productividad ZeroC ha creado Slice2Java, un plug-in de Eclipse4 que automatiza la traducción de los ficheros Slice y gestiona el código resultante generado. El uso de este IDE se debe a la estrecha integración que tiene con las herramientas de desarrollo ofrecidas por Android. Para descargar e instalar este plug-in podemos consultar la siguiente dirección http://www.zeroc.com/eclipse.html. En el Anexo C podemos encontrar un ejemplo sencillo sobre el uso de I CE en Android. 2.5 Sensores en smartphone con Android Un smartphone o teléfono inteligente, es un teléfono móvil que incorpora un SO y una tecnología más compleja que dota al teléfono de más funciones de conectividad y capacidades de cómputo más avanzadas. Los smartphone incorporan una serie de sensores, cada vez más amplia, que nos permiten realizar aplicaciones capaces de detectar determinadas circunstancias, y realizar una serie de acciones. El SO Android da soporte a tres grandes categorías de sensores [Andd]: 4 http://www.eclipse.org 11 2. A NTECEDENTES Sensores de movimiento: miden fuerzas de rotación y aceleración sobre los tres ejes. Sensores ambientales: miden parámetros ambientales como la temperatura del aire, la presión, la iluminación y la humedad. Sensores de posición: miden la posición física del dispositivo. En el cuadro 2.1 podemos ver la lista completa de sensores compatibles con Android. En Android el framework que nos permite acceder a los sensores forma parte del paquete android.hardware. Este framework nos permite determinar el tiempo de ejecución de los sensores en el dispositivo, así como determinar las capacidades de cada sensor, como su alcance máximo, requisitos de energía y resolución. Para usar un sensor en Android primero es preciso identificarlo, por lo que crearemos una instancia de SensorManager y después obtendremos la lista de sensores del dispositivo mediante una llamada a getSensorList(). A este método podremos indicarle si deseamos obtener la lista completa de sensores «TYPE_ALL» o solo los de un tipo específico, usando la constante adecuada. También podemos obtener un sensor de un tipo específico llamando al método getDefaultSensor(), lo que nos devolverá un sensor predeterminado para el tipo indicado o null si no existe un sensor para ese tipo. Finalmente para obtener los datos del sensor debemos registrar un SensorEventListener para el sensor específico. En el listado 2.2 se muestra como crear una clase que obtenga un sensor acelerómetro y se registre para obtener cambios en él. 1 public class A c ce l e ro m e te r S en s o r implements S en s o r Ev e n tL i s te n e r { 3 4 private SensorManager sM ; private Sensor sA ; 6 7 8 public A c ce l e ro m e te r S en s o r ( Context ctx ) { sM = ( SensorManager ) ctx . getSystemService ( Context . SENSOR_SERVICE ) : sA = sM . getDefaultSensor ( Sensor . TY PE _A CC EL ER OME TE R ) ; sM . registerListener ( this , sA , SensorManager . S E N SO R _ D EL A Y _N O R MA L ) ; 10 11 } 16 @Override public final void onA ccurac yChang ed ( Sensor sensor , int accuracy ) { // Hacer algo si se produce un cambio de precision en el sensor } 18 19 20 21 @Override public final void onSensorChanged ( SensorEvent event ) { // Hacer algo si el sensor recoge un nuevo valor } 13 14 15 22 } Listado 2.2: Ejemplo de obtención de sensor acelerómetro en Android 12 2. A NTECEDENTES 13 Sensor Tipo Descripción Usos comunes TYPE_ACCELEROMETER HW Detección de movimiento. TYPE_AMBIENT_TEMPERATURE HW TYPE_GRAVITY SW/HW TYPE_GYROSCOPE HW TYPE_LIGHT HW TYPE_LINEAR_ACCELERATION SW/HW TYPE_MAGNETIC_FIELD HW TYPE_ORIENTATION SW TYPE_PRESSURE HW Mide la fuerza de aceleración en m/s2 que se aplica a un dispositivo en los tres ejes (X, Y, Z), incluida la fuerza de gravedad. Mide la temperatura ambiente en grados Celsius (0 C) Mide la fuerza de la gravedad en m/s2 que se aplica a un dispositivo en los tres ejes (X, Y, Z). Mide la frecuencia de rotación de un dispositivo en rad/s alrededor de cada uno de los tres ejes (X, Y, Z). Mide la iluminación en lux (lx). Mide la fuerza de aceleración en m/s2 que se aplica a un dispositivo en los tres ejes (X, Y, Z), excluyendo la fuerza de gravedad. Mide el campo geomagnético en los tres ejes (X, Y, Z) en µT . Mide los grados de rotación que un dispositivo hace alrededor de los tres ejes (X, Y, Z). Mide la presión del aire en hPa o mbar. TYPE_PROXIMITY HW TYPE_RELATIVE_HUMIDITY HW TYPE_ROTATION_VECTOR SW/HW Mide la proximidad de un objeto en cm respecto a la pantalla de un dispositivo. Mide la humedad relativa del ambiente en porcentaje ( %). Mide la orientación de un dispositivo, proporcionando los tres elementos del vector de rotación. Comprobar temperatura del aire. Detección de movimiento. Detección de rotación. Control de brillo de la pantalla. Supervisión de la aceleración en un solo eje. Creación brújula. de una Determinar la posición del dispositivo. Supervisión de los cambios de presión en el aire. Posición del teléfono durante una llamada. Supervición de la humedad absoluta y relativa. Detección de movimiento y rotación. Cuadro 2.1: Sensores compatibles con Android (A NDROID D EVELOPERS [Andd]) 2. A NTECEDENTES Como se puede observar en el listado 2.2 la interfaz SensorEventListener requiere la implementación de los métodos onAccuracyChanged() y onSensorChanged(). El primero nos indica un cambio en la precisión del sensor, y el segundo un nuevo valor recogido por el sensor. 2.6 Sistemas de localización Los sistemas de localización [dlSdlIO09] son aquellos que nos permiten determinar la posición geográfica de un objeto móvil o inmóvil, mediante una serie de tecnologías de posicionamiento. Para que la localización sea posible es preciso contar con un sistema de referencia que nos permita determinar una posición sobre un plano. De forma general, el sistema más extendido es el sistema de coordenadas geográficas, que se basa en dos coordenadas (latitud y longitud) para determinar la posición de un punto sobre la superficie terrestre. Según las tecnologías empleadas para realizar la localización podemos diferenciar entre dos tipos de sistemas de localización, basándonos en el alcance de su ámbito de actuación: outdoor (exteriores): Son usados para localización en grandes áreas geográficas. En cuanto a las tecnologías empleadas encontramos sistemas basados en satélite como el GPS (Estados Unidos), GALILEO (Unión Europea), o basados en redes celulares de largo alcance como GSM (Global System for Mobile Communications). indoor (Interiores): Están destinados a localización en pequeñas áreas geográficas, o para interiores de edificios. Los ILS (Indoor Location Systems) se utilizan principalmente para implantar sistemas Real Time Location System (RTLS) mediante el uso de tecnologías inalámbricas de corto alcance como Wi-Fi, Bluetooth, Radio-Frequency Identification (RFID) o Zigbee. 2.6.1 Localización en Android La localización en Android [Andc] se realiza mediante el paquete android.location5 , que proporciona las APIs necesarias para determinar la ubicación geográfica del usuario. Cuando se desarrolla una aplicación para determinar la ubicación en Android se pueden emplear dos mecanismos: (Global Positioning System)6 : es el más preciso, pero conlleva un enorme gasto de batería y solo funciona en entornos outdoor. GPS Network Location Provider: hace uso de antenas celulares y señales Wi-Fi. Proporciona información tanto indoor como outdoor, pero en áreas interurbanas es poco preciso. 5 6 http://developer.android.com/reference/android/location/package-summary.html http://www.gps.gov/ 14 2. A NTECEDENTES Para obtener la ubicación de un usuario en Android primero debemos solicitar al sistema una instancia del servicio LocationManager. Posteriormente, debemos indicar a este servicio que deseamos recibir actualizaciones de ubicación, para lo que deberemos hacer una llamada a requestLocationUpdates() pasándole un objeto LocationListener. Este LocationListener deberá ser implementado definiendo una serie de métodos que el LocationManager llama cuando cambia la ubicación del usuario. En el listado 2.3 se muestra un ejemplo de petición de localización mediante GPS con un intervalo de 500ms entre actualizaciones de localización. En este ejemplo se recoge la latitud y longitud, pero no se hace nada con ellas. 1 2 3 Context ctx = g e t A p p l i c a t i o n C o n t e x t () ; LocationManager lM ; LocationListener lL ; 5 lM =( LocationManager ) ctx . getSystemService ( Context . LOCATION_SERVICE ) ; 7 8 9 10 11 lL = new LocationListener () { public void onL ocatio nChang ed ( Location location ) { double lat = location . getLatitude () ; double lon = location . getLongitude () ; } 13 public void on Pr ov id er Di sa bl ed ( String provider ) {} 15 public void onP rovide rEnabl ed ( String provider ) {} 17 18 public void onStatusChanged ( String provider , int status , Bundle extras ) {} 20 }; 22 lM . r e q u e s t L o c a t i o n U p d a t e s ( LocationManager . GPS_PROVIDER , 500 , 0 , lL ) ; Listado 2.3: Ejemplo de petición de localización en Android con GPS Para que sea posible la utilización de la localización GPS es necesario añadir el permiso adecuado en el fichero AndroidManifest.xml (ver listado 2.4). 1 2 3 4 < manifest ... > < uses - permission android:name = " android . permission . A C C E S S _ F I N E _ L O C A T I O N " / > </ manifest > Listado 2.4: Permisos necesarios para uso de GPS en Android 2.7 Sistemas RC Los sistemas RC (Remote Control) son aquellos que nos permiten controlar a distancia uno o varios dispositivos que pueden estar dotados de una serie de sensores y actuadores. En 15 2. A NTECEDENTES estos sistemas intervienen dos partes: una que envía órdenes y otra que las recibe y actúa en consecuencia. Por lo que tenemos una comunicación entre ambas emisor/receptor. La parte que envía las órdenes contendrá un panel de control para permitir activar componentes actuadores o modificar su comportamiento. También puede incluir alertas o indicadores que nos permitan conocer el estado de algún sensor. Por otro lado la parte que recibe las ordenes estará compuesta por una serie de sensores y actuadores a los que tendrá acceso. Cuando reciba una petición se pondrá en contacto con estos para realizar la acción necesaria. Existe una amplia gama de sistemas destinados al control remoto de dispositivos. Estos pueden ir desde algo tan cotidiano como el mando a distancia de una televisión o un coche teledirigido, hasta sistemas más complejos que nos permitan controlar un PC o un smartphone a distancia. 2.7.1 Cerberus En cuanto a sistemas RC orientados a smartphone podemos destacar Cerberus7 . Cerberus [pla] es un app disponible para Android cuya funcionalidad esta orientada a la recuperación de terminales Android perdidos o robados. Permite el control remoto del dispositivo de dos formas diferentes: Mediante Internet accediendo desde la página web de Cerberus. Mediante mensajes de texto SMS. La aplicación cuenta con una función conocida como «SIM Checker» que nos informa del nuevo número que tendría el teléfono en el caso de que la tarjeta SIM sea cambiada, de modo que la manipulación del dispositivo mediante mensajes SMS siga siendo posible. El control remoto de Cerberus permite realizar una gran variedad de acciones en el dispositivo, entre las que podemos destacar algunas como la localización del dispositivo, activación de una alarma, grabación de audio con el micrófono o la obtención de las últimas llamadas realizadas o recibidas. 2.8 Detección automática de accidentes El tiempo que transcurre desde que se produce un accidente hasta el momento en que la víctima es localizada y atendida, es fundamental para que la intervención de los servicios de socorro tenga éxito. Por ello, es importante reducir este tiempo el máximo posible con el fin de minimizar las consecuencias del accidente en los heridos. Una de las formas de reducir este tiempo de respuesta es mediante el uso de los sistemas ACN (Automatic Crash Notification). Estos sistemas son capaces de detectar cuando se 7 https://www.cerberusapp.com/ 16 2. A NTECEDENTES produce un accidente y de alertar al personal de emergencia de dicho accidente. Uno de los sistemas ACN más famosos es OnStar. En [LPFF08] se realiza un estudio sobre como los ACN pueden ayudar a reducir la mortalidad en accidentes de tráfico. OnStar [OnS] es un sistema ACN perteneciente a la empresa americana General Motors LLC. Este sistema proporciona servicios como respuesta automática ante choques, navegación y asistencia en carretera. Su sistema de respuesta automática ante choques consta de una serie de sensores colocados en el vehículo que permiten detectar un choque y alertar a un centro de asesoramiento. A continuación si el usuario solicita ayuda o no contesta se le enviará un equipo de emergencias a su localización calculada mediante GPS. Además, el vehículo puede transmitir información importante sobre la colisión, como la dirección y el número de impactos, o el estado de vuelco del vehículo. Aunque OnStar es uno de los sistemas más destacados, existen otros sistemas similares, que incluyen ACN. Podemos nombrar algunos como Mercedes-Benz Tele Aid, Ford’s VEMS/RESCU system y BMW Assist. Recientemente, la Comisión Europea8 ha propuesto hacer obligatoria la incorporación del sistema eCall, a partir del 2015, en todos los vehículos de fabricación nueva. El comunicado de prensa puede verse en [Eur13]. El sistema eCall supone una alternativa en Europa al sistema OnStar mostrado anteriormente. Básicamente su funcionamiento es el mismo, salvo que eCall viene programado para realizar un llamada al número de emergencia europeo 112 en caso de accidente. Esta llamada también puede ser realizada manualmente con un botón que incorpora y que podría ser pulsado por un testigo del accidente [Eura]. En la imagen de la figura 2.4 podemos ver un esquema de su funcionamiento. 2.8.1 Detección automática de accidentes basada en smartphone Los sistemas ACN como OnStar presentan el inconveniente de no estar disponibles en todos los coches, además de ser caros de equipar en vehículos antiguos. Sin embargo, los smartphone gracias a la amplia variedad de sensores que incorporan (acelerómetro, GPS, etc.), nos brindan la oportunidad de crear sistemas capaces de detectar un accidente e informar de forma rápida a los servicios sanitarios. Además permiten mantener una conexión persistente a Internet lo que les permite transmitir datos de forma continua para informar de cualquier problema que se detecte. La figura 2.5 nos muestra el funcionamiento de este tipo de sistemas. Como se observa en la figura, se distinguen tres acciones básicas realizadas por el sistema: 1. Mediante los sensores del smartphone se detecta un posible accidente de trafico. 2. Mediante una conexión de datos 3G el teléfono transmite la información relativa al accidente a un servidor. 8 http://ec.europa.eu/index es.htm 17 2. A NTECEDENTES Figura 2.4: Esquema de funcionamiento de eCall (European Commision [Eurb]) 3. El servidor procesa la información del accidente y realiza las acciones que considere oportunas. Los sistemas de detección automática de accidentes basados en smartphone presentan importantes ventajas con respecto a los basados en vehículo, como son el acceso a la tecnología o el precio de ésta, sin embargo presentan la desventaja de los falsos positivos. El problema de los falsos positivos rara vez aparece en sistemas basados en vehículo, ya que estos cuentan con sensores capaces de detectar los daños físicos en el vehículo, o la activación de mecanismos de emergencia en el coche, como por ejemplo el airbag. Por otro lado podemos contrarrestar el efecto de los falsos positivos haciendo uso de información adicional, como señales acústicas antes y después del accidente o las fuerzas de aceleración registradas. A continuación se muestran las principales ventajas que podemos encontrar en los sistemas basados en smartphone con respecto a los sistemas de abordo instalados en los vehículos [WTT+ 11]: Pueden medir de una forma más precisa las fuerzas experimentadas por las víctimas, ya que el dispositivo suele estar situado en su bolsillo. 18 2. A NTECEDENTES Figura 2.5: Estructura de un sistemas de detección de accidentes basado en Smartphone (WreckWatch [WTT+ 11]) El coste de un smartphone es relativamente bajo, y su uso esta muy extendido. Se evita tener que instalar hardware adicional en el vehículo. Reducción de la complejidad del software de mantenimiento. Posibilidad de ampliar capacidades de procesamiento y almacenamiento a través de servicios basados en cloud. Por otro lado, los sistemas basados en smartphone presentan varias desventajas a tener en cuenta: Consumen una cantidad significativa de batería. La fuerza de impacto captada por el smartphone se ve reducida por los sistemas de seguridad del vehículo. Una avería en el teléfono ocasionada por un impacto puede impedir la notificación del accidente. El software de los sensores está controlado por el SO del smartphone. Esto quiere decir que una actualización en dicho software podría dejar obsoleta la detección de accidentes. Las pruebas de calidad se hacen difíciles debido a los falsos positivos. 19 2. A NTECEDENTES 2.8.2 WreckWatch WreckWatch [WTT+ 11] es un sistema de detección automática de accidentes de tráfico basado en smartphone. El sistema graba todos los datos posibles referentes a los sucesos que podrían originar un accidente. En concreto realiza un registro de la trayectoria, velocidad y fuerzas de aceleración sobre un vehículo que está siendo conducido y durante un accidente. El sistema también es capaz de alertar a los servicios de emergencia de un accidente, añadiendo imágenes y vídeos realizados por testigos que se encuentren en el lugar del suceso. Arquitectura El sistema presenta una arquitectura C/S, donde el cliente ha sido desarrollado para su ejecución en entornos Android. La información se transmite del cliente al servidor mediante operaciones estándar HTTP POST (ver figura 2.6). Figura 2.6: Diagrama de arquitectura de WreckWatch [WTT+ 11] El cliente se compone de una serie de Activities (ver sección 2.3.1) para la cartografía, pruebas y carga de imágenes. También presenta servicios en segundo plano para la detección de accidentes mediante la consulta constante de los sensores del sistema, como el acelerómetro o el GPS. La aplicación permite modificar la frecuencia de rastreo de los sensores, con el fin de reducir los consumos de batería, y la recopilación de datos del teléfono, para obtener información de interés, como los contactos que se deben avisar en caso de emergencia. El servidor esta desarrollado utilizando Java/MySQL con Jetty y Spring Framework. Proporciona un servicio de recogida de datos, y un mecanismo para la comunicación con los servicios de emergencia y familiares de la víctima. Permite a los sistemas clientes el en- 20 2. A NTECEDENTES 21 vío de características del accidente y presenta varias interfaces, como un mapa de Google y servicios web XML/JSON, para acceder a esta información. Modelo formal de detección de accidente En la creación de un modelo formal de detección de accidentes basado en smartphone, con una precisión aceptable, es importante hacer frente a dos problemas importantes: Detectar el accidente sin la medición directa de datos de impacto de sensores de a bordo instalados en el vehículo. Examinar la posibilidad de falsos positivos. Para hacer frente a estos problemas el sistema WreckWatch realiza un muestreo continuo de varios sensores, atendiendo a unos umbrales de filtrado que pretenden predecir cuando sucede un accidente. El modelo empleado por el sistema para explorar el estado del vehículo es el siguiente: γ =< φ, Tφ , ρ, Tρ , β, , Sφ , Sρ , Sβ , Mφ , Mρ , Mβ , M > (2.1) Donde: φ: variable de aceleración que indica la aceleración máxima registrada por el teléfono en cualquier dirección. Sφ : lapso de tiempo desde que un evento de aceleración establece un valor para φ hasta que la variable es reiniciada. ρ: variable binaria de evento de sonido que indica si un evento de sonido mayor que Mρ dBs se ha producido. Mediante un estudio se ha establecido que 140dBs es un buen valor para Mρ . Sρ : lapso de tiempo que se mantendrá a nivel 1 la variable ρ después de registrar un evento de sonido superior a Mρ dBs. β: variable de velocidad umbral que toma valor uno si el vehículo ha estado viajando a más de M βmph. Sβ : lapso de tiempo que se mantendrá el valor 1 para la variable β después de que el vehículo deje de viajar por encima de Mβ mph. : distancia recorrida desde la última vez que la variable β cambiará de 1 a 0. Mφ : aceleración mínima en Gs para que un solo evento de aceleración active la detección de accidentes. 2. A NTECEDENTES 22 Mρ : decibelios mínimos requeridos para que un evento acústico active la variable ρ. Mβ : velocidad mínima, en millas por hora, que el dispositivo debe detectar para activar el sistema de detección de accidentes. M : distancia máxima en metros que el dispositivo puede desplazarse a una velocidad más baja que Mβ , antes de que el sistema de detección de accidentes sea desactivado. La función de detección de accidente evalúa a 1 si un accidente es detectado o 0 en caso contrario. Ev : γ → {0, 1} (2.2) La detección de accidente se establece de la siguiente forma: Ev(γ) = 1 + αρ ≥ MT r ∧ (β == 1) si( < M ) ∧ Mφφ + αρ ≥ MT r 0 en otros casos 1 si φ Mφ (2.3) Donde: α: es un factor ajustable que se aplica al evento de sonido para indicar su importancia en la detección del accidente. MT r : es el umbral para la detección del accidente. Como se abstrae de la fórmula, el sistema reconocerá un accidente mediante dos posibles escenarios: en el primero, el sistema registra un evento de aceleración y sonido con una escala alta mientras el vehículo se esta moviendo con una velocidad superior a Mβ , y en el segundo se produce una aceleración y un evento de sonido habiendo recorrido una distancia inferior a M desde la última vez que se activó Mβ , con este escenario se intenta detectar si el vehículo es golpeado mientras esta detenido. Evaluación de falsos positivos WreckWatch basa su sistema de detección de accidentes en mediciones de aceleración y sonidos, por lo que se enfrenta a falsos positivos derivados de ambas mediciones. En esta sección mostraremos los casos que se consideraron como causantes de falsos positivos en la creación de este sistema y los análisis realizados para determinar su importancia. 2. A NTECEDENTES En cuanto a los casos que provocan falsos positivos relacionados con los valores del acelerómetro, los casos considerados son: la caída accidental del smartphone dentro del vehículo, o la realización de una frenada de emergencia que no de lugar a accidente. Los resultados obtenidos de los ensayos realizados por WreckWatch se muestran en la figura 2.7. Como se observa, en ninguno de los dos casos se sobrepasa el umbral establecido de 4G por lo que se considera poco probable que estas situaciones den lugar a un falso positivo. Figura 2.7: Aceleración registrada durante una caída y una frenada brusca [WTT+ 11] Por otro lado, se consideraron seis casos que podrían causar falsos positivos relacionados con la medición de sonido, entre los que se tenían en cuenta la radio, el ruido de los ocupantes del vehículo o el de la carretera. Este estudio demostró que el smartphone no era capaz de detectar niveles de sonido superiores a 145 dB por lo que la medición de los niveles de sonido podría dar lugar a la aparición de falsos positivos. Sin embargo, esta medida nos es útil para mejorar la percepción de accidentes, ya que si se registra una aceleración que se encuentre ligeramente por debajo del umbral, pero que presentan niveles altos en la percepción de sonido, podríamos tratar el caso también como un accidente. 23 Capítulo 3 Objetivos E n esta sección se mostrarán los objetivos tanto principales como específicos que se persiguen con la realización de este proyecto, con el fin de dar a conocer al lector el alcance al que se pretende llegar con la realización del mismo. 3.1 Objetivo general El objetivo principal de L O RAM es la creación de un sistema capaz de detectar posibles accidentes de motocicleta e informar de dichos accidentes. Además pondrá los medios necesarios para la localización de la posible víctima y facilitará una serie de mecanismos de interación que permitan recabar la mayor cantidad de información posible para conocer la posición y el estado en el que se encuentra dicha víctima. A partir de este objetivo principal se definen una serie de subobjetivos funcionales específicos que serán detallados a continuación. 3.2 Objetivos específicos En este apartado se mostrarán los distintos objetivos específicos que han sido marcados para el desarrollo de L O RAM. 3.2.1 Detección del accidente Este objetivo nos indica que el sistema debe ser capaz de detectar un accidente de motocicleta con un grado de exactitud razonable. Para cumplirlo, el sistema solo podrá hacer uso de las tecnologías existentes en el smartphone de la víctima, por lo que utilizará sensores como el acelerómetro, medición de niveles de sonido u otros mecanismos que le permitan detectar una posible colisión o caída. La detección del accidente presenta el problema de los falsos positivos, por lo que habrá que lidiar con ellos para obtener buenos resultados en el cumplimiento de este objetivo. 24 3. O BJETIVOS 3.2.2 Notificación de incidentes Los incidentes detectados por el sistema, deberán ser notificados a una entidad externa al smartphone de la víctima para su almacenamiento, y posterior tratamiento por el personal de emergencia, con el fin de comprobarlos y ofrecer asistencia, en caso de que sea necesaria. La notificación de estos incidentes se llevará a cabo mediante el uso de una arquitectura de eventos, en la que el smartphone de la víctima es visto como el publicador de esta comunicación y la entidad externa que gestiona las incidencias como el subscriptor. 3.2.3 Asistencia Remota El sistema deberá estar dotado de un módulo RC que permita la manipulación remota de una serie de actuadores localizados en el smartphone de la víctima (altavoz, vibrador, luz, ...) con el fin de poder comprobar el estado en el que se encuentra y facilitar su localización in situ. Este mecanismo se hace necesario, ya que en algunas ocasiones la víctima de un accidente de motocicleta queda desplazada del lugar del accidente, y esto dificulta su localización. Por otro lado, deberá existir un módulo de rescate, que contará con un panel de control, para manipular de forma remota los actuadores soportados por smartphone de la víctima. Este panel permitirá al personal de emergencias activar y desactivar estos actuadores, así como modificar ciertos parámetros de estos, como el volumen de sonido o frecuencia de vibración, por poner algún ejemplo. 3.2.4 Localización de la víctima Este objetivo, nos indica que deberemos contar con los mecanismos apropiados, para poder determinar la localización precisa de la víctima. Para la realización de este cometido, se deberá hacer uso exclusivo de los mecanismos presentes en un smartphone corriente. Ya que será necesaria una localización bastante precisa y orientada a exteriores, lo más factible será usar una localización basada en satélite, como GPS. Además, el hecho de que en la mayoría de los casos, sea necesario realizar la localización en puntos interurbanos, refuerza esta decisión, ya que otras tecnologías, como GSM, están más orientadas a núcleos urbanos. 3.2.5 Gestión de datos de incidentes Deberemos contar con los medios adecuados para recoger y almacenar las incidencias que se produzcan, de forma que posteriormente sea posible una explotación y consulta de estos datos de forma sencilla. Este objetivo, pone de manifiesto la importancia de almacenar la mayor cantidad de datos posibles con relación a un incidente, como la fecha y hora exacta o las posibles causas del mismo, haciendo uso de las estructuras apropiadas, para que su consulta sea rápida y eficiente. Así, el uso de una BD será bastante apropiado para el cumplimiento de este objetivo. 25 3. O BJETIVOS 3.2.6 Basado en smartphone Debido a la gran movilidad que se precisa para el correcto funcionamiento del sistema, y con el fin de reducir costes en la realización del mismo, se marca como objetivo la implementación de la aplicación del usuario y la del personal de los servicios de emergencia sobre plataformas móviles, como tablet o smartphone. Actualmente, los smartphone presentan una gran variedad de tecnologías, como sensores, sistemas de localización, conexiones inalámbricas, etc, lo que los hace atractivos para la realización de este sistema. Además, el acceso a este tipo de dispositivos es asequible, por lo que están ampliamente extendidos entre la población. 3.2.7 Estándares libres El desarrollo del sistema se realizará haciendo uso de estándares y software libre. Con este objetivo, se pretende facilitar la adaptación a otras plataformas, u otros sistemas que pudieran trabajar en colaboración con este. Además de este modo se facilitan las posibles expansiones futuras, así como adaptaciones a nuevas versiones del SO Android. 26 Capítulo 4 Método de trabajo E n este capítulo se explicará al lector la metodología de desarrollo empleada para la realización de este proyecto. Se mostrarán también las herramientas, tanto hardware como software, utilizadas en la realización del mismo. 4.1 Metodología de trabajo La realización de este proyecto suponía hacer frente a una serie de dificultades durante su desarrollo, ya que los requisitos del sistema no estaban del todo claros al inicio, podían ser cambiantes y a pesar de tener una idea clara de lo que se pretendía hacer, se suponía imposible prever todos los requisitos inicialmente. Todo ello dificultaba realizar un cálculo a priori del alcance del proyecto, por lo que se optó por hacer uso de una metodología ágil. La metodología de desarrollo finalmente escogida para la realización de L O RAM ha sido XP (eXtreme Programming), ya que hace especial énfasis en la adaptabilidad a los cambios durante la fase de análisis y desarrollo. 4.1.1 Extreme Programming [Bec02] es una metodología ágil de desarrollo de software creada por Kent Beck. Esta metodología tiene como objetivo entregar al cliente el software que necesita en el momento que lo necesita, respondiendo a los requerimientos cambiantes de los clientes incluso en las fases finales del ciclo de vida del desarrollo. Otro objetivo que presenta XP es potenciar el trabajo en equipo, de modo que tanto los clientes como los jefes de proyecto y desarrolladores, estén involucrados en el desarrollo. XP La metodología XP define cuatro variables para los proyectos de software: costo, tiempo, calidad y ámbito. De estas cuatro variables solo tres de ellas podrán ser establecidas por actores externos al grupo de desarrollo, mientras que la cuarta deberá ser establecida por el equipo de desarrollo, en función del valor de las anteriores. se basa en una serie de valores que deben ser maximizados en todo proyecto para alcanzar el éxito [Welb]. XP 27 4. M ÉTODO DE TRABAJO 28 Simplicidad: Se debe realizar de la forma más sencilla posible únicamente lo que se nos pide. Se irán dando pequeños pasos hacia los objetivos marcados, corrigiendo los fallos que vayan apareciendo sobre la marcha. Comunicación: La comunicación entre todas las partes es importante durante todo el proceso para evitar errores en el desarrollo. Retroalimentación: Se realizan iteraciones cortas en las que se presenta un software funcional al cliente. De este modo se minimizan los problemas derivados de errores en la comprensión de los requisitos. Honestidad: Ser honestos sobre las estimaciones y afrontar los problemas que se presenten sin miedo a desechar trabajo realizado. Con el fin de maximizar estos valores, XP establece una serie de reglas y prácticas que deben ser realizadas. Estas reglas pueden ser agrupadas en cinco tipos [Wela]: Planificación, gestión, diseño, codificación y pruebas. En la figura 4.1 podemos ver un modelo visual de los procesos que intervienen en XP. Figura 4.1: Modelo de proceso de XP A continuación se muestran en detalle las reglas y prácticas indicadas por XP según la división anteriormente citada. Planificación. Se comienza recopilando «historias de usuario» para describir la funcionalidad del software. A continuación el usuario asigna una prioridad a cada «historia de usuario» y el equipo de desarrollo evalúa el tiempo que será necesario para la realización de cada una. El proyecto se divide en iteraciones y se planifica el comienzo de cada una de las iteraciones. Gestión. Se asigna al equipo un espacio de trabajo y se establece un ritmo sostenido. Se realiza una reunión entre los miembros al inicio de cada día para medir la velocidad en la que avanza el proyecto, y poder compartir problemas y soluciones que vallan surgiendo. Diseño. Se hace especial hincapié en la simplicidad y en la utilización de metáforas con el fin de facilitar la comprensión rápida del código, por ello se utilizan nombres claros 4. M ÉTODO DE TRABAJO y descriptivos que no requieran de documentación extra. Para reducir riesgos se crean soluciones «spike» y se utiliza la recodificación (refactoring) siempre que sea posible. Codificación. La disponibilidad del cliente es requerida durante todo el proyecto, por lo que se necesita que pase a formar parte del grupo. Se hace uso de estándares y se realiza una programación dirigida por las pruebas (ver sección 4.1.2). También se establece una programación por pares, es decir, dos personas trabajan juntas en el mismo ordenador con el fin de evitar errores. Además, estos grupos tendrán libertad para cambiar el código que sea necesario, ya que se establece una propiedad colectiva del código. Las integraciones se realizan a menudo, aunque solo una pareja puede realizar integraciones a la vez. Pruebas. Las pruebas son uno de los conceptos más importantes en XP. Para cada módulo deben existir sus correspondientes pruebas unitarias, que deberán ser pasadas en su totalidad antes de la publicación de dicho módulo. Para la corrección de errores se deberán escribir pruebas que permitan verificar que el error ha sido resuelto. Finalmente se deberán realizar pruebas de aceptación en base a las historias de usuario, y serán los usuarios los encargados de verificar que los resultados de dichas pruebas son los esperados. 4.1.2 Test Driven Development La metodología XP incluye como técnica de diseño e implementación TDD (Test Driven Development) [BBG+ 10]. Uno de los objetivos principales que se persigue al diseñar software con esta técnica, es la de implementar solo las funciones exactas que el cliente precisa y ninguna más, de este modo se evita desarrollar funcionalidades que nunca serán usadas. Otro objetivo que se presenta, es la minimización del número de defectos que llegan en la fase de producción al software. Además se propone una producción de software modular que este preparada para el cambio y sea altamente reutilizable. La utilización correcta de TDD como técnica de diseño conlleva la aplicación del algoritmo TDD, que consiste en la realización de los tres siguientes pasos: Escribir el test o especificación del requisito. Implementar el código adecuado según ese test. Refactorizar para hacer mejoras y eliminar duplicidad. El primero de este pasos consiste en expresar en forma de código el requisito. De este modo podemos entender inicialmente un test como un ejemplo o especificación. Para escribir el test debemos pensar primero en un comportamiento del SUT (Subject Under Test) bien definido y en como comprobaríamos que, efectivamente, hace lo que le pedimos. Una vez tenemos el ejemplo escrito, debemos escribir únicamente el código necesario para que el test sea pasado con éxito. Durante esta tarea nos surgirán dudas sobre distintos 29 4. M ÉTODO DE TRABAJO comportamiento del SUT ante distintas entradas, pero debemos contener el impulso inicial de codificarlas sobre la marcha, y limitarnos a anotar esas dudas para futuras especificaciones. La refactorización consiste en modificar el diseño de modo que el comportamiento permanezca intacto. Para ello, revisamos el código, incluido el de los test, en busca de líneas duplicadas y prestando atención en que se cumplan los principios de diseño establecidos. Con todo esto aplicamos la refactorización oportuna. 4.2 Herramientas En este apartado se mostrarán las distintas herramientas, tanto hardware como software, que han intervenido en la elaboración de L O RAM. 4.2.1 Lenguajes Para la elaboración de este proyecto ha sido necesaria la utilización de varios lenguajes de programación. A continuación se muestra la lista completa de todos ellos: Java Lenguaje de programación orientado a objetos, desarrollado por Sun Microsystems (actualmente propiedad de Oracle Corporation1 ). Este lenguaje se utiliza para el desarrollo de los módulos de la aplicación que se ejecutan bajo Android debido a la alta integración que existe entre este SO y Java. Python Lenguaje de programación interpretado, desarrollado por Guido van Rossum [Foua]. Este lenguaje se usa para el código del módulo de gestión y para la implementación de los test de sistema. Slice Lenguaje similar a C creado por ZeroC para definir las interfaces de los objetos y poder separar estas de la implementación de dichos objetos. 4.2.2 Hardware Para el desarrollo de L O RAM se ha empleado un equipo de sobremesa, usado principalmente para la realización del código de la aplicación y los test. Este equipo cuenta con las siguientes características: R Intel CoreTM 2 Quad CPU Q6600(2.40GHz x 4). 6GB RAM. 1TB Disco Duro. 1 http://www.oracle.com 30 4. M ÉTODO DE TRABAJO También ha sido necesaria la utilización de un smartphone para realizar algunas pruebas sobre la plataforma de destino de algún módulo de la aplicación. Las características del smartphone usado son las siguientes: HTC Desire. Qualcomm Snapdragon QSD8250 1GHz. 576MB RAM. 512MB ROM, microSD 4GB. GPS, acelerómetro, Wi-Fi(802.11b/g), Bluetooth 2.1. Versión de Android 2.2.2 Froyo. 4.2.3 Software En el desarrollo de este proyecto han intervenido diferentes herramientas y bibliotecas software. A continuación se detallarán todas ellas, explicando brevemente para que han sido utilizadas. Sistema operativo: Debian Se ha empleado Debian 7.0 (wheezy) 64-bit con núcleo Linux 3.0.0-1-amd64, instalado en el equipo de sobremesa indicado en la sección 4.2.2, como SO principal para la realización de este proyecto. Android El SO empleado en el smartphone ha sido Android 2.2.2 (Froyo) por ser la ultima versión actualizada por HTC para este dispositivo. Software de desarrollo: GNU Emacs Editor de texto extensible perteneciente al proyecto GNU [Sta]. Este editor se ha usado como IDE para la programación en Python de los test y del módulo de gestión. También ha sido usado para redactar la documentación del proyecto. La versión usada ha sido GNU Emacs 23.4.1. Eclipse multiplataforma empleado para el desarrollo de los módulos de la aplicación que se ejecutan en Android [Foub]. La versión utilizada ha sido 3.7.2 (Indigo), a la que se le han añadido los plugins ADT Plugin y Slice2Java para la integración con Android y I CE respectivamente. IDE ZeroC Ice Middleware de comunicación orientado a objetos creado por ZeroC Inc [Zerb]. Se ha 31 4. M ÉTODO DE TRABAJO utilizado I CE para realizar la comunicación entre los distintos módulos de la aplicación. La versión usada ha sido la 3.4. Android SDK Kit de desarrollo de software para Android [Andb]. Nos ha permitido desarrollar los módulos de la aplicación para Android, así como depurarlos y probarlos en un emulador. Se ha empleado la versión 21 de este Software Development Kit (SDK). JUNIT Framework integrado en Eclipse para la realización de test en Java [jt]. Se ha empleado para realizar los test unitarios de los módulos implementados para Android. La versión empleada ha sido JUNIT 4. Nose Herramienta para facilitar la realización de pruebas en Python [Nos]. La versión usada ha sido la 1.1.2. python-doublex Framework de dobles de prueba para python creado por David Villa [Vil]. Se ha utilizado para la realización de los test unitarios e integración que verifican el comportamiento del sistema. Mockito Framework de dobles de prueba para Java [Kac]. Se ha utilizado, junto con Junit, para la realización de las pruebas unitarias, de los componentes del sistema implementados para Android. La versión empleada ha sido la 1.9. Documentación y gráficos: LATEX Lenguaje de marcado para la composición de documentos de texto [CLM+ 03]. Se ha utilizado para realizar esta memoria. BibTeX Herramienta para dar formato a listas de referencias en documentos escritos en LATEX. Usado para crear las referencias de este documento. Dia Programa para dibujar diagramas estructurados. Se ha utilizado en su versión 0.97.2 para crear los diagramas que aparecen en algunas figuras de este documento. Gimp Programa de manipulación de imágenes de GNU. Usado en su versión 2.8 para crear los gráficos que aparecen en algunas de las figuras de este proyecto. 32 4. M ÉTODO DE TRABAJO Control de versiones: Mercurial Sistema de control de versiones distribuido [O’S]. Este sistema ha sido usado junto a un repositorio que se encuentra en el servidor de alojamiento Bitbucket2 . 2 https://bitbucket.org/ 33 Capítulo 5 Arquitectura y Desarrollo E ste capítulo mostrará la arquitectura que presenta el sistema L O RAM. Primero se comenzará explicando a grandes rasgos la estructura del sistema, para posteriormente profundizar en cada una de los módulos que lo forman, aplicando un enfoque descriptivo basado en una aproximación top-down. Después de mostrar como está dividido el sistema y de detallar cada una de sus partes, se definirán los requisitos funcionales, así como las distintas iteraciones que se han llevado a cabo para obtener cada uno de los prototipos. 5.1 Visión general La visión general del sistema atiende primeramente a su distribución, ya que se trata de un sistema distribuido, que se encuentra dividido en tres componentes, cada uno de ellos pensado para su ejecución sobre un tipo de plataforma específico. Los tres componentes distribuidos en los que se divide el sistema son los siguientes: Aplicación de usuario. Aplicación del sistema de gestión Aplicación del servicio de emergencias La visión general de la estructuración de L O RAM la podemos ver en la figura 5.1. Como se observa en la figura cada una de estas partes esta dividida a su vez en varios módulos. Por un lado la Aplicación de usuario es la parte del sistema creada para interactuar con el usuario. Esta parte está pensada para trabajar sobre una plataforma tipo smartphone, por ello se diseñó para explotar los recursos que facilita dicha plataforma. En esta parte encontramos dos módulos del sistema, uno de ellos destinado a la detección de los posibles accidentes (ver sección 5.1.1) y otro módulo RC (ver sección 5.1.2) que permite la interacción con el dispositivo para conocer el estado de algún sensor o permitir la activación de un actuador. Estos módulos al igual que el resto de módulos de la aplicación se mostrarán en detalle mas adelante. Por otro lado, tenemos la parte de la aplicación destinada a ser usada por los servicios de emergencia. La plataforma para la cual está pensada la ejecución de esta parte es de tipo 34 5. A RQUITECTURA Y D ESARROLLO Figura 5.1: Estructura esquematizada de L O RAM tablet o smartphone. Esta parte presenta también dos módulos, uno para conocer la existencia de incidentes producidos (ver sección 5.1.5) y otro para poder interactuar con el dispositivo de la víctima y de este modo hacer más sencilla su localización (ver sección 5.1.6). En el centro de la comunicación entre estas dos partes se encuentra el sistema de gestión. Esta parte del sistema está pensada para su ejecución en un PC, preferiblemente de tipo servidor, con capacidad para explotar bases de datos. Esta parte consta de dos módulos, uno encargado de recibir los posibles incidentes y almacenarlos debidamente (ver sección 5.1.3) y otro que permite la interacción con un usuario que ha informado de incidente (ver sección 5.1.4). Además, el primero de estos módulos aceptará peticiones de los servidores de emergencias para comprobar los incidentes provocados. Para facilitar la comprensión del proceso de comunicación entre módulos puede verse el diagrama de secuencia de la figura 5.2. En este diagrama se representa una detección de accidente, y se solicita al smartphone de la víctima la activación del altavoz, y posteriormente su desactivación. Se considera que la valoración de petición que realiza el módulo de control de acceso remoto se evalúa como positiva. A continuación pasamos a mostrar más detalladamente cada uno de estos módulos, profundizando en la funcionalidad que aportan al sistema. 5.1.1 Módulo de Detección Para comenzar hablaremos del módulo de detección de accidentes. Como se observa en la figura 5.1 este módulo pertenece a la Aplicación de usuario, es decir, se ejecutará en el smartphone del usuario al que pretendemos dar asistencia, y que por consiguiente estará en ejecución durante el transcurso del viaje. 35 5. A RQUITECTURA Y D ESARROLLO Figura 5.2: Diagrama de secuencia que representa la comunicación entre módulos La funcionalidad principal de este módulo es la de detectar posibles incidentes que se produzcan durante la conducción, como colisiones o caídas, e informar debidamente de ellas para que puedan ser comprobadas. El módulo, al estar ubicado en el smartphone, hace uso de los sensores de que dispone este para realizar su cometido. Inicialmente el usuario arranca la aplicación con este módulo desconectado, y será cuando el usuario advierta de que se encuentra en ruta cuando entre en funcionamiento. Al activarse el módulo se registra un «listener» para el acelerómetro del teléfono, de modo que cada vez que se produzca un cambio en algún valor de los tres ejes de coordenadas (x, y, z) este sea recogido y analizado. 5.1.2 Módulo de RC El siguiente módulo que analizaremos será el módulo de RC. Este módulo a igual que el anterior se ejecuta en el smartphone del usuario al que proporcionamos asistencia durante el viaje. El objetivo principal que se persigue con este módulo es el de poder controlar remotamente ciertos aspectos del teléfono del usuario, como activar el altavoz para que reproduzca un sonido, encender la luz de la cámara trasera o el vibrador. Además este módulo nos permite conocer el estado de ciertos sensores, como el nivel de batería para que sea tenido en cuenta por el sistema, así como la ubicación en que se encuentra según el sistema de posicionamiento GPS. 36 5. A RQUITECTURA Y D ESARROLLO Cuando el sistema de detección capta un posible incidente y avisa de él, a su vez pone en funcionamiento este módulo con el fin de que sea posible la interacción y localización de la víctima. 5.1.3 Módulo de Gestión de incidentes El módulo de gestión de incidentes lo podemos encontrar en la parte del sistema que hemos nombrado anteriormente como Aplicación del sistema de gestión. Como ya se anticipó, este módulo está pensado para su ejecución en una plataforma tipo PC, que deberá ser capaz de recibir y procesar varias peticiones de forma simultánea. Con la ejecución de este módulo se consigue gestionar y almacenar de forma eficiente todos los incidentes de que informan los distintos usuarios, recogiendo datos relevantes de cada uno de ellos. También recibe las peticiones de los servicios de emergencias en la que solicitan conocer los incidentes que tiene registrados, y permite la asignación de un determinado incidente a un componente del servicio de emergencias. La gestión de incidentes se encuentra en constante funcionamiento, preparada para recibir en cualquier momento un incidente. Cuando esto se produce, el incidente es recogido y almacenado en una BD gestionada por un SGBD (Sistema Gestor de Bases de Datos) MySQL. 5.1.4 Módulo de control de acceso remoto Al igual que el módulo anterior, se encuentra en el sistema de gestión. Su objetivo consiste en comprobar el estado en el que se encuentra el dispositivo que ha informado de un incidente y atendiendo a esto, filtrar las peticiones de acceso remoto que soliciten los servicios de emergencia para este dispositivo, es decir, actúa como intermediario de la comunicación entre el dispositivo del usuario y los servicios de emergencia. Para que se entienda más claramente, pensemos en una situación en la que el smartphone que ha indicado un incidente se encuentra al 25 % de su nivel de batería, y los servicios de emergencia solicitan la activación del vibrador y la posición GPS, este módulo podría decidir que solo se realizará la solicitud de posición, con el fin de preservar la batería del dispositivo. El módulo de control de acceso remoto actúa como un servicio, que permanece a la espera de alguna solicitud. Cuando un programa de servidor de emergencias solicita la interacción con algún componente del smartphone del usuario, este módulo comprueba en su BD si dicho usuario ha indicado algún incidente recientemente, y comprueba que exista una asociación entre este usuario y el servicio de emergencias solicitante. En tal caso, realiza una consulta al dispositivo interrogándolo para conocer que mecanismos tiene disponibles, y su estado de batería. Una vez que tiene esta información, aplica un filtro a las solicitudes del servicio de emergencia con el fin de preservar el estado de la batería del teléfono. 37 5. A RQUITECTURA Y D ESARROLLO 5.1.5 Módulo de Consulta Este módulo pertenece a la parte del sistema dedicada al uso de los servicios de emergencias. Tiene como finalidad permitir a los servicios de emergencia consultar los incidentes que son notificados al módulo de gestión de incidentes. Cuando un usuario de los servicios de emergencia ejecuta la aplicación, este módulo realiza una petición al servidor de gestión para obtener la lista de incidentes producidos. Dicha lista será cargada en pantalla, y el usuario de los servicios de emergencia podrá indicar mediante pulsación en la lista que incidente desea atender. 5.1.6 Módulo de Rescate Al igual que el módulo de consulta, este módulo se encuentra en la Aplicación del servicio de emergencias. Ya que su uso es necesario en el lugar del accidente, está pensado para una plataforma tipo smartphone o tablet, dada la gran movilidad que se requiere. El objetivo de este módulo es el de facilitar el rescate de la víctima, aportando la mayor cantidad posible de información sobre su estado y localización. Además, si es posible, nos permitirá la comunicación con dicha víctima, de modo que nos pueda aportar algún dato extra referente a su estado o localización. Después de que el usuario de los servicios de emergencia seleccione el incidente que desea atender, se le cargará este módulo. El módulo consta de un panel con una serie de controles que permiten la activación de diferentes actuadores en el teléfono (luz, vibrador, altavoz, ...). Cada uno de estos actuadores cuenta con unos elementos reguladores que permiten modificar su comportamiento, como por ejemplo modificar el volumen del altavoz. Este panel también cuenta con unos elementos de visualización que nos permiten conocer alguna información relevante, como los datos personales de la víctima, los números a avisar en caso de accidente o información resultado de la activación de un control, como por ejemplo la localización GPS. 5.2 Requisitos En esta sección se listarán los requisitos tanto funcionales como no funcionales recogidos para el desarrollo del sistema objeto del presente proyecto. Para cada uno de estos requisitos se indicará su descripción y una prioridad que distinguirá entre requisito obligatorio o requisito deseable según corresponda. Además se justificará de forma breve porqué se considera de una prioridad u otra. 5.2.1 Requisitos funcionales En este apartado se van a definir los requisitos funcionales, numerando cada uno de ellos para que sea más fácil una gestión de los mismos. 38 5. A RQUITECTURA Y D ESARROLLO Requisito funcional 1. El usuario deberá registrarse para hacer uso del sistema, indicando sus datos personales, así como su número de teléfono y el número que deberá ser avisado en caso de emergencia. Este requisito se establece como obligatorio, ya que sin la realización de este registro el usuario no podrá acceder al sistema. Además, los datos del registro serán muy útiles en el caso de una emergencia. Requisito funcional 2. Los servicios de emergencias deberán, también, registrarse en el sistema. Este requisito es obligatorio, ya que sin él, los servicios de emergencia no podrán acceder a su parte correspondiente del sistema, y no se podrá tener un control sobre los servicios de emergencias con los que cuenta el sistema para realizar los rescates. Requisito funcional 3. Los usuarios registrados en el sistema podrán «loguearse»1 mediante el uso de un correo electrónico y una contraseña. Se trata de requisito obligatorio, ya que controla el acceso al sistema. Requisito funcional 4. El personal de los servicios de emergencias registrados en el sistema podrán «loguearse» mediante el uso de un identificador único y una contraseña. Este requisito, también se considera como obligatorio, ya que controla los accesos a la parte del sistema destinada a los servicios de emergencia, evitando el uso inapropiado del sistema. Requisito funcional 5. Tanto los usuarios como el personal de los servicios de emergencia podrán abandonar el sistema, mediante un cierre de sesión. Se considera un requisito obligatorio, ya que se debe poder abandonar la sesión siempre que se quiera para evitar que una persona haga uso de la sesión de otra sin su consentimiento. Requisito funcional 6. El sistema permitirá al usuario poder ver los datos que introdujo en su registro. La prioridad de este requisito funcional es deseable, ya que no interfiere en el funcionamiento normal del sistema. Requisito funcional 7. Se permitirá, al usuario, modificar los datos introducidos en su registro al sistema. Este requisito se considera deseable, ya que si bien no juega un papel fundamental en el funcionamiento básico del sistema, si que resulta útil contemplar la posibilidad de que el usuario tenga que modificar algún dato, bien sea por que cometió un error en el registro, o por que dicho dato necesita ser actualizado. Requisito funcional 8. El sistema debe ser capaz de detectar un accidente con un margen de error aceptable. Consideramos que se trata de un requisito obligatorio, ya que este requisito define una de las características más importantes de todo el sistema. Requisito funcional 9. El usuario debe poder indicar de forma manual si ha tenido un incidente y requiere asistencia. Este requisito se considera de prioridad obligatoria, ya que de este modo podremos solventar un problema no detectado por el sistema por cualquier tipo de fallo hardware o software que se pudiera producir. 1 Termino usado para referirnos al proceso de acceso a un sistema mediante identificación. 39 5. A RQUITECTURA Y D ESARROLLO Requisito funcional 10. El usuario debe poder contar con un periodo de tiempo para cancelar un incidente detectado por el sistema, antes de que este sea notificado. La prioridad de este requisito es obligatoria, ya que de este modo podemos subsanar posibles errores debidos a falsos positivos que pudieran surgir en la detección de un accidente por parte del sistema detección. Requisito funcional 11. El personal de los servicios de emergencia debe poder listar los incidentes que han sido notificados al sistema. Este requisito es obligatorio ya que los servicios de emergencia son los encargados finales de atender los incidentes, y para ello se requiere que estén informados debidamente de los mismos. Requisito funcional 12. El personal de los servicios de emergencias debe poder modificar el estado de un incidente, para saber si se encuentra sin asignar, asignado o si ya esta resuelto. Este requisito es de prioridad obligatoria, ya que de este modo se facilita la distribución del personal de los servicios de emergencias, de modo que no queden incidentes sin resolver, mientras que en otros sobra asistencia. Requisito funcional 13. El personal de los servicios de emergencias debe poder visualizar los datos de la víctima. Consideramos que se trata de un requisito obligatorio ya que para realizar una buena asistencia será preciso conocer ciertos datos de la víctima, como por ejemplo el número que dicha víctima desea que sea avisado en caso de emergencia. Requisito funcional 14. El personal de los servicios de emergencia debe poder conocer en todo momento la localización exacta de la víctima. Nos encontramos ante un requisito fundamental del sistema, ya que sin él no se podrá realizar un rescate eficiente. Es por eso que este requisito es de carácter obligatorio. Requisito funcional 15. El sistema debe permitir la activación y desactivación de ciertos actuadores en el smartphone de la víctima para facilitar la localización in situ. Se considera un requisito obligatorio, ya que define uno de los objetivos principales marcados por este proyecto (ver capítulo 3) que es el de poder controlar remotamente ciertos aspectos del dispositivo. Requisito funcional 16. El sistema debe permitir modificar de forma remota la forma en que trabajan los actuadores. Este requisito se considera deseable, ya que si bien sería apropiado contar con un mecanismo que nos permita adaptar los actuadores a una situación determinada, no podemos considerar que se trate de un factor determinante en el funcionamiento del sistema en su conjunto. Requisito funcional 17. El sistema debe contar con un mecanismo de filtrado de las peticiones realizadas a un dispositivo por los servicios de emergencias. La prioridad de este requisito se considera deseable, ya que este filtrado no interviene en el funcionamiento básico del sistema, pero sin embargo es muy recomendable poder contar con 40 5. A RQUITECTURA Y D ESARROLLO un mecanismo que proteja el dispositivo del usuario de un abuso de peticiones por parte del personal de los servicios de emergencias que pudiera consumir la batería del dispositivo, dejándolo inservible para el sistema. 5.2.2 Requisitos no funcionales A parte de los requisitos funcionales mencionados en la sección 5.2.1, el sistema cuenta con algún requisito no funcional que debemos mencionar. En este apartado mostraremos los requisitos no funcionales que se han tenido en cuenta en el desarrollo del sistema. Requisito no funcional 1. Las aplicaciones de usuario y servicios de emergencia deberán estar orientadas a plataformas móviles como tablet o smartphone. Consideramos este requisito no funcional como obligatorio, ya que es necesario que estas partes del sistema puedan ser transportadas, la primera para detectar el accidente y la segunda para facilitar la comunicación y localización de la víctima en caso de accidente. Requisito no funcional 2. El SO para las aplicaciones de usuario y servicios de emergencia será Android. Este requisito se considera deseable, ya que se podría hacer uso de otro SO, pero se ha escogido Android por lo ampliamente extendido que está entre los smartphone, y por la facilidad de acceso a las APIs de desarrollo y a la documentación. Requisito no funcional 3. Se deberán utilizar estándares y software libre para la realización de todo el sistema. Se considera un requisito deseable, ya que de este modo resultarán más sencillas de realizar las posibles expansiones futuras. 5.3 Casos de uso De acuerdo a los requisitos estudiados en la sección 5.2 de este capítulo, se ha creado el modelo de casos de uso apropiado para el sistema que se pretende desarrollar. La representación de este modelo puede ser vista en la figura 5.3 mediante el correspondiente diagrama de casos de uso. 5.4 Proceso de desarrollo En este apartado se mostrarán las distintas iteraciones que han tenido lugar en el desarrollo de este proyecto. Los test y algunos de los diagramas que se mostrarán, harán referencia a la versión final del software, ya que dichos productos han sufrido cambios debido a diferentes procesos de refactorización a lo largo del desarrollo. En el proceso de desarrollo se persiguió el contar con un prototipo de la aplicación extremo a extremo desde un primer momento, y después, sobre este, añadir progresivamente las funcionalidades que fueran siendo necesarias, hasta alcanzar un grado de satisfacción aceptable con el producto. Los tests utilizados los podemos dividir en dos tipos: 41 5. A RQUITECTURA Y D ESARROLLO Figura 5.3: Diagrama de Casos de Uso Test unitarios Son los test que tienen como objetivo probar el correcto funcionamiento de cada uno de los módulos de la aplicación por separado. El lenguaje utilizado para realizar estos test unitarios ha sido Python o Java, dependiendo de la localización del módulo en el sistema. Para los módulos del bloque de gestión se ha empleado Python por ser el lenguaje empleado en este bloque de la aplicación, mientras que para los módulos referentes a los bloques del agente y de rescate ha sido Java. Test de integración Estos test pretenden probar el correcto funcionamiento del sistema en su conjunto. Para la realización de estos test, el lenguaje empleado ha sido Python por su sencillez y rapidez a la hora de realizar este tipo de test. Además para facilitar la labor de las pruebas de integración se han realizado dobles de prueba, de modo que todos los componentes se encuentren escritos en el mismo lenguaje a la hora de realizar las pruebas. 42 5. A RQUITECTURA Y D ESARROLLO 5.4.1 Detección y notificación de incidentes Análisis y diseño La aplicación que se pretende realizar debe contar con un sistema capaz de detectar un accidente que se produzca durante un trayecto en carretera. Para ello, lo primero que debemos identificar es el momento en que el usuario inicia la ruta, para desde ese momento activar los dispositivos necesarios para la detección. El proceso de detección debe estar formado por uno o varios sensores que informen a un centinela de cualquier irregularidad, para de este modo centralizar dicho proceso. La activación del centinela y sus sensores asociados se realizará en el momento en que el usuario indique el comienzo de una nueva ruta. Finalmente, si el centinela detecta algún tipo de incidente, procederá al envío de dicho incidente, con su información asociada, a un gestor, el cual almacenará de manera apropiada el incidente para su posterior tratamiento y difusión. Además, antes de realizar el envío, se dejará un tiempo en el cual el usuario podrá cancelar el envío del incidente. Implementación La realización de esta funcionalidad conlleva la creación de dos módulos, uno de ellos destinado a la detección de incidentes, y otro destinado a la gestión de incidentes. En el test de integración mostrado en el listado 5.1, puede apreciarse como se realiza el proceso de comunicación entre estos dos módulos. El test consiste en la comunicación de un incidente desde el centinela del módulo de detección al módulo de gestión de incidentes. Para la detección se ha creado la clase Sentry, que una vez que fue llevada a la aplicación del smartphone, se transformó en un servicio Android de ejecución en segundo plano. Este servicio es lanzado cuando el usuario pulsa un botón, presente en una Activity, con el que indica el comienzo de una nueva ruta en carretera (ver figura A.3). Para la realización de los mecanismos de detección de Sentry, inicialmente se implementó el mecanismo más simple, que consistía en la pulsación de un botón de alerta por parte del usuario. Más tarde, con la realización del módulo sobre Android, se reforzó con la creación de la clase MotionSensor, que haciendo uso del acelerómetro del teléfono detecta las fuerzas de aceleración experimentadas, y comprueba que no sobrepasen un límite. Para este cometido, el límite ha sido fijado en 3G, ya que es el empleado en la activación de los airbag, y por ello resulta apropiado. Una vez que un incidente es detectado, Sentry lanza una Activity que muestra una barra de progreso, conectada a un temporizador de cuenta atrás, y un botón que permite cancelar el envío del incidente (ver figura A.5). Si el temporizador llega a cero, el incidente será enviado al gestor. 43 5. A RQUITECTURA Y D ESARROLLO Por otro lado, en el módulo de gestión de incidentes se ha creado la clase Incident con el fin de almacenar toda la información referente al incidente, y la clase IncidentManager, destinada a gestionar los incidentes que se produzcan permitiendo informar de ellos, cambiar su estado y consultarlos de forma apropiada. La notificación del incidente se realizará mediante una llamada a la función notifyIssue de la clase IncidentManager en la que se le suministrará la información referente al incidente, así como la víctima del mismo y un proxy al centinela de la víctima para poder comunicarse con la víctima y realizar ciertas acciones. La figura 5.4 muestra, mediante un diagrama de secuencia, un escenario normal de notificación de un incidente, detectado por el sensor de movimiento. Se entiende que dicho sensor ha recibido un evento del acelerómetro, con una fuerza superior a 3G, antes de realizar la notificación al centinela. Figura 5.4: Diagrama de secuencia de la notificación de un incidente El S LICE que muestra las interfaces precisas para la realización de esta primera iteración se muestra en el listado 5.2. 5.4.2 Solicitud de listado de incidentes Análisis y diseño El personal de rescate encargado de atender los incidentes que sean detectados y notificados al gestor, necesitará un mecanismo de consulta de todos ellos, para poder escoger cuál debe atender en cada momento. La realización de esta acción se producirá bajo demanda de alguien perteneciente al personal de rescate, y por lo general, será la primera acción que realice al entrar al sistema. como resultado, la persona perteneciente al personal de emergencias recibirá un listado de todos los incidentes que han sido previamente registrados y almacenados en el sistema. 44 5. A RQUITECTURA Y D ESARROLLO Implementación Esta funcionalidad implica la utilización del módulo creado anteriormente para la gestión de incidentes, aunque añadiéndole una nueva funcionalidad, y la creación de un nuevo módulo destinado a realizar consultas al gestor. La comunicación entre estos módulos queda plasmada en el test de integración del listado de código 5.3. Este test analiza la realización de una solicitud del listado completo de incidentes registrados, por parte del módulo de consulta. Inicialmente, con motivo de simplificar las primeras etapas del desarrollo, los datos referentes a los distintos incidentes notificados eran almacenados en memoria mediante estructuras de datos, por lo que el proceso de búsqueda y envío de los mismos era relativamente sencillo, y se realizaba mediante la función listIncidents de la clase IncidentManager. Posteriormente, se creó una base de datos para almacenarlos (véase 5.4.8), y parte del proceso de búsqueda se relegó a la clase Incident, contando ésta con los recursos necesarios para realizar las consultas relacionadas con incidentes, sobre la BD. Por otro lado, el módulo de consultas, antes de la realización de la aplicación en Android, estaba formado por la clase QuerySystem, que al realizar el cambio a la plataforma móvil, fue transformado en la activity ShowIncidentsActivity (ver figura B.2). Dicha activity se presenta al iniciar la aplicación de los servicios de emergencia, y realiza una petición del listado de incidentes a IncidentManager. Como resultado de esta petición obtiene una IncidentsList que adapta para su representación en un ListView de Android. El diagrama de secuencia correspondiente al proceso de solicitud del listado de incidentes por el personal de rescate, puede verse en la figura 5.5. En dicha figura no aparece el proceso de búsqueda y extracción de los incidentes de la BD, ya que se entiende que corresponde a las primeras etapas, en las que se almacenaban en estructuras de datos. A continuación se muestra, como queda el S LICE de definición de las interfaces que intervienen una vez realizada esta iteración. (Ver listado 5.4). 5.4.3 Petición de datos de usuario Análisis y diseño En esta iteración, se puso de manifiesto la necesidad de conocer los datos de un usuario que ha notificado un incidente. De este modo, un usuario perteneciente al rescate, podría consultar dichos datos y realizar una asistencia más eficiente, como por ejemplo realizando una llamada de teléfono para conocer el estado de la víctima. Para ello, será necesaria la creación de un formulario de registro, en el que el usuario introduzca sus datos, y estos queden almacenados. En el caso de que el usuario deba notificar un incidente, estos datos serán enviados. Finalmente, será necesario un mecanismo de consulta de dichos datos, cuando un usuario de rescate lo requiera. 45 5. A RQUITECTURA Y D ESARROLLO Figura 5.5: Diagrama de secuencia de la notificación de un incidente Implementación La realización de esta funcionalidad ha sufrido muchos cambios durante el desarrollo, debido a labores de refactorización. Inicialmente, no llevó a la creación de ningún nuevo módulo, pero posteriormente, esta funcionalidad junto con otras, llevó a la creación de un nuevo módulo dedicado a la gestión de usuarios. El listado de código del S LICE 5.5, muestra los cambios realizados conforme a este punto. Como se observa, aún no se ha tenido en cuenta la creación del gestor de usuarios, y lo que se ha hecho ha sido añadir la función getUserData a la interfaz de gestión de incidentes. Esta función, en iteraciones posteriores, pasará a una interfaz distinta destinada a los procesos de gestión de usuarios. Además, se ha añadido la clase UserData, para recoger los datos del usuario, y enviar un objeto de este tipo en el momento de realizar una notificación de incidente. Con respecto a los cambios en el código. Inicialmente se crearon las estructuras de datos necesarias para almacenar los datos de los usuarios en el gestor, pero después de añadir el sistema de base de datos, se creó la clase User que permite el tratamiento de la información de los usuarios en la base de datos. Por otro lado, en el módulo de consulta se añadió una función para la obtención de los datos de una víctima determinada. Esta funcionalidad fue llevada al sistema Android con la creación de la activity IncidentDataActivity (ver figura B.3), que mostraba toda la información de un incidente y de su víctima, una vez seleccionado dicho incidente en la lista inicial creada en la iteración anterior (véase 5.4.2). 46 5. A RQUITECTURA Y D ESARROLLO En la figura 5.6, se muestra el diagrama de secuencia de un caso normal de solicitud de datos de un usuario, por parte de alguien del personal de emergencias. Antes de este proceso, se entiende que algún usuario ha notificado un incidente, y que el usuario de emergencia está visualizando la lista de incidentes, obtenida en 5.4. Figura 5.6: Diagrama de secuencia de petición de datos de un usuario 5.4.4 Petición de localización Análisis y diseño Llegados a este punto, el siguiente paso es dotar al sistema de un mecanismo capaz de localizar a la víctima. Este proceso se puede dividir en dos partes: una primera en la que se obtiene la posición de la víctima, y otra, en la que se representa sobre un mapa mediante geoposicionamiento. El primer proceso, se debe realizar mediante el uso del GPS para obtener la latitud y longitud, correspondiente a la localización de la víctima. Para ello, se deberá aportar un mecanismo de activación del GPS, en el momento de iniciar una nueva ruta, si este no esta activo aún. El segundo proceso, requiere de un mecanismo de consulta de los valores obtenidos por el GPS desde la aplicación del rescatador. Una vez obtenidos estos valores, se precisará la representación de un punto sobre un mapa para facilitar el proceso de búsqueda. Implementación En esta iteración se necesitará la creación de tres nuevos módulos, uno de ellos destinado a aportar los servicios de control remoto, otro destinado a las funciones de rescate (para lo cual realiza peticiones sobre el anterior), y un último módulo que realiza el control de acceso a estos servicios. 47 5. A RQUITECTURA Y D ESARROLLO Los cambios realizados con respecto a la versión del S LICE de la iteración anterior, pueden verse en el listado 5.6. En este listado de código se observa la creación de tres nuevas interfaces: una destinada a la manipulación de las opciones disponibles en el GPS, otra destinada a gestionar los componentes RC y una tercera para aportar el control de acceso al tratamiento de estos componentes. Además, se ha añadido una clase para definir las peticiones de acceso al GPS y otra para definir la posición obtenida. La comunicación entre el módulo de control de acceso y el módulo RC queda explicada en el test de integración 5.7, que fue realizado para esta iteración, aunque como ya se comentó al principio de esta sección, el test mostrado corresponde a la versión obtenida después de los sucesivos procesos de refactorización. En el test, se observa como el SUT, realiza la llamada a la interfaz RCManager para obtener el acceso al GPS, y una vez lo obtiene le solicita la localización. En el proceso de desarrollo de esta iteración, se crearon las clases que implementan las interfaces del S LICE en sus respectivos módulos. Además, se ha creado la función getRemoteControl en la clase IncidentManager, que permite obtener un objeto RemoteControl apropiado para el manejo de un determinado incidente. En cuanto a la parte de esta iteración que se ejecuta en Android. Por un lado tenemos la clase GPSI, que además de ser la definición de la interfaz GPS, implementa la interfaz de Android LocationListener que permite obtener los cambios en la localización captados por el GPS. Por el lado del rescatador, se creó una activity para la asistencia. Esta activity se dividió en fragments (ver sección 2.3.1), donde uno de ellos se destinó al proceso de mostrar los datos del incidente (realizado anteriormente en la iteración de la sección 5.4.3) y otro al geoposicionamiento de la víctima (ver figura 6.6). El geoposicionamiento se realizó mediante un SupportMapFragment. Este consiste en un tipo especifico de fragment, que permite la manipulación de los mapas de GoogleMaps. De este modo se pudo representar un mapa y dibujar un punto de localización sobre él. En el diagrama de secuencia de la figura 5.7, se muestra el proceso de solicitud de localización de una víctima por parte de los servicios de emergencia. En este diagrama se ha obviado el proceso de obtención del RCManager de la víctima, ya que se reduce a una simple petición al centinela de la víctima. Además se considera que antes de este proceso, la víctima ha enviado un incidente. 5.4.5 Peticiones de activación y desactivación de actuadores Análisis y diseño En esta iteración se realizarán los mecanismos necesarios para poder interactuar con la víctima de un incidente. 48 5. A RQUITECTURA Y D ESARROLLO Figura 5.7: Diagrama de secuencia de la solicitud de localización Para realizar este proceso, primero deberemos comprobar que los actuadores a los que se desea dar servicio están disponibles en el dispositivo. Además, se deben crear las funciones necesarias para indicar al hardware la activación y desactivación de dichos actuadores. En la parte del rescatador, se deberá facilitar un panel, que permita la activación y desactivación de los actuadores, una vez seleccionado un incidente. Además, se deberá poder conocer el estado en el que se encuentran los actuadores en todo momento. Implementación Esta iteración hará uso de los módulos creados en el paso anterior añadiéndoles nuevas funcionalidades. El listado de código 5.8 muestra los cambios producidos en el S LICE con respecto a la iteración anterior. Se han añadido interfaces para los distintos actuadores con las acciones de activar o desactivar. También se han añadido dos tipos nuevos de «request», uno para cada una de las acciones citadas. Para la implementación de esta iteración, se han añadido las funciones activate y deactivate a la clase RemoteControl creada en la iteración anterior. Además se han añadido las funciones necesarias al RCManager para la obtención de los objetos que regulan el funcionamiento de los actuadores. En Android se han creado las clases SpeakerI, LampI y VibratorI, cada una encargada de facilitar la interacción con el actuador correspondiente del dispositivo físico. Estas clases además suponen la implementación de las interfaces del S LICE, de manera que aportan la comunicación con los actuadores. 49 5. A RQUITECTURA Y D ESARROLLO Por la parte de la aplicación del equipo de rescate, se ha añadido un nuevo fragment a la activity AssistanceActivity. Este nuevo fragment presenta un panel de control, donde se permite la activación y desactivación de los actuadores de la víctima, y se muestra el estado en que se encuentran cada momento (ver figura B.5). El proceso de activación de un actuador puede verse en el diagrama de secuencia de la figura 5.8. En este diagrama se muestra la activación del altavoz de la víctima desde la aplicación de rescate. El proceso para activación del resto de actuadores sería análogo al mostrado en la figura, y el proceso de desactivación de cualquiera de los actuadores sería muy similar cambiando el tipo de «request». Figura 5.8: Diagrama de secuencia de la activación del altavoz 5.4.6 Peticiones de regulación de actuadores Análisis y diseño Para poder adecuar el comportamiento de los actuadores a cada situación, se planteó crear un sistema de regulación de ciertos aspectos de su comportamiento, como por ejemplo el volumen del altavoz o el grado de luminosidad de la linterna. Para realizar esta funcionalidad, se requiere comprobar las posibilidades de modificación que presentan los componentes físicos, y aportar las funciones necesarias para realizar la modificación de estos comportamientos. El siguiente paso será servir estas funciones de forma remota para que puedan ser usadas por los servicios de emergencias. Y finalmente se deberá crear un panel con los controles necesarios para modificar el valor de las variables que regulan el comportamiento de estos componentes. Implementación La realización de esta iteración no ha supuesto la creación de nuevos módulos, y la variación en cuanto al S LICE de la versión anterior ha sido mínima. Los cambios en el S LICE han 50 5. A RQUITECTURA Y D ESARROLLO consistido en añadir las funciones de configuración a las interfaces de comunicación de cada actuador, y la creación de tres nuevas clases para adaptar las peticiones de activación de cada actuador. Estas nuevas clases heredan de la clase ActivationRequest definida en la iteración anterior. Los cambios realizados en el S LICE pueden verse en el listado 5.9. En cuanto a la implementación del código en el agente, los cambios producidos han sido la incorporación de la función configure a cada uno de los componentes actuadores. Esta función recibe los valores nuevos que deben ser establecidos en la configuración del actuador, y realiza los cambios oportunos. En la parte del gestor, se ha modificado el comportamiento de la función activate de la clase RemoteControlI, para que realice la configuración apropiada del actuador antes de su activación. Por último, en la aplicación de rescate se han añadido componentes reguladores al panel de control, para fijar los valores de configuración que se desean establecer para cada componente actuador. El proceso de configuración se realiza en el momento de la activación del actuador. 5.4.7 Filtrado de peticiones a actuadores Análisis y diseño Con el fin de preservar la batería del smartphone de la víctima, se creará un filtro de peticiones, de forma que se reserve la batería para las tareas más importantes del rescate. El primer paso será crear un mecanismo que permita la lectura del nivel de la batería en el dispositivo del usuario. Después, se crearán los medios necesarios para permitir la lectura de la batería desde el gestor. Finalmente, se creará en el gestor un componente que acceda a esta lectura y realice el filtrado de peticiones según algún criterio. Implementación El desarrollo de esta iteración no ha supuesto la creación de nuevos módulos a la aplicación, sin embargo se ha añadido nueva funcionalidad al módulo RC y al de control de acceso creados en pasos previos del desarrollo. El listado 5.10 muestra los cambios que han sido necesarios en el S LICE. Se observa la creación de la nueva interfaz Battery y el mecanismo de obtención de esta a través de RCManager. El proceso de implementación comenzó con la creación de test unitarios que permitieran definir el comportamiento de filtrado. En el listado de código 5.11 se muestra un test unitario que define el comportamiento que se realiza ante una petición de activación del vibrador con un nivel de batería bajo. Ante esta situación se espera una respuesta negativa por parte del controlador de acceso. 51 5. A RQUITECTURA Y D ESARROLLO Los test realizados exigieron la creación de la clase BatteryI para acceder a la batería física del smartphone y realizar las lecturas de nivel. Además, en el manager se creó la clase AccessControl para realizar las peticiones remotas a la clase BatteryI, y según el valor obtenido permitir o denegar la activación de un actuador. El diagrama de secuencia de la figura 5.9, muestra un intento de activación del vibrador, denegado por el control de acceso, con motivo de un nivel de batería bajo en el dispositivo de la víctima. Figura 5.9: Diagrama de secuencia de intento de activación del vibrador con batería baja 5.4.8 Almacenamiento de información en BD Análisis y diseño En este punto del desarrollo se hizo necesario contar con mecanismos de persistencia que permitieran almacenar los datos obtenidos por la aplicación en una BD. Después de pensar en la información que era necesario almacenar, se diseñó la base de datos que permitía almacenar dicha información, atendiendo a las relaciones entre los datos. En la figura 5.10 se muestra el diagrama entidad relación que muestra el diseño de la base de datos creada. Una vez realizada la base de datos, se deberá crear los mecanismos de acceso a ella que nos permitan realizar las operaciones de inserción, modificación, eliminación y búsqueda de los datos. 52 5. A RQUITECTURA Y D ESARROLLO Figura 5.10: Esquema de la base de datos Implementación La realización de esta iteración afecta únicamente a la aplicación de gestión (LoRAM_Management), ya que para las aplicaciones de ambos extremos debe ser transparente el modo en que se almacena la información. La implementación se ha realizado creando un broker en python, que haciendo uso de la biblioteca MySQLdb, accede a una base de datos MySQL. Además se han añadido métodos para la persistencia en las clases Incident y User. 5.4.9 Registro y login de usuarios Análisis y diseño La iteración consiste en realizar un control centralizado de usuarios que acceden al sistema, para de esta forma regular los accesos y controlar las personas que están conectadas en cada momento y los permisos de que disponen. Para realizar este acción se deben aportar formularios de login y registro en las aplicaciones de usuarios. También sera necesario que el gestor aporte funciones que permitan la conexión y registro de usuarios de forma remota. Además, será conveniente contar con un mecanismo de sesión que permita mantener los datos de los usuarios conectados. Implementación La realización de esta iteración ha supuesto la creación de un nuevo módulo para realizar la gestión de usuarios. También se han producido modificaciones en el módulo de gestión de incidentes, ya que antes realizaba alguna tarea de gestión de usuarios y ahora quedará relegada al nuevo módulo. En el S LICE se han producido los cambios mostrados en el listado de código 5.12. Como se observa, se ha creado una interfaz para la gestión de usuarios, y ahora la solicitud de los datos de usuario se realiza desde esta interfaz. Además se ha añadido la clase RescuerData que representa los datos del usuario de rescate. 53 5. A RQUITECTURA Y D ESARROLLO Para la creación de esta funcionalidad se han realizado varios test de integración que representan las diferentes situaciones de comunicación entre módulos que se pueden dar. En el test 5.13 se muestra la comprobación de un login aceptado por el gestor. A parte de este test se crearon otros para definir el resto de situaciones posibles en el login y en el registro de usuarios. La implementación ha requerido la creación de las clases UserManagerI y Rescue, en el nuevo módulo creado para la gestión de usuarios, y la clase User, creada con anterioridad, ha sido trasladada también a este módulo. En Android ha sido necesaria la realización de las activities LoginActivity (Ver figura A.1) y RegisterActivity (ver figura A.2) tanto en la aplicación de rescate como en la de usuario, para presentar los formularios de login y registro respectivamente. El proceso de login puede verse en detalle en el diagrama de secuencia de la figura 5.11, donde se muestra la comunicación con el broker de la base de datos. Figura 5.11: Diagrama de secuencia del proceso de login aceptado 54 5. A RQUITECTURA Y D ESARROLLO 1 2 3 4 5 7 8 def test _noti fy_iss ue ( self ) : # Given email = " foo@example . com " user = Stub () user . email = email s e r v a n t I n c i d e n t M a n a g e r = Mimic ( Spy , IncidentManagerI ) incidentManager = self . adapter_add ( IncidentManagerPrx , servantIncidentManager ) 12 with Mimic ( Stub , UserManagerI ) as servant : servant . ge tI nc id en tMa na ge r ( email , ANY_ARG ) . returns ( incidentManager ) manager = self . adapter_add ( UserManagerPrx , servant ) 14 15 time = TimeC (10 , 20 , 30) date = DateC (25 , 5 , 2013) 17 18 19 with Stub () as datesChanger : datesChanger . o b t a i n T i m e T o T i m e s t a m p ( ANY_ARG ) . returns ( time ) datesChanger . o b t a i n D a t e T o T i m e s t a m p ( ANY_ARG ) . returns ( date ) 21 22 23 24 sut = LoRAM_Agent ( manager ) sut . connected = True sut . user = user sut . datesChanger = datesChanger 26 27 28 sut . startRoute () servantSentry = Mimic ( Stub , S e n t ry C o mm u n ic a t or I ) sut . sentry . communicator . proxy = self . adapter_add ( SentryCommunicatorPrx , servantSentry ) 30 31 32 # When timer = sut . alert () timer . expire () 34 35 # Then sentryExpected = sut . sentry . communicator . proxy issueExpected = IssueC ( time , date , IssueType . A le rt Bu tt on Pr es se d ) assert_that ( s e r v a n t I n c i d e n t M a n a g e r . notifyIssue , \ called () . with_args ( email , sentryExpected , issueExpected , ANY_ARG ) ) 10 11 36 37 38 Listado 5.1: Test de integración de la notificación de un incidente 55 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { 3 enum IssueType { DetectedFall , DetectedCollision , Motion , AlertButtonPressed , UnknownIssue }; 5 6 class int int int }; Date { day ; month ; year ; class int int int }; Time { hour ; minute ; second ; 7 8 9 11 12 13 14 15 class Issue { Time timeIss ; Date dateIss ; IssueType typeIss ; }; 17 18 19 20 21 interface S en try Co mm un ic at or { void solveIncident () ; }; 23 24 25 interface IncidentManager { void notifyIssue ( string user , S en tr yC om mu ni ca to r * sentry , Issue iss ) ; }; 27 28 29 31 }; Listado 5.2: S LICE empleado en la primera iteración 56 5. A RQUITECTURA Y D ESARROLLO 1 2 3 4 5 7 8 def t es t _ l is t _ in c i de n t s ( self ) : # Given nif = " 11223344 a " password = " 1234 " rescuer = RescuerDataC ( nif , " name " , " surname1 " , " surname2 " , 123456789 , 10) s e r v a n t I n c i d e n t M a n a g e r = Mimic ( Spy , IncidentManagerI ) incidentManager = self . adapter_add ( IncidentManagerPrx , servantIncidentManager ) 14 with Mimic ( Stub , UserManagerI ) as servant : servant . loginRescuer ( nif , password , ANY_ARG ) . returns ( True ) servant . g e t L o g g e dR e s c u e r D a t a ( nif , ANY_ARG ) . returns ( rescuer ) servant . ge tI nc id en tMa na ge r ( nif , ANY_ARG ) . returns ( incidentManager ) manager = self . adapter_add ( UserManagerPrx , servant ) 16 sut = LoRAM_Rescue ( manager ) 18 # When sut . loginRescuer ( nif , password ) sut . querySystem . showIncidents () 10 11 12 13 19 20 23 24 # Then assert_that ( s e r v a n t I n c i d e n t M a n a g e r . listIncidents , called () . with_args ( rescuer . nif , \ 25 Listado 5.3: Test de integración de la solicitud del listado de incidentes 57 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { 3 enum StateType { NoAllocate , Allocated , Resolved , UnknownState }; 5 6 7 8 9 10 11 12 13 class IncidentData { int idIncident ; string victim ; Date dateIncident ; Time timeIncident ; StateType state ; IssueType typeIncident ; int rescueTeam ; }; 15 sequence < IncidentData > IncidentsList ; 17 18 interface IncidentManager { void notifyIssue ( string user , S en tr yC om mu ni ca to r * sentry , Issue iss ) ; IncidentsList listIncidents ( string rescuer ) ; }; 19 20 22 }; Listado 5.4: Cambios realizados en el S LICE de la primera iteración 1 module LoRAM { class UserData { string email ; string name ; string surname1 ; string surname2 ; int phone ; int numAA ; }; 3 4 5 6 7 8 9 10 interface IncidentManager { void notifyIssue ( UserData user , S en tr yC om mu ni ca to r * sentry , Issue iss ) ; IncidentsList listIncidents ( string rescuer ) ; UserData getUserData ( string email ) ; }; 12 13 14 15 16 18 }; Listado 5.5: Cambios realizados en el S LICE de la segunda iteración 58 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { 3 4 5 exception GenericError { string reason ; }; 7 exception ActuatorOff extends GenericError {}; exception N o t A v a i l a b l e Ac t u a t o r extends GenericError {}; exception NotExistRCModule extends GenericError {}; 8 9 11 enum LocationType { GPSType , NETWORKType }; 13 class Location { double latitude ; double longitude ; }; 14 15 16 class LocationRequest { LocationType locType ; long t ime Be tw ee nU pd at es ; long d i s t a n c e C h a n g e F o r U p d a t e s ; }; 18 19 20 21 22 interface GPS { bool isEnable () ; Location getLocation () throws ActuatorOff ; void configure ( long timeBetweenUpdates , long distanceChangeForUpdates ); }; 24 25 26 27 28 interface RCManager { GPS * getGPS () throws N o t A v a i l a b l e A c t u a t o r ; }; 30 31 32 interface S en try Co mm un ic at or { RCManager * getRCManager () throws NotExistRCModule ; void solveIncident () ; }; 34 35 36 37 interface RemoteControl { Location getLocation ( LocationRequest request ) throws NotAvailableActuator , ActuatorOff ; }; 39 40 41 42 interface IncidentManager { void notifyIssue ( string email , S en tr yC om mu ni ca to r * sentry , Issue iss ) ; IncidentsList listIncidents ( string nif ) ; UserData getUserData ( string email ) ; RemoteControl * getRemoteControl ( string email ) ImposibleConnectWithUser ; 44 45 46 47 48 }; 50 52 }; Listado 5.6: Cambios realizados en el S LICE de la tercera iteración 59 5. A RQUITECTURA Y D ESARROLLO 1 2 3 4 5 6 7 def t e s t _ g e t _ v i c t i m _ l o c a t i o n ( self ) : # Given request = Stub () request . locType = LocationType . GPSType request . ti me Be tw een Up da te s = 15000 request . d i s t a n c e C h a n g e F o r U p d a t e s = 0 location = LocationC (25 , 42.2) 11 with Mimic ( Spy , GPSI ) as servantGPS : servantGPS . getLocation ( ANY_ARG ) . returns ( location ) gps = self . adapter_add ( GPSPrx , servantGPS ) 13 14 15 with Mimic ( Spy , RCManagerI ) as servantRCManager : servantRCManager . getGPS ( ANY_ARG ) . returns ( gps ) rcManager = self . adapter_add ( RCManagerPrx , servantRCManager ) 17 18 19 with Mimic ( Stub , S en tr yC o m mu n i ca t o rI ) as servantSentry : servantSentry . getRCManager ( ANY_ARG ) . returns ( rcManager ) sentry = self . adapter_add ( SentryCommunicatorPrx , servantSentry ) 21 22 with Stub () as accessControl : accessControl . i s S u i t a b l e G e t L o c a t i o n ( ANY_ARG ) . returns ( True ) 24 sut = RemoteControlI ( sentry ) 26 sut . accessC = accessControl 28 29 # When test1 = sut . getLocation ( request ) 31 32 33 34 # Then assert_that ( servantRCManager . getGPS , called () ) assert_that ( servantGPS . getLocation , called () ) assert_that ( test1 , is_ ( location ) ) 9 10 Listado 5.7: Test de integración de la solicitud de localización a la víctima 60 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { 3 enum ActuatorType { TypeSpeaker , TypeLamp , TypeVibrator , TypeLocation }; 5 6 7 8 class Activ ation Reques t { Time timeReq ; Time duration ; ActuatorType typeReq ; }; 9 11 12 13 14 class D e a ct i v at i o nR e q ue s t { Time timeReq ; ActuatorType typeReq ; }; 16 17 18 19 interface Speaker { void turnOn () ; void turnOff () ; }; 21 22 23 24 interface Lamp { void turnOn () ; void turnOff () ; }; 26 interface Vibrator { void turnOn () ; void turnOff () ; }; 27 28 29 interface RCManager { Speaker * getSpeaker () throws N o t A v a i l a b l e A c t u a t o r ; Lamp * getLamp () throws N o t A v a i l a b l e A c t u a t o r ; Vibrator * getVibrator () throws N o t A v a i l a b l e A c t u a t o r ; GPS * getGPS () throws N o t A v a i l a b l e A c t u a t o r ; }; 31 32 33 34 35 36 interface RemoteControl { void activate ( Acti vation Reque st request ) throws NotAvailableActuator , NotSuitable ; void deactivate ( D e a cti v at i o n Re q u es t request ) ; Location getLocation ( LocationRequest request ) throws NotAvailableActuator , ActuatorOff ; }; 38 39 40 41 42 43 45 }; Listado 5.8: Cambios realizados en el S LICE de la cuarta iteración 61 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { 3 enum Level { High , Medium , Low }; 5 6 7 8 class S p e a k e r A c t i v a t i o n R e q u e s t extends Act ivatio nReque st { float volume ; float rate ; }; 10 11 12 class L a m p A c t i v a t i o n R e q u e s t extends Act ivatio nReque st { Level brightness ; }; 14 class V i b r a t o r A c t i v a t i o n R e q u e s t extends Act ivatio nReque st { Level frequency ; }; 15 16 interface Speaker { void turnOn () ; void turnOff () ; void configure ( float volume , float rate ) ; }; 18 19 20 21 22 interface Lamp { void turnOn () ; void turnOff () ; void configure ( Level brightness ) ; }; 24 25 26 27 28 interface Vibrator { void turnOn () ; void turnOff () ; void configure ( Level frequency ) ; }; 30 31 32 33 34 35 }; Listado 5.9: Cambios realizados en el S LICE de la quinta iteración 1 module LoRAM { 3 4 5 interface Battery { float getLevel () ; }; 7 interface RCManager { Speaker * getSpeaker () throws N o t A v a i l a b l e A c t u a t o r ; Lamp * getLamp () throws N o t A v a i l a b l e A c t u a t o r ; Vibrator * getVibrator () throws N o t A v a i l a b l e A c t u a t o r ; GPS * getGPS () throws N o t A v a i l a b l e A c t u a t o r ; Battery * getBattery () ; }; 8 9 10 11 12 13 15 }; Listado 5.10: Cambios realizados en el S LICE de la sexta iteración 62 5. A RQUITECTURA Y D ESARROLLO 1 2 3 def t e s t _ a c t i v a t i o n _ w i t h _ l o w _ b a t t e r y ( self ) : # Given self . levelLow = 15 5 6 with Stub () as self . battery : self . battery . getLevel () . returns ( self . levelLow ) 8 sut = AccessControl ( self . battery ) 13 vibratorOn = True lampOn = False speakerOn = False actuatorsOn = [ speakerOn , lampOn , vibratorOn ] 15 16 # When test = sut . isS ui ta bl eA ct iv at e ( actuatorsOn ) 18 # Then assert_that ( test , is_ ( False ) ) 10 11 12 19 Listado 5.11: Test unitario de intento de activación con batería baja 63 5. A RQUITECTURA Y D ESARROLLO 1 module LoRAM { exception exception exception exception 3 4 5 6 class RescuerData { string nif ; string name ; string surname1 ; string surname2 ; int phone ; int team ; }; 8 9 10 11 12 13 14 15 interface UserManager { bool login ( string email , string password ) throws UserNotFound ; bool loginRescuer ( string nif , string password ) throws UserNotFound ; void logout ( string identification ) ; void register ( UserData user , string password ) throws Use rAlrea dyExis ts ; void registerRescuer ( RescuerData user , string password ) throws Use rAlrea dyExis ts ; UserData getL oggedU serDat a ( string email ) throws UserNotLogged ; RescuerData g e t L o g g e d R e s c u e r D a t a ( string nif ) throws UserNotLogged ; IncidentManager * g et In ci de nt Man ag er ( string identification ) throws AccessDenied ; }; 17 18 19 20 21 22 23 24 25 26 30 UserNotFound extends GenericError {}; UserNotLogged extends GenericError {}; AccessDenied extends GenericError {}; UserA lread yExist s extends GenericError {}; }; Listado 5.12: Cambios realizados en el S LICE de la séptima iteración 64 5. A RQUITECTURA Y D ESARROLLO 1 2 3 4 5 def t es t _ l og i n _a c c ep t e d ( self ) : # Given email = " foo@example . com " password = " 1234 " user = UserDataC ( email , " name " , " surname1 " , " surname2 " , 123456789 , 987654321) 7 8 9 10 with Mimic ( Spy , UserManagerI ) as servant : servant . login ( email , password , ANY_ARG ) . returns ( True ) servant . g etLogg edUser Data ( email , ANY_ARG ) . returns ( user ) manager = self . adapter_add ( UserManagerPrx , servant ) 12 sut = LoRAM_Agent ( manager ) 14 15 # When sut . login ( email , password ) 17 18 # Then assert_that ( servant . login , called () . with_args ( email , password , ANY_ARG ) ) assert_that ( sut . connected , is_ ( True ) ) assert_that ( servant . getLoggedUserData , called () . with_args ( email , ANY_ARG ) ) assert_that ( sut . user , is_ ( user ) ) 19 20 21 Listado 5.13: Test de integración de login aceptado 65 Capítulo 6 Resultados E n este capítulo se muestran los resultados obtenidos de un análisis sobre posibles errores debidos a falsos positivos, y se estudia la aplicación en funcionamiento sobre un escenario ficticio, donde se observan los comportamientos ante esta situación de prueba. También se realiza una estimación del coste que ha supuesto la realización del proyecto, y se determina el tiempo empleado en llevarlo a cabo. 6.1 Resultados En esta sección se realiza un análisis sobre el proceso de detección, y se analizan los resultados obtenidos en un ensayo realizado para intentar determinar las causas que pueden provocar falsos positivos. Posteriormente se muestra los pasos realizados en una prueba real de la aplicación, y se indican los comportamientos obtenidos por ésta. Análisis previo Una de las principales dificultades que existía a la hora de realizar la aplicación, era la de ser capaz de detectar un accidente lidiando con el problema de los falsos positivos. Para la detección, se optó por hacer uso del acelerómetro integrado en el teléfono, pero entonces apareció la dificultad de determinar un umbral adecuado que nos permitiera saber en qué situación estamos ante un accidente de tráfico. Ya que no se contaba con los medios apropiados para recrear impactos y poder realizar un cálculo del umbral adecuado, se decidió estudiar tecnologías similares para comprobar en que valor se solía establecer dicho umbral. Así, se comprobó que en otros sistemas en los que es preciso detectar un accidente, como es el caso del airbag, este valor se establecía en 3G. Sin embargo todos los sistemas que se encontraron estaban orientados a vehículos automóviles, por lo que no se sabía como afectarían los falsos positivos en una motocicleta, que cuenta con otras condiciones, como un alto grado de vibración. Posteriormente se realizó un estudio sobre los casos que eran potencialmente propensos a ser considerados como falsos positivos. Dado que la aplicación solo se activa cuando se indica el inicio de una ruta, estos casos debían ser estudiados en el momento en que nos 66 6. R ESULTADOS 67 encontramos sobre la motocicleta. La causa principal que se consideró era la de realizar una parada de emergencia. Para la realización de la prueba se usó un ciclomotor tipo scooter y un smartphone HTC Desire. La captura de los datos se ha realizado con la app de Android Accelerometer Monitor1 . Los resultados obtenidos al realizar una parada de emergencia a 30km/h y 50Km/h se muestran en los gráficos de las figuras 6.1 y 6.2 respectivamente. 18 16 14 m/s2 12 10 8 6 4 0 20 40 60 ds 80 100 120 Figura 6.1: Gráfico de los valores máximos de aceleración en valor absoluto para una frenada de emergencia a 30km/h. El eje vertical expresa la fuerza de aceleración experimentada en m/s2 y el eje horizontal expresa el momento de tiempo en décimas de segundo (ds) Estos gráficos representan los valores absolutos máximos de aceleración en m/s2 captados en las frenadas de emergencia de los dos casos representados. Para la creación de estos gráficos se ha usado la herramienta Octave2 . Como se puede observar en los gráficos, en ninguno de los casos se alcanza ni de lejos el valor umbral de 3G, por lo que podemos decir que las frenadas de emergencia no serán causa de falsos positivos. Detección y envío del accidente Dada la imposibilidad de probar la aplicación en su entorno real, por motivos obvios, se ha optado por representar un escenario alternativo que nos pueda ayudar a probar la aplicación, sin la necesidad de que se produzca un accidente real. Para la realización de esta prueba ha 1 2 https://play.google.com/store/apps/details?id=com.lul.accelerometer http://www.gnu.org/software/octave/ 6. R ESULTADOS 68 16 14 m/s2 12 10 8 6 4 0 50 100 150 200 250 ds Figura 6.2: Gráfico de los valores máximos de aceleración en valor absoluto para una frenada de emergencia a 50km/h. El eje vertical expresa la fuerza de aceleración experimentada en m/s2 y el eje horizontal expresa el momento de tiempo en décimas de segundo (ds) sido necesario adaptar el valor umbral de detección de accidente fijándolo en poco mas de 1G (15m/s2 ), para de este modo evitar la detección inmediata, a la vez que se tiene un valor lo suficientemente pequeño como para que pueda ser creado mediante un movimiento de mano. La prueba ha consistido en realizar un movimiento brusco con la mano, mientras se sostiene un smartphone HTC Desire con la aplicación de usuario activa, y una vez que se ha indicado el inicio de una ruta. Al realizar esta prueba, el teléfono ha experimentado una aceleración de 17,65m/s2 que es superior al valor fijado como limite, por lo que ha considerado que estamos ante un accidente y ha procedido a mostrar la pantalla de confirmación (ver figura A.5). Transcurrido el tiempo necesario para la confirmación, la aplicación ha notificado del accidente a la aplicación de gestión, la cual ha registrado el accidente y lo ha almacenado en la base de datos. En el log de la figura 6.3 podemos ver como el gestor ha recibido un incidente del usuario «[email protected]». Búsqueda y asignación del accidente Una vez realizado el paso anterior la aplicación del usuario ha activado un servicio que nos permitirá comunicarnos con el smartphone de forma remota para solicitarle diversas acciones. 6. R ESULTADOS 69 Figura 6.3: Pantalla de log del gestor tras la recepción de un incidente Mediante el uso de otro teléfono, esta vez un LG L5, con la aplicación de rescate instalada, hemos iniciado sesión con un usuario de rescate valido y se nos ha mostrado la ventana con el listado de accidentes (ver figura 6.4), en este caso solo uno. Tras seleccionar este accidente se nos muestra una ventana con tres pestañas. En la pestaña activa encontramos toda la información relacionada con el accidente que se acaba de detectar, así como los datos de la víctima (ver figura 6.5). Si intentamos pulsar en la pestaña «localización» o en «controles» nos encontramos con el mensaje que nos indica que previamente debemos tener asignado dicho accidente (ver figura B.4). Figura 6.4: Pantalla de listado de incidentes 6. R ESULTADOS 70 Figura 6.5: Pantalla de datos de incidente La asignación del accidente seleccionado la realizamos en la pestaña «Datos incidente», en la cual aparece en la parte inferior un botón que nos permite asignarnos el accidente (ver figura B.3). Localización de la víctima Para finalizar la prueba, una vez realizada la asignación indicada en el paso anterior, procedemos a pulsar en la pestaña «localización». En esta ocasión se nos muestra un mapa con un punto dibujado sobre él, que representa la localización de la víctima (ver figura 6.6). Esto nos permitiría ir a la zona indicada para tratar de localizarla. No obstante, una vez allí podríamos tener dificultades para encontrarla, por lo que realizaremos la activación del altavoz y la linterna. La activación de los componentes que nos facilitaran la localización in situ, la hemos realizado desde la pestaña «controles». Una vez que indicamos la activación de estos componentes, la pantalla de la aplicación de rescate ejecutada por el LG nos muestra que estos componentes se encuentran activos (ver figura B.6), mientras que en la aplicación de usuario ejecutada por el HTC comienza a sonar una alarma y se enciende la luz de la cámara. En la figura 6.7 podemos ver el log mostrado por el gestor durante este proceso. 6.2 Costes y recursos En esta sección se mostrarán los costes estimados, tanto materiales como de recursos humanos, en la realización de este proyecto. Además se realizará una estimación del tiempo empleado en llevarlo a cabo. Aunque la idea del proyecto surgió mucho antes, la realización del mismo comenzó en septiembre de 2012, y se han contabilizado 40 semanas empleadas para su desarrollo, con 6. R ESULTADOS Figura 6.6: Captura de pantalla de LoRAM_Rescue mostrando ubicación de la víctima Figura 6.7: Pantalla de log del gestor de la activación de los controles una dedicación media de 8 horas al día durante 5 días a la semana. Entre el tiempo dedicado al proyecto, debemos incluir también, el tiempo invertido al inicio del desarrollo en estudiar las diversas tecnologías y herramientas que han intervenido, como Android o I CE. A continuación se realiza un cálculo aproximado del coste que ha supuesto los recursos hardware utilizados en la realización de este proyecto. En el cuadro 6.1 puede verse el desglose de estos componentes con el coste estimado. En esta tabla solamente se ha tenido en cuenta el precio de cada componente, sin indicar otros gastos, como consumo eléctrico o desgaste de material. 71 6. R ESULTADOS Por otra parte los recursos y herramientas software utilizadas han sido software libre, por lo que no han supuesto ningún incremento en los costes derivado del uso de licencias privativas. El número de líneas de código totales empleadas por lenguaje de programación puede verse en el cuadro 6.2, este cuadro además incluye las líneas de código destinadas a las pruebas. La división por componentes del sistema, de estas líneas de código, puede verse en el cuadro 6.3. La realización de la estimación del coste que ha supuesto el proyecto, en cuanto a recursos humanos, puede verse en el cuadro 6.4. Para crear este cuadro se ha usado la herramienta SLOCCount que nos ha permitido calcular el tamaño del proyecto en SLOC (Source Lines Of Code) y realizar una estimación del esfuerzo según el modelo COCOMO. En esta estimación no se ha tenido en cuenta el esfuerzo realizado en la creación de esta memoria. 6.2.1 Repositorio El proyecto completo, incluido el código y la documentación, se encuentra almacenado en bitbucket.org3 . La descarga del proyecto puede realizarse en un terminal con la siguiente orden: 1 $ hg clone https :// bitbucket . org / arco_group / pfc . loram El repositorio se encuentra organizado de la siguiente forma: db: Contiene el código sql de creación de la base de datos empleada por el sistema. doc: Contiene los ficheros .tex y .bib que forman esta memoria y el anteproyecto de este trabajo. src: Contiene todo el código del sistema dividido por componentes. test: Contiene todos los test creados para la realización de este proyecto, divididos en unitarios y de integración. 3 https://bitbucket.org/ 72 6. R ESULTADOS 73 Recurso Precio/Unidad Unidades Precio Equipo sobremesa Smartphone HTC Smartphone LG 980.00 e 199.00 e 129.00 e 1 1 1 TOTAL: 980.00 e 199.00 e 129.00 e 1308.00 e Cuadro 6.1: Coste económico del hardware empleado Lenguaje No líneas Python Java XML Slice Pruebas 1064 3304 1306 179 2112 Cuadro 6.2: Líneas de código por lenguaje de programación Componente Lenguaje No líneas LoRAM Agent Java XML Python Pruebas Python Slice Pruebas Java XML Python Pruebas 1798 530 143 510 850 179 1277 1506 776 71 325 LoRAM Management LoRAM Rescue Cuadro 6.3: Líneas de código separadas por componentes del sistema Concepto Valor Total lineas físicas de código fuente Estimación del esfuerzo de desarrollo, Personas-Año (Personas-Mes) Estimación de la planificación, Años (Meses) Promedio de desarrolladores estimados (Esfuerzo/Planificación) Coste total estimado para el desarrollo (salario medio = 20.000 e/año) 8298 1.84 (22.14) 0.68 (8.11) 2.73 88.551 e Cuadro 6.4: Coste económico estimado en recursos humanos Capítulo 7 Conclusiones y trabajo futuro E n este capítulo se analiza el trabajo realizado en la elaboración de este proyecto, mostrando en que grado han sido alcanzados los objetivos marcados al comienzo de su desarrollo. Además se expondrán distintas propuestas de trabajo futuro que podrían mejorar y extender la funcionalidad del sistema desarrollado. 7.1 Objetivos alcanzados En esta sección se analizarán los objetivos expuestos en el capítulo 3, mostrando la forma en que han sido resueltos y el grado de satisfacción alcanzado con cada uno de ellos. Comenzamos recordando que el objetivo principal del proyecto era crear un sistema capaz de detectar accidentes de motocicleta e informar de dichos accidentes, y que además debía aportar mecanismos para realizar la localización de la víctima. Podemos decir sobre este objetivo, que ha sido cubierto en su totalidad con la realización de un sistema distribuido formado por tres componentes diferentes, donde dos de ellos están pensados para su ejecución en un sistema empotrado tipo smartphone, haciendo uso de los recursos que nos brindan este tipo de plataformas. Por otra parte, debemos recordar que a parte de este objetivo principal, existían una serie de objetivos específicos que detallaban de una forma más concisa lo que se esperaba del sistema. A continuación se muestra como se han afrontado estos objetivos específicos. Detección del accidente Este objetivo pretendía dotar al sistema de la capacidad de detectar de forma automática un accidente de tráfico, haciendo uso exclusivo de las capacidades del smartphone. Este objetivo se ha llevado a cabo mediante la realización de un módulo, que haciendo uso del acelerómetro del teléfono, realiza mediciones constantes de las fuerzas de aceleración experimentadas, y comprueba que no superen un umbral establecido en 3G, ya que esta demostrado que este valor es el adecuado para medir un impacto en accidente de tráfico. De esta forma, se asegura que no se produzcan falsos positivos, pero no se puede asegurar que se detecte la totalidad de los accidentes producidos. Notificación de incidentes Con este objetivo se pretendía hacer llegar los incidentes detectados a una entidad ex74 7. C ONCLUSIONES Y TRABAJO FUTURO terna que los almacenará. Para ello, se ha creado una arquitectura de objetos distribuida (véase 2.2) usando el middleware I CE, donde uno de los componentes de la comunicación es un smartphone y el otro un PC. Además se ha añadido un timer, que permite durante un periodo de tiempo cancelar el envío si fuera necesario. Asistencia remota Este objetivo pretendía que el sistema contará con un mecanismo de control remoto, sobre el teléfono de la persona que ha sufrido el accidente, con el fin de facilitar la localización in situ. Para satisfacer este objetivo, se han creado objetos distribuidos que dan acceso al manejo de varios actuadores en el smartphone. Por otro lado, se ha creado un panel en otra aplicación Android que accede a estos objetos permitiendo la manipulación de los actuadores. Localización de la víctima Con este objetivo se pretendía contar con los medios apropiados para determinar la localización de la víctima, con el fin de poder enviar un equipo de rescate al lugar indicado. Como se indicó anteriormente, el proceso de localización se ha realizado mediante el uso del sistema de localización GPS, del que disponen hoy en día todos los teléfonos inteligentes. Para el envío de la posición, expresado en latitud y longitud, se han empleado objetos distribuidos accesibles desde la aplicación de rescate. Sin embargo, mostrar estos valores al usuario de rescate, no resultaba adecuado para determinar el lugar en que se encontraba la víctima, por lo que se optó por hacer uso de GoogleMaps para representar estos valores sobre un mapa. Gestión de datos de incidentes Este objetivo recalcaba la necesidad del almacenamiento de los datos de incidentes de forma ordenada, para poder realizar consultas eficientes. Para ello, inicialmente se usaron estructuras de datos, pero posteriormente se diseñó y creó una BD que no solo almacenaba los datos de los incidentes, si no también el de los usuarios. El acceso a esta base de datos se realiza a través de un broker y el SGBD escogido ha sido MySQL. Basado en smartphone Este objetivo pretendía que el sistema fuera desarrollado para su ejecución en dispositivos tipo smartphone. Por ello se ha optado por crear las aplicaciones que requerían movilidad para su ejecución en el SO Android. Estándares libres Por último, se nos presentaba este objetivo, que pretendía que la realización del proyecto fuera llevada a cabo mediante el uso de software libre. Por ello se centro su desarrollo para los sistemas operativos GNU/Linux y Android, y se emplearon herramientas y bibliotecas libres en la creación del proyecto. 75 7. C ONCLUSIONES Y TRABAJO FUTURO 7.2 Propuestas de trabajo futuro La realización del proyecto mostrado en la presente memoria, ha supuesto la creación de un sistema de detección y asistencia en accidentes de tráfico, que a pesar de cumplir con todos los objetivos marcados, es susceptible de mejoras en cada una de las partes que forman su estructura. En esta sección se realizará un estudio de esas mejoras dividiéndolas según la parte del sistema a que correspondan. Las posibles mejoras en la aplicación de usuario serían las siguientes: Mejora del sistema de detección El sistema de detección juega un papel fundamental en el funcionamiento de L O RAM. Sin embargo, la realización de un sistema de detección realmente eficiente, que sea capaz de detectar cualquier posible incidente que se produzca por leve que sea, es una tarea ardua y que sobrepasaba los límites fijados en este proyecto. Por esta razón, se propone como trabajo futuro la mejora del sistema de detección, añadiendo a las lecturas del acelerómetro la recogida de valores de otros sensores, y la realización de un estudio, que permita determinar que condiciones deben darse para que el sistema considere que estamos ante un accidente. Alguno de los valores a tener en cuenta para ayudar a la detección de accidentes pueden ser: los cambios bruscos de velocidad, que podrían ser calculados con la ayuda del GPS, o las variaciones en la inclinación de la motocicleta, calculados mediante un acelerómetro o nivel electrónico. Mejora de la asistencia remota Los controles que ofrece actualmente el sistema para dar asistencia remota, están bastante limitados, y todos ellos están centrados en facilitar la búsqueda del accidentado en el lugar del suceso. Por ello, se propone como posible mejora añadir otro tipo de controles que permitan obtener alguna información sobre el estado de la víctima de forma remota. Por ejemplo, se podría añadir a la aplicación un cardiógrafo, para poder obtener una medida del ritmo cardiaco de la víctima, antes de desplazarse al lugar del accidente. Además, se podrían añadir otras funciones de cara a facilitar la búsqueda del accidentado, como la realización de vídeos o fotografías del lugar. Envío de incidentes por SMS La aplicación actualmente, solo permite el envío de incidentes mediante Internet. En ocasiones puede que el usuario no disponga de tarifa de datos, o que la tenga limitada. Por ese motivo, se propone que se permita adicionalmente el envío de incidentes por SMS, cuando la comunicación por Internet falle. En cuanto a la aplicación del sistema de gestión, las mejoras que podríamos considerar son las siguientes: Creación de una aplicación web para administrar el gestor Actualmente la aplicación no cuenta con una interfaz capaz de realizar labores de 76 7. C ONCLUSIONES Y TRABAJO FUTURO administración sobre el gestor y los datos que recoge. Sobre este aspecto, se propone la creación de una aplicación web para llevar a cabo estas tareas. La aplicación debería permitir gestionar los usuarios, equipos de rescate, rescatadores e incidentes, llevando un control sobre las asignaciones que se realizan. Así mismo debería ser capaz de realizar informes que puedan resultar interesantes, como que zonas son mas propensas a accidentes o cuantos incidentes ha notificado un usuario en un periodo de tiempo. De este modo, se podrían crear estadísticas y realizar una distribución más eficiente del personal de rescate, por ejemplo. Optimización del filtrado de peticiones El filtrado de peticiones consiste en un mecanismo creado con el fin de preservar la batería durante la búsqueda de una persona accidentada. Actualmente este filtrado atiende únicamente al nivel de la batería y al número de actuadores activos. Como trabajo futuro se propone optimizar este filtrado añadiendo otros factores, como el tipo de actuador que se pretende conectar, y dotarlo de capacidades para dar prioridad a ciertos actuadores sobre otros, desconectando alguno si fuera preciso. Mejora de la recogida logs Hasta ahora la generación de logs se realiza para las tareas más básicas, y no recoge demasiada información sobre los sucesos que acontecen. Se propone mejorar la recogida de estos logs añadiendo la mayor cantidad posible de información detallada sobre cada suceso, además de mejorar la forma en que se presentan. Finalmente, la aplicación del servicio de emergencias acepta las siguientes mejoras futuras: Añadir opciones de filtrado en la búsqueda de incidentes Actualmente, cuando un rescatador solicita la búsqueda de incidentes, todos los incidentes sin resolver son enviados y mostrados al rescatador. Cuando el número de estos incidentes es elevado esto supondrá trabajar con un volumen grande datos, dificultando no solo el envío, si no también la localización del incidente adecuado. Por ello, se propone como trabajo futuro proporcionar opciones de filtrado que permitan restringir los incidentes que se desean obtener. Una posible búsqueda podría ser por cercanía a una determinada zona, o por tiempo trascurrido desde que sucedió el incidente. Creación de un sistema de alertas Siempre que un usuario de rescate desea proporcionar asistencia a las víctimas de un accidente, necesita consultar el listado de accidentes y seleccionar uno de la lista. Como trabajo futuro, se propone la creación de un sistema de alertas, que permita a la aplicación de rescate ser avisada en el momento de producirse un accidente. Esto podría realizarse en Android mediante el uso del sistema de notificaciones. 77 7. C ONCLUSIONES Y TRABAJO FUTURO 7.3 Conclusión personal La realización del PFC sirve para afianzar los conocimientos adquiridos durante toda la carrera, ya que supone una oportunidad para poner en práctica todos los conceptos adquiridos durante los años de formación. Por ello representa un paso fundamental en la formación de un ingeniero, donde se pone de manifiesto no solo los conocimientos de que dispone, si no también su capacidad para adquirir nuevos conocimientos para resolver un problema. Con este proyecto se han adquirido nuevos conocimientos que o bien por la elección de asignaturas o por otros motivos no se habían adquirido durante la carrera. Entre estos conocimientos cabe destacar el aprendizaje de una nueva metodología de desarrollo y su puesta en práctica, con todo lo que esto supone. Además, se han adquirido conocimientos como la comunicación con objetos distribuidos mediante el uso del middleware I CE o el aprendizaje del lenguaje Python, que ha permitido agilizar el proceso de realización de pruebas que exigía la metodología. Con la creación de L O RAM no se pretende dar una solución definitiva a un problema tan importante como es la detección de un accidente y la localización de las víctimas, simplemente se pretende mostrar una posible forma de dar solución a este problema con un coste reducido. Por último, destacar la experiencia enriquecedora de haber trabajado en temas de actualidad, como es la programación móvil, y la satisfacción de haber completado un trabajo de ingeniería aunando los conocimientos adquiridos. 78 ANEXOS Anexo A Manual de usuario E l siguiente manual de usuario pretende mostrar todas las funcionalidades básicas de la aplicación. Se detallará el modo de acceso, así como el proceso que se debe seguir para que la aplicación nos proporcione asistencia en carretera. A.1 Login y Registro Al iniciar la aplicación se nos mostrará la ventana de «login» o inicio de sesión (ver figura A.1). Para acceder a la aplicación es necesario tener una cuenta registrada en el sistema. Figura A.1: Pantalla de inicio de sesión Si ya disponemos de una cuenta, simplemente tendremos que introducir nuestro correo electrónico y contraseña, y pulsar en el botón «enviar». Si por el contrario, aún no disponemos de una cuenta en el sistema, deberemos primero crearla pulsando en el enlace denominado «registrarse». Acto seguido se nos mostrará la pantalla con el formulario de registro (ver figura A.2) que deberemos cumplimentar debidamente para crear la cuenta. 80 A. M ANUAL DE USUARIO 81 Figura A.2: Formulario de registro Si se produce algún error, tanto al crear la cuenta como al iniciar sesión, el sistema nos mostrará un mensaje indicándonos de que se trata, y nos marcará los campos que lo han producido para que procedamos a modificarlos. A.2 Iniciar ruta Una vez que hemos accedido al sistema se nos mostrará la pantalla de inicio de ruta (ver figura A.3). Desde aquí podemos indicar al sistema que nos disponemos a iniciar un trayecto en carretera. Al pulsar el botón «iniciar ruta», si anteriormente habíamos activado la utilización de satélites GPS en el teléfono, el sistema activará el servicio interno de detección de accidentes y nos mostrará la pantalla A.4, desde la cual podemos indicar un accidente de forma manual, o dar por finalizado el trayecto. Si no habíamos activado la utilización de satélites GPS con anterioridad, al pulsar sobre el botón «iniciar ruta» se nos mostrarán las opciones de ubicación del teléfono, permitiéndonos activarlo en este momento1 . A.3 Avisar de accidente Un aviso de accidente se puede producir de dos formas: Automáticamente, producido por el sistema de detección. Manualmente, indicado expresamente por el usuario de la aplicación. 1 Debido a la nueva política de seguridad de Android no se permite la manipulación directa de los ajustes, por lo que estos deben ser modificados manualmente A. M ANUAL DE USUARIO 82 Figura A.3: Pantalla de inicio de ruta Figura A.4: Pantalla de trayecto Si se produce un aviso de accidente por cualquiera de estos dos medios, antes de que el accidente sea notificado al gestor deberá pasar por un proceso de confirmación, en el cuál el usuario tiene la ultima palabra sobre si debe ser enviado o no. La figura A.5 muestra la pantalla de confirmación. Si se muestra esta pantalla, y el usuario considera que el aviso no debe ser notificado, podrá cancelarlo pulsando el botón «cancelar aviso», y si por el contrario desea que sea enviado de inmediato, puede indicarlo pulsando el botón «confirmar aviso». A. M ANUAL DE USUARIO 83 Figura A.5: Pantalla de confirmación de aviso Si finalmente el accidente es confirmado, el sistema lanzará un servicio interno que permitirá la manipulación de las funciones remotas disponibles en el teléfono, con el fin de facilitar el rescate. Además, la aplicación mostrará al usuario la pantalla de asistencia (ver figura A.6), permitiéndole dar por finalizada esta si lo cree conveniente. No obstante, la finalización de la asistencia también podrá ser indicada de forma remota por el personal de rescate. Figura A.6: Pantalla de asistencia A. M ANUAL DE USUARIO Una vez que se ha dado por terminada la asistencia, ya sea de forma remota o indicado por el usuario, la aplicación volverá a la pantalla de inicio de ruta mostrada en la figura A.3. A.4 Cerrar sesión Para finalizar correctamente el uso de la aplicación, se debe realizar el proceso de cierre de sesión. De este modo, indicamos al gestor que dejamos de usar la aplicación, por lo que este podrá liberar nuestros datos de memoria aliviando su carga. El cierre de sesión se realiza desde la pantalla de inicio de ruta. Para realizarlo, debemos pulsar la tecla «atrás» presente en todos los smartphone, y el programa nos mostrará el cuadro de dialogo que se observa en la figura A.7. Si pulsamos aceptar la aplicación indicará al gestor nuestra salida del sistema. Figura A.7: Diálogo de cierre de sesión 84 Anexo B Manual de usuario de rescate A continuación se muestran las funcionalidades de la aplicación destinada al uso del personal de rescate. Se detallará el modo de acceso, así como los pasos ha seguir para realizar un rescate usando la aplicación. B.1 Login y Registro Al iniciar la aplicación del usuario de rescate, se nos muestra una pantalla de «login» similar a la mostrada en la aplicación de usuario (ver figura A.1), pero en lugar del correo electrónico, se nos solicitará el NIF. Para tener acceso a la aplicación, será necesario contar con una cuenta de usuario de rescate previamente registrada. Si disponemos de una cuenta de usuario de rescate, solo tendremos que introducir el número de NIF y la contraseña, y pulsar el botón «enviar», para tener acceso al sistema de rescate. De no tener aún una cuenta de usuario rescatador, podremos realizar el registro pulsando en el enlace «registrarse» de la pantalla inicial. A continuación se mostrará la pantalla con el formulario de registro de usuario de rescate, que deberemos rellenar para crear la cuenta. Durante el proceso de login o registro, pueden aparecer errores en la información introducida, de ser así, se nos mostrará un mensaje indicando el error correspondiente y el campo en el que se ha producido (ver figura B.1) Si el error producido consiste en que se intenta iniciar sesión con un usuario inexistente, la aplicación nos mostrara directamente la pantalla de registro, con el nombre del usuario rellenado con el valor que previamente habíamos introducido. B.2 Selección de Accidente Al acceder al sistema, se nos cargará un listado con los accidentes recientes que están aún sin resolver (ver figura B.2). Esta pantalla cuenta con un botón «actualizar» para que podamos recargar la vista de incidentes en cualquier momento, y poder comprobar si han entrado nuevos. 85 B. M ANUAL DE USUARIO DE RESCATE Figura B.1: Error producido durante el inicio de sesión Figura B.2: Pantalla de listado de incidentes Para comprobar los datos de un incidente debemos pulsar sobre él en la lista. De este modo se nos cargará la vista de asistencia, donde podremos consultar tanto los datos del incidente, como los de la víctima. B.3 Proceso de rescate Una vez que hemos seleccionado el incidente que deseamos atender se nos mostrará la vista de asistencia. Esta vista cuenta con tres pestañas en la parte superior, desde las que podremos realizar las acciones oportunas para realizar el rescate. Las pestañas que aparecen en la vista de asistencia son las siguientes: Datos incidente 86 B. M ANUAL DE USUARIO DE RESCATE Localización Controles A continuación mostraremos las acciones que podemos realizar en estas pestañas. B.3.1 Asignación del accidente La asignación del accidente se realiza desde la pestaña «datos incidente». Esta pestaña nos permite consultar todos los datos de la víctima y del accidente que estamos tratando. Si el incidente no esta asignado a ningún grupo de rescate, podremos indicar al sistema que deseamos asignarnos el incidente pulsando sobre el botón que aparece en la parte inferior «asignarse el incidente». Una vez que hemos indicado al sistema la asignación, aparecerá entre los datos del incidente nuestros número de grupo de rescate en rojo, como asignado al incidente, y el botón de asignación aparecerá deshabilitado (véase B.3). Figura B.3: Pantalla de datos de incidente con incidente asignado B.3.2 Petición de ubicación Para solicitar la ubicación de la víctima debemos ir a la pestaña «localización». Esta pestaña nos muestra un mapa de Google Maps1 , con un punto indicando la ubicación actual de la víctima. Para que sea posible obtener la ubicación de la víctima, debemos tener el incidente a tratar previamente asignado. De no ser así se nos mostrará un mensaje advirtiéndonos de esta necesidad (ver figura B.4). En el caso de que no sea posible obtener la ubicación de la víctima, bien por problemas con la señal GPS, como por otras causas, se nos mostrará en la pantalla un mensaje advirtiéndonos de esta situación. 1 https://maps.google.es 87 B. M ANUAL DE USUARIO DE RESCATE Figura B.4: Error de localización por incidente no asignado B.3.3 Activación de controles remotos La tercera pestaña de la vista de asistencia, nos presenta una serie de controles que pueden ser activados en el teléfono de la víctima, para facilitar su localización en el lugar del accidente (ver figura B.5). Figura B.5: Panel de control remoto Al igual que ocurría al obtener la localización, para que podamos hacer uso del panel de control, necesitamos que previamente el usuario de rescate tenga asignado el incidente. Además de los botones de activación, el panel presenta una serie de reguladores, que nos permiten manipular el comportamiento de los actuadores, antes de activarlos. 88 B. M ANUAL DE USUARIO DE RESCATE La pantalla de control además nos muestra información sobre el estado, apagado o encendido, de cada actuador, en la figura B.6, se nos muestra la aplicación con el altavoz y la luz encendidos. Figura B.6: Panel de control remoto con controles activos B.4 Cerrar sesión La aplicación de usuario de rescate, al igual que la de usuario normal, debe ser cerrada correctamente. Por ello se debe realizar el proceso de cierre de sesión, para indicar al gestor que abandonamos el sistema. En el caso de esta aplicación, el cierre de sesión se realiza desde la pantalla del listado de incidentes. Para realizarlo, debemos pulsar la tecla «atrás» y el programa nos mostrará un cuadro de dialogo, similar al mostrado en la aplicación de usuario al cerrar sesión (ver figura A.7). Si pulsamos aceptar la aplicación indicará al gestor que hemos abandonado el sistema. 89 Anexo C Hello World, Ice for Android E l siguiente código es un ejemplo sencillo o lo que podríamos denominar «hello world» sobre el uso de I CE en Android. Este código muestra una estructura C/S en la que las dos partes que intervienen en la comunicación, están desarrolladas sobre la plataforma Android. También se mostrará el código S LICE que define las interfaces de comunicación entre ambas partes. Para que la comunicación sea posible, además se deberán asignar permisos para el uso de Internet en el Manifest del cliente y el servidor: <uses-permission android:name=“android.permission.INTERNET”/> C.1 S LICE El ejemplo cuenta con una sola interfaz llamada «Hello», que esta compuesta por una única función encargada de enviar un mensaje sin esperar ningún valor de retorno. 1 2 3 4 5 module Example { interface Hello { void puts ( string message ) ; }; }; Listado C.1: Slice para ejemplo de uso de Ice en Android C.2 Cliente El cliente cuenta con una única activity (ver sección 2.3.1) formada por un cuadro de texto y un botón. Al pulsar el botón se realiza una llamada a la función «puts» indicando como cadena de entrada la obtenida del cuadro de texto. En el listado C.2 puede verse el código asociado a la activity y en C.3 la definición en XML de su interfaz de usuario. 1 package israel . androidclient ; 3 import Example . HelloPrx ; import Example . HelloPrxHelper ; 4 90 C. H ELLO W ORLD , I CE FOR A NDROID 12 import import import import import import import import 14 public class MainActivity extends Activity { 5 6 7 8 9 10 11 16 17 19 20 22 23 24 25 27 28 29 31 32 33 34 35 36 37 android . os . Bundle ; android . os . Build . VERSION ; android . app . Activity ; android . view . Menu ; android . view . View ; android . view . View . OnClickListener ; android . widget . Button ; android . widget . EditText ; private Ice . Communicator _broker ; private HelloPrx _hello ; private EditText _txvMessage ; private Button _btnSend ; @Override protected void onCreate ( Bundle s av ed In st an ce Sta te ) { super . onCreate ( s av ed Ins ta nc eS ta te ) ; setContentView ( R . layout . activity_main ) ; // Activity controllers _txvMessage = ( EditText ) findViewById ( R . id . txvMessage ) ; _btnSend = ( Button ) findViewById ( R . id . btnSend ) ; // Communication setting if ( VERSION . SDK_INT == 8) { // android . os . Build . VERSION_CODES . FROYO (8) // // Workaround for a bug in Android 2.2 ( Froyo ) . // // See http :// code . google . com / p / android / issues / detail ? id =9431 // java . lang . System . setProperty ( " java . net . preferIPv4Stack " , " true " ) ; java . lang . System . setProperty ( " java . net . p r ef e r IP v 6 Ad d r es s e s " , " false " ) ; 39 40 41 } 43 i n i t i a l i z e C o m m u n i c a t o r () ; 45 _hello = this . createProxy () ; 47 // Controllers setting _btnSend . s et On Cl ic kLi st en er ( new OnClickListener () { 48 91 C. H ELLO W ORLD , I CE FOR A NDROID @Override public void onClick ( View v ) { String message = _txvMessage . getText () . toString () ; _hello . puts ( message ) ; } 49 50 51 52 53 }) ; 54 55 } 57 @Override public boolean o n Cr e a te O p ti o n sM e n u ( Menu menu ) { // Inflate the menu ; this adds items to the action bar if it is present . getMenuInflater () . inflate ( R . menu . activity_main , menu ) ; return true ; } 58 59 60 61 62 64 65 66 @Override public void onDestroy () { super . onDestroy () ; if ( _broker != null ) { try { _broker . destroy () ; } catch ( Ice . LocalException e ) { e . printStackTrace () ; } } 68 69 70 71 72 73 74 75 76 } 78 private void i n i t i a l i z e C o m m u n i c a t o r () { try { _broker = Ice . Util . initialize () ; } catch ( Ice . LocalException e ) { e . printStackTrace () ; } catch ( Exception e ) { System . err . println ( e . getMessage () ) ; } } 79 80 81 82 83 84 85 86 88 89 90 91 private HelloPrx createProxy () { // replace IP with the server ’s IP address String s = " hello -t : tcp -h 192.168.1.10 -p 10000 " ; Ice . ObjectPrx base = _broker . stringToProxy ( s ) ; return HelloPrxHelper . checkedCast ( base ) ; 93 94 } 92 C. H ELLO W ORLD , I CE FOR A NDROID 95 } Listado C.2: Cliente de ejemplo de Ice for Android 1 2 3 4 5 6 7 < LinearLayout xmlns:android = " http: // schemas . android . com / apk / res / android " xmlns:tools = " http: // schemas . android . com / tools " a n d r o i d : l a y o u t _ w i d t h = " match_parent " a n d r o i d : l a y o u t _ h e i g h t = " match_parent " a nd r o i d: o r ie n t at i o n = " vertical " android:gravity = " center " tools:context = " . MainActivity " > < EditText android:id = " @ + id / txvMessage " a n d r o i d : l a y o u t _ w i d t h = " wrap_content " a n d r o i d : l a y o u t _ h e i g h t = " wrap_content " and roid:i nputTy pe = " text " android:text = " @string / hello_world " / > < Button android:id = " @ + id / btnSend " a n d r o i d : l a y o u t _ w i d t h = " wrap_content " a n d r o i d : l a y o u t _ h e i g h t = " wrap_content " android:text = " @string / btnSend " / > 9 10 11 12 13 14 15 16 17 18 19 21 </ LinearLayout > Listado C.3: Definición en XML de la interfaz del cliente C.3 Servidor En la parte del servidor además de la activity C.4 necesitamos implementar la interfaz «Hello» C.5 definida en el fichero S LICE. La activity cuenta con un botón que al ser pulsado muestra en un visor de texto el último mensaje recibido. En el listado C.6 se muestra el fichero XML que define la User Interface (UI). 1 package israel . androidserver ; 3 import import import import import import import import import 4 5 6 7 8 9 10 11 Example . HelloPrx ; android . os . Bundle ; android . os . Build . VERSION ; android . app . Activity ; android . view . Menu ; android . view . View ; android . view . View . OnClickListener ; android . widget . Button ; android . widget . TextView ; 93 C. H ELLO W ORLD , I CE FOR A NDROID 13 public class MainActivity extends Activity { 16 private Ice . Communicator _broker ; private Ice . ObjectAdapter _adapter ; 18 private HelloI _hello ; 20 private TextView _txvMessage ; private Button _btnCheck ; 15 21 23 24 25 26 28 29 30 32 33 34 35 36 37 38 @Override protected void onCreate ( Bundle s av ed In st an ce Sta te ) { super . onCreate ( s av ed Ins ta nc eS ta te ) ; setContentView ( R . layout . activity_main ) ; // Activity controllers _txvMessage = ( TextView ) findViewById ( R . id . txvMessage ) ; _btnCheck = ( Button ) findViewById ( R . id . btnCheck ) ; // Communication setting if ( VERSION . SDK_INT == 8) { // android . os . Build . VERSION_CODES . FROYO (8) // // Workaround for a bug in Android 2.2 ( Froyo ) . // // See http :// code . google . com / p / android / issues / detail ? id =9431 // java . lang . System . setProperty ( " java . net . preferIPv4Stack " , " true " ) ; java . lang . System . setProperty ( " java . net . p r ef e r IP v 6 Ad d r es s e s " , " false " ) ; 40 41 42 } 44 i n i t i a l i z e C o m m u n i c a t o r () ; 46 _hello = new HelloI () ; _hello . add_to ( _broker , _adapter ) ; 47 49 50 51 52 53 54 55 // Controllers setting _btnCheck . s et OnC li ck Li st en er ( new OnClickListener () { @Override public void onClick ( View v ) { _txvMessage . setText ( _hello . get_message () ) ; } }) ; 94 C. H ELLO W ORLD , I CE FOR A NDROID 57 } 59 @Override public boolean o n Cr e a te O p ti o n sM e n u ( Menu menu ) { // Inflate the menu ; this adds items to the action bar if it is present . getMenuInflater () . inflate ( R . menu . activity_main , menu ) ; return true ; } 60 61 62 63 64 @Override public void onDestroy () { super . onDestroy () ; 66 67 68 if ( _broker != null ) { try { _broker . destroy () ; } catch ( Ice . LocalException e ) { e . printStackTrace () ; } } 70 71 72 73 74 75 76 77 78 } 80 private void i n i t i a l i z e C o m m u n i c a t o r () { try { _broker = Ice . Util . initialize () ; _adapter = _broker . c r e a t e O b j e c t A d a p t e r W i t h E n d p o i n t s ( " adapter " , " tcp -p 10000 " ) ; 81 82 83 _adapter . activate () ; } catch ( Ice . LocalException e ) { e . printStackTrace () ; } catch ( Exception e ) { System . err . println ( e . getMessage () ) ; } 85 86 87 88 89 90 } 91 92 } Listado C.4: Servidor de ejemplo de Ice for Android 1 package israel . androidserver ; 3 import Example . HelloPrx ; import Example . HelloPrxHelper ; import Example . _HelloDisp ; 4 5 95 C. H ELLO W ORLD , I CE FOR A NDROID 6 7 8 10 import Ice . Communicator ; import Ice . Current ; import Ice . ObjectAdapter ; public class HelloI extends _HelloDisp { 12 private HelloPrx _proxy ; 14 private String _message ; 16 public HelloI () { this . _proxy = null ; } 17 18 public HelloPrx add_to ( Communicator broker , ObjectAdapter adapter ) { _proxy = HelloPrxHelper . uncheckedCast ( adapter . add ( this , broker . stringToIdentity ( " hello " ) ) ) ; 20 21 return _proxy ; 23 24 } 26 @Override public void puts ( String message , Current __current ) { _message = message ; } 27 28 29 public String get_message () { return _message ; } 31 32 33 36 } Listado C.5: Implementación de la interfaz Hello 1 2 3 4 5 6 7 9 10 < LinearLayout xmlns:android = " http: // schemas . android . com / apk / res / android " xmlns:tools = " http: // schemas . android . com / tools " a n d r o i d : l a y o u t _ w i d t h = " match_parent " a n d r o i d : l a y o u t _ h e i g h t = " match_parent " a nd r o i d: o r ie n t at i o n = " vertical " android:gravity = " center " tools:context = " . MainActivity " > < TextView android:id = " @ + id / txvMessage " 96 C. H ELLO W ORLD , I CE FOR A NDROID 11 12 13 14 15 16 17 18 19 a n d r o i d : l a y o u t _ w i d t h = " wrap_content " a n d r o i d : l a y o u t _ h e i g h t = " wrap_content " android:text = " " / > < Button android:id = " @ + id / btnCheck " a n d r o i d : l a y o u t _ w i d t h = " wrap_content " a n d r o i d : l a y o u t _ h e i g h t = " wrap_content " android:text = " @string / btnCheck " / > </ LinearLayout > Listado C.6: Definición en XML de la interfaz del servidor 97 Bibliografía [Anda] Android. Android Develop - API Guides. url: http://developer.android. com/guide/components/fundamentals.html. [Andb] Android. Android Develop - Tools. url: http://developer.android.com/ sdk/index.html. [Andc] Android. Location and Maps. url: http://developer.android.com/guide/ topics/location/index.html. [Andd] Android. Sensors Overview. url: http://developer.android.com/guide/ topics/sensors/sensors overview.html. [BBG+ 10] C. Blé, J. M. Beas, J Gutiérrez, F Reyes, y G Mena. Diseño agil con TDD. 2010. [Bec02] K. Beck. Una explicación de la programación extrema: Aceptar el cambio. Addison Wesley, 2002. [Cit12] Citroen. LDWS, 2012. url: http://www.citroen.es/universo-citroen/ tecnologia/seguridad/LDWS/#/universo-citroen/tecnologia/ seguridad/LDWS/. [CLM+ 03] B. Cascales, P. Lucas, J.M Mira, A.J Pallares, y S Sánchez-Pedreño. El libro de latex. Prentice Hall, 2003. [Con11] Continental. Two eyes are better than one - The stereo camera, 2011. url: http://www.conti-online.com/generator/www/com/en/continental/ pressportal/themes/press releases/3 automotive group/ chassis safety/press releases/pr 20110504 stereo camera en. html. [dlSdlIO09] Observatorio Regional de la Sociedad de la Información (ORSI). Sistemas de localización e información geográfica. Technical report, 2009. [Eura] Comision Europea. eCall: Time saved = lives saved. url: http://ec.europa. eu/information society/activities/esafety/ecall/index en.htm. 98 BIBLIOGRAFÍA 99 [Eurb] Comisión Europea. Imagen del funcionamiento de eCall. url: http://ec.europa.eu/information society/activities/esafety/ doc/ecall/ecall adac en 2012.pdf. [Eur13] Comisión Europea. eCall: La llamada de emergencia automática para accidentes de tráfico será obligatoria en los vehículos a partir de 2015. 2013. url: http://europa.eu/rapid/press-release IP-13-534 es.htm. [Foua] Python Software Foundation. The Python Tutorial. url: http://docs.python. org/2/tutorial/. [Foub] The Eclipse Foundation. url: http://www.eclipse.org/. [jt] junit team. JUnit wiki. url: https://github.com/junit-team/junit/wiki. [Kac] T. Kaczanowski. Practical Unit Testing with JUnit and Mockito. [LPFF08] J. A. Lahausse, D. Psych, B. N. Fildes, y M. P. Fitzharris. The potential for automatic crash notification systems to reduce road fatalities. Ann Adv Automot Med, 2008. [Nos] Testing with nose. testing.html. [OnS] OnStar. Automatic chash response. portal/emergencyexplore. [Org13] World Health Organization. Global status report on road safety. Technical report, 2013. [O’S] B. O’Sullivan. Mercurial: The Definitive Guide. red-bean.com/read/. [Par00] A.M. Parera. Sistemas de Seguridad y Confort en Vehículos Automóviles. Marcombo, Boixareu, 2000. [pla] Google play. Cerberus anti theft. url: https://play.google.com/store/ apps/details?id=com.lsdroid.cerberus. [Som05] Ian Sommerville. Ingeniería del software, Séptima edición. Addison Wesley, 2005. [Sta] Richard Stallman. GNU Emacs Manual, edición Sixteenth. [Sub12] Subaru. EyeSight, 2012. url: http://subaru.com.au/about/eyesight. url: https://nose.readthedocs.org/en/latest/ url: https://www.onstar.com/web/ url: http://hgbook. BIBLIOGRAFÍA 100 [Vil] D. Villa. Python-doublex. url: https://bitbucket.org/DavidVilla/ python-doublex/wiki/Home. [VMA12] D. Villa, F. Moya, y O. Aceña. Computación Distribuida Heterogénea con ZeroC Ice. 2012. [Vol12] Volvo. City Safety, 2012. url: http://www.volvocars.com/es/footer/ Pages/ CitySafetyTerms.aspx. [Wela] D. Wells. The Rules of Extreme Programming. extremeprogramming.org/rules.html. url: http://www. [Welb] D. Wells. The Values of Extreme Programming. extremeprogramming.org/values.html. url: http://www. [WTT+ 11] J. White, C. Thompson, H. Turner, B. Dougherty, y D. C. Schmidt. WreckWatch: Automatic Traffic Accident Detection and Notification with Smartphones. Mobile Networks and Applications, 2011. [Zera] ZeroC. Ice for Android. url: http://www.zeroc.com/android.html. [Zerb] ZeroC. The Internet Communications Engine. url: http://www.zeroc.com. [Zer11] ZeroC. Ice 3.4.2 Documentation, 2011. Este documento fue editado y tipografiado con LATEX empleando la clase arco-pfc que se puede encontrar en: https://bitbucket.org/arco group/arco-pfc [Respeta esta atribución al autor]