Escuela Técnica Superior de Ingenieros Industriales Universidad Politécnica de Madrid TRABAJO FIN DE GRADO DISEÑO E IMPLEMENTACIÓN DE UN SISTEMA DE IDENTIFICACIÓN BASADO EN TECNOLOGÍA NFC APLICADO A SERVICIOS DE RESTAURACIÓN Autor: Ramón Arteaga Rodrı́guez de los Santos Tutor: Yago Torroja Fungairiño Madrid, 2016 Agradecimientos Este trabajo está dedicado a muchas personas, todas ellas fundamentales en mi vida. Gracias a vosotros siempre se puede sacar fuerzas de flaqueza frente a la adversidad y seguir adelante con una sonrisa. Gracias Fran, por tu constante apoyo. Gracias por enseñarme tanto sobre programación, pero sobre todo gracias por demostrarme que la distancia no impide que dos personas puedan ser grandes amigos. Gracias César, por ser un referente en el modo de afrontar la adversidad, por conducirme en mis despistes y por haber sido un gran amigo durante estos años. Gracias Carlos, por haber estado siempre ahı́ cuando te he necesitado, ya sea como programador, como consejero, como escuchador, o como baterista los viernes por la noche. Gracias Fer, por hacerme sentir maestro con nuestras charlas cientı́ficas, y alumno con las económicas. Gracias Raquel, por alejarme del mundo de las ciencias y descubrirme nuevos horizontes en el ámbito artı́stico. Dicen que los amigos de verdad están para lo bueno, pero sobre todo para lo malo. Gracias por ser amigos de verdad. Gracias Javi, gracias Benito, gracias Yago. Gracias por vuestra generosidad, por orientarme y ser un apoyo fundamental durante este trabajo. Y un agradecimiento especial... A mi hermana. A pesar de haberte visto crecer, siempre serás mi hermanita pequeña. Siempre serás esa hermana que tiene una sonrisa para mı́ aunque el mundo vaya en contra. Es un privilegio ser tu hermano, y un honor intentar cada dı́a ser un referente para ti. Gracias, Marta. A mi padre y a mi madre. Vosotros sois los pilares de mi vida, los que me habéis brindado las mejores oportunidades, los que habéis puesto a vuestros hijos por delante de cualquier cosa, los que habéis creı́do en mı́. Siempre decı́s que soy un orgullo para vosotros, pero la verdad es que el verdadero orgullo es el que siente un hijo cuando ve a sus padres orgullosos de él. Gracias papá, gracias mamá, este trabajo culmina un Grado que os agradezco y dedico especialmente a vosotros. I II Enseñar no es lo importante; la función vital es aprender. Aristóteles. Filósofo (322 a. C. - 384 a. C.) III IV Resumen La constante evolución de la tecnologı́a supone una imparable modernización del mundo en el que vivimos. Cada vez más tareas cotidianas se actualizan introduciendo dispositivos electrónicos que las hacen más sencillas y eficientes. La identificación inalámbrica es un ejemplo de estas tareas: cada vez más establecimientos cuentan con sistemas de pago electrónico; el metro y los autobuses disponen de lectores electrónicos para los abonos; el acceso a lugares restringidos puede realizarse asimismo mediante identificación del personal, etc. Se llevan a cabo estas tareas de identificación mediante sistemas que cuentan con un lector que lee los tags (aquellos dispositivos que pueden ser identificados: smartphones, llaveros, tarjetas, abonos...) que puede ser independiente o puede estar conectado a otro módulo que actúe como cerebro que procesa la información (servidor web, ordenador, smartphone, etc). En el presente trabajo se diseña e implementa uno de estos sistemas de identificación contactless, tanto a nivel hardware como a nivel software. Este sistema contará con dos módulos: el lector propiamente dicho y un dispositivo basado en Android que controlará al lector y procesará la información recibida de aquél. De cara al hardware, se profundiza en las tecnologı́as NFC (Near Field Communication) y Bluetooth, pues son tecnologı́as que permiten la lectura de los tags y de comunicar ambos módulos, respectivamente. Se profundizará de igual modo en las plataformas Arduino y Android de cara al software que gobierne el comportamiento de ambos módulos. Se desarrolla el sistema propuesto aplicándolo a un caso práctico: la implantación del mismo en la cafeterı́a de una residencia de estudiantes, que jugará por tanto el rol de cliente. Se trata de un entorno que reúne las caracterı́sticas necesarias para contemplar la implantación de un sistema de este tipo. En efecto, es necesaria la identificación de los residentes, pero la cafeterı́a no disponı́a hasta ahora de un dispositivo electrónico para tal fin. Por tanto este paradigma permitirá evaluar la utilidad, productividad y eficiencia del sistema de identificación presentado en este trabajo. Además, se complementa dicho sistema con funcionalidades acordadas con el cliente, creando ası́ una herramienta completa para la gestión de su negocio. V VI Abstract The constant evolution of technology involves an unstoppable modernization of the world we live in. More and more daily tasks take advantage of electronic devices, therefore becoming easier and more efficient. Wireless identification is an example of such tasks: the number of stores that support electronic payment is increasing; subway and buses have electronic readers for transport tickets; access to restricted areas is granted through staff identification, and so on. These identification tasks are performed by systems consisting of a device capable of reading tags (devices that can be identified: smartphones, keyrings, cards, tickets. . . ), which can either function independently or be connected to another module that centralizes the information, such as a smartphone, a computer, a web server, and so on. In this project, a contactless identification system is designed and implemented, both at a hardware and software level. This system consists of two modules: the reader itself and an Android device that controls the reader and processes the received information. Regarding hardware, the NFC (Near Field Communication) and Bluetooth technologies are studied in detail, since they allow for reading the tags and communicating both modules, respectively. On the other hand, the software implementation for both modules is based on Arduino and Android. The proposed system is developed with the aim of solving a practical problem: to provide an identification system for the cafeteria of a student residence, which will act as a customer. It is an environment that gathers all the requirements to implement such a system. Indeed, it is necessary to identify the residents, but the cafeteria did not yet have such an electronic device for this purpose. Therefore, this paradigm will allow us to evaluate the usefulness, productivity and efficiency of the identification system presented in this work. Furthermore, the system is complemented with a set of functionalities agreed with the customer, therefore creating a complete tool to manage their business. VII VIII Palabras clave Sistema de identificación, NFC, Bluetooth, Arduino, Android. Keywords Identification system, NFC, Bluetooth, Arduino, Android. IX X Índice general 1. INTRODUCCIÓN 1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Alcance y objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Contenido de la memoria . . . . . . . . . . . . . . . . . . . . . . . . . 2. ESTADO 2.1. NFC 2.1.1. 2.1.2. DEL ARTE . . . . . . . . . . . . . . . . . . . . . . . . . Introducción . . . . . . . . . . . . . . . . . Caracterı́sticas . . . . . . . . . . . . . . . 2.1.2.1. Especificaciones técnicas . . . . . 2.1.2.2. Seguridad en NFC . . . . . . . . 2.1.3. Comunicación NFC . . . . . . . . . . . . . 2.1.3.1. Configuraciones de utilización . . 2.1.3.2. Estándares de comunicación . . . 2.1.3.3. Caracterı́sticas de funcionamiento 2.1.3.4. Modos de comunicación . . . . . 2.1.3.5. Protocolos . . . . . . . . . . . . . 2.1.3.6. Pasos de la comunicación . . . . 2.1.4. NFC en la actualidad . . . . . . . . . . . . 2.2. Bluetooth . . . . . . . . . . . . . . . . . . . . . . 2.2.1. Introducción . . . . . . . . . . . . . . . . . 2.2.2. Caracterı́sticas . . . . . . . . . . . . . . . 2.2.2.1. Especificaciones técnicas . . . . . 2.2.2.2. Seguridad en Bluetooth . . . . . 2.2.3. Comunicación Bluetooth . . . . . . . . . . 2.2.3.1. Arquitectura a nivel hardware . . 2.2.3.2. Protocolos . . . . . . . . . . . . . 2.2.3.3. Perfiles . . . . . . . . . . . . . . 2.2.3.4. Caracterı́sticas de funcionamiento 2.2.3.5. Pasos de la comunicación . . . . 2.2.4. Versiones . . . . . . . . . . . . . . . . . . 2.3. Comparativa . . . . . . . . . . . . . . . . . . . . . XI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 4 5 5 5 6 6 7 7 7 8 9 9 10 10 11 12 12 13 13 14 15 15 15 16 17 18 18 20 ÍNDICE GENERAL ÍNDICE GENERAL 3. PLATAFORMAS DE DESARROLLO 3.1. Android . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1. Introducción . . . . . . . . . . . . . . . . . . 3.1.2. Versiones . . . . . . . . . . . . . . . . . . . 3.1.3. APIs . . . . . . . . . . . . . . . . . . . . . . 3.1.4. Arquitectura . . . . . . . . . . . . . . . . . . 3.1.5. Entorno de desarrollo: Android Studio . . . Creación de un proyecto en Android Studio 3.1.6. Aplicaciones en Android . . . . . . . . . . . 3.1.6.1. Estructura del proyecto . . . . . . 3.1.6.2. Estructura de la aplicación . . . . 3.1.6.3. Activities . . . . . . . . . . . . . . 3.2. Arduino . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1. Introducción . . . . . . . . . . . . . . . . . . 3.2.2. Placas Arduino . . . . . . . . . . . . . . . . 3.2.3. Entorno de desarrollo: Arduino IDE . . . . . 4. HARDWARE 4.1. Componentes . . . . . . . . . . . . . 4.1.1. Arduino . . . . . . . . . . . . 4.1.1.1. Arduino UNO . . . . 4.1.1.2. Arduino NANO . . . 4.1.2. NFC . . . . . . . . . . . . . . 4.1.2.1. Lectores comerciales 4.1.2.2. Módulos compatibles 4.1.3. Bluetooth . . . . . . . . . . . 4.1.4. Otros componentes . . . . . . 4.1.4.1. LCD . . . . . . . . . 4.1.4.2. LED RGB . . . . . . 4.2. Montaje . . . . . . . . . . . . . . . . 4.2.1. Primer prototipo . . . . . . . 4.2.2. Prototipo final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . con Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5. SOFTWARE 5.1. App Android . . . . . . . . . . . . . . . . 5.1.1. Análisis . . . . . . . . . . . . . . . 5.1.1.1. Definición . . . . . . . . . 5.1.1.2. Requisitos . . . . . . . . . 5.1.2. Diseño e implementación . . . . . . 5.1.2.1. Clases . . . . . . . . . . . 5.1.2.2. Diagrama de navegación . 5.1.2.3. Gestión de la información Base de datos local: SQLite XII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 21 23 26 27 28 28 31 31 31 32 34 34 34 36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 39 39 39 41 42 42 43 45 46 46 47 47 47 51 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 59 59 60 61 65 65 68 69 69 ÍNDICE GENERAL ÍNDICE GENERAL Almacenamiento local . . . . . . . . Almacenamiento en la nube: Google 5.1.2.4. Bluetooth . . . . . . . . . . . . . 5.1.2.5. Bibliotecas externas . . . . . . . 5.1.2.6. Cafeterı́a RUGP . . . . . . . . . 5.1.2.6.1. Servicio . . . . . . . . . . . . . 5.1.2.6.2. Opciones . . . . . . . . . . . . Tags . . . . . . . . . . . . . . . . . Residentes . . . . . . . . . . . . . . Archivos . . . . . . . . . . . . . . . Lista de la compra . . . . . . . . . Instagram . . . . . . . . . . . . . . Backups . . . . . . . . . . . . . . . Ajustes avanzados . . . . . . . . . . 5.1.2.7. Manifest . . . . . . . . . . . . . . Activities . . . . . . . . . . . . . . . Permisos . . . . . . . . . . . . . . . 5.1.2.8. Casos de uso . . . . . . . . . . . 5.2. Módulo lector: firmware . . . . . . . . . . . . . . 5.2.1. Bibliotecas . . . . . . . . . . . . . . . . . . 5.2.2. Configuración inicial: setup . . . . . . . . . 5.2.3. Ejecución: loop . . . . . . . . . . . . . . . 5.2.3.1. Máquina de estados . . . . . . . 5.2.3.1.1. Diseño . . . . . . . . . . 5.2.3.1.2. Implementación . . . . . Estados . . . . . . . . . . . . . . . Transiciones . . . . . . . . . . . . . 6. EVALUACIÓN Y PROBLEMAS 6.1. Módulo lector . . . . . . . . . . . . . . . . . . 6.1.1. Evaluación . . . . . . . . . . . . . . . . 6.1.1.1. Primeras pruebas: BlueTerm 6.1.1.2. Pruebas con la app . . . . . . 6.1.2. Problemas encontrados . . . . . . . . . 6.2. Cafeterı́a RUGP . . . . . . . . . . . . . . . . . 6.2.1. Evaluación . . . . . . . . . . . . . . . . 6.2.2. Problemas encontrados . . . . . . . . . 7. DIRECCIÓN DEL PROYECTO 7.1. Gestión del alcance . . . . . . . . . . . . 7.2. Gestión del tiempo . . . . . . . . . . . . 7.2.1. Diagrama de Gantt del proyecto . 7.2.2. Diagrama de Gantt del producto XIII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Drive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 76 80 82 84 86 92 93 95 98 102 103 105 105 106 106 107 108 109 109 110 111 112 112 113 113 115 . . . . . . . . 119 . 119 . 119 . 119 . 120 . 121 . 123 . 123 . 124 . . . . 127 . 127 . 131 . 131 . 134 ÍNDICE GENERAL ÍNDICE GENERAL 7.3. Gestión de costes . . . . . . . . . . . . . 7.3.1. Contabilidad del proyecto . . . . Gasto de personal . . . . . . . . . Gasto de hardware . . . . . . . . Gastos de software . . . . . . . . Presupuesto de ejecución material 7.3.2. Presupuesto del producto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 136 136 137 138 138 139 8. LÍNEAS FUTURAS 143 9. CONCLUSIONES 145 Apéndices 145 A. IMPACTOS 147 A.1. Impacto ambiental . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 A.2. Impacto social . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 XIV Índice de figuras 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7. Configuraciones de utilización en NFC (Cortesı́a Modo de comunicación activa . . . . . . . . . . Modo de comunicación pasiva . . . . . . . . . . Logotipo de la tecnologı́a Bluetooth . . . . . . . Pila de protocolos Bluetooth [11]. . . . . . . . . Conexiones maestro/esclavo [15]. . . . . . . . . Scatternet formado por dos piconets [12]. . . . . de NFC Forum). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 9 10 12 16 17 17 3.1. Andy, logotipo de Android. . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Gráfico de la distribución de las versiones de Android en los dispositivos (20 de junio de 2016) . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Distribución global de las versiones de Android durante su historia. . 3.4. Arquitectura del sistema Android[20]. . . . . . . . . . . . . . . . . . . 3.5. Android SDK Manager. . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. Clase de la activity principal. . . . . . . . . . . . . . . . . . . . . . . 3.7. Layout de la activity principal. . . . . . . . . . . . . . . . . . . . . . 3.8. Ciclo de vida de una activity. . . . . . . . . . . . . . . . . . . . . . . 3.9. Comparativa de las placas oficiales (cortesı́a de Arduino [1]) . . . . . 3.10. Entorno de desarrollo de Arduino . . . . . . . . . . . . . . . . . . . . 3.11. Valores posibles para el baudrate del monitor serial del IDE de Arduino 25 25 27 29 30 30 33 35 36 37 4.1. Arduino UNO R3 (cortesı́a de Arduino) . . . . . . . . . . . . . . . . . 4.2. Arduino NANO (cortesı́a de Arduino) . . . . . . . . . . . . . . . . . . 4.3. Lector comercial con comunicación Bluetooth (cortesı́a de Sumlung). 4.4. Lector comercial con comunicación USB (cortesı́a de Emartee). . . . . 4.5. Shield RFID-NFC para Arduino UNO (cortesı́a de Elecrow). . . . . . 4.6. Módulo lector RFID-NFC basado en el sensor pn532 . . . . . . . . . 4.7. Módulo Bluetooth HC-05 . . . . . . . . . . . . . . . . . . . . . . . . . 4.8. Módulo LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.9. Módulo LED RGB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.10. Diseño del prototipo. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.11. Esquema del prototipo. . . . . . . . . . . . . . . . . . . . . . . . . . . 40 41 42 42 43 44 45 46 47 48 49 XV 22 ÍNDICE DE FIGURAS ÍNDICE DE FIGURAS 4.12. Vista frontal del prototipo. . . . . . . . . . . . . . . . . . . . 4.13. Vista trasera del prototipo. . . . . . . . . . . . . . . . . . . . 4.14. Vista en perspectiva del prototipo. . . . . . . . . . . . . . . 4.15. Diseño de la PCB del prototipo. . . . . . . . . . . . . . . . . 4.16. Circuito buscado en la PCB. . . . . . . . . . . . . . . . . . . 4.17. PCB fabricada en el taller del departamento de Electrónica. 4.18. Base de la carcasa. . . . . . . . . . . . . . . . . . . . . . . . 4.19. Embellecedor de la carcasa. . . . . . . . . . . . . . . . . . . 4.20. Cubierta de la carcasa. . . . . . . . . . . . . . . . . . . . . . 4.21. Parte trasera de la carcasa. . . . . . . . . . . . . . . . . . . . 4.22. Módulo lector: carcasa y circuito electrónico. . . . . . . . . . 4.23. Módulo lector: encapsulación del circuito en la carcasa. . . . 4.24. Módulo lector ensamblado y listo para su uso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 50 51 52 52 53 54 54 55 55 56 56 57 5.1. Diagrama de navegación de la app. . . . . . . . . . . . . . . . . . . . 68 5.2. Clases cuyas instancias permiten leer la información de la base de datos. 72 5.3. Árbol de directorios creado por la app. . . . . . . . . . . . . . . . . . 74 5.4. Clase Backups. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 5.5. Diálogo de confirmación. . . . . . . . . . . . . . . . . . . . . . . . . . 76 5.6. Registro de la app en la consola de Google. . . . . . . . . . . . . . . . 78 5.7. Integración del Bluetooth en la app. . . . . . . . . . . . . . . . . . . . 82 5.8. ActionBar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.9. Pantalla principal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 5.10. Autorización para el acceso a las opciones de la app. . . . . . . . . . 86 5.11. Lógica de conexión entre los módulos durante en Servicio. . . . . . . 87 5.12. Modos de funcionamiento en servicio: modo manual. . . . . . . . . . . 90 5.13. Modos de funcionamiento en servicio: modo automático. . . . . . . . 90 5.14. Modos de funcionamiento en servicio: modo mixto. . . . . . . . . . . 91 5.15. Tipos de dialogs en función de la pensión del residente. . . . . . . . . 92 5.16. Menú de opciones de la app. . . . . . . . . . . . . . . . . . . . . . . . 93 5.17. Opciones relativas a los tags. . . . . . . . . . . . . . . . . . . . . . . . 94 5.18. Opciones relativas a los residentes. . . . . . . . . . . . . . . . . . . . 96 5.19. Fichas de residente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 5.20. Historial de registros de un residente. . . . . . . . . . . . . . . . . . . 97 5.21. Pantalla para añadir un residente o modificar sus datos. . . . . . . . . 98 5.22. Opciones relativas a los registros: historial y visualización de backups. 99 5.23. Opciones relativas a los registros: generación de backups. . . . . . . . 99 5.24. Personalización de gráficas. . . . . . . . . . . . . . . . . . . . . . . . . 101 5.25. Restauración de datos y visualización de la lista de la compra. . . . . 101 5.26. Ejemplos de gráficas generadas con la app. . . . . . . . . . . . . . . . 102 5.27. Administración de la lista de la compra. . . . . . . . . . . . . . . . . 103 5.28. Pantallas destinadas a compartir imágenes tomadas desde la app. . . 104 5.29. Modificación de parámetros desde Ajustes avanzados. . . . . . . . . . 105 XVI ÍNDICE DE FIGURAS ÍNDICE DE FIGURAS 5.30. Pantalla de aceptación de permisos previa a la instalación de 5.31. Casos de uso de la app. . . . . . . . . . . . . . . . . . . . . . 5.32. Máquina de estados del módulo lector. . . . . . . . . . . . . 5.33. Mensaje en estado de espera. . . . . . . . . . . . . . . . . . 5.34. Mensajes mostrados en el display en S4. . . . . . . . . . . . la app. . . . . . . . . . . . . . . . . . . . . . 107 108 112 114 115 7.1. 7.2. 7.3. 7.4. 7.5. 7.6. 7.7. . . . . . . . . . . . . . . 128 129 130 132 133 135 141 Nivel superior de la EDP . . . . . . . . . . . . . . . Desglose de la EDP (1/2) . . . . . . . . . . . . . . Desglose de la EDP (2/2) . . . . . . . . . . . . . . Diagrama de Gantt del proyecto: desglose de tareas. Diagrama de Gantt del proyecto: diagrama. . . . . Diagrama de Gantt del producto. . . . . . . . . . . Representación gráfica del desglose del presupuesto. XVII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ÍNDICE DE FIGURAS ÍNDICE DE FIGURAS XVIII Índice de tablas 2.1. Clasificación de los dispositivos por su potencia de transmisión Bluetooth. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2. Velocidades de transmisión de las diferentes versiones Bluetooth. . . . 13 2.3. Comparativa entre las principales caracterı́sticas de NFC y Bluetooth. 20 3.1. Distribución de versiones Android en los dispositivos (20 de junio de 2016) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.1. Resumen de caracterı́sticas de la Arduino UNO R3 (cortesı́a de Arduino) 40 4.2. Resumen de caracterı́sticas de la placa Arduino NANO (cortesı́a de Arduino) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.1. Requisito patrón. . . . . . . . . . . . . . 5.2. RC-01: Control de datos. . . . . . . . . . 5.3. RC-02: Almacenamiento de datos. . . . . 5.4. RC-03: Sincronización. . . . . . . . . . . 5.5. RC-04: Alertas sonoras. . . . . . . . . . . 5.6. RC-05: Información de la conexión con el 5.7. RC-06: Control básico del lector . . . . . 5.8. RC-07: Modo de servicio. . . . . . . . . . 5.9. RC-08: Gráficas. . . . . . . . . . . . . . . 5.10. RC-09: Lista de la compra. . . . . . . . . 5.11. RC-10: Compartir imágenes. . . . . . . . 5.12. RU-01: Interfaz de usuario (UI). . . . . . 5.13. RU-02: Conectividad automática. . . . . 5.14. RU-03: Contraseña. . . . . . . . . . . . . 5.15. RU-04: Plataforma . . . . . . . . . . . . 5.16. Clases del proyecto . . . . . . . . . . . . 7.1. 7.2. 7.3. 7.4. Presupuesto Presupuesto Presupuesto Presupuesto parcial del proyecto no parcial del proyecto no parcial del proyecto no de ejecución material. XIX 1: 2: 3: . . . . . . . . . . . . . . . . . . . . . lector. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gastos de Gastos de Gastos de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 61 62 62 62 62 63 63 63 63 64 64 64 64 65 66 personal. hardware. sofware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 137 138 138 ÍNDICE DE TABLAS 7.5. 7.6. 7.7. 7.8. Presupuesto Presupuesto Presupuesto Presupuesto ÍNDICE DE TABLAS parcial del producto no 1: Gastos de personal. . parcial del producto no 2: Gastos de hardware. . parcial del producto no 3: Gastos de sofware. . . de ejecución material del producto. . . . . . . . XX . . . . . . . . . . . . . . . . . . . . 140 140 140 140 Listings 5.1. Lectura de registros de la base de datos. . . . . . . . . . . 5.2. Obtención del resumen MD5 del archivo debug.keystore. . 5.3. Huella digital obtenida. . . . . . . . . . . . . . . . . . . . . 5.4. Subida de la base de datos a Google Drive. . . . . . . . . . 5.5. Integración de ICallback y BluetoothHelper. . . . . . . . . 5.6. Bibliotecas importadas en build.gradle. . . . . . . . . . . . 5.7. Sistema FIFO en modo automático. . . . . . . . . . . . . . 5.8. Declaración de la activity principal. . . . . . . . . . . . . . 5.9. Declaración de las activities no principales. . . . . . . . . . 5.10. Permisos declarados en el Manifest. . . . . . . . . . . . . . 5.11. Inicialización de los módulos Bluetooth y NFC. . . . . . . 5.12. Inicialización de la máquina de estados. . . . . . . . . . . . 5.13. Ejemplo de implementación de un estado de la máquina de 5.14. Función loop. . . . . . . . . . . . . . . . . . . . . . . . . . 5.15. Progreso de la sincronización. . . . . . . . . . . . . . . . . 5.16. Transición S1 → S2. . . . . . . . . . . . . . . . . . . . . . 6.1. Lectura única de códigos recibidos por Bluetooth. . . . . . XXI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . estados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 78 78 79 81 84 89 106 106 107 110 111 111 112 113 116 122 LISTINGS LISTINGS XXII Capı́tulo 1 INTRODUCCIÓN El objetivo de este capı́tulo es servir como introducción a la memoria de este Trabajo Fin de Grado, mediante la exposición de la motivación, alcance, objetivos y estructura de la misma. 1.1. Motivación El progreso de la tecnologı́a busca facilitar el dı́a a dı́a de las personas, tanto en lo profesional como en lo personal. En la revolución tecnológica en la que nos vemos inmersos estos años se ha manifestado la tendencia a la automatización, entendida como el desarrollo de sistemas con el fin de reducir o eliminar la intervención humana en la producción o en el funcionamiento de bienes y servicios [14]. Este Trabajo Fin de Grado pretende proponer un sistema de identificación basado en radiofrecuencia. Se desarrollará dicho sistema enfocándolo a los servicios de restauración alojados en hoteles, colegios mayores, residencias, etc. En este tipo de establecimientos el cliente tiene que identificarse como tal para disfrutar del servicio, que en el caso planteado, es un desayuno o un menú de comida o cena. En concreto, en aquellos en los que el cliente realiza un pago previo en función de los servicios que desea contratar, este control de acceso se torna vital de cara a una correcta gestión de la actividad del restaurante. A lo largo de la memoria se desarrolla un sistema que automatiza estos procesos que a dı́a de hoy algunos locales siguen llevando a cabo mediante métodos manuales, identificando al cliente a través de una lista, que en el mejor de los casos es informática, pero que en ocasiones es, como quien dice, con papel y bolı́grafo. La motivación surge de la experiencia propia del autor, quien, durante sus años de estudio en la Escuela Técnica Superior de Ingenieros Industriales, se ha alojado 1 1.1. MOTIVACIÓN CAPÍTULO 1. INTRODUCCIÓN en una residencia de estudiantes. En ella, se ha identificado el problema descrito previamente, y es lo que ha motivado a buscar una solución más acorde al entorno tecnológico y automatizado de estos dı́as. Por lo que se ha resaltado anteriormente, la solución propuesta no solo resuelve el problema observado, sino que se concibe como una solución perfectamente válida para otros establecimientos de similares caracterı́sticas, otorgando al Trabajo Fin de Grado ambas perspectivas: particular y general. En concreto, se va a aplicar al servicio de cafeterı́a de la citada residencia de estudiantes, la cual jugará en este sentido el papel de cliente para quien se pretende desarrollar un producto. Se ha buscado una tecnologı́a con potencial, alcance y disponibilidad. Estas caracterı́sticas las reúne la tecnologı́a basada en la radiofrecuencia (RFID, NFC...). Se trata de una tecnologı́a cada vez más desarrollada, integrada en multitud de dispositivos y compatible entre sus diferentes variantes. Además es una tecnologı́a sencilla e intuitiva, pues permite la comunicación entre dispositivos simplemente con el acercamiento entre ambos. Al estar integrada en los dispositivos, no requiere configuración por parte del usuario, asegurando la comodidad del mismo. Se trata de una tecnologı́a segura, ya que para activar cualquier servicio o intercambiar información el usuario tendrá que hacerlo manualmente, o bien juntar dos dispositivos móviles, siendo por tanto el usuario el que confirma la acción. Todas estas cualidades confirman que es una tecnologı́a con futuro, y que está adquiriendo gran importancia, además de popularizarse entre los usuarios. Por tanto una parte del sistema que se pretende desarrollar es un lector basado en este tipo de tecnologı́a. Por otra parte, el sistema de identificación planteado requiere, además del lector, una segunda parte consistente en una interfaz de cara al personal de la cafeterı́a. El sistema que se escoge, tanto por petición del cliente como por suponer la profundización en una importante plataforma de desarrollo como es Android, será una aplicación que gestione las tareas que se detallarán en capı́tulos posteriores. Como resulta evidente, ambas partes del sistema, que en adelante denominaremos módulos, han de estar conectadas. Para ello se recurrirá a la tecnologı́a Bluetooth por lo que la comunicación será inalámbrica. Por todo ello, este Trabajo Fin de Grado pretende resolver un problema detectado en el dı́a a dı́a del autor, aprovechando la oportunidad para aprender acerca de diversas tecnologı́as, para profundizar en conocimientos y destrezas adquiridos durante el Grado, y para desarrollar aptitudes en un entorno de programación a la vanguardia como es Android. Además de la motivación que supone la resolución del problema, a ello se suma la satisfacción de ver el resultado aplicado en un entorno real que permita sacar provecho de sus caracterı́sticas y ventajas para comprobar la utilidad y eficacia del trabajo realizado. 2 CAPÍTULO 1. INTRODUCCIÓN 1.2. 1.2. ALCANCE Y OBJETIVOS Alcance y objetivos El principal objetivo de este proyecto consiste en diseñar e implementar un sistema de identificación, tanto a nivel hardware como a nivel software, como el que se ha introducido en la sección anterior. El sistema permite la automatización de la identificación de los clientes en el comedor. Para ello, cada residente contará un tag de tipo llavero provisto de RFID o NFC (se profundizará en NFC por ser una evolución más actual del RFID). El personal contará con el sistema propuesto para la lectura de los tags. Consistirá básicamente en dos partes: un lector y un dispositivo basado en Android (smartphone o tablet), comunicados de modo inalámbrico mediante la tecnologı́a Bluetooth. Los tags contendrán únicamente un código de identificación. Los datos personales de cada residente se gestionarán mediante una base de datos en el dispositivo Android, desde el cual se podrán modificar de un modo sencillo. El lector tendrá como base un Arduino, que controlará, entre otros, los módulos de Bluetooth y NFC. Por su parte, se diseñará una aplicación en Android que gestione la comunicación con el lector y ofrezca la posibilidad de llevar un registro. Además se complementará el sistema con las funcionalidades que el cliente estime oportunas. Por ello, los objetivos a cumplir son: Estudiar las tecnologı́as inalámbricas Bluetooth y NFC, analizando los diferentes protocolos de intercambio de datos entre los dispositivos. Profundizar en el entorno de Arduino para desarrollar el firmware del lector. Analizar el entorno de Android y familiarizarse con la programación de aplicaciones en esta plataforma. Construir un módulo lector integrando las herramientas y tecnologı́as anteriores. Programar una aplicación en Android que gobierne el funcionamiento del sistema y satisfaga los requisitos establecidos por el cliente. Evaluar el funcionamiento global del sistema utilizándolo en la cafeterı́a de la residencia. Abordar el trabajo realizado desde la perspectiva de la Ingenierı́a de Proyeyctos y analizar las lı́neas de futuro que pueden llevarse a cabo para mejorar el producto desarrollado. Redactar una correcta memoria del Trabajo Fin de Grado, que permita al lector de aquélla comprender el trayecto seguido durante éste. 3 1.3. CONTENIDO DE LA MEMORIA 1.3. CAPÍTULO 1. INTRODUCCIÓN Contenido de la memoria La memoria del proyecto se ha estructurado de modo que siga los pasos que se han dado durante el desarrollo del mismo. En primer lugar se incluye el estado del arte, esto es, el background tecnológico resultado de un proceso de documentación en el que se analizan las tecnologı́as inalámbricas que se van a utilizar en el proyecto para justificar su utilización. En lı́nea con lo anterior, se incluye un análisis de las plataformas de desarrollo de ambos módulos, ası́ como los entornos de desarrollo que permiten la creación del software y el firmware de aquéllos. Presentadas las bases tecnológicas, se detalla la parte relativa al hardware mediante la exposición del diseño fı́sico del producto que se propone como solución al problema que se pretende resolver. Posteriormente se desarrolla la implementación del sistema. Se exponen los aspectos fundamentales de la programación, la estructura y el funcionamiento del firmware del módulo lector y de la app. Una vez desarrollado el producto, se exponen los resultados y problemas hallados durante la evaluación del mismo. Con los objetivos cumplidos, se aborda el proyecto desde una perspectiva global, analizando el trabajo realizado desde el punto de vista de la gestión del alcance, la programación temporal, y los costes. Se presentan en penúltimo lugar las conclusiones y las lı́neas futuras que permitan mejorar las caracterı́sticas del sistema e implementar nuevas funcionalidades. Por último se hacen unos comentarios sobre los impactos ambientales y sociales que tiene este Trabajo Fin de Grado, cuyo desarrollo propiamente dicho comienza a partir del siguiente capı́tulo. 4 Capı́tulo 2 ESTADO DEL ARTE En este capı́tulo se recopila la información necesaria para comprender las tecnologı́as que se utilizarán durante el desarrollo del proyecto. Como ya se ha introducido, el sistema propuesto tendrá dos módulos fundamentales. Uno será la interfaz de cara al personal de establecimiento, y consistirá en un dispositivo Android y una aplicación que gobierne el funcionamiento general del sistema. El otro consistirá en un lector que permitirá la identficación del cliente. Dicha identificación se realizará mediante la tecnologı́a NFC, y la comunicación de ambos módulos se realizará mediante la tecnologı́a Bluetooth. Por ello, el objetivo del presente capı́tulo se exponen los fundamentos tanto de NFC como de Bluetooth, recopilando como conclusión sus principales caracterı́sticas que ponen de manifiesto sus diferencias y similitudes. 2.1. 2.1.1. NFC Introducción La tecnologı́a NFC (Near Field Communication) es una tecnologı́a inalámbrica que permite la interconexión de dispositivos de corto alcance. Se basa en RFID, o Radio-Frequency Identification. Esta tecnologı́a, de más antigüedad, permite el seguimiento y la identificación a través de ondas de radio de un objeto (normalmente llamado tag RFID), que se adosa a un producto, animal o persona. La tecnologı́a NFC combina las funciones de tag y reader/writer RFID en un único dispositivo. Puesto que se trata de una extensión de RFID, es compatible con toda la infraestructura ya existente de RFID [6], lo que hace más atractiva e interesante a la tecnologı́a NFC. 5 2.1. NFC CAPÍTULO 2. ESTADO DEL ARTE No obstante, la tecnologı́a NFC no está concebida para una transmisión masiva de datos, a diferencia de otras como Bluetooth y WiFi, pero sı́ para una alta velocidad de comunicación. En efecto, su punto fuerte es la rapidez en el intercambio de la información, que suelen ser unos pocos bits, con lo que nos encontramos en una comunicación casi instantánea. A continuación profundizaremos en esta tecnologı́a para entender qué podemos lograr con ella, su funcionamiento y su uso en la actualidad. 2.1.2. Caracterı́sticas Como ya se ha venido destacando, NFC es una tecnologı́a de comunicaciones inalámbrica de corto alcance y alta frecuencia que permite el intercambio de datos entre 2 dispositivos cercanos de manera bidireccional. Se trata de una tecnologı́a que surgió con la idea de crear un nuevo protocolo compatible con las tecnologı́as de corto alcance ya existentes. Se trata de una extensión de RFID, es decir, del estándar ISO/IEC 14443. Combina la interfaz de una smart card y de un lector, integrados ambos en un mismo dispositivo. Al incluir la posibilidad de comunicación bidireccional, entre dos dispositivos activos, NFC difiere de RFID en dos aspectos: 1. NFC permite la comunicación peer to peer, o P2P, mientras que los protocolos anteriores solo soportan comunicación entre un dispositivo activo y tags pasivos. 2. La activación no puede ser accidental o involuntaria, sino que ha de existir un acercamiento entre dispositivos para iniciar la comunicación. Desde el comienzo de su desarrollo a finales de 2002, fabricantes, desarrolladores de aplicaciones, instituciones de servicios financieros, etc. han estado cooperando para promover el uso de la tecnologı́a NFC en la electrónica de consumo, dispositivos móviles y PC. 2.1.2.1. Especificaciones técnicas NFC opera con distancias de hasta 20 cm, y en la banda de los 13.56 MHz, una banda de frecuencia no licenciada [22]. Con lo cual se puede usar libremente, sin restricción y sin necesidad de licencia. Los dispositivos generan una onda de radio mediante circuitos inductivos emparejados que posibilitan un flujo de datos al estar próximos entre sı́. Los acoplamientos inductivos funcionan para distancias cortas, por ello se emplea en NFC, pero no en tecnologı́as que trabajan a distancias 6 CAPÍTULO 2. ESTADO DEL ARTE 2.1. NFC mayores como Bluetooth y WiFi, las cuales operan en el entorno de los 10 y 100 m. respectivamente. Otra comparación posible con entre tecnologı́as es la de la tasa de datos transmitidos. Como ya se ha dicho, NFC no está pensada para una transmisión masiva de datos. La tasa de transferencia máxima es de 424 Kbps. en comparación a Bluetooth y WiFi, con tasas de transferencias del orden de los Mbps. Por ello el enfoque de NFC es el de la comunicación instantánea, útil para tareas de identificación y validación de equipos y personas. Otras tasas de transferencia ofrecidas son 106 y 212 Kbps. 2.1.2.2. Seguridad en NFC Dado que se trata de una comunicación por radiofrecuencia, la lectura no autorizada de la información transmitida es una posibilidad que existe siempre, por lo no se puede descartar la copia de los códigos de nuestro chip para un uso fraudulento. Sin embargo esto se contrarresta con la distancia de operación de NFC ya que al ser de tan solo unos pocos centı́metros el espı́a deberı́a estar dentro de ese rango. Por otra parte, un dispositivo pasivo, que no genera su propio campo de radio frecuencia, es mucho más difı́cil de intervenir que un dispositivo activo [22]. La posibilidad del robo de nuestros datos no es la única preocupación. Algunas otras amenazas son la modificación, corrupción e inserción de errores, y ataques Man-in-the-middle 1 . Las aplicaciones deben usar protocolos criptográficos de una capa superior para establecer un canal seguro, como por ejemplo la capa de conexión segura, o SSL2 . 2.1.3. Comunicación NFC 2.1.3.1. Configuraciones de utilización Existen tres configuraciones posibles para utilizar NFC. Esto la hace más adaptable y eficiente que otras tecnologı́as. Estas configuraciones son: Emulación de tarjetas: en este modo un dispositivo se comporta como una contactless card. Aprovechando las caracterı́sticas de seguridad, es útil para el manejo de sistemas de pago o para controles de acceso e identificación. 1 Se trata de ataques en los que se adquiere la capacidad de leer, insertar y modificar a voluntad, los mensajes entre dos partes sin que ninguna de ellas conozca que el enlace entre ellos ha sido violado. 2 Secure Sockets Layer: https://www.digicert.com/es/ssl.htm 7 2.1. NFC CAPÍTULO 2. ESTADO DEL ARTE Modo reader/writer : es probablemente la configuración más habitual. En ella, el dispositivo NFC se encuentra en modo activo, leyendo tags RFID pasivos. Modo P2P: el NFC permite la comunicación entre dos dispositivos para el intercambio de información. Permite el establecimiento de protocolos como ocurre con Bluetooth o WiFi. Figura 2.1: Configuraciones de utilización en NFC (Cortesı́a de NFC Forum). 2.1.3.2. Estándares de comunicación En 2004, Philips, Nokia y Sony fundaron el NFC Forum3 , encargado del desarrollo de las especificaciones, garantizando la interoperabilidad entre los dispositivos NFC. En la figura anterior se aprecian estos estándares de comunicación: NDEF: el formato NFC Data Exchange Format es un formato ligero de mensaje que se emplea para guardar y transportar diferentes tipos de elementos. Únicamente especifica la estructura del formato, siendo éste el mismo tanto para un dispositivo NFC como para un tag. Por tanto, la información es independiente de los dispositivos que se estén comunicando. Dentro del formato de un mensaje NDEF se puede enviar información de diversos tipos: encapsular documentos XML, datos encriptados, imágenes o cadenas de información [7] 3 NFC Forum: http://www.nfc-forum.org/home 8 CAPÍTULO 2. ESTADO DEL ARTE 2.1. NFC RTD: el estandar Record Type Definition especifica los tipos de registros que pueden ser enviados en los mensajes entre los dispositivos[8]. Encontramos: • Smart Poster RTD: Para incorporar etiquetas con datos (URLs, SMS o números de teléfono). • Text RTD: Para registros que solo contienen texto. • Uniform Resource Identifier : Para registros referidos a un recurso de internet. 2.1.3.3. Caracterı́sticas de funcionamiento La tecnologı́a NFC se basa en las tecnologı́as contactless. Para ello se necesitan dos tipos de dispositivos para el establecimiento de la comunicación. El iniciador (initiator ) es el dispositivo que inicia y controla el intercambio de información. El objetivo (target) es el dispositivo que responde a la petición del iniciador. Ambos roles son intercambiables entre las dos partes, con lo que cualquier dispositivo provisto de tecnologı́a NFC puede operar de las dos formas. 2.1.3.4. Modos de comunicación De manera similar a la tecnologı́a RFID, en NFC existen dos modos de funcionamiento: Modo activo: cada dispositivo genera su propio campo electromagnético para enviar los datos, reconociéndose automáticamente. Ambos dispositivos intercambian datos, y mientras está esperando respuesta, un dispositivo desactiva su campo. Por lo dicho, ambos dispositivos necesitan tener una fuente de energı́a para su funcionamiento. Figura 2.2: Modo de comunicación activa 9 2.1. NFC CAPÍTULO 2. ESTADO DEL ARTE Modo pasivo: sólamente el dispositivo iniciador genera campo, y el otro aprovecha dicho campo para intercambiar la información. Es un modo de mayor eficiencia energética, aspecto relevante en dispositivos en los que la duración de la baterı́a es crı́tico, como en PDAs o teléfonos móviles. Figura 2.3: Modo de comunicación pasiva 2.1.3.5. Protocolos En la estandarización de la comunicación NFC ya comentada, se han definido dos protocolos Near Field Communication Interface and Protocol : NFCIP-1: el primero de estos dos protocolos define tanto el enlace de radiofrecuencia con la que NFC trabaja (13.56 MHz) como la arquitectura para las tasas de datos (106, 212 y 424 Kbps) y los modos de operación activo y pasivo. NFCIP-2: el segundo especifica un método para escoger una de las tres configuraciones de utilización (emulación, reader y P2P), de modo que no interfieran otras comunicaciones en curso en la frecuencia de 13.56 MHz. 2.1.3.6. Pasos de la comunicación La comunicación que hemos venido describiendo, y caracterizada como casi instantánea, en realidad consta de una serie de pasos: 1. Descubrimiento: es una primera etapa en la que los dispositivos comienzan un proceso de rastreo mutuo para su posterior reconocimiento. 2. Autenticación: cada dispositivo verifica si esta autorizado para comunicarse con el otro, o si ha de establecer algún tipo de cifrado. 3. Negociación: en esta etapa se definen parámetros como la velocidad de transmisión, el tipo de aplicación, la identificación del dispositivo, etc. 4. Transferencia: es la etapa en la que se produce el intercambio o flujo de información propiamente dicho. 10 CAPÍTULO 2. ESTADO DEL ARTE 2.1. NFC 5. Confirmación: por último, una vez se han realizado correctamente el establecimiento de comunicación y la transferencia de datos, el receptor ası́ lo confirma. 2.1.4. NFC en la actualidad A lo largo de la sección se han descrito las caracterı́sticas de la tecnologı́a NFC. A partir de ellas se deducen los aspectos más interesantes que se pueden conseguir en aplicaciones de la vida real: información y transacciones en tiempo real, ahorro en utilización de papeles y folletos, automatización de tareas manuales y otras ventajas derivadas de la combinación con otras tecnologı́as. La premisa básica a la que se acoge el uso de la tecnologı́a NFC es aquella situación en la que es necesario un intercambio de datos de forma segura y por acercamiento de dispositivos. Lo usos que más futuro tienen son la identificación, la recogida e intercambio de información y sobre todo, el pago electrónico. Identificación El acceso a lugares donde es precisa una identificación puede hacerse simplemente acercando un teléfono móvil o un tag NFC a un dispositivo de lectura. Los abonos de autobús son un ejemplo muy válido de esto. Además está siendo utilizado en empresas como método de validación de los empleados o incluso para llevar a cabo un control de acceso a zonas restringidas. Las lı́neas futuras parecen apuntar a su integración en documentos oficiales como el DNI, pasaporte o permisos de conducir en un telefono móvil para poder llevarlos siempre encima [18]. Recogida e intercambio de datos Aunque tradicionalmente durante los últimos años se ha utilizado Bluetooth, con NFC existe una posibilidad de utilizar la tecnologı́a NFC para compartir datos, siempre aprovechando la proximidad entre dos usuarios. Google es el principal protagonista de este uso, pues en combinación con las etiquetas RFID, utilidades como marcar dónde estamos, recibir información de un evento o establecimiento son inmediatas. Transacciones Sin duda alguna, es la estrella de los usos del NFC. La comodidad de uso y que el gasto pueda estar asociado a nuestra factura o una cuenta de banco son armas 11 2.2. BLUETOOTH CAPÍTULO 2. ESTADO DEL ARTE muy poderosas y esta tecnologı́a está camino de ser el método de pago del futuro. Otro enfoque serı́a la de realizar una transferencia de dinero de una persona a otra. Simplemente acercando el teléfono al de un amigo y validando la transacción, sin duda una forma rápida y fácil de prestar o devolver dinero. Además de estas aplicaciones, quizá las más evidentes y habituales, también podemos llegar a encontrar la tecnologı́a NFC en otros contextos: folletos digitales, hospitales, tarjetas de visitas, domótica, vehı́culos, ayudas a discapacitados, fotografı́a, localización, parkings... 2.2. 2.2.1. Bluetooth Introducción Las redes de área personal inalámbrica, o WPAN, son tecnologı́as de red inalámbrica de corto alcance utilizadas para la conexión de dispositivos entre sı́ sin que dicha conexión sea a través de cable. Bluetooth es una especificación industrial para este tipo de redes. Se trata de una tecnologı́a desarrollada por Ericsson en 1994 que facilita el intercambio de información de manera inalámbrica entre dispositivos como computadores, teléfonos móviles o PDAs, manteniendo los niveles de seguridad ofrecidos por la conexión cableada. En febrero de 1998, se formó un grupo llamado Bluetooth Special Interest Group (Bluetooth SIG) que contó con más de 200 compañı́as, ente las que estaban Ericsson, IBM, Intel, Microsoft, Motorola, Nokia y Toshiba [3]. Su objetivo era desarrollar las especificaciones para Bluetooth 1.0, que se publicaron en julio de 1999. Figura 2.4: Logotipo de la tecnologı́a Bluetooth El objetivo de Bluetooth es la transmisión de voz y datos mediante circuitos de radiofrecuencia con un bajo consumo energético. Ofrece la posibilidad de crear pequeñas redes inalámbricas entre diferentes equipos, ası́ como la sincronización de datos entre ellos, facilitando las comunicaciones entre equipos fijos y móviles. Los dispositivos que emplean esta tecnologı́a con mayor frecuencia pertenecen a sectores de las telecomunicaciones o la informática personal. Ası́, encontramos total12 CAPÍTULO 2. ESTADO DEL ARTE 2.2. BLUETOOTH mente integrada la tecnologı́a Bluetooth en PDAs, teléfonos móviles, ordenadores, impresoras, cámaras digitales, teclados y ratones, etc. 2.2.2. Caracterı́sticas 2.2.2.1. Especificaciones técnicas Las distancias permitidas por Bluetooth son mayores que las asociadas a la tecnologı́a NFC estudiada en la sección anterior. La comunicación entre dispositivos no exige que estos estén ni en contacto, ni siquiera alineados. Si la potencia es suficiente, pueden estar incluso en habitaciones separadas. Por ello, encontramos una clasificación de los dispositivos atendiendo a su potencia de transmisión, la cual determina el alcance posible, como queda reflejado en la tabla 2.1. Clase Potencia máxima (mW) Clase I 100 Clase II 2.5 Clase III 1 Alcance aproximado (m) 30 5-10 1 Tabla 2.1: Clasificación de los dispositivos por su potencia de transmisión Bluetooth. A pesar de los valores anteriores, hay que destacar que en combinaciones de dispositivos pertenecientes a distintas clases, dichos valores pueden extenderse. Por ejemplo, un dispositivo de clase I, al tener mayor potencia de transmisión, permite que la señal llegue con energı́a suficiente a un dispositivo de clase II, aunque la separación entre ambos dispositivos sea superior a la del rango del dispositivo de clase II. La velocidad de transmisión, mayor en cualquier caso que las de NFC, depende de la versión Bluetooth utilizada, como puede comprobarse en la tabla 2.2. Las caracterı́sticas de las diferentes versiones se detallan en el posterior epı́grafe. Versión Versión 1.2 Versión 2.0 Versión 3.0 Versión 4.0 Velocidad de transmisión 1 Mbps 3 Mbps 24 Mbps 24 Mbps Tabla 2.2: Velocidades de transmisión de las diferentes versiones Bluetooth. Bluetooth opera en una banda libre de radiofrecuencia llamada banda internacional médico-cientı́fica, o banda ISM, de 2.4 a 2.48 GHz. Al ser la banda ISM libre, está abierta a cualquier usuario que la quiera utilizar y expuesta al ruido 13 2.2. BLUETOOTH CAPÍTULO 2. ESTADO DEL ARTE externo pudiendo ocasionar interferencias y pérdidas de información. Por ello la tecnologı́a Bluetooth realiza un rápido emparejamiento y utiliza saltos de frecuencia en la transmisión para garantizar una conexión robusta. En concreto, se utiliza la técnica del espectro ensanchado por saltos de frecuencia, o FHSS (frequency hopping spread spectrum). Esta técnica consiste en dividir la banda de frecuencia de 2.402 - 2.480 GHz en 79 canales, denominados saltos, de 1 MHz cada uno, para posteriormente transmitir la señal utilizando una secuencia de canales que sea conocido tanto por el emisor como por el receptor. Al cambiar de canales con una frecuencia de 1600 veces por segundo, el estándar Bluetooth permite evitar la interferencia con otras señales de radio. El estándar Bluetooth se divide en múltiples normas IEEE 802.15.x, con x variando desde 1 hasta 4. Entre ellas cabe destacar la IEEE 802.15.2, que recomienda una serie de prácticas para utilizar la banda de 2.4 GHz evitando problemas de coexistencia de otro tipo de redes WPAN. En efecto, no sólo pueden existir otras conexiónes Bluetooth, sino que la frecuencia de la banda también es utilizada por el WiFi. Cada dispositivo Bluetooth tiene asignada una dirección Bluetooth única de 48 bits, basada en el estándar IEEE 802.11 para redes de área local inalámbrica (WLAN). Esta dirección se utiliza tanto para la identificación, como para sincronizar el salto de frecuencia entre los dispositivos y la generación de claves en los procedimientos de seguridad. 2.2.2.2. Seguridad en Bluetooth Bluetooth dispone de diferentes mecanismos de seguridad a la hora de llevar a cabo las transmisiones. Estos mecanismos, o modos, son los siguientes: No seguro: en este modo, los mecanismos de seguridad se encuentran deshabilitados. Seguridad a nivel de alcance: se establecen mecanismos de seguridad mediante cifrados y autenticación a través de PIN y seguridad MAC. Podemos distinguir tres mecanismos: • Autenticación: para establecer la comunicación entre dos dispositivos, hay que emplear una clave secreta. • Autorización: se establecen niveles de confianza que determinan la capacidad de acceso de un dispositivo a los servicios. Esta confianza puede ser total, parcial o nula. • Cifrado de datos: protege la información transmitida, asegurando la confidencialidad. 14 CAPÍTULO 2. ESTADO DEL ARTE 2.2. BLUETOOTH Seguridad a nivel de servicio: no hay codificación, PIN o claves, sino que la seguridad se inicia tras establecerse el canal de comunicación entre dispositivos. La seguridad que ofrece un dispositivo, y con ello, el modo de seguridad que posee, es decisión del fabricante. Tanto los dispositivos como los servicios que ofrecen disponen de distintos niveles de seguridad [21]. 2.2.3. Comunicación Bluetooth Para garantizar la interoperabilidad de unos fabricantes con otros, y que los dispositivos Bluetooth puedan descubrirse unos a otros, explorar servicios y hacer uso de ellos, Bluetooth esboza un sistema radio, una pila de protocolos y varios perfiles. 2.2.3.1. Arquitectura a nivel hardware El hardware que compone el dispositivo Bluetooth se compone de dos partes: Dispositivo de radio: se basa en una antena cuya función es la modulación y transmisión de la señal. Es la parte encargada de aplicar la técnica FHSS y la que caracteriza al dispositivo en su clase (clase I, II ó III) según su potencia. Controlador digital: entre sus tareas destacan el envı́o y recepción de datos, determinación de conexiones, autenticación, negociación, determinación del tipo de enlace, etc. 2.2.3.2. Protocolos La especificación de Bluetooth determina el conjunto de protocolos con los que pueden operar las distintas aplicaciones. Cada una puede operar bajo una estructura de protocolos definida por cada columna que se presentan en la figura 2.2.1, o por un conjunto de ellas. Los dispositivos que vayan a participar en las comunicaciones tendrán que ejecutar la misma pila de protocolos. Los protocolos de las capas inferiores, usados por la mayorı́a de los dispositivos, han sido desarrollados por el Grupo Bluetooth SIG. Por el contrario, en las capas superiores la especificación es abierta, lo que permite el desarrollo de nuevos protocolos de aplicación, lo cual se traduce en el desarrollo de una gran variedad de servicios. 15 2.2. BLUETOOTH CAPÍTULO 2. ESTADO DEL ARTE Figura 2.5: Pila de protocolos Bluetooth [11]. 2.2.3.3. Perfiles El estándar Bluetooth establece una serie de perfiles para definir qué tipos de servicio ofrece un determinado dispositivo Bluetooth. A su vez, un dispositivo puede admitir varios perfiles. Algunos de ellos son: GAP (Generic Access Profile): se trata del perfil de acceso genérico, base para el resto de perfiles. Define los procedimientos generales para establecer la comunicación entre dos dispositivos: descubrimiento, gestión, configuración, y seguridad. SDAP (Service Discovery Application Profile): define los procedimientos necesarios para que un dispositivo Bluetooth descubra los servicios registrados en otro dispositivo Bluetooth y reciba la información necesaria asociada a dichos servicios [17]. SPP (Serial Port Profile): el perfil de puerto serie define cómo configurar puertos serie virtuales y conectar dos dispositivos entre ellos. Es decir, emula una lı́nea serie y provee una interfaz de reemplazo de comunicaciones basadas en RS-232 (conexión cableada). GOEP (Generic Object Exchange Profile): el perfil genérico de intercambio de objetos está basado en OBEX, un perfil abstracto que se utiliza para transferir objetos binarios de un dispositivo a otro. Existen numerosos perfiles además de los anteriores, relacionados con audio y vı́deo (A2DP, AVRCP), imagen (BIP), telefonı́a (CTP), etc. Pueden consultarse en bibliografı́a especı́fica [10]. 16 CAPÍTULO 2. ESTADO DEL ARTE 2.2.3.4. 2.2. BLUETOOTH Caracterı́sticas de funcionamiento El estándar Bluetooth se basa en el modo de operación maestro/esclavo. La diferencia entre ambos es que un esclavo únicamente puede contectarse a un maestro, mientras que un maestro puede conectarse a varios esclavos, hasta un máximo de 7, o 255 si el dispositivo está en modo espera. Además el maestro puede permitir a dos esclavos conectarse entre sı́, actuando como un intermediario que controla las transferencias de datos en ese caso. Figura 2.6: Conexiones maestro/esclavo [15]. Habitualmente también incluyen un PIN de conexión que, como se comentó en el apartado referente a la seguridad, supone una medida de seguridad. Se denomina piconet a la red formada por un maestro y todos los esclavos asociados, denominados puntos de acceso. Poseen una dirección lógica de 3 bits, con lo que el máximo de dispositivos interconectados es de 8. Los dispositivos en modo espera se sincronizan, pero no poseen su propia dirección dentro de la piconet. Dos piconets pueden conectarse entre sı́ cuando un dispositivo actúa como enlace. De este modo se forma una red más amplia, llamada scatternet. Figura 2.7: Scatternet formado por dos piconets [12]. 17 2.2. BLUETOOTH 2.2.3.5. CAPÍTULO 2. ESTADO DEL ARTE Pasos de la comunicación La seguridad que puede exigirse a la comunicación por Bluetooth implica que el procedimiento sea relativamente complicado: 1. Modo pasivo: en condiciones normales, un dispositivo funciona en modo pasivo, en el cual, permanece a la escucha de la red. 2. Solicitud: es la fase inicial en el establecimiento de la conexión. El maestro envı́a una solicitud a los puntos de acceso (dispositivos en su rango), los cuales responden con su dirección. 3. Paginación: ante las direcciones recibidas, el maestro elige una y se sincroniza con el punto de acceso que la ha enviado, mediante la sincronización de los relojes y frecuencia de ambos. 4. Descubrimiento del servicio: en este punto se ha creado un enlace entre el maestro y el punto de acceso. El maestro entra en esta fase mediante el protocolo SDP (figura 2.5). 5. Creación de un canal: tras el descubrimiento del servicio, el maestro crea un canal de comunicación mediante el protocolo L2CAP (figura 2.5). Se puede crear un canal adicional para proporcionar un puerto serie virtual (a través del ya mencionado perfil SPP). 6. Emparejamiento mediante PIN: si el punto de acceso incluye un número de información personal, o PIN, se dice que posee un mecanismo de seguridad llamado emparejamiento. Esto restringe el acceso únicamente a los usuarios autorizados, de modo que la piconet esté segura. El punto de acceso le envı́a la solicitud de emparejamiento al maestro, algo que habitualmente resulta en la petición al usuario del PIN. La conexión se lleva a cabo si el PIN introducido es correcto. 7. Utilización de la red: cuando el emparejamiento se activa, el dispositivo maestro puede utilizar el canal de comunicación establecido. 2.2.4. Versiones Al hablar de las diferentes tasas de transmisión de datos en la tecnologı́a Bluetooth, se ha puesto de manifiesto la existencia de diferentes versiones en esta tecnologı́a, que han ido siendo implementadas desde que esta tecnologı́a fue creada. Se pueden destacar tres lı́neas generales que rigen la evolución de las versiones Bluetooth: reducción del consumo de energı́a, mejoras en la velocidad de transferencia y mejoras en la seguridad. 18 CAPÍTULO 2. ESTADO DEL ARTE 2.2. BLUETOOTH Versión 1.1 El origen de Bluetooth se remonta a un estudio llevado a cabo por Ericsson que pretendı́a investigar la viabilidad de una interfaz de bajo coste para la conexión entre dispositivos vı́a radio. El resultado fue un enlace de corto alcance llamado MC link, que abrió un abanico de posibilidades en cuanto a sus potenciales aplicaciones. Versión 1.2 Esta versión se caracteriza por introducir la compatibilidad con la tecnologı́a WiFi en la banda de los 2.4 GHz, sin interferencias. Esto es posible mediante la técnica FHSS ya comentada, que por otra parte permite una transmisión más eficiente y un cifrado más seguro. Cabe destacar que esta versión provee una comunicación más rápida entre dispositivos, y ofrece otras funcionalidades, como por ejemplo la Voice Quality - Enhanced Voice Processing, que combina una mejora en la calidad de voz y la reducción de ruido ambiente. Versiones 2.0 y 2.1 La caracterı́stica fundamental la versión 2.0 es la incorporación de la técnica Enhanced Data Rate, o EDR, que permite un aumento en la velocidad de transmisión hasta los 3 Mbps. Si bien su versión predecesora habı́a logrado un aumento en cuanto a velocidad, la versión 2.1 introduce mejoras en el consumo energético, llegando a reducirlo hasta cinco veces. Además simplifica los pasos para establecer la conexión entre dispositivos. Versiones 3.0 y 4.0 Se persigue la idea de que Bluetooth y WiFi puedan trabajar juntas, para lo cual es necesario incrementar la velocidad en Bluetooth. Es la versión 3.0 la que la aumenta hasta los 24 Mbps. En la última versión de la tecnologı́a Bluetooth, la 4.0, se ha disminuido el consumo de energı́a y se ha ampliado la gama de aplicaciones. Ası́, se ha incorporado a dispositivos como por ejemplo los smartwatches. Por último, destacar que se ha mejorado notablemente la seguridad mediante la introducción de la encriptación AES-1284 . 4 El esqumema de cifado por bloques, o AES, es uno de los algoritmos más populares en cripotgrafı́a simétrica. 19 2.3. COMPARATIVA 2.3. CAPÍTULO 2. ESTADO DEL ARTE Comparativa Tanto NFC como Bluetooth han sido concebidas con el objetivo de poder establecer comunicaciones inalámbricas entre dispositivos. Una vez se han expuesto las caracterı́sticas de ambas tecnologı́as, se puede presentar una comparativa entre las principales: NFC • Tiene un alcance máximo de 20 cm. Bluetooth • El alcance depende de la clase, siendo el máximo de decenas de metros (clase I). • Trabaja en una frecuencia de 13.56 MHz. • La frecuencia de operación se sitúa en los 2.4 GHz. • Tiene una tasa de transmi- • La velocidad de transmisión menor, de 424 kbps como sión, dependiendo de la vermáximo. sión, va desde 1 Mbps hasta 24 Mbps. • No es posible crear una red • Se pueden crear rede dispositivos, la conexión es des WPAN entre varios punto-a-punto. dispositivos. • El establecimiento de la • El tiempo es del orden de conexión es más rápido que los segundos. en Bluetooth, del orden de las décimas de segundo. • La potencia requerida es • La potencia es más elevamenor. da, y depende de la clase del dispositivo. Tabla 2.3: Comparativa entre las principales caracterı́sticas de NFC y Bluetooth. El análisis de la sección permite concluir que NFC cuenta con un menor rango de alcance, pero a su vez requiere un tiempo menor para establecer la comunicación. Por otra parte, Bluetooth cuenta con unos sistemas de seguridad más férreos y con una mayor velocidad de transmisión [9]. Teniendo en cuenta las caracterı́sticas, y con ellas, las ventajas e inconvenientes de cada tecnologı́a, se puede establecer cuál es la apropiada para una determinada aplicación. 20 Capı́tulo 3 PLATAFORMAS DE DESARROLLO Una vez expuestos los detalles de las tecnologı́as en las que se basará el sistema, se puede subir un nivel y profundizar en las plataformas de desarrollo que nos permitirán la implementación de los módulos. Recuérdese que el módulo del lado del usuario consiste en un dispositivo Android y una aplicación que permita al personal del establecimiento tanto llevar a cabo tareas de gestión como activar y atender al segundo módulo. Estará por tanto basado en Android, primera plataforma de desarrollo que se presenta en el presente capı́tulo. De igual modo se recuerda que el segundo módulo consiste en un lector, interfaz de cara a los residentes. Este módulo estará gobernado por una placa Arduino, siendo ésta la segunda plataforma de desarrollo que se exponga. 3.1. 3.1.1. Android Introducción Durante los últimos años el sector de la telefonı́a móvil ha evolucionado de manera exponencial. Esto ha desembocado en la aparición de dispositivos como o smartphones y tablets. Ha sido necesario implementar sistemas operativos que gestionen estos ordenadores de bolsillo. Una plataforma de desarrollo que satisface esta necesidad es Android. Se trata de un sistema operativo basado en Linux que se lanzó por primera vez en 2008 [20]. Desarrollado por Android Inc., pertenece a la Open Handset Alliance, que engloba 21 3.1. ANDROID CAPÍTULO 3. PLATAFORMAS DE DESARROLLO a 84 empresas de fabricantes y desarrolladores tanto de hardware como de software, entre los que destacan Google, Samsung, HTC, LG e Intel. Figura 3.1: Andy, logotipo de Android. Se trata de una plataforma de código abierto, gracias a lo cual es sencillo programar, implementar y distribuir aplicaciones mediante Google Play1 , sin restricciones. Además de ser de código abierto, hay varios motivos por los cuales cada vez más desarrolladores se decantan por este sistema operativo: Variedad en hardware: podemos encontrar en el mercado dispositivos de todas las gamas y precios, con lo que Android se postula como una plataforma accesible a todos. Además no está diseñado exclusivamente para su uso en teléfonos y tablets, sino para dispositivos de otra ı́ndole, con gran variedad de pantalla, memoria, entradas/salidas, etc. Esta caracterı́stica, aunque es ventajosa, supone un esfuerzo adicional al programador. Portabilidad: al estar desarrollado en Java, las aplicaciones pueden ser ejecutadas en cualquier tipo de dispositivo que cuente con un intérprete. Servicios: Android cuenta con gran cantidad de servicios incorporados como la localización por GPS y redes, bases de datos con SQL, reconocimiento y sı́ntesis de voz, navegador, multimedia, etc. Seguridad: hereda de Linux la ejecución aislada en sandbox 2 , además de disponer de una serie de permisos que limitan su rango de actuación. Optimización: la implementación de Google de la máquina virtual Dalvik, supone un optimizado para baja potencia y poca memoria. 1 Google Play: es el distribuidor oficial de aplicaciones para Android. Sandbox: cada aplicación en Android se ejecuta de manera independiente, teniendo acceso exclusivamente a sus propios recursos (por ejemplo en cuanto a hardware). 2 22 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1. ANDROID Otras caracterı́sticas: alta calidad de gráficos (animaciones, gráficos 3D, OpenGL...), de sonido (incorporación de códecs), arquitectura basada en XML, filosofı́a de dispositivo siempre conectado a Internet, etc. El principal competidor de Android es Apple, con su sistema operativo iOS. La competencia entre ambos beneficia al usuario al redundar en una constante mejora y optimización de los sistemas. Una cuestión habitual en la población es qué sistema es mejor. La realidad es que no se pueden comparar: se trata de sistemas diseñados de forma distinta para plataformas distinta. Apple desarrolla hardware y software, con lo que la compatibilidad entre sus dispositivos es inigualable. Por otro lado, el desarrollador se encuentra más limitado en cuanto a la compatibilidad con otras plataformas, y con restricciones como la comprobación de su aplicación antes de su distribución, ası́ como una cuota anual. Sin embargo, como se mencionó al principio de la sección, Android ofrece un código totalmente abierto, con lo que el desarrollador puede crear aplicaciones de cualquier tipo y que accedan a todas las funcionalidades del dispositivo, solicitando los permisos pertinentes. Las caracterı́sticas expuestas en este epı́grafe justifican el uso de Android como plataforma de desarrollo para la implementación de la aplicación. 3.1.2. Versiones Las versiones de Android se caracterizan por el nombre de un postre en inglés. Además de un orden cronológico, también siguen un orden alfabético. Ası́, desde la primera versión lanzada, versión 1.0 Apple pie, a dı́a de hoy (20 de junio de 2016), la versión más actual es la versión 6.0 Marshmallow. Cada nueva versión, además de corregir errores de las versiones anteriores, introduce un gran número de novedades que pueden consultarse si se desea [20]. Se comentarán las más relevantes: Apple Pie 1.0: primera versión de Android, aunque no llegó a utilizarse comercialmente. Banana Bread 1.1: se trata de una versión que se empleó para corregir los errores de la primera. Cupcake 1.5: incorpora un teclado integrado e introduce los widgets. Donut 1.6: permite la adaptación a nuevos tipos de pantalla mediante cambios de resolución. Eclair 2.0: proporciona APIs para manejar Bluetooth e introduce el soporte a HTML5. 23 3.1. ANDROID CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Froyo 2.2: soporta flash 10.1 y permite el uso de almacenamiento externo. Gingerbread 2.3: incorpora soporte para la tecnologı́a NFC. Aparece el multi-touch y el gestor de aplicaciones, que redundará en un menor consumo energético. Honeycomb 3.0: es especı́fico para tablets, con lo que introduce mejoras en cuanto a gráficos y adaptabilidad de pantallas. Ice Cream Sandwich 4.0: presenta un diseño más moderno con pantallas de bloqueo mejoradas y gestores de datos. Jelly Bean 4.1 - 4.3: soporte para Bluetooth 4.0, OpenGL ES 3.0, nuevos idiomas, mejoras en seguridad. Soporte para Chromecast. KitKat 4.4: visualización en pantalla completa, implementación de la máquina virtual ART para desarrolladores, aumento en la cantidad de dispositivos sincronizados por Bluetooth. Lollipop 5.0 - 5.1: aparece Material Design, un nuevo estilo de diseño. Incluye mejoras en las notificaciones y en la duración de la baterı́a. Marshmallow 6.0: incluye un administrador de permisos y soporte para huellas dactilares. Incorpora Android Pay y la posibilidad de restaurar datos y aplicaciones al cambiar de dispositivo o aplicar un factory reset. La página oficial de Android Developers3 ofrece información y estadı́sticas actuales, como por ejemplo los datos relativos a la distribución de las versiones en los dispositivos[5], que se presentan en la figura 3.2 y en la tabla 3.1, aunque las versiones anteriores a Froyo y versiones cuya distribución no alcanza el 0.1 % no se muestran. Versión Nombre 2.2 Froyo 2.3 Gingerbread 4.0 Ice Cream Sandwich 4.1 - 4.3 Jelly Bean 4.4 KitKat 5.0 - 5.1 Lollipop 6.0 Marshmallow API Distribución 8 0.1 % 10 2% 15 1.9 % 16-18 18.9 % 19 31.6 % 21-22 35.4 % 23 10.1 % Tabla 3.1: Distribución de versiones Android en los dispositivos (20 de junio de 2016) 3 Android index.html Dashboards: https://developer.android.com/about/dashboards/ 24 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1. ANDROID Figura 3.2: Gráfico de la distribución de las versiones de Android en los dispositivos (20 de junio de 2016) La figura 3.3 muestra las distribuciones globales de las distintas versiones de Android desde 2009 hasta 2015. Figura 3.3: Distribución global de las versiones de Android durante su historia. 25 3.1. ANDROID 3.1.3. CAPÍTULO 3. PLATAFORMAS DE DESARROLLO APIs Las interfaces de programación de aplicaciones, o APIs, son las capas que permiten al desarrollador interactuar cómodamente con la base del sistema Android. Se componen de diversos elementos: paquetes, clases, atributos XML, Intents, etc [19]. En cada versión lanzada de Android se incluyen cambios y actualizaciones de la API. Dichas modificaciones siempre se llevan a cabo de manera que sigan siendo compatibles con las anteriores. Por ello, cuando se actualiza una API se introducen nuevas funcionalidades que pueden reemplazar a otras ya existentes, pero sin borrarlas: se dejan como obsoletas, pero con la posibilidad de seguir empleándolas. Por este motivo, cada versión de Android soporta un nivel de API concreto a la perfección, y todos los anteriores prácticamente sin ningún problema. La tabla 3.1 muestra el nivel de API que incluyen las versiones de Android. Cabe destacar la biblioteca de soporte (Support Library) llegados a este punto. Esta biblioteca permite utilizar algunas de las APIs más recientes de Android en una aplicación, aunque dicha aplicación se ejecute en versiones antiguas. Como ejemplo, cabe destacar los Fragments, que se incluyeron en Honeycomb, con API 11, pero gracias a la Support Library, pueden utilizarse a partir de la versión 1.6 con API 4. Para elegir el nivel de API que soportará una determinada aplicación, se han de tener en cuenta diferentes aspectos. Por una parte, parece razonable escoger aquél nivel mı́nimo que incluya los elementos necesarios para la ejecución correcta de la aplicación, ya que niveles de API superiores también la permitirán. Por otra parte, si el nivel mı́nimo es demasiado bajo, debido a que los requisitos estén incluidos desde APIs más antiguas, no conviene usarlas debido a que gran cantidad de rutinas estarán obsoletas y no se estarı́an aprovechando las mejoras introducidas en nuevas versiones. Además hay que tener en cuenta el público al que va dirigido debido al tipo de terminales a los que ofrezcamos la aplicación. Se trata de buscar un consenso entre el público al que irá dirigida y los requisitos necesarios. Las versiones que cuentan con API 16 en adelante representan la mayorı́a de los dispositivos actuales (97.8 %). Además cuentan con todos los recursos necesarios para el sistema propuesto, con lo cual dicha API será la elegida para la implementación del proyecto. 26 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1.4. 3.1. ANDROID Arquitectura La arquitectura del sistema Android se basa en un modelo de 4 capas que se detallan a continuación, y que pueden observarse en la figura 3.4. Figura 3.4: Arquitectura del sistema Android[20]. Capa 1: Núcleo Linux: es la única capa dependiente del hardware, permitiendo a las restantes capas abstraerse del mismo. Proporciona servicios como la seguridad, la gestión de la memoria, el multiproceso, el soporte de controladores (pantalla, cámara, Bluetooth...), etc. Capa 2: Bibliotecas nativas: Android incluye un conjunto de bibliotecas en C/C++ empleadas por varios componentes del sistema, muchas de ellas de código abierto. Algunos ejemplos son System C Library, OpenGL, SQLite, WebKit, FreeType, etc. Dentro de esta capa se encuentra el entorno de ejecución, o Runtime de Android. Se trata de un conjunto de bibliotecas base que proporcionan la mayor parte de las funciones disponibles de las bibliotecas de Java. Dadas las limitaciones de los dispositivos, en lugar de utilizar una máquina virtual estándar, Google creó la máquina virtual Dalvik para responder a estas limitaciones y, a partir de Android 5.0, dicha máquina virtual fue reemplazada por ART, que incluye mejoras en el rendimiento y el consumo de memoria, entre otras. 27 3.1. ANDROID CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Capa 3: Framework: el marco de trabajo de aplicaciones es accesible a los desarrolladores. La arquitectura está diseñada para simplificar la reutilización de componentes. Cualquier aplicación puede publicar sus capacidades, y cualquier otra aplicación puede hacer uso de esas capacidades, siempre sujetos a reglas de seguridad. Capa 4: Aplicaciones: está formada por el conjunto de aplicaciones instaladas. Normalmente están escritas en Java, y se recomienda su ejecución en la máquina virtual Dalvik para asegurar la seguridad. Algunas aplicaciones base incluyen un cliente de correo electrónico, programa de SMS, calendario, mapas, navegador, contactos, etc. 3.1.5. Entorno de desarrollo: Android Studio El desarrollo de la parte relacionada con Android en este trabajo se ha realizado mediante Android Studio4 . Se trata de un entorno de desarrollo basado en IntelliJ IDEA5 cuya instalación de Android Studio incluye: El entorno de desarrollo (editor de código) propiamente dicho. La última versión del Android SDK (Sofware Development Kit). Emulador para probar una aplicación en diferente dispositivos virtuales. El SDK proporciona las bibliotecas de cada API, ası́ como herramientas de desarrollo necesarias para construir, testear y depurar aplicaciones para Android. Los elementos que están incluidos en la instalación de Android Studio son los más actualizados. Para probar las aplicaciones desarrolladas en versiones anteriores de Android, se ha de descargar e instalar el SDK correspondiente a través del SDK Manager de Android Studio (ver figura 3.5). Además se ha de contar con el Java Development Kit (JDK7)6 . Creación de un proyecto en Android Studio Al crear un nuevo proyecto en Android Studio, en primer lugar se ha de introducir el nombre de la aplicación que se va a desarrollar ası́ como el nombre de la compañı́a y del paquete. El nombre del paquete usa una convención llamada reverse DNS, por la cual se invierte los nombres de la organización y de la aplicación, aplicando además 4 Android Studio: http://developer.android.com/intl/es/sdk/index.html IntelliJ IDEA: https://www.jetbrains.com/idea/ 6 JDK7: http://www.oracle.com 5 28 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1. ANDROID Figura 3.5: Android SDK Manager. identificadores. Esto se realiza para que los paquetes sean únicos y distinguibles de otros tanto en un dispositivo como en Google Play. A continuación Android Studio solicita al desarrollador ciertos parámetros como la API, diseño de la activity principal, etc. Tras completar este proceso inicial, el proyecto estará creado, y con él, la clase (fichero Java) y el layout (fichero XML) de la activity principal. Por una parte, la clase permite programar la lógica del comportamiento de la activity. Además en ella se especifica qué layout ha de mostrar dicha activity, y por tanto, permite implementar el comportamiento de los diferentes widgets incluidos en el layout. Por otra parte, el layout de una activity es su aspecto gráfico, esto es, cómo se verá en la pantalla del dispositivo cuando la aplicación se esté ejecutando. Además de con el propio editor de código, los ficheros XML que implementan el diseño gráfico de las activities se pueden crear o editar de manera gráfica mediante el editor de diseño que incluye el propio Android Studio. La clase y el layout creados para la activity principal tras crear un proyecto en Android Studio pueden observarse, respectivamente, en las figuras 3.6 y 3.7. En la parte izquierda de android Studio aparece la estructura del proyecto y de la aplicación, que se detalla en el siguiente epı́grafe. 29 3.1. ANDROID CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Figura 3.6: Clase de la activity principal. Figura 3.7: Layout de la activity principal. 30 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1.6. Aplicaciones en Android 3.1.6.1. Estructura del proyecto 3.1. ANDROID Todas las aplicaciones, desde la más simple hasta la más compleja, se estructuran del mismo modo. Esta estructura se genera automáticamente con la creación del proyecto en cualquier entorno de dearrollo que se utilice. La estructura de una aplicación que proporciona Android Studio consta de diferentes directorios: gradle: es una herramienta que automatiza la construcción del proyecto. La sintaxis es similar a Java, y permite realizar tareas de compilación, empaquetado y testing. External Libraries: como su nombre indica, se trata de bibliotecas externas incluidas en el proyecto. idea: es un entorno de desarrollo integrado en Java. app: contiene todos los archivos relacionados con un proyecto, por lo que conviene profundizar más en ella. En su interior se encuentran los siguientes subdirectorios: • build : contiene códigos generados por Android Studio cada vez que se realiza la compilación del proyecto. • libs: contiene las bibliotecas Java que utiliza una determinada aplicación. La referencia a dichas bibliotecas se realiza en el fichero build.gradle (se verá esto al exponer la parte relativa al software de este trabajo). • src: contiene la información más importante, la que pone de manifiesto la estructura de la aplicación. 3.1.6.2. Estructura de la aplicación El directorio src contiene a su vez más subdirectorios a considerar. Son los siguientes: java: contiene las clases, archivos .java, en los cuales se implementa toda la codificación lógica de la aplicación. res: incluye los archivos como imágenes, strings, layouts, estilos, menús o interfaces gráficas, cada uno en un subdirectorio dentro de res. Android Manifest: se trata del documento más importante de la aplicación. Su función es describir la implementación de la misma. Se profundizará más en el capı́tulo relativo al software. 31 3.1. ANDROID 3.1.6.3. CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Activities Los archivos más elementales de una aplicación Android son las activities. Una activity es una entidad de aplicación que representa cada una de las pantallas de la misma. El usuario interactúa únicamente con una activity, pero puede navegar entre ellas. Android almacena las activities en una pila cuyo orden indica el historial de navegación. En efecto, es el propio sistema Android quien se encarga de pausar, parar o destruir una activity según las necesidades de recursos del dispositivo. Para ello se basa en el estado de las activities, que permite identificar qué activities no están siendo utilizadas y pueden destruirse para liberar recursos. Dichos estados son: Activa (running): la activity está encima de la pila, con lo cual es la activity visible. Se dice que tiene el foco (focused ). Visible (paused ): la activity está pausada: es visible pero no tiene el foco. Este estado se alcanza cuando nuevas activities llegan a la pila, cuando se pulsa el botón home, etc. En definitiva, cuando se puede volver a ella sin necesidad de que para ello tenga que volver a crearse. Parada (stopped ): la activity no está visible. En este momento Android puede destruirla si necesita recursos, con lo que es tarea del programador guardar los datos que no deban perderse. Destruida (destroyed ): la activity termina. Se alcanza al invocarse el método finish(), o cuando Android la mata. Los diferentes estados que puede presentar una activity durante su existencia y el modo en que se relacionan se conoce como el ciclo de vida de la activity. La documentación oficial de Android Developers ofrece el esquema que aparece en la figura 3.8. Los métodos que aparecen en el ciclo de vida de una activity son llamados por Android, y son los siguientes: onCreate(): se dispara cuando la activity es creada. En él se inicializa la acitivity, aunque exiten métodos que permiten que se cree manteniendo el estado que tenı́a la última vez que existió en lugar de inicializarse. onStart(): carga la activity en el dispositivo. onResume(): muestra la activity en la pantalla permitiendo al usuario interactuar con ella. onPause(): se llama cuando el sistema lanza una nueva activity, cuando el usuario pulsa el botón home o bloque el dispositivo, etc. 32 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.1. ANDROID Figura 3.8: Ciclo de vida de una activity. onStop(): cuando se llama, la activity deja de ser visible. A partir de este momento deja de haber garantı́a de que la activity siga estando accesible sin necesidad de crearla de nuevo. onRestart(): al ser llamado la activity va a volver a ser cargada después de haber pasado por onStop(). onDestroy(): destruye la activity. Es llamado por el método finish() o cuando el usuario pulsa el botón back. Aunque por lo dicho anteriormente, puede ser llamado por Android si el dispositivo está escaso de recursos. 33 3.2. ARDUINO 3.2. CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Arduino El módulo lector se pretende diseñar desde cero, y se fundamentará en una placa Arduino. Frente a otras opciones parecidas como Raspberry Pi, más complejas como un PLC, o ya existentes como lectores comerciales, se ha escogido Arduino debido a que el desarrollo del módulo lector es perfectamente abordable con ella, y supone la profundización en una herramienta presentada en el Grado. 3.2.1. Introducción Arduino es una plataforma de hardware libre basada en una placa gobernada por un microcontrolador Atmel. Se puede adquirir comercialmente o se puede fabricar de modo casero mediante el empleo del microcontrolador apropiado. La placa comercial conecta el microcontrolador con una serie de entradas/salidas y un puerto USB que permite su alimentación y programación. Se trata de una plataforma que proporciona flexibilidad para realizar infinidad de proyectos al permitir una conexión del mundo fı́sico con el virtual a través de entradas y salidas tanto digitales como analógicas. Ofrece una serie de ventajas que han llevado a la elección de esta plataforma para el desarrollo del sistema. Como ya se ha introducido, se trata de una plataforma económica y abierta. Existe una amplia gama de versiones y accesorios compatibles, algo que ha hecho que esté muy estandarizada. Con ello se han desarrollado infinidad de bibliotecas de libre distribución que permiten la comunicación con hardware de terceros. A las caracterı́sticas anteriores cabe destacar la extensa gama de modelos disponibles. 3.2.2. Placas Arduino Desde su nacimiento en 2005 [4], las innovaciones no han dejado de estar presentes en Arduino. Las distintas placas7 que están disponibles en el mercado son las que se exponen, junto con sus especificaciones, en la figura 3.9. La arquitectura depende de la placa considerada. Por este motivo, se detallará posteriormente, una vez se exponga el hardware empleado, y por tanto, la placa utilizada. 7 Pueden consultarse más caracterı́sticas en la web oficial: https://www.arduino.cc/en/ Main/Boards 34 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.2. ARDUINO Figura 3.9: Comparativa de las placas oficiales (cortesı́a de Arduino [1]) 35 3.2. ARDUINO 3.2.3. CAPÍTULO 3. PLATAFORMAS DE DESARROLLO Entorno de desarrollo: Arduino IDE El desarrollo del firmware que se pretende cargar en la placa, se puede realizar mediante Arduino IDE, que es el entorno de desarrollo oficial. A su vez, se encarga de la correcta conexión y comunicación entre la placa y el ordenador. Figura 3.10: Entorno de desarrollo de Arduino Como puede observarse en la figura 3.10, el IDE de Arduino se compone de: Barras de herramientas (1), que ofrecen diferentes funciones. Un editor de texto (2), para implementar el código del firmware. Un área de mensajes (3), que permite al usuario tener constancia de los posibles problemas de comunicación, errores de compilación, procesos en ejecución, etc. Un monitor serie (4), que no es sino una consola de texto que permite al usuario comunicarse con la placa. 36 CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 3.2. ARDUINO El IDE de Arduino deriva de Processing 8 , del cual hereda el término sketch (se profundizará en la estructura de un sketch cuando se detalle el firmware del módulo lector). En Processing se considera cada código como un boceto, y de ahı́ que el código escrito en el IDE de Arduino suela denominarse sketch. Por su importancia cabe destacar el monitor serie, o monitor serial. Permite ver la comunicación establecida por el puerto serie entre la placa Arduino y el ordenador durante la ejecución del sketch. Permite tanto la lectura de los mensajes que aparecen en la consola como el envı́o comandos a través de la barra de escritura. Esto permite, por ejemplo, el envı́o de comandos AT9 a shields o módulos que se conecten a la placa Arduino. También permite el establecimiento de diferentes tasas de baudios, o baudrates, que marcan las unidades de señal transmitidas por segundo. Este valor ha de coincidir en las dos partes que estén formando una conexión para que ésta sea legible. De otro modo, la información ofrecida por el monitor serial no podrá ser entendida. Figura 3.11: Valores posibles para el baudrate del monitor serial del IDE de Arduino La comunicación serie no es exclusivamente realizable a través del monitor serial del IDE de Arduino, sino que puede llevarse a cabo mediante software de terceros, o incluso a través de software desarrollado por el propio usuario. En efecto, las placas Arduino desdoblan el canal de transmisión serie para llevarlo al puerto USB. Con el controlador apropiado, la señal puede ser reconocida por el ordenador. Este controlador generalmente no supone un problema para el usuario, pues la instalación del IDE de Arduino lo incluye, de modo que la placa se detectará como un puerto COM adicional, pudiendo controlarse a través de software apropiado. Es necesario identificar dicho puerto, pues para cargar un sketch en la placa es necesario especificar tanto el modelo de placa como el puerto por el que se conecta. 8 Processing: lenguaje de programación orientado a diseñadores, especialmente pensado para proyectos multimedia. Para más información se puede acudir a la web oficial: https:// processing.org/ 9 Comandos AT: son comandos de atención, a través de los cuales se establece la comunicación directa con un dispositivo mediante la petición y la recepción de una respuesta. 37 3.2. ARDUINO CAPÍTULO 3. PLATAFORMAS DE DESARROLLO 38 Capı́tulo 4 HARDWARE En este capı́tulo se exponen las caracterı́sticas principales de los componentes que se utilizan para la construcción del módulo lector. Pueden encontrarse descripciones e informaciones más detalladas en los datasheets de los componentes que a continuación se presentan. 4.1. 4.1.1. Componentes Arduino Durante el desarrollo del módulo lector se han empleado dos placas Arduino: la placa Arduino UNO y la placa Arduino NANO, pasándose a presentar las caracterı́sticas principales de ambos tipos. 4.1.1.1. Arduino UNO La placa Arduino UNO se ha empleado durante el montaje inicial del módulo, durante las fases de integración de todos los componentes, y de primeras pruebas de verificación del correcto funcionamiento del módulo. El uso de esta placa, que es una de las más conocidas y utilizadas para introducirse en el entorno de este microcontrolador, sigue la estela de su uso durante asignaturas más tempranas en la carrera, en las cuales despertó el interés del autor, quien decidió darle un uso más allá de los ejemplos elementales que se mostraron en las asignaturas de la carrera. Ası́ pues, esta placa forma parte de los primeros pasos de este proyecto. 39 4.1. COMPONENTES CAPÍTULO 4. HARDWARE Figura 4.1: Arduino UNO R3 (cortesı́a de Arduino) Sus caracterı́sticas principales son: Microcontrolador Tensión de operación Tensión de entrada recomendada Pines digitales Pines analógicos de entrada Corriente en pines E/S Corriente en pin 3.3 V Memoria Flash SRAM EEPROM Frecuencia de reloj ATmega328 5V 7-12 V 14 (6 disponen de PWM) 6 20 mA 50 mA 32 kB (0.5kB empleados por el bootloader) 2 kB 1 kB 16 MHz Tabla 4.1: Resumen de caracterı́sticas de la Arduino UNO R3 (cortesı́a de Arduino) Dispone además de otras caracterı́sticas como puerto USB regular, I2C, UART... que junto con el resto de información relativa a la placa pueden encontrarse en la página web de Arduino. 40 CAPÍTULO 4. HARDWARE 4.1.1.2. 4.1. COMPONENTES Arduino NANO El factor tamaño del módulo lector lleva a la búsqueda de alternativas de montaje de un menor tamaño. En esta lı́nea, se busca una placa de caracterı́sticas similares pero de dimensiones más reducidas. Ası́ se elige la Arduino NANO para este fin, y de cara a implementar el montaje del módulo lector en una placa de un modo más cómodo. Figura 4.2: Arduino NANO (cortesı́a de Arduino) Sus caracterı́sticas principales son: Microcontrolador Tensión de operación Tensión de entrada recomendada Pines digitales Pines analógicos de entrada Corriente en pines E/S Corriente en pin 3.3 V Memoria Flash SRAM EEPROM Frecuencia de reloj ATmega168 ó ATmega328 5V 7-12 V 14 (6 disponen de PWM) 8 40 mA 50 mA 16 ó 32 kB según el microcontrolador 1 (ATmega168) ó 2 kB (ATmega328) 512 (ATmega168) ó 1 kB (ATmega328) 16 MHz Tabla 4.2: Resumen de caracterı́sticas de la placa Arduino NANO (cortesı́a de Arduino) También soporta comunicación I2C y SPI, y otras caracterı́sticas que pueden consultarse en la página web oficial de Arduino. 41 4.1. COMPONENTES 4.1.2. CAPÍTULO 4. HARDWARE NFC Para la elección del sensor NFC se han estudiado diferentes posibilidades, que pueden clasificarse en dos grupos: lectores comerciales y módulos para integrar con Arduino. 4.1.2.1. Lectores comerciales Los lectores comerciales presentan la ventaja de tener una mayor robustez pero como inconvenientes destacan el precio y la baja flexibilidad a la hora de desarrollar una aplicación con ellos, pues poseen un funcionamiento determinado de fábrica. A continuación se presentan dos modelos de lector de este tipo: Figura 4.3: Lector comercial con comunicación Bluetooth (cortesı́a de Sumlung). Figura 4.4: Lector comercial con comunicación USB (cortesı́a de Emartee). 42 CAPÍTULO 4. HARDWARE 4.1. COMPONENTES La figura 4.3 muestra un lector con comunicación por Bluetooth, y la figura 4.4 muestra un lector con comunicación USB. El lector inalámbrico de la figura 4.3 posee un elevado coste (más de 100 ¤), mientras que el lector plug and play es más económico pero no se adapta a las caracterı́sticas que requiere el módulo lector planteado en este trabajo. En efecto, se busca la comunicación inalámbrica entre los módulos lector y recepctor, y de emplear la alternativa anterior, el módulo lector no serı́a un módulo independiente, sino que se tendrı́a un solo módulo (tablet o smartphone) al cual se acopları́a el lector. Ası́, requerirı́a que el personal tendrı́a que acercar el dispositivo al cliente para que este acercara el tag. Esto no supone una solución interesante de cara a la funcionalidad del sistema. Existen otros lectores comerciales que están pensados para comunicación con un ordenador a través de USB y mediante un software propio que proporciona el proveedor junto con el lector. Esta opción se descarta pues ni se pretende emplear un ordenador, ni se pretende usar un software de terceros, sino que se plantea un desarrollo completo tanto a nivel hardware como a nivel software. 4.1.2.2. Módulos compatibles con Arduino Existen en el mercado módulos que se basan en diferentes sensores RFID-NFC carentes de una carcasa o software propio. Suponen una mejor alternativa para el desarrollo propio, programando el uso del sensor a placer. Hay dos grandes alternativas en este grupo: shields y módulos individuales. Figura 4.5: Shield RFID-NFC para Arduino UNO (cortesı́a de Elecrow). 43 4.1. COMPONENTES CAPÍTULO 4. HARDWARE Los shields (ejemplo en la figura 4.5) son funcionales y económicos, sin embargo se descartan puesto que no se va a emplear una Arduino UNO, que es la placa que estas shields soportan. La opción elegida para incluirla en el lector es el módulo basado en el sensor pn532 que puede observarse en la figura 4.6. Figura 4.6: Módulo lector RFID-NFC basado en el sensor pn532 Sus principales caracterı́sticas son: Soporte I2C, SPI y HSU (UART de alta velocidad), con facilidad de cambiar entre los modos. Compatible con RFID, NFC y con la posibilidad de comunicación P2P. Gran variedad de dispositivos admisibles, como tarjetas Mifare 1K y 4K o tarjetas ISO/IEC 14443-4, por citar algunos ejemplos. Distancia de lectura de hasta 7 cm. Compatible con Arduino, incluyendo el sensor la biblioteca necesaria para su correcto uso en esta plataforma. Pequeñas dimensiones que lo hacen especialmente interesante para este proyecto. Precio muy competitivo (se trata de la alternativa más económica). El manual del módulo no sólo incluye las caracterı́sticas mencionadas, ası́ como una descripción más detallada del sensor, sino también explica cómo realizar la conexión de los pines con la placa Arduino para su uso en los diferentes modos posibles. 44 CAPÍTULO 4. HARDWARE 4.1.3. 4.1. COMPONENTES Bluetooth La comunicación entre ambos módulos (lector y receptor), se ha planteado a través de la tecnologı́a Bluetooth. Si bien el módulo receptor se trata de un dispositivo Android (tablet o smartphone), y por tanto consta de un módulo Bluetooth propio, se necesita un módulo Bluetooth para el módulo lector. Para elegir un módulo Bluetooth compatible con Arduino se busca una buena combinación de caracterı́sticas como precio, distancia de alcance, documentación de referencia, etc. De lo anterior se decide emplear un módulo habitual en aplicaciones de Arduino que requieren comunicación por Bluetooth: el módulo HC-05. Figura 4.7: Módulo Bluetooth HC-05 Sus principales caracterı́sticas son: Versión de Bluetooth 2.0 Clase II. Velocidad de hasta 2.1 Mbps. Antena de PCB incorporada. Módulo montado en tarjeta con regulador de voltaje y 6 pines suministrando acceso a VCC, GND, TXD, RXD, STATE (conectado a un led), y KEY ó EN (dependiendo del fabricante). Consumo de corriente: 50 mA. Se trata de un módulo que puede actuar como maestro o esclavo y es configurable a través de comandos AT. La forma de acceder al modo configuración depende del modelo. Como ya se ha adelantado en las caracterı́sticas, existen dos modelos diferentes de este módulo Bluetooth. En un modelo se dispone de un pin llamado KEY, que dependiendo de si está a nivel alto o bajo (HIGH ó LOW) al encender el módulo se entra en modo configurable o no. El otro modelo no dispone de dicho pin, 45 4.1. COMPONENTES CAPÍTULO 4. HARDWARE pues en su lugar el pin actúa como enable. Los módulos HC-05 de este tipo disponen de un botón que dependiendo si está presionado o no al iniciar el módulo se entra o no al modo configurable. Puede consultarse en la bibliografı́a [15] una lista de comandos AT que pueden emplearse con el módulo Bluetooth HC-05. 4.1.4. Otros componentes De cara a la viabilidad tecnológica del proyecto, bastarı́an los componentes hasta ahora descritos. No obstante, la funcionalidad del sistema incluye la posibilidad de ofrecer información al cliente. Para ello se hace uso de una serie de componentes que se detallan a continuación. 4.1.4.1. LCD Una manera intuitiva de ofrecer información al cliente es a través de una pantalla de cristal lı́quido (liquid-crystal display o LCD). La opción más razonable es emplear un módulo LCD para Arduino basado en el chip HD44780, al incluir Arduino una biblioteca para dicho chip. Figura 4.8: Módulo LCD 46 CAPÍTULO 4. HARDWARE 4.1.4.2. 4.2. MONTAJE LED RGB Para indicar de una manera visual e intuitiva el estado del módulo lector (activo o inactivo), ası́ como información de otro tipo, es conveniente disponer de un led rgb que exprese diferentes mensajes con el color de su luz (ámbar para alerta por bajo número de consumiciones disponibles, por ejemplo). Figura 4.9: Módulo LED RGB 4.2. 4.2.1. Montaje Primer prototipo A medida que los componentes fueron adquiridos se realizaron una serie de pruebas para determinar su correcto funcionamiento. Dichas pruebas fueron, en esencia, códigos de ejemplo incluidos en las bibliotecas nativas de Arduino, o en las bibliotecas de terceros. En el primer caso encontramos las bibliotecas LiquidCrystal y SoftwareSerial, con las que se puede comprobar el funcionamiento individual de los módulos LCD y HC-05, respectivamente. En el segundo caso se encuentran las bibliotecas1 PN532, PN532 I2C y NfcAdapter, que permiten evaluar el funcionamiento del módulo lector RFID-NFC. Por último, las pruebas realizadas al módulo led RGB no requieren de una biblioteca especı́fica, pues el color de la luz que éste emite se consigue a través del control de la salida de los pines analógicos o PWM a los que se conecta. En cualquier caso, además de permitir la comprobación del buen estado y correcto funcionamiento de los módulos, estos códigos de ejemplo fueron de extraordinaria 1 Las bibliotecas necesarias para utilizar el módulo RFID-NFC se pueden descargar desde el repositorio oficial del proveedor en GitHub: https://github.com/elechouse/PN532 47 4.2. MONTAJE CAPÍTULO 4. HARDWARE utilidad para comprender cómo funcionan, cómo controlarlos, y en consecuencia, poder desarrollar sketches propios para practicar. En este sentido se desarrollaron diferentes sketches con la filosofı́a del Hello World! para familiarizarse con los módulos, a modo de entrenamiento para el propio autor. El siguiente paso es la integración de los módulos de manera progresiva hasta que funcionen en conjunto. Para esto se desarrollaron sketches que integraban los módulos por parejas. La filosofı́a de estos sketches se basaba en que un módulo se comportaba de un determinado modo en función de la lectura del otro módulo. De este modo, poco a poco se llegó a la integración total de los módulos. El carácter transitorio de este proceso y los inevitables futuros errores de montaje eléctrico y de código requerı́an que el montaje fı́sico fuese flexible y cómodo. Por ello se recurrió al montaje temporal basado en el uso de una breadboard o protoboard. Las siguientes imágenes muestran el primer prototipo del módulo, tanto a nivel de diseño2 como a nivel fı́sico. Figura 4.10: Diseño del prototipo. 2 Diseño realizado a través del software gratuito de código abierto Fritzing. 48 CAPÍTULO 4. HARDWARE 4.2. MONTAJE Figura 4.11: Esquema del prototipo. 49 4.2. MONTAJE CAPÍTULO 4. HARDWARE Figura 4.12: Vista frontal del prototipo. Figura 4.13: Vista trasera del prototipo. 50 CAPÍTULO 4. HARDWARE 4.2. MONTAJE Figura 4.14: Vista en perspectiva del prototipo. 4.2.2. Prototipo final Una vez comprobado el funcionamiento de todos los componentes integrados con el primer prototipo, se implementó el comportamiento final requerido para el módulo lector. Este firmware es objeto de estudio de capı́tulos posteriores. Tras comprobar de este modo que el módulo lector se comportaba tal y como se habı́a diseñado, se desarrolló un prototipo final. Si bien a nivel de programación los cambios son mı́nimos (fundamentalmente alguna modificación en los pines), los cambios a nivel hardware si son considerables. Al estar concebido el prototipo final para ser entregado al cliente, ha de perder el carácter temporal propio del primer prototipo. Para ello se han desarrollado: PCB: se ha elaborado una sencilla PCB (Printed Circuit Board ) con la finalidad de reducir el tamaño del prototipo. La PCB está pensada para soldar pines macho en los agujeros que tiene. Estos pines están agrupados por grupos (alimentación, masa y componentes) y por componentes (LCD, led, bluetooth y resistencias). De este modo pueden conectarse los componentes sin más que emplear cables jumper hembra entre dichos pines y los pines de los componentes. No obstante pueden no soldarse pines y soldar cables directamente. Este planteamiento se justifica por la necesidad de disponer los componentes 51 4.2. MONTAJE CAPÍTULO 4. HARDWARE tridimensionalmente en el módulo lector. Esta disposición espacial impide la conexión directa de los componentes en la propia PCB. El diseño, circuito y la placa real pueden observarse en las figuras 4.15, 4.16 y 4.17. Obsérvese cómo ha de fabricarse la PCB con el diseño en efecto espejo, puesto que el circuito ha de quedar en la capa inferior o bottom (los componentes se colocarán en la superior o top). Figura 4.15: Diseño de la PCB del prototipo. Figura 4.16: Circuito buscado en la PCB. 52 CAPÍTULO 4. HARDWARE 4.2. MONTAJE Figura 4.17: PCB fabricada en el taller del departamento de Electrónica. Carcasa: la PCB y los componentes que forman el módulo lector se encuentran contenidos en el interior de una carcasa diseñada por ordenador e impresa en 3D. El diseño de la carcasa es libre, pues el cliente no ha especficado requisitos en este sentido. Se ha diseñado una carcasa con las siguientes caracterı́sticas: • Tamaño reducido: el módulo lector ha de ser compacto y portátil. Esto no es una gran restricción al no ser elevado el número de componentes ni muy grande el tamaño de los mismos: • Zona vertical: para colocar al menos el LCD, pues es el modo más cómodo para que el usuario vea los mensajes mostrados. • Zona horizontal: para colocar al menos el sensor RFID-NFC, pues más cómodo para el usuario pasar un tag sobre una superficie horizontal. • Ranuras para los componentes: tal y como se describió anteriormente, los componentes se dispondrán tridimensionalmente dentro de la carcasa, por lo que se han aprovechado diferentes zonas en ella para colocar ranuras en las que insertar los componentes. Teniendo en cuenta las caracterı́sticas anteriores, se ha diseñado una carcasa que consta de 4 partes: • Base: superficie inferior del módulo lector. • Parte trasera: contiene el soporte para el módulo Bluetooth HC-05. • Cubierta: es la que contiene las zonas vertical y horizontal para el LCD y el sensor RFID-NFC respectivamente, y ranuras para la inserción de dichos módulos. Además cuenta con un agujero en la zona horizontal 53 4.2. MONTAJE CAPÍTULO 4. HARDWARE para posicionar el LED y cajeados en los que se inserta un embellecedor y la PCB. Incluye un agujero en el lateral por donde va el cable de alimentación del circuito. Se ha dividido en 2 partes para facilitar la impresión (la impresión de una sola pieza requerirı́a un aporte extra considerable de material para soportes auxiliares). • Embellecedor: permite identificar visualmente la zona por la que el usuario ha de pasar el tag. Se ha extruido además en esta pieza el logo de la empresa. Las siguientes figuras muestran la carcasa diseñada: Figura 4.18: Base de la carcasa. Figura 4.19: Embellecedor de la carcasa. 54 CAPÍTULO 4. HARDWARE 4.2. MONTAJE (a) Parte principal. (b) Lateral auxiliar. Figura 4.20: Cubierta de la carcasa. Figura 4.21: Parte trasera de la carcasa. 55 4.2. MONTAJE CAPÍTULO 4. HARDWARE Las siguientes imágenes muestran el proceso de ensamblado del módulo lector, una vez se ha impreso la carcasa y se ha efectuado el montaje del circuito: Figura 4.22: Módulo lector: carcasa y circuito electrónico. Figura 4.23: Módulo lector: encapsulación del circuito en la carcasa. 56 CAPÍTULO 4. HARDWARE 4.2. MONTAJE Figura 4.24: Módulo lector ensamblado y listo para su uso. 57 4.2. MONTAJE CAPÍTULO 4. HARDWARE 58 Capı́tulo 5 SOFTWARE En este capı́tulo se abordan los detalles referentes al software que gobierna los dos módulos que componen el sistema propuesto en este trabajo. Se expondrá en primer lugar en la aplicación Android desarrollada para el módulo del lado del personal y posteriormente se presentará el firmware del módulo lector. 5.1. App Android Como ya se ha mencionado a lo largo del presente documento, el módulo del lado del personal es un smartphone o una tablet que opere mediante el sistema operativo Android. Ası́ pues, se ha diseñado e implementado una aplicación (en adelante app) que cumpla los requisitos y los objetivos necesarios para permitir la completa funcionalidad del sistema. Para lograr una mejor comprensión del proceso de desarrollo y del funcionamiento de la app, se realizará una descripción de la misma desde diferentes puntos de vista: análisis, diseño e implementación. 5.1.1. Análisis En esta sección se exponen las caracterı́sticas que han conformado el sustento sobre el cual se ha diseñado e implementado la app. El fin último es fijar el marco en el que se ha de envolver, por lo que se describirán el propio sistema, y se presentarán los requisitos concretos del mismo, ası́ como los posibles casos de uso. 59 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Se debe remarcar la importancia de los requisitos del sistema. Su correcta identificación no sólo es fundamental para que el funcionamiento sea satisfactorio, sino que al ser un sistema particularmente adaptado a una aplicación concreta, una mala identificación de los requisitos supondrı́a un fracaso de cara al usuario final, que en este caso es el cliente. 5.1.1.1. Definición El objetivo principal es ofrecer al cliente una app que le permita controlar el módulo lector, entendiéndose este control no sólo como el gobierno de su comportamiento, sino también como la correcta adquisición e interpretación de los datos recibidos del mismo. El carácter dinámico de este trabajo, ha conllevado que este objetivo se vea ampliado por otra serie de caracterı́sticas. En efecto, las diferentes reuniones que se han mantenido con el cliente han tenido como resultado nuevas ideas, mejoras y modificaciones del sistema. Por este motivo, se busca además que la app posea las funciones necesarias para administrar y gestionar el negocio del cliente. Se distinguirán por tanto dos usos de la app. Por una parte, se ha de poder emplear durante el servicio de cafeterı́a, que es el objetivo fundamental. Por otra parte, se han de poder realizar otras funciones complementarias como añadir, eliminar o modificar la información almacenada en la base de datos, ası́ como otra serie de funciones que se han ajustado a la voluntad del propio cliente. De este modo, las dos grandes funcionalidades de la app propuesta son: Servicio: accederá a la pantalla en la que se podrá controlar el sistema durante el horario de servicio. Se deben incluir aquı́ todas las funciones necesarias para generar los registros de las consumiciones. Es aquı́ donde entra en juego el módulo lector. Opciones: accederá a un menú que ofrece al usuario (en este caso el propio cliente) todas las diferentes funcionalidades que ofrece la app y que se expondrán con mayor grado de detalle en la sección relativa a la implementación. Tanto durante el servicio como en alguna de las opciones de la app, es necesaria la comunicación con el módulo lector. El SDK de Android ofrece de manera nativa las funciones necesarias para efectuar conexiones Bluetooth con otros dispositivos. De igual modo, en apartados posteriores se especificará cómo gestionar la conexión por Bluetooth entre ambos módulos. 60 CAPÍTULO 5. SOFTWARE 5.1.1.2. 5.1. APP ANDROID Requisitos Para desarrollar la app es necesario recopilar las diferentes capacidades y restricciones que deba cumplir. Estos requisitos representan las especificaciones de las funcionalidades que han de ser resueltas. Son definidos tanto por el desarrollador como por el usuario, en este caso, el cliente. Tienen como objetivo plantear el problema y delimitar qué es lo que ha de cumplir la aplicación. Se pueden dividir según su naturaleza en: Requisitos de capacidad (RC): tienen por objetivo plantear soluciones ante problemáticas concretas. Requisitos de usuario (RU): tienen por objetivo establecer las condiciones que ha establecido el cliente. Estos requisitos se exponen aquı́ en forma de tablas que siguen el patrón siguiente: Identificador Descripción Necesidad Prioridad Tı́tulo: nombre del requisito Código que identifica unı́vocamente al requisito. Será de la forma RC-XX o RU-XX dependiendo si el requisito es de capacidad o usuario. Breve explicación del requisito. La descripción de los requisitos de usuario no es habitualmente demasiado técnica. Denota la importancia del requisito de cara al resultado global de la app. Podrá ser alta, media o baja. Indica la necesidad de abordar el requisito antes que otros. Podrá ser alta, media o baja. Tabla 5.1: Requisito patrón. Ası́ pues, los requisitos de la app son: Identificador Descripción Necesidad Prioridad Control de datos RC-01 El sistema permitirá un control total de la información: visualizar, añadir, modificar y eliminar datos. Alta Alta Tabla 5.2: RC-01: Control de datos. 61 5.1. APP ANDROID Identificador Descripción Necesidad Prioridad CAPÍTULO 5. SOFTWARE Almacenamiento de datos RC-02 El sistema permitirá almacenar datos tanto localmente como en la nube. Alta Alta Tabla 5.3: RC-02: Almacenamiento de datos. Identificador Descripción Necesidad Prioridad Sincronización RC-03 La información ha de ser accesible desde cualquier dispositivo que cuente con la app. Media Media Tabla 5.4: RC-03: Sincronización. Identificador Descripción Necesidad Prioridad Alertas sonoras RC-04 La app deberá emitir diferentes sonidos en función de si una consumición es aceptada o denegada. Media Baja Tabla 5.5: RC-04: Alertas sonoras. Identificador Descripción Necesidad Prioridad Información de la conexión con el lector RC-05 Cuando sea necesario el uso del módulo lector, la app deberá indicar el estado de la conexión con él. Media Baja Tabla 5.6: RC-05: Información de la conexión con el lector. 62 CAPÍTULO 5. SOFTWARE Identificador Descripción Necesidad Prioridad 5.1. APP ANDROID Control básico del lector RC-06 Puesto que el comportamiento del lector va implı́cito en su firmware, la app ha de limitarse a conectarse a él y a leer/enviarle datos. Alta Media Tabla 5.7: RC-06: Control básico del lector Identificador Descripción Necesidad Prioridad Modo de servicio RC-07 La app permitirá un uso del lector de modo manual, automático y mixto. Alta Media Tabla 5.8: RC-07: Modo de servicio. Gráficas Identificador Descripción Necesidad Prioridad RC-08 La app permitirá generar diferentes gráficas mostrando la distribución de consumiciones a lo largo del servicio, el número de consumiciones de un tipo a lo largo de un cierto periodo de tiempo, etc. Media Media Tabla 5.9: RC-08: Gráficas. Identificador Descripción Necesidad Prioridad Lista de la compra RC-09 La app ofrecerá la posibilidad de hacer la lista de la compra. Baja Baja Tabla 5.10: RC-09: Lista de la compra. 63 5.1. APP ANDROID Identificador Descripción Necesidad Prioridad CAPÍTULO 5. SOFTWARE Compartir imágenes RC-10 La app permitirá compartir imágenes con otras aplicaciones (particularmente se orientará a Instagram). Baja Baja Tabla 5.11: RC-10: Compartir imágenes. Identificador Descripción Necesidad Prioridad Interfaz de usuario (UI) RU-01 La app ha de tener una interfaz sencilla para garantizar la usabilidad de la misma. Alta Alta Tabla 5.12: RU-01: Interfaz de usuario (UI). Identificador Descripción Necesidad Prioridad Conectividad automática RU-02 La conexión con el módulo lector y con la nube se ha de hacer automáticamente, liberando al usuario de la necesidad de efectuar una conexión manual. Alta Alta Tabla 5.13: RU-02: Conectividad automática. Contraseña Identificador Descripción Necesidad Prioridad RU-03 Sólo se podrá acceder a las opciones de la app mediante la introducción de una contraseña únicamente conocida por el personal. Esta contraseña deberá poder ser modificada si se desea. Alta Baja Tabla 5.14: RU-03: Contraseña. 64 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Plataforma Identificador Descripción Necesidad Prioridad RU-04 La app será funcional a partir de la versión 4.2 de Android (JellyBean). Alta Alta Tabla 5.15: RU-04: Plataforma 5.1.2. Diseño e implementación La solución propuesta de cara al módulo del lado del personal es una app llamada Cafeterı́a RUGP, siendo el principal objetivo de este apartado la descripción de la estructura y el funcionamiento de dicha app. Para ello se expondrá la estructura del proyecto, presentando las clases existentes y un diagrama de navegación entre las clases que en la app aparecen como pantallas (se recuerda que este tipo de clases se denominan también activities). Posteriormente se incluyen los aspectos más relevantes de cara a la implementación de la app. Se comienza con los cimientos que sustentan su comportamiento para llegar a descripciones más funcionales y especı́ficas. Ası́ pues se parte de los dos pilares fundamentales de la app: la base de datos y la comunicación Bluetooth con el módulo lector. Ambos son fundamentales de cara a proporcionar robustez a la app, y por tanto merece la pena invertir un tiempo superior en estos apartados. Posteriormente se comentan las bibliotecas externas que se incluyen en la app, ası́ como la justificación de su uso. Por último se pasará a una descripción más funcional de la app, presentando las opciones y funcionalidades que ofrece al usuario. 5.1.2.1. Clases El proyecto consta de una serie de clases que en su conjunto forman la app que se presenta en este trabajo. Estas clases se han dividido en 5 grupos según su finalidad, y se presentan en la tabla 5.16. Se han establecido las categorı́as presentadas en la tabla atendiendo a la funcionalidad de las clases que incluyen. En concreto: 65 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Ajustes Backups CambioGeneral CambioIndividual Estadisticas GenerateEntries gestor residentes gestor tags Graficas Historial registros Activities HomeActivity Instagram ListaCompra newItemListaCompra newResidente newTagRoom OtrasFuncionalidades ResidenteView Servicio ListaCompraCategoriaAdapter ListaCompraElementosAdapter RegistrosAdapter Adapters ResidentesAdapter TagRoomAdapter Admin Horario ItemCompras MediaPension Classes Registro Residente TagRoom BluetoothNotAvailableException Exceptions BluetoothNotEnabledException BluetoothHelper ICallback ItemClickSupport Utils MyDB ResidentesConstants WrappingRecyclerViewLayoutManager Tabla 5.16: Clases del proyecto 66 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Activities: como el propio nombre indica, las clases incluidas en este grupo son las que aparecen como pantallas en la app. Adapters: algunas pantallas de la app contienen RecyclerViews, que es un widget que permite mostar listas de otros widgets. Los adapters son las clases que permiten la interacción del usuario con cada widget de la lista mostrada en el RecyclerView. Classes: las clases de este grupo son las que se emplean para leer la información almacenada en la base de datos (se profundizará en esto al hablar de la gestión de la información en la app). Exceptions: son dos clases que se emplean para detectar los casos en los que el Bluetooth del dispositivo no esté disponible o esté desactivado. Utils: están incluidas aquı́ ciertas clases auxiliares con finalidad propia. Se comenta brevemente la función de cada una: • BluetoothHelper: clase que encapsula la lógica del control del Bluetooth del dispositivo. • ICallback: interfaz que implementan las clases que requieren el uso del Bluetooth. Se profundizará en la clase BluetoothHelper y en esta interfaz al hablar de la gestión del Bluetooth en la app. • ItemClickSupport: código abierto1 que implementa un método similar al onClick de los widgets de Android para los widgets de un RecyclerView. Esto puede hacerse desde el adapter sin emplear esta clase, aunque de manera menos directa. No obstante se incluyó esta clase para comprobar cómo puede realizarse la misma tarea de diferentes maneras. Ası́ pues, las diferentes RecyclerViews de la app implementan la gestión de las pulsaciones de un modo u otro. • MyDB: es la clase que permite gestionar la base de datos. Se estudiará en detalle cuando se exponga la gestión de la información en la app. • ResidentesConstants: clase que contiene 3 constantes que sirven para reutilizar un mismo adapter pero con diferentes condiciones. En concreto se usa para el adapter del RecyclerView que muestra la lista de residentes, puesto que esta lista aparece en varias activities, pero las opciones que ha de implementar depende de qué activity contenga la lista. • WrappingRecyclerViewLayoutManager: se trata de una clase que permite implementar RecyclerViews anidados, esto es, RecyclerViews de RecyclerViews, algo que el layout nativo no permite. Se emplea para la lista de la 1 ItemClickSupport: Handle-Android-RecyclerView-Clicks/ 67 http://www.littlerobots.nl/blog/ 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE compra, en la que las categorı́as se muestran en un RecyclerView, y cada categorı́a contiene otro RecyclerView con los productos asociados a ella. Es una clase creada por el desarrollador ruso Denis Nek. 5.1.2.2. Diagrama de navegación Las clases de un proyecto, junto con sus atributos y métodos, y la relación entre las mismas suelen presentarse como modelos o diagramas de clases (por ejemplo siguiendo el estándar UML). Teniendo en cuenta la extensión que presentarı́a el diagrama de clases de este proyecto y el flaco favor a la mejora de la comprensión global de la app lo hace poco interesante en este trabajo. Sin embargo la futura implementación de la app sı́ puede comprenderse más fácilmente con una simplificación de un diagrama de clases. Se presenta con este objetivo el diagrama de navegación de la figura 5.1, que muestra las activities y el camino que las relaciona. Figura 5.1: Diagrama de navegación de la app. 68 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Una vez que se ha presentado una visión global de la app, se exponen en lo sucesivo aspectos relativos a la implementación de la misma. 5.1.2.3. Gestión de la información La descripción de la app que se ha hecho a lo largo de los epı́grafes previos justifica la necesidad de desarrollar una app configurable y flexible, capaz de añadir, modificar, eliminar y almacenar una serie de datos e información que se presenta en este apartado. Ası́ pues, es fundamental la integración de una base de datos en la app. Base de datos local: SQLite Existen diversos motores de bases de datos, sin embargo SQLite es el que reúne las caracterı́sticas adecuadas para que sea cómodo usarlo en apps [16]. Entre estas caracterı́sticas destacan: No requiere el soporte de un servidor, con lo que no hay que trabajar mediante peticiones. Libera al programador de tareas de configuración de bajo nivel. Almacena la base de datos en la carpeta de la propia app, con lo que otras apps no pueden acceder a ella. Es de código abierto. No obstante, SQLite tiene ciertas limitaciones a la hora de implementar ciertas cláusulas que otros motores sı́ posibilitan. Sin embargo esto no será un problema en la app propuesta. Además, el SDK de Android ofrece una biblioteca con clases para administrar los archivos bases de datos basadas en SQLite. Por lo anteriormente explicado, se escoge este motor para manejar la base de datos de la app de este trabajo. Considérese llegados a este punto, una habitación cualquiera de la residencia. Se pueden observar dos parámetros asociados a la misma: el tag que la identificará, y el residente que la ocupará. Estos parámetros guardan una diferencia fundamental: la duración. Mientras que un tag puede estar asociado permanentemente a una misma habitación (salvo deterioro o pérdida), el residente es temporal. En efecto, un residente ocupará una habitación durante un cierto periodo de tiempo, y posteriormente cambiará de habitación si alguna más acorde a sus preferencias queda libre, o bien finalizará su estancia en la residencia (cuando termine 69 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE el curso académico, por ejemplo). Ası́ pues, queda constancia del carácter fijo y temporal de los tags y residentes, respectivamente. De esta apreciación se deducen dos conclusiones necesarias para estructurar la base de datos: Los códigos de los tags y los perfiles de los residentes han de almacenarse en tablas diferentes en la base de datos, quedando ambos relacionados por la habitación a los que están asociados. La app ha de posibilitar las modificaciones pertinentes debidas a los cambios de habitación. Hecho este matiz se presentan las diferentes tablas de la base de datos, indicando además los campos que contienen, ası́ como su tipologı́a2 : TAGROOM: contiene los códigos de los tags (TEXT) y la habitación a la que éstos se asocian (INTEGER). RESIDENTES: almacena los perfiles de usuario de los residentes mediante campos TEXT: nombre, apellidos, tipo de pensión (media pensión o pensión completa), y campos INT: habitación, y menús y desayunos disponibles. LISTACOMPRA: los campos de esta tabla son los necesarios para poder gestionar la lista de la compra. Son el nombre, categorı́a y medio en el que se adquiere un producto (TEXT), y dos campos de tipo INT: la cantidad a comprar, y un campo auxiliar llamado borrar que es INT puesto que SQLITE no admite el tipo boolean. Este serı́a el tipo recomendado, puesto que es un campo cuyo valor indica si un elemento de la lista de la compra se ha de eliminar o no. Tablas de registros de consumiciones: se trata de 3 tablas que guardan información asociada a las consumiciones que se efectuan. Las 3 tienen los mismos campos, pero se ha decidido independizarlas entre sı́ puesto que esto permite realizar operaciones especı́ficas a cada una. Estas tablas son: • DESAYUNOS. • COMIDAS. • CENAS. Contienen los campos TEXT del residente que efectúa la consumición (nombre, apellidos, tipo de pensión y habitación) y además contiene campos INT para guardar la hora, minuto, segundo, dı́a, mes y año a la que la consumición se efectúa. Por último tiene un campo TEXT que contiene el tipo de tabla 2 Los tipos requeridos son INT, TEXT, e INT PRIMARY KEY, para los valores numéricos (int, float, long...), las cadenas de texto (String), y los identificadores de cada registro, respectivamente. 70 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID (desayuno, comida o cena) que es útil para ciertas funciones que se ejecutan en otras clases. Otras tablas: se recogen a continuación las restantes tablas, que, si bien de menor relevancia que las anteriores, tienen su razón de ser. • HORARIOS: es la tabla en la que se guardan los horarios de comienzo y fin de los diferentes servicios (desayunos, comidas y cenas). La necesidad de almacenar y modificar estos datos radica en que la app detecta el tipo de consumición que se va a efectuar en base a la hora que es. Fuera de horario, antes de efectuar la consumición, se pide al usuario que indique el tipo. De este modo, el propio usuario puede modificar a su criterio los horarios para que estas peticiones aparezcan con menor frecuencia. Ası́ pues, se almacenan como TEXT el tipo de consumición (desayuno, comida o cena) y el tipo de horario (comienzo o fin). Como INT se guardan la hora y el minuto. • ADMIN: es una tabla cuya misión es exclusivamente almacenar la contraseña de acceso a las opciones de la app, contraseña que al ser numérica se almacena en un campo de tipo INT. • MEDIAPENSIÓN: Los residentes adscritos al sistema de media pensión cuentan con 30 menús (indistintamente se consuman como comidas o cenas) y 20 desayunos mensuales. Por otra parte, un residente recibe nuevas consumiciones cuando abona las cuotas pertinentes, algo que se hace de manera trimestral. De este modo, el usuario puede guardar estos valores para que al crear las fichas de nuevos residentes se asignen de manera automática a los residentes de media pensión. Además al poder modificarlos, si en el futuro la empresea decide ofrecer más o menos consumiciones por trimestre, seguirá siendo posible asignarlos automáticamente, pues bastará con cambiar el valor desde la pantalla correspondiente. Cada elemento que se almacene en la base de datos, independientemente de la categorı́a a la que pertenezca, dispondrá de un campo denominado id, de tipo INT PRIMARY KEY, que servirá para identificar unı́vocamente cada elemento de cada tabla. La clase encargada de gestionar la base de datos es MyDB, que incluye los atributos y métodos necesarios para crear, actualizar y eliminar las tablas que contiene la base de datos. Además, MyDB contiene los métodos que otras clases necesitan para desempeñar sus respectivas funciones relacionadas con la información de la base de datos. Estas clases requieren un procedimiento adecuado para leer los datos de la base de datos, que no dejan de ser filas y columnas de diferentes tablas. 71 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Dicho procedimiento consiste en generar diferentes clases (una por cada tipo de dato almacenado) que cuentan con un constructor y con los métodos get(), o getters que proporcionan la información previamente leı́da de la base de datos. La figura 5.2 representa gráficamente la relación descrita. Figura 5.2: Clases cuyas instancias permiten leer la información de la base de datos. Las instancias de estas clases (u objetos) que se emplean en las distintas activities de la app se crean mediante los métodos incluidos en MyDB. Estos métodos se basan a su vez en otros métodos que ofrece el SDK de Android y que están basados en sentencias SELECT de SQL. Ası́ se pueden leer las entradas de la base de datos que se ajusten a un cierto criterio. 72 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Los atributos de estos objetos coinciden con los campos de las tablas a los que están asociados. Los valores numéricos (INT) de las tablas son almacenados como variables int y las cadenas alfanuméricas (TEXT) como variables String. Como ejemplo se presenta el fragmento de código 5.1 que genera un objeto de tipo TagRoom. Para ello es necesario leer de la tabla TAGROOM la entrada cuya id coincida con la deseada (pasada a la función como parámetro). 1 public TagRoom getTAGROOMwithID(int id) { 2 3 SQLiteDatabase db = getReadableDatabase(); 4 TagRoom tagroom = null; 5 String[] valores_recuperar = {"_id", "room", "tag"}; 6 7 //Lectura de la base de datos 8 Cursor c = db.query(TAGROOM,valores_recuperar,"_id="+id,null,null, null,null,null); 9 if(c != null) { 10 //Lectura de los valores de la entrada 11 int id = c.getInt(0); 12 int room = c.getInt(1); 13 String code = c.getString(2); 14 //Creacion de instancia 15 tagroom = new TagRoom(id,room,code); 16 c.close(); 17 } 18 19 db.close(); 20 return tagroom; 21 } Listing 5.1: Lectura de registros de la base de datos. Definida pues la estructura y el funcionamiento de la base de datos, es de fundamental importancia de cara al cliente no perder la información que ésta contiene. Se plantearán dos tipos de almacenamiento: local y en la nube. Almacenamiento local El SDK de Android ofrece la posibilidad de que una app guarde información en un medio de almacenamiento externo, que en el caso de los smartphones o las tablets es una tarjeta SD3 . Ası́ pues, se aplicará esta funcionalidad de cara a exportar datos a una tarjeta SD. De este modo en caso de deterioro del dispositivo, la información quedará a salvo en dicha tarjeta. 3 Tarjetas de memoria con formato Secure Digital, del cual puede obtenerse más información en su página web oficial: https://www.sdcard.org/ 73 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Las funciones necesarias para llevarlo a cabo están incluidas en dos clases diferentes. Por un lado, en la clase HomeActivity se crean los directorios necesarios en los que posteriormente se almacenará la información. Sólo se crean si no existen previamente, de modo que en condiciones normales se crearán al iniciar la app por primera vez. No obstante, de este modo se garantiza que si por algún motivo se borra una carpeta, ésta se regenere al abrir de nuevo la app. Con esto se asegura la existencia de los directorios en los que almacenar la información localmente en la tarjeta SD. El árbol de directorios creado se observa en la figura 5.3. Figura 5.3: Árbol de directorios creado por la app. La copia de seguridad de la base de datos se almacenará en la carpeta Database. Por completar la descripción: en la carpeta Fotos se guardarán las fotos de las fichas de los residentes, en Instagram quedarán las copias locales de las fotografı́as que se tomen desde la funcionalidad expresamente diseñada para ello, independientemente de que se lleguen a compartir en Instagram u otra app o no. En Lista de la compra se almacena un fichero txt en el que aparece una representación escrita de la lista de la compra de la app. Por último, en Registros se crean a su vez 3 subdirectorios para los desayunos, las comidas y las cenas, en los cuales se almacenan de nuevo ficheros txt con los registros de las consumiciones (un fichero por dı́a y carpeta). Por otro lado, la clase Backups es la que ofrece al usuario la posibilidad de manejar las copias de seguridad de la base de datos. Esta clase se presenta como una activity tal y como se observa en la figura 5.4. Cabe diferenciar llegados a este punto las 3 bases de datos con las que trabaja la app, y que coinciden con los 3 apartados de la clase Backups (figura 5.4): 1. Base de datos: es la base de datos que necesita la app para funcionar. Es la que se modifica durante el uso de la app, y que no es accesible de manera externa. Es por tanto de la que se desean generar copias de seguridad. 74 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.4: Clase Backups. La única opción disponible es la dada por el botón SUBIR. Su función es la de generar una copia de seguridad tanto en la tarjeta SD como en la nube. Ası́ pues, realiza una copia del fichero database.db guardado en el espacio de la app, y la duplica tanto en la carpeta Database del árbol de directorios, como en la nube. Por tanto mediante un simple botón, el usuario salva la información de las dos formas deseadas. 2. Backup local: es la copia de seguridad de la base de datos que se almacena en la tarjeta SD (base de datos almacenada localmente). En este caso la opción disponible para el usuario es la dada por el botón DESCARGAR. Su función es la de restaurar la base de datos de la app con la copia de seguridad almacenada localmente. Básicamente comprueba si existe una copia de seguridad en la tarjeta SD, y en caso afirmativo, sustituye la base de datos de la app por dicha copia de seguridad. 75 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Puesto que la restauración de la base de datos conlleva la pérdida del estado actual de la misma, hay que solicitar la confirmación del usuario para evitar una restauración accidental. Para ello se muestra un diálogo de alerta o Alert Dialog como el de la figura 5.5. Este es sólo un ejemplo de los numerosos diálogos de confirmación que lanza la app, puesto que ciertas opciones deben protegerse de este modo para evitar pérdidas de información. Figura 5.5: Diálogo de confirmación. Por tanto, gracias al backup local, en caso de deterioro del dispositivo o reinstalación de la app, se puede restaurar la base de datos sin necesidad de conexión a internet, siempre que la tarjeta SD no esté dañada. De ser éste el caso, habrı́a que recurrir a la restauración de la base de datos mediante el backup en la nube. 3. Backup en la nube: es la copia de seguridad de la base de datos que se almacena en la nube y que se detallará en profundidad en el apartado siguiente. Almacenamiento en la nube: Google Drive Se ha expuesto hasta ahora un método de almacenamiento permanente a nivel local, pero el cliente estimó oportuna la posibilidad de almacenar la información en la nube. De este modo no sólo se cubre la posibilidad de pérdida de información por deterioro de la tarjeta SD, sino que se abren las puertas a una sincronización de la información entre diferentes dispositivos que tengan la app instalada. El SDK de Android no ofrece una funcionalidad nativa para esto. Por ello se torna necesario emplear una herramienta alternativa. Atendiendo al criterio económico, resulta razonable buscar opciones gratuitas. Los servidores en la nube contemplados, por su popularidad y fiabilidad, son Google Drive y Dropbox. Ambas herramientas ofrecen APIs para la integración de sus servicios en el desarrollo de una app. 76 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Dropbox ofrece una API4 bien documentada y completamente funcional de cara al propósito de la app de este trabajo. Google Drive ofrece dos APIs5,6 perfectamente documentadas y que sin duda permiten cumplir los objetivos de la app: Google Drive Android API (GDAA): se trata de una API de alto nivel que permite tratar archivos y carpetas en Drive como si fueran locales. Esto implica que pueden realizarse copias de seguridad a pesar de que no se disponga de conexión a internet. La propia API actualizará o sincronizará los datos en la nube cuando sı́ se disponga de conexión, con lo cual el desarrollador se despreocupa de estos aspectos. Google Drive REST API (REST): ofrece funciones de bajo nivel para realizar procesos más complejos que la API anterior. Sin embargo en este caso es el desarrollador quien tiene que prestar especial atención al estado de la conexión a internet, pues esta API no ofrece el acceso offline ni la sincronización automática que sı́ ofrece la API GDAA. La elección de un servidor u otro, puesto que no se tiene una restricción en este sentido, depende del trabajo que conlleve la integración del mismo en la app. En efecto, es objetivo de este trabajo lograr el almacenamiento de los datos en la nube, pero no el desarrollo de una API propia o introducirse en funciones de bajo nivel para lograrlo. Desde esta perspectiva, se descarta la API REST de Google Drive. Entre la API de Dropbox y la API GDAA de Google Drive no existen diferencias fundamentales para los objetivos que busca la app. Ası́ pues, y teniendo en cuenta que ambas opciones son válidas, se opta por la API GDAA de Google Drive por disponer de una más amplia documentación. Además, al ser de Google, las tareas de autenticación o login se realizan de un modo más sencillo desde la plataforma Android. Para trabajar con Google Drive hay que seguir una serie de instrucciones que se indican en la documentación oficial7 . En primer lugar hay que descargar, si no se posee ya, el SDK de los servicios de Google Play, o Google Play services SDK. Este SDK es el que incluye la Google Drive Android API. A continuación hay que registrar la app para poder interactuar con la API. Esto 4 Dropbox - Core API: https://www.dropbox.com/developers-v1/core Google Drive Android API: https://developers.google.com/drive/android/ intro 6 Google Drive REST API: https://developers.google.com/drive/v2/web/ about-sdk 7 Pasos para emplear la GDAA: https://developers.google.com/drive/android/ get-started#overview 5 77 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE significa registrar un nuevo proyecto en la Google Developers Console que incluya la app desarrollada. Para ello hay que introducir una huella digital o resumen MD58 del fichero de claves de prueba. Este archivo, almacenado en la carpeta de usuario del desarrollador, se llama debug.keystore. Es un archivo que contiene las claves o firmas digitales necesarias para verificar la autorı́a de una app durante su desarrollo (si la app se publica en Google Play, el desarrollador deberá generar explı́citamente una clave para firmar con ella la app). El resumen MD5 del archivo debug.keystore se obtiene desde la consola del Android Studio mediante el código 5.29 . Tras introducir el comando anterior, la consola de Android Studio nos proporciona la huella digital buscada, con un aspecto como el que muestra el código 5.3. 1 keytool -exportcert -alias androiddebugkey -keystore RUTA %AL %ARCHIVO %debug.keystore -list -v Listing 5.2: Obtención del resumen MD5 del archivo debug.keystore. 1 Huella digital de certificado (MD5): 2 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX Listing 5.3: Huella digital obtenida. Introduciendo en la Google Developers Console el código anterior, y seleccionando las APIs que se desean emplear en el desarrollo, la app quedará registrada como se observa en la figura 5.6. Figura 5.6: Registro de la app en la consola de Google. 8 MD5: el Message-Digest Algorithm 5, o algoritmo del resumen del mensaje 5 es un algoritmo criptográfico ampliamente usado que genera un código (resumen) a partir de un contenido digital cualquiera[2]. 9 Generación de huellas digitales y autorización de uso de APIs de Google: https:// developers.google.com/drive/android/auth 78 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID En ella se muestra la sección Credenciales de la web, en la que se comprueba que está habilitado un cliente de Drive con un identificador único. Este procedimiento permite emplear cualquier API de las que se ofertan en la web, siendo la necesaria para este trabajo la API de Google Drive. Como ejemplo, se expone el fragmento de código 5.4, que muestra el método updateDriveDb que tiene por finalidad guardar la copia de seguridad de la base de datos en Google Drive. En el fragmento de código 5.4 se observa el uso clases, métodos e interfaces de la API de Google Drive que es posible tras el registro de la app expuesto anteriormente. 1 private void updateDriveDb(final File fileToSave) { 2 Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback (new ResultCallback<DriveApi.DriveContentsResult>() { 3 @Override 4 public void onResult(DriveApi.DriveContentsResult result) { 5 if (!result.getStatus().isSuccess()) { 6 Toast.makeText(Backups.this, "Ha ocurrido un error al preparar los archivos para subir.", Toast.LENGTH_LONG). show(); 7 return; 8 } 9 OutputStream outputStream = result.getDriveContents(). getOutputStream(); 10 //Los ficheros han de subirse a Drive como cadenas de bytes 11 byte[] bArray = file2Bytes(fileToSave); 12 try { 13 outputStream.write(bArray); 14 } catch (IOException e1) { 15 Toast.makeText(Backups.this, "No ha sido posible subir los archivos.", Toast.LENGTH_LONG).show(); 16 } 17 MetadataChangeSet metadataChangeSet = new MetadataChangeSet .Builder() 18 .setMimeType("application/x-sqlite3") 19 .setTitle("database.db") 20 .build(); 21 IntentSender intentSender = Drive.DriveApi 22 .newCreateFileActivityBuilder() 23 .setInitialMetadata(metadataChangeSet) 24 .setInitialDriveContents(result.getDriveContents()) 25 .build(mGoogleApiClient); 26 try { 27 startIntentSenderForResult(intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0); 28 } catch (SendIntentException e) e.printStackTrace(); 29 } 30 }); 31 } Listing 5.4: Subida de la base de datos a Google Drive. 79 5.1. APP ANDROID 5.1.2.4. CAPÍTULO 5. SOFTWARE Bluetooth La comunicación con el módulo lector pasa por incluir en la app las funciones necesarias para el control del Bluetooth del dispositivo. Se presentan en este apartado los aspectos fundamentales de dicho propósito. El SDK de Android posee funcionalidades elementales para la gestión del Bluetooth. Algunas de ellas son el encendido y apagado, detección de estado y cambios de estado, etc. Estas funciones se presentan como métodos de diferentes clases incluidas en el SDK, con lo que no es necesario ningún paso previo como ocurre para la API de Google Drive. No obstante, es tarea del desarrollador emplear estas herramientas del SDK para que el funcionamiento del Bluetooth se ajuste a los requisitos de la app. Puesto que el Bluetooth es necesario en más de una activity, es razonable encapsular todo lo relacionado con él. Para ello se emplean los siguientes ficheros: La clase BluetoothHelper : implementa la lógica del funcionamiento del Bluetooth. Incluye los métodos necesarios para el correcto funcionamiento de la app: conexión y desconexión, lectura y escritura de datos, y emparejamiento con otro dispositivo. Esta última funcionalidad está particularizada para la app de este trabajo. Al ser fijo el dispositivo al que ha de emparejarse (se requiere el uso del Bluetooth especı́ficamente para emparejarse al módulo lector), basta con incluir en el código de manera especı́fica la dirección MAC del sensor Bluetooth HC05 contenido en el módulo lector. Ası́, en lugar de mostrar un listado de los dispositivos encontrados, se emparejará directamente con el módulo lector. El inconveniente de este proceder radica en que una posible sustitución por deterioro del sensor HC-05 conllevarı́a una actualización del código de la app con la MAC del nuevo sensor instalado. Sin embargo, de este modo se libera al usuario del emparejamiento manual (algo que sugirió el propio cliente), y el emparejamiento erróneo con otro dispositivo. La interfaz ICallback : las interfaces son colecciones de métodos abstractos que heredan las clases que implementan dichas interfaces. En este caso, la interfaz contiene sólamente uno: el método call. Toda activity de la app que requiere el uso de Bluetooth implementa esta interfaz, y por tanto implementan sus particulares métodos call. Se expone a continuación las lı́neas generales de la integración de ambos ficheros con las diferentes clases que lo requieren. 80 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Las instancias de la clase BluetoothHelper son los objetos que una activity emplea para usar el Bluetooth. El constructor recibe como parámetro la activity que lo llama, de modo que la instancia generada puede inicializar una variable de tipo ICallback, que hereda el método call. Este método recibe como parámetro el String que contiene los datos leı́dos (es necesario convertirlos, pues en crudo se recibe una cadena de bytes), y es llamado con cada lectura de datos en un proceso gestionado por un Thread y un Handler. Lo anteriormente descrito se puede observar en el extracto de código 5.5. 1 public class BluetoothHelper { 2 ... 3 private ICallback mCallback; 4 private Thread mWorkerThread; 5 private Handler mHandler(); 6 private String mData; 7 ... 8 private BluetoothHelper(Activity activity) { 9 mCallback = (ICallback) activity; 10 } 11 ... 12 private void beginListenForData() { 13 mHandler = new Handler(); 14 mWorkerThread = new Thread(new Runnable(){ 15 public void run(){ 16 ... 17 mData = new String(encodedBytes, "US-ASCII"); 18 ... 19 mHandler.post(new Runnable(){ 20 public void run(){ 21 mCallback.call(mData); 22 } 23 ... 24 } 25 } Listing 5.5: Integración de ICallback y BluetoothHelper. Como la variable de tipo ICallback se ha inicializado con la activity, al llamar al método call de esta variable, se ejecuta la lógica implementada en el método call de la activity. Por tanto, gracias a la interfaz ICallback y a BluetoothHelper, basta implementar un método call en cada activity que requiera Bluetooth. Este método recibe como parámetro un String con el código recibido del sensor. De este modo es sencillo programar la lógica necesaria para trabajar con la información recibida del módulo lector. La idea general descrita para encapsular la integración del uso del Bluetooth 81 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE en la app, se representa en la figura 5.7, en la que se observan las dos clases que lo emplean. Figura 5.7: Integración del Bluetooth en la app. La necesidad de estas activities de emplear el Bluetooth se debe a la funcionalidad de las mismas. Esto se comentará, junto a la funcionalidad del resto de activities, en una sección posterior. 5.1.2.5. Bibliotecas externas Los requisitos establecidos para el adecuado funcionamiento de la app suponen, en algunos casos, la necesidad de recurrir a bibliotecas creadas por terceros. En efecto, cumplir con ciertos requisitos excederı́a los objetivos de este trabajo al requerir una gran cantidad de horas de desarrollo que no estarı́an especı́ficamente dedicadas al fin último del trabajo. En su lugar, para implementar las funcionalidades relacionadas con estos requisitos, se recurre a bibliotecas externas. Ya se ha visto anteriormente un ejemplo de uso de estas bibliotecas cuando se presentó la de Google Drive. Al igual que ésta ofrece funciones especı́ficas para el almacenamiento en la nube, las demás bibliotecas proporcionan las herramientas necesarias para implementar otras funcionalidades deseadas en la app. 82 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Las bibliotecas, su función y justificación de uso son las siguientes: Support: se trata de un paquete de bibliotecas10 de Android que ya se presentó en la sección 3.1.2. Su uso es necesario para el diseño gráfico de la app. En concreto se emplean las siguientes bibliotecas: • AppCompat: añade soporte para la ActionBar (figura 5.8). Figura 5.8: ActionBar. • Design: permite emplear Material Design, que es la tendencia actual en diseño de interfaces de usuario. • Cardview y RecyclerView : permiten emplear dichas widgets, al no estar incluidas por defecto en la paleta de diseño (la cual incluye widgets más tı́picos como botones, switches, campos de texto...). Ion: biblioteca desarrollada por Koushik Dutta11 que entre otras funcionalides, se emplea en la app para incluir imágenes animadas con formato gif. Este tipo de imágenes no son soportadas de manera nativa por Android, de ahı́ la necesidad de uso de esta biblioteca. aChartEngine: biblioteca de código abierto que se emplea para la generación de gráficas. Las herramientas de dibujo que proporciona Android son bastante elementales, de manera que la creación de representaciones complejas como una gráfica es un proceso laborioso y que no concuerda con los objetivos principales de este trabajo. La elección de esta biblioteca frente a otras igualmente válidas se basa en que es de código abierto y gratuita. Otras bibliotecas consultadas resultaron ser de pago e incluso alguna de ellas requerı́a la instalación de una app externa en el terminal. Google Play Services: es la biblioteca necesaria para emplear las APIs de Google. Ası́ pues, se incluye para utilizar la Google Drive Android API, como ya se detalló anteriormente. Para incluir estas bibliotecas hay que añadirlas como dependencias en el fichero build.gradle del proyecto, como muestra el fragmento de código 5.6. 10 Se puede consultar información más detallada en la web oficial: https://developer. android.com/topic/libraries/support-library/features.html 11 Repositorio oficial: https://github.com/koush/ion 83 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE 1 ... 2 dependencies { 3 ... 4 compile ’com.android.support:appcompat-v7:23.1.1’ 5 compile ’com.android.support:design:23.1.1’ 6 compile ’com.android.support:cardview-v7:23.0.+’ 7 compile ’com.android.support:recyclerview-v7:23.0.+’ 8 compile ’com.koushikdutta.ion:ion:2.+’ 9 compile ’org.achartengine:achartengine:1.2.0’ 10 compile ’com.google.android.gms:play-services:7.8.+’ 11 } Listing 5.6: Bibliotecas importadas en build.gradle. Con esto concluye la exposición de los cimientos de la app. Las funcionalidades detalladas hasta ahora son las que permiten el desarrollo de aquélla. Analizada pues la base, en los siguientes epı́grafes se procede con la descripción funcional de la app, siguiendo el orden de presentación establecido al inicio de la sección. 5.1.2.6. Cafeterı́a RUGP La app desarrollada para este trabajo tiene como nombre su lugar de aplicación: Cafeterı́a RUGP. En efecto, el sistema de identificación contactless fruto de este trabajo se ha aplicado al servicio de cafeterı́a de la Residencia Universitaria GómezPardo, de cuyas siglas nace el nombre de la app. Se trata de una app que cumple dos funciones. Por una parte, satisface los objetivos del trabajo que se establecieron en el capı́tulo 1. Por otra parte, ha sido diseñada a medida, a gusto del cliente. Puesto que su aplicación es especı́fica a la cafeterı́a, se ha mantenido una estrecha colaboración con el responsable de la misma, quien ha sugerido nuevas funcionalidades y modificaciones de las ya existentes de manera que el sistema global sea válido desde su perspectiva para la gestión de su negocio. La pantalla principal de la app viene dada por la activity HomeActivity, y es la que se muestra en la figura 5.9. Como se puede deducir de dicha pantalla, se han dividido las distintas funciones de la app en dos grandes categorı́as, que se lanzan mediante los botones: Servicio: carga la pantalla pensada para funcionar durante el horario de servicio de la cafeterı́a. 84 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.9: Pantalla principal. Opciones: accede a un menú con las restantes funcionalidades de la app. Puesto que desde las opciones se pueden modificar los datos almacenados, se requiere una auntorización para acceder. Esto se logra mediante la petición de una contraseña numérica, como muestra la figura 5.10. Por defecto, esto es, tras instalar la app, la clave de acceso es 1234. Esta clave puede modificarse en los ajustes avanzados de la app, como se verá posteriormente. Se ha contemplado igualmente el caso en el que se modifique la contraseña y posteriormente se olvide. Esta situación impedirı́a el acceso a las opciones de la app, con lo que, entre otras cosas, no se podrı́an salvar las copias de seguridad. Por ello existe otro modo de acceder a las opciones: mediante una clave maestra. Se trata de un código secreto que es aceptado siempre. Por seguridad, se le entrega dicho código al cliente, quedando en él la responsabilidad de mantenerlo en secreto y no olvidarlo. 85 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Figura 5.10: Autorización para el acceso a las opciones de la app. Los siguientes epı́grafes exponen en detalle las funcionalidades incluidas en cada una de las dos categorı́as presentadas. 5.1.2.6.1. Servicio La activity Servicio permite al usuario desempeñar la funcionalidad principal del sistema: validar consumiciones tras la detección de tags por el módulo lector. Al entrar a esta pantalla, lo primero que se comprueba es el estado del Bluetooth del dispositivo. Si está activado, se intenta conectar al módulo lector. Si no, muestra un botón cuya función es activarlo, y posteriormente, ofrecer mediante un segundo botón la posibilidad de conexión manual. En cualquier caso, tras intentar conectarse al módulo lector, se indicará si la conexión ha sido establecida o no. Como la dirección MAC del sensor HC-05 está explı́citamente escrita en el código de la app, la conexión es directa si el módulo lector está encendido. Si está apagado, la conexión no será posible. 86 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID La información relativa tanto al estado del Bluetooth como al estado de la conexión se muestra al usuario a través de un par indicador-mensaje situado en la zona inferior de la pantalla. La figura 5.11 muestra el comportamiento descrito. Figura 5.11: Lógica de conexión entre los módulos durante en Servicio. 87 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Cabe destacar la primera conexión entre ambos módulos tras encender el módulo lector. Cuando éste último se enciende, entra en el primer estado, que es el de espera a la sincronización. Dicha sincronización se requiere para que el módulo lector posea información relativa a la fecha y la hora actual. Cada vez que el usuario accede a la pantalla Servicio, si la conexión es establecida, se envı́a el código SYNC BT al lector, seguido de un String que contiene la fecha y la hora en formato dd-MM-yyyy HH:mm. Este mensaje sólo es aceptado e interpretado por el módulo lector si éste se encuentra en estado de espera a la sincronización, esto es, tras encenderlo. De este modo el módulo lector se sincroniza con la app simplemente con entrar a la pantalla Servicio tras encenderlo, y a partir de ese momento, el módulo lector lleva su propia cuenta de la hora y la fecha. Por tanto, sólamente es necesaria la sincronización tras su encendido, motivo por el cual cabı́a destacar esta primera conexión entre ambos módulos. Una vez que los módulos han sido conectados y sincronizados, puede comenzar a usarse el sistema como conjunto. Se han implementado 3 modos de trabajo distintos: Modo manual: en este modo, el usuario puede generar consumiciones sin necesidad del módulo lector. Ası́, en caso de deterioro del lector, la app sigue siendo funcional. Puesto que se trata de un modo que no se empleará de manera habitual, no se ha reservado espacio en la interfaz gráfica para él, sino que se selecciona a través del menú de la pantalla Servicio. Modo automático: cuando la app opera en modo automático, el lector está constantemente activo y esperando tags. Los tags que son leı́dos lanzan un dialog personalizado que permite al usuario validar las consumiciones. Estos dialogs se comentarán en detalle posteriormente. Ahora bien, si un dialog está abierto y el lector lee un nuevo tag, se lanza un nuevo dialog, quedando el primero en segundo plano y por tanto inaccesible hasta que se cierre el dialog que se ha sobrepuesto. Esto es lo que se conoce como una pila de tipo LIFO (Last In First Out), pues los dialogs más recientes son los que se lanzan por encima de los anteriores. Esta lógica no es la apropiada para el interés de la app. En efecto, supuesta una cola de residentes que se identifican, el orden de aparición de los dialogs debe coincidir con el orden de los residentes, de manera que se pueda validar sus consumiciones en dicho orden. Por ello se busca el sistema contrario, esto es, una pila de tipo FIFO (First In First Out), pues es la que permite una lógica como la que se precisa. Para crearla se emplea una instancia de la clase LinkedList, pues combina las propiedades de la clase List (es necesario añadir y leer elementos) y de la clase Queue 88 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID (en concreto interesa el método remove, que ejecuta lo que serı́a un POP en la pila). Además se ha implementado el método deQueue encargado de lanzar los dialogs siguiendo el orden FIFO deseado. La integración de ambos se observa en el extracto de código 5.7 que se ejecuta al recibir un tag del módulo lector. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 LinkedList<String> fifoDialogStack = new LinkedList<String>(); public void call(String s) { ... //Si no hay codigos almacenados se llama //a deQueue() para lanzar el dialog if(fifoDialogStack.isEmpty()){ fifoDialogStack.add(s); deQueue(); } //Si hay, entonces hay un dialog abierto //luego solo se mete el codigo a la pila else{ fifoDialogStack.add(s); } ... } Listing 5.7: Sistema FIFO en modo automático. Los botones Aceptar y Cancelar del dialog eliminan el elemento actual de la pila, y llaman a deQueue. De este modo, es el cierre de cada dialog el que va llamando a deQueue para comprobar si quedan códigos registrados en la pila, y en cuyo caso, lanzar dialogs según el orden de registro de dichos códigos. Modo mixto: es el modo por defecto, que combina propiedades del manual y el automático. Del manual hereda la necesidad de operar individualmente mediante un botón. Del automático hereda la identificación del residente a través del tag leı́do mediante el módulo lector. En este modo, cada vez que el usuario pulsa el botón, el módulo lector se activa durante 10 segundos. Si en ese intervalo se detecta un tag, entonces el lector se desactiva, y la app lanza un dialog para la validación de la consumición. Si transcurren los 10 segundos sin detección de tag, el lector se desactiva hasta que se le vuelva a llamar, notificando al usuario mediante un AlertDialog que se ha alcanzado el lı́mite de tiempo de espera. Los diferentes modos de funcionamiento se representan en las figuras 5.12, 5.13 y 5.14. Los registros de las consumiciones realizadas durante el dı́a se muestran en la pantalla en orden descendente segun la hora a las que fueron efectuadas. 89 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Figura 5.12: Modos de funcionamiento en servicio: modo manual. Figura 5.13: Modos de funcionamiento en servicio: modo automático. 90 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.14: Modos de funcionamiento en servicio: modo mixto. Los dialogs de los que se ha hablado previamente son elementos emergentes que ofrecen al usuario información y opciones. Hay 2 tipos de dialogs en la pantalla Servicio, dependiendo del tipo de pensión del residente. Ambos dialogs muestran los datos del residente: foto, nombre, apellidos, habitación, tipo de pensión y notas. Además, los de residentes asociados al régimen de media pensión, muestran también el número de menús o desayunos (según el tipo de consumición que se vaya a efectuar) restantes, ası́ como un par de botones que permiten modificar el número de consumiciones a efectuar. Por otra parte, aparece también la fecha y la hora, ası́ como 3 botones que permiten validar o denegar la consumición (en caso de validar la consumición se envı́an al lector la habitación y el número de menús o desayunos restantes tras la validación, o un mensaje de consumición validada dependiendo del tipo de pensión del residente, de manera que éste está al tanto de su situación), ası́ como cambiar el tipo de consumición. En relación a esto último cabe destacar que teniendo en cuenta los horarios establecidos en los ajustes de la app, al generarse un dialog, éste deduce el tipo de consumición que se va a hacer (desayuno, comida o cena). Si la consumición se realiza fuera de horarios, se ha de introducir manualmente el tipo. Por último mencionar que la app informa al usuario si una consumición es aceptada o no mediante un mensaje Toast y una alerta sonora. En concreto, se denegará una consumición a los residentes de pensión completa si en el mismo dı́a 91 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE ya se ha validado una consumición del mismo tipo, y a los residentes de media pensión si en el tercer trimestre, el número de consumiciones de un determinado tipo es 0. Esto no es decisión del desarrollador, sino que es la polı́tica de la cafeterı́a. La figura 5.15 muestra dos ejemplos de estos dialogs. (a) Media pensión. (b) Pensión completa. Figura 5.15: Tipos de dialogs en función de la pensión del residente. 5.1.2.6.2. Opciones El menú de opciones de la app, mostrado en la figura 5.16, es el que se abre una vez se introduce la contraseña correcta en la pantalla principal tal y como se describió anteriormente. Se comentará a continuación cada una de las funcionalidades implementadas a las que se accede desde este menú. 92 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.16: Menú de opciones de la app. Tags Esta opción muestra al usuario la pantalla TAGs, que contiene la lista de habitaciones y el código del tag asociado a ellas, o un mensaje informando de que no hay un tag asociado en caso contrario. Al pulsar sobre una habitación determinada, se genera un menú popup que puede ser de dos tipos: Si la habitación no tiene un tag asociado, el menú contiene una única opción: introducir TAG. Tras leer un tag, el usuario introduce un número de habitación al que asociarlo. Si el número es válido, la asociación se habrá realizado con éxito. Si la habitación tiene un tag asociado, el menú contiene dos opciones: modificar TAG y eliminar. La modificación es similar al proceso de introducción. La eliminación borra el código asociado a la habitación (requiere autorización). El menú de esta pantalla muestra 3 opciones más: 93 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Búsqueda: aparecen un campo de texto en la action bar y un teclado numérico, posibilitando la búsqueda de una habitación concreta. Resetear lista: elimina todos los códigos almacenados (requiere confirmación). Comprobar TAG: muestra la habitación a la que está asociado un tag que se pase por el módulo lector (o informa de que no es un tag conocido). Las opciones de introducir, modificar y comprobar tags lanzan una nueva pantalla gestionada por la activity newTagRoom. Se trata de una activity que tiene como misión leer un tag del módulo lector y ejecutar una acción con el código leı́do. Por ello y tal como se mostraba en la figura 5.7, newTagRoom requiere el uso del Bluetooth, por lo que solo se lanzará la pantalla si el dispositivo tiene activado el Bluetooth y si está encendido el módulo lector. En caso contrario, se mostrará un mensaje Toast al usuario indicando el motivo (Bluetooth desactivado o lector no encontrado). El funcionamiento general se resume en la figura 5.17. Figura 5.17: Opciones relativas a los tags. 94 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Residentes Desde la pantalla Residentes se muestra una lista similar a la de la pantalla TAGs, con la lista de habitaciones, pero en este caso, la información mostrada es un resumen de los datos del residente asociado a cada una de ellas. El menú de opciones de esta pantalla permite realizar 4 operaciones: Búsqueda: similar al análogo de la pantalla TAGs, pero con la diferencia de que en este caso permite realizar búsquedas por nombre, por apellido y por número de habitación. Resetear lista: elimina los datos de todos los residentes (requiere confirmación). Ronda de tickets: lanza un dialog personalizado que permite al usuario indicar un número de menús y un número de desayunos que añadir a todos los residentes asociados al régimen de media pensión. La lista de estos residentes también se muestra en el dialog. Esta funcionalidad está pensada para ser empleada tras abonar los residentes las cuotas de un trimestre, pues esto les da derecho a 30 menús y 20 desayunos mensuales. Por tanto se evita tener que aumentar estos parámetros manualmente. Cambio de habitación: si bien un residente está asociado a una habitación, esto no es algo fijo. Pueden haber mudanzas a habitaciones vacı́as, intercambios consentidos entre dos o más residentes, etc. Por ello se han implementado dos tipos de cambios: • Cambio individual: el usuario selecciona un residente de la lista completa, y a continuación emerge un dialog con un campo de texto en el que ha de introducir el número de habitación a la que se va a mudar dicho residente. Este modo está pensado para el caso más habitual entre los cambios que se producen: mundanzas a habitaciones vacı́as. Por ello, si la nueva habitación está asociada a otro residente, se informa mediante un AlertDialog al usuario de que si confirma el cambio, se eliminarán los datos asociados al residente que hasta ahora ocupaba la habitación. • Cambio general: en este caso, el usuario puede modificar los números de habitación de la lista completa de residentes, pudiendo modificarse todas las habitaciones que se deseen. Para que la modificación sea efectiva, la app comprobará si todos los números de habitación son válidos y si no hay ninguno repetido, en cuyo caso, informará al usuario del error encontrado, de manera que en ningún caso se asocie a un residente a una habitación inexistente (y por tanto sin tag asociado) ni a dos o más residentes a la misma habitación. Estas funciones quedan representadas en la figura 5.18 95 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Figura 5.18: Opciones relativas a los residentes. Expuestas las funcionalidades generales, se comentan a continuación las funcionalidades relativas a cada residente de manera individual. Pulsando en una habitación se lanza la pantalla Ficha de residente, que muestra la información relativa al residente asociado a dicha habitación, o bien indica que la habitación está vacı́a, como puede comprobarse en la figura 5.19. (a) Habitación vacı́a. (b) Habitación ocupada. Figura 5.19: Fichas de residente. 96 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Como puede apreciarse también en dicha figura, cada tipo de ficha tiene unas opciones distintas en el menú. Una habitación vacı́a posee únicamente la opción de añadir un nuevo residente. Una habitación ocupada permite modificar los datos del residente actual, eliminarlo, o ver su historial de consumiciones. Esta última funcionalidad, mostrada en la figura 5.20, genera un mensaje con el registro de consumiciones del residente indicando el número de consumiciones de cada tipo ası́ como la fecha y la hora en la que se efectuaron. Figura 5.20: Historial de registros de un residente. Las opciones de añadir o modificar un residente lanzan la pantalla Nuevo residente, mostrada en la figura 5.21. Esta pantalla posee un formulario en el que se pueden introducir los datos pertinentes. Al acceder desde una habitación vacı́a, el formulario de esta pantalla está vacı́o y han de rellenarse al menos el nombre, el apellido y el tipo de pensión para que la ficha sea válida. Si se accede desde una habitación ocupada, el intent que lanza la pantalla contiene la información del residente asociado a la habitación, mostrándose sus datos en el formulario. 97 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Figura 5.21: Pantalla para añadir un residente o modificar sus datos. Archivos Desde la pantalla Archivos el usuario puede realizar operaciones que se enmarcan en las siguientes categorı́as: 1. Registros: ofrece una serie de funciones relativas a los registros de las consumiciones. Presentadas en las figuras 5.22 y 5.23, se comentan a continuación: Ver historial: lanza la pantalla Historial, que muestra todos los registros almacenados. Además, manteniendo pulsado un registro en concreto emerge un menú contextual que permite ver información detallada del registro, ver el historial de registros del residente, y eliminar el registro. Actualizar ficheros: genera ficheros txt y los almacena en los directorios creados para tal fin en la tarjeta SD, como se detalló en la sección relativa al almacenamiento local. También guarda en formato txt la lista de la compra. Ver copias de seguridad: muestra un calendario de manera que al seleccionar un dı́a, emerge un AlertDialog que muestra el registro de consumiciones de dicho dı́a. La información es presentada atendiendo a las preferencias del cliente: número total de consumiciones, número y desglose de desayunos, comidas y cenas. 98 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.22: Opciones relativas a los registros: historial y visualización de backups. Figura 5.23: Opciones relativas a los registros: generación de backups. 2. Estadı́sticas: esta opción lanza la pantalla Estadı́sticas, desde la cual el usuario puede generar una serie de gráficas que el cliente estimó interesantes. En esta pantalla entra en juego la biblioteca aChartEngine que se presentó anteriormente. 99 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Las gráficas pueden personalizarse atendiendo a diferentes parámetros: Estilo de gráfica: se pueden generar gráficas de lı́neas, barras o tartas. Las lı́neas son adecuadas para representar evoluciones temporales de las consumiciones de cara a analizar los picos de demanda. Las barras y las tartas son interesantes de cara a comparaciones del número de consumiciones de cada tipo que se han validado. Tipo de consumición: pueden generarse gráficas exclusivamente para desayunos, comidas o cenas, ası́ como gráficas de todas en conjunto. Perı́odo: en gráficas temporales pueden seleccionarse diferentes intervalos de tipo: el dı́a actual, la última semana, el último mes, el último año o un dı́a en concreto seleccionado desde un calendario que emerge análogamente al caso visto en la visualización de backups de registros. En caso de seleccionarse un diagrama de tartas, se habilita el intervalo Siempre, que tiene en cuenta todos los registros almacenados en la base de datos. Si el periodo escogido es el de un dı́a en concreto (dı́a actual o dı́a seleccionado del calendario), y además el tipo de consumición es también concreto (desayunos, comidas o cenas, pero no todos en conjunto), entonces el eje horizontal de la gráfica es el horario establecido para dicho servicio a intervalos de 15 minutos en comidas y cenas o de 30 minutos en el caso de los desayunos. La figura 5.24 muestra estas opciones de personalización de las gráficas que ofrece la app, mientras que la figura 5.26 muestra algunos ejemplos de gráficas que pueden generarse. 3. Lista de la compra: esta opción genera un AlertDialog que muestra como texto la lista de la compra. 4. Restauración: permite restaurar ciertos parámetros a sus valores por defecto. Por tanto, elimina los registros, y fija los valores de los horarios, contraseña y número de menús y desayunos de los residentes de media pensión. Los parámetros a restaurar pueden seleccionarse individualmente si se desea, y por supuesto, la restauración requiere confirmación. Las dos últimas opciones se muestran en la figura 5.25. 100 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Figura 5.24: Personalización de gráficas. Figura 5.25: Restauración de datos y visualización de la lista de la compra. 101 5.1. APP ANDROID (a) Diagrama de barras que muestra el número de desayunos servidos en la semana actual. CAPÍTULO 5. SOFTWARE (b) Diagrama de lı́nea que muestra la evolución temporal de comidas servidas durante el horario de servicio. (c) Diagrama de lı́nea que muestra el número de cenas servidas en la semana actual. (d) Diagrama de tartas que muestra una comparativa entre el número de consumiciones servidas. Figura 5.26: Ejemplos de gráficas generadas con la app. Lista de la compra Se trata de una pantalla que muestra los elementos añadidos por el usuario a la lista de la compra. Los elementos están organizados por categorı́as, y cuentan con un CheckBox de manera que son eliminados si éste está seleccionado cuando se pulsa 102 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID el botón de eliminar presente en el menú de opciones de la pantalla. Los productos se añaden a la lista mediante una plantilla que se lanza mediante el botón flotante de esta pantalla. La plantilla tiene los siguientes campos: Nombre: es el atributo principal, que identifica el producto a añadir a la lista. Categorı́a: es el nombre de la categorı́a en la que se incluirá el producto. Se selecciona de una lista que incluye categorı́as predefinidas. Cantidad y medida: son dos campos en los que se puede especificar cuánto y en qué forma se ha de comprar un determinado producto. No es necesario introducir estos datos si no se desea. La figura 5.27 muestra el funcionamiento descrito de la lista de la compra. Figura 5.27: Administración de la lista de la compra. Instagram La cafeterı́a cuenta con un perfil en la red social Instagram, en la cual suelen subir imágenes de los platos que preparan. Por ello se ha implementado una activity en la app desde la cual se pueden tomar fotografı́as y compartirlas. La pantalla cuenta con un único botón que envı́a un intent que abre la cámara, recibiendo además la imagen tomada desde la misma. Esta imagen se carga en el ImageView que ocupa la mayor parte de la pantalla, apareciendo además 2 nuevos botones. 103 5.1. APP ANDROID CAPÍTULO 5. SOFTWARE Ası́ pues, tras tomar una imagen se tienen 3 botones: Tomar imagen: permite tomar una nueva imagen, que sustituirá la tomada previamente. Compartir en Instagram: la finalidad de este botón era en un principio la de publicar la imagen en la red social. Sin embargo, Instagram no ofrece una API que permita llevar a cabo este propósito, por lo que se ha cambiado la funcionalidad del mismo. Se distinguen dos comportamientos: • Si el dispositivo tiene instalada la app oficial de Instagram, se abre dicha app y la imagen tomada se carga automáticamente en la pantalla previa a la publicación. Esto es lo más próximo a la propia publicación debido a la ausencia de una API de Instagram que lo permita. • Si el dispositivo no cuenta con la app de Instagram, el botón abre Google Play en la pantalla de la app Instagram para que el usuario la descargue si lo desea. Compartir: este botón carga una lista de todas las apps a través de las cuales se puede compartir la imagen, generalizando la funcionalidad de compartir que tiene la app. La figura 5.28 muestra lo anteriormente descrito. Figura 5.28: Pantallas destinadas a compartir imágenes tomadas desde la app. 104 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Backups La última funcionalidad a la que se accede mediante un botón del menú de opciones de la app es a la pantalla Backups. Esta pantalla (ver figura 5.4) es la que ofrece las funciones de subida y descarga de la base de datos, y la información relativa a ella se expuso al profundizar en el almacenamiento de la base de datos. Ajustes avanzados Por último se presenta la pantalla Ajustes avanzados, a la cual se accede desde el menú de la pantalla del menú de opciones de la app. Esta pantalla recopila los parámetros cuya modificación no encaja en ninguna de las pantallas anteriores. Estos parámetros son los horarios de apertura y cierre del servicio, los menús y desayunos trimestrales correspondientes a los residentes asociados al régimen de media pensión, y la contraseña de acceso. Pulsando en los valores de estos parámetros emergen dialogs personalizados. En concreto, un reloj en el caso de los horarios, y un campo de texto numérico para los demás. La figura 5.29 muestra esquemáticamente el funcionamiento de esta pantalla. Figura 5.29: Modificación de parámetros desde Ajustes avanzados. 105 5.1. APP ANDROID 5.1.2.7. CAPÍTULO 5. SOFTWARE Manifest Como ya se adelantó en el capı́tulo 3, el Android Manifest es el documento más importante de una aplicación. Describe la configuración básica de la app: activities que contiene, nombre, hardware necesario, permisos... Activities Todas las activities que participan en la app están declaradas en el manifest. Esto se realiza de manera distinta según el tipo de activity. La declaración de la main activity, esto es, la activity que se lanzará al abrir la app, se realiza mediante la estructura mostrada en el extracto del manifest 5.8. Como puede observarse, esta activity incluye un intent que la identifica como la actividad principal que ha de ser la mostrada al iniciar la app. 1 <activity 2 android:name=".Activities.HomeActivity" 3 android:label="Cafeteria RUGP"> 4 <intent-filter> 5 <action android:name="android.intent.action.MAIN" /> 6 <category android:name="android.intent.category.LAUNCHER" /> 7 </intent-filter> 8 </activity> Listing 5.8: Declaración de la activity principal. La declaración de las restantes activities es similar a la anterior, con la diferencia de no incluir el intent, como muestra el extracto de código 5.9. En la declaración de estas activities se pueden especificar configuraciones relativas a ellas. En concreto puede observarse en el extracto cómo la activity Servicio está fijada a una orientación vertical mediante el atributo screenOrientation incluido en su declaración. 1 2 3 4 5 6 7 8 9 10 11 ... <activity android:name=".Activities.Servicio" android:label="Servicio" android:screenOrientation="portrait"> </activity> <activity android:name=".Activities.Historial_registros" android:label="Historial"> </activity> ... Listing 5.9: Declaración de las activities no principales. 106 CAPÍTULO 5. SOFTWARE 5.1. APP ANDROID Permisos Algunas funcionalidades implementadas en la app requieren ciertas capacidades del dispositivo que no pueden emplearse salvo que el usuario lo consienta. Para solicitar dicho consentimiento hay que incluir en el Manifest los permisos necesarios. En el caso de la app de este trabajo, son los siguientes: Bluetooth: los permisos BLUETOOTH y BLUETOOTH ADMIN son necesarios para poder usar el Bluetooth del dispositivo y ası́ poder comunicar la app con el módulo lector. Almacenamiento: se necesitan los permisos READ EXTERNAL STORAGE y WRITE EXTERNAL STORAGE para poder leer y salvar datos en la tarjeta SD del dispositivo, algo necesario para el almacenamiento local que requiere la app. Internet: el permiso INTERNET hace posible que la app acceda a la nube, al- Figura 5.30: Pantalla de aceptación go necesario para el almacenamiento en de permisos previa a la instalación de la app. Google Drive implementado en la app. El extracto del Manifest 5.10 muestra el código que reúne los permisos necesarios para la app, algo que el usuario ha de aceptar al instalar la app, como muestra la figura 5.30. 1 2 3 4 5 ... <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission. READ_EXTERNAL_STORAGE" /> 6 <uses-permission android:name="android.permission. WRITE_EXTERNAL_STORAGE"/> 7 ... Listing 5.10: Permisos declarados en el Manifest. 107 5.1. APP ANDROID 5.1.2.8. CAPÍTULO 5. SOFTWARE Casos de uso Una vez que se han expuesto todas las funcionalidades disponibles de la app, se presentan en este apartado los casos de uso, como simplificación gráfica de las mismas. De este modo se presentan de manera resumida en la la figura 5.31 cada interacción que puede tener el usuario con la app, mejorando ası́ la comprensión global sobre la app. Figura 5.31: Casos de uso de la app. 108 CAPÍTULO 5. SOFTWARE 5.2. 5.2. MÓDULO LECTOR: FIRMWARE Módulo lector: firmware El módulo lector basado en Arduino que se ha desarrollado en este trabajo se comporta según el firmware que lo gobierna. Dicho firmware es un sketch en Arduino basado en una máquina de estados. Un sketch de Arduino posee de forma genérica las siguientes partes: Bibliotecas: llamadas a los ficheros .h necesarios. Definiciones y declaraciones: creación de las constantes y variables necesarias. Función setup: función que se ejecuta una única vez al arrancar el sistema. Por tanto suele emplearse para tareas que supongan una única configuración (inicialización de variables, objetos, etc). Función loop: función que se ejecuta en bucle y que contiene la implementación de la lógica del comportamiento del sistema. Funciones auxiliares: funciones creadas por el desarrollador y que pueden ser llamadas desde el setup o desde el loop. Comentarios: anotaciones que mejoran la comprensión del código. No se cargan en la placa, por lo que no ocupan memoria. A nivel de programación, el módulo lector tiene menor complejidad que la app presentada en la sección anterior. El desarrollo un firmware que permita el comportamiento necesario se basa en un diseño adecuado de la máquina de estados y una correcta implementación del control de los módulos que forman el lector. Es el objetivo de esta sección presentar dicho firmware. Para ello se profundizará en las partes más importantes del sketch. 5.2.1. Bibliotecas Al igual que ocurrı́a con la app, en el desarrollo del firmware del módulo lector es recomendable el uso de bibliotecas externas puesto que evita horas de trabajo en creación de funciones que no son estrictamente los objetivos del trabajo. Las bibliotecas empleadas son las siguientes: Bibliotecas para el control de los módulos: son las bibliotecas que se presentaron en el capı́tulo 4. Se enumeran de nuevo a continuación: • LiquidCrystal para el display LCD. • SoftwareSerial para el módulo Bluetooth HC-05. • Wire, PN532, PN532 I2C y NfcAdapter para el módulo RFID-NFC. 109 5.2. MÓDULO LECTOR: FIRMWARE CAPÍTULO 5. SOFTWARE SMLib: biblioteca creada por un usuario del foro oficial de Arduino12 . Permite implementar de un modo sencillo una máquina de estados. La máquina de estados del firmware del módulo lector se expondrá posteriormente. Time.h: biblioteca oficial de Arduino13 empleada para gestionar la hora y la fecha. Como se comentó en la exposición de la app, se manda al lector la hora y la fecha al sincronizar ambos módulos. Gracias a esta biblioteca, al recibir estos datos, el propio módulo lector puede llevar la cuenta de la hora y la fecha. 5.2.2. Configuración inicial: setup Tras encender el módulo lector hay que realizar una serie de tareas antes de que el sistema entre en régimen permanente de funcionamiento. Dichas tareas están implementadas en la configuración inicial del sistema, que queda mayormente representada en la funcion setup, y que se enumeran a continuación: Configurar los pines como entrada o como salida de manera que el circuito expuesto en el capı́tulo 4 funcione correctamente. Inicializar los objetos myBluetooth y nfc que permiten el control del módulo HC-05 (empleando un puerto serie creado por software) y del módulo NFC (conectado al puerto serie). Como se puede ver en el extracto de la función setup 5.11 (supuestas declaradas las variables que intervienen), la inicialización del puerto serie por sofware se hace a 38400 baudios debido a que es el baudrate adecuado para el envı́o de comandos AT si se precisa. En el caso del módulo RFID-NFC, son las bibliotecas las que se encargan de esto, limitándose el desarrollador a llamar al método begin. 1 void setup(){ 2 ... 3 //Bluetooth 4 myBluetooth.begin(38400); 5 //NFC 6 nfc.begin(); 7 ... 8 } Listing 5.11: Inicialización de los módulos Bluetooth y NFC. Bloquear el módulo lector si no se detecta el lector NFC, mostrando un mensaje en el display LCD alertando de la falta de detección de dicho lector. 12 Biblioteca SMLib: http://playground.arduino.cc/Code/SMlib, //codebender.cc/library/SM 13 Biblioteca Time: http://playground.arduino.cc/Code/Time 110 https: CAPÍTULO 5. SOFTWARE 5.2.3. 5.2. MÓDULO LECTOR: FIRMWARE Ejecución: loop Si la configuración inicial se ha realizado sin errores, entonces el sistema entrará a la función loop, en la que permanecerá hasta que se apague. Cada vez que se ejecuta la función, se realizan 3 tareas: 1. Comprobar si la app ha mandado la información relativa a la fecha y la hora, y en caso afirmativo generar un String con dicha información que se mostrará en el display LCD. 2. Guardar en un String el código que reciba por Bluetooth desde la app. Los diferentes estados de la máquina de estados tienen un comportamiento u otro dependiendo del código almacenado en este String. 3. Llamar a la macro EXEC de la máquina de estados. Para entender el funcionamiento de la macro hay que describir la estructura de la máquina de estados. Sirva como base de la explicación la lı́nea de código 5.12. Dicha lı́nea indica que se genera la máquina de estados Simple mediante la biblioteca SM, y que se inicializa situándose en el estado S1. 1 SM Simple(S1); Listing 5.12: Inicialización de la máquina de estados. Cada estado tiene su implementación que incluye la lógica de su comportamiento. Se adjunta como ejemplo un fragmento de la implementación del estado S1. 1 State S1(){ 2 ... 3 if(!tag.equals(tagOld)){ 4 String s = tag.substring(0,7); 5 if(s.equals("SYNC_BT")){ 6 ... 7 Simple.Set(S2); 8 } 9 } 10 } Listing 5.13: Ejemplo de implementación de un estado de la máquina de estados. Fundamentalmente al llamar a la macro EXEC, se ejecuta la implementación del estado en que se encuentre la máquina de estados. 111 5.2. MÓDULO LECTOR: FIRMWARE CAPÍTULO 5. SOFTWARE Puede comprobarse la implementación de la función loop en el código 5.14 (supónganse declaradas las variables que intervienen). 1 void loop(){ 2 if(timeReceived){ 3 time_t t = now(); 4 dateTimeLCD = timeToString(t); 5 } 6 tag = readKey(); 7 EXEC(Simple); 8 tagOld=tag; 9 } Listing 5.14: Función loop. Por lo explicado previamente, se deduce que la mayor parte de la lógica del comportamiento del lector se encuentra en la implementación de los estados, y por tanto la máquina de estados que gobierna el funcionamiento del módulo lector ha de ser expuesta llegados a este punto. 5.2.3.1. 5.2.3.1.1. Máquina de estados Diseño La máquina de estados propuesta para el módulo lector desarrollado en este trabajo se ha realizado mediante la identificación de los requisitos que ha de cumplir. La escasa complejidad del funcionamiento harı́a posible resolver el problema con menos estados de los que se han implementado. Sin embargo, por motivos estéticos de cara al usuario, se han incluido estados me- Figura 5.32: Máquina de estados del módulo lector. ramente informativos para él. Finalmente la máquina de estados cuenta con los 4 estados representados en la figura 5.32. Las transiciones entre los estados se representan simplificadas, y se comentarán con más detalle en el epı́grafe posterior. 112 CAPÍTULO 5. SOFTWARE 5.2.3.1.2. 5.2. MÓDULO LECTOR: FIRMWARE Implementación Estados Las funcionalidades de los estados presentados en la figura 5.32 se recopilan a continuación: 1. S1: es el estado de inicio, el que adopta el sistema tras el encendido. Su función es indicar al usuario la necesidad de llevar a cabo una sincronización entre la app y el módulo antes de que éste último quede operativo. Esto se consigue mostrando en el display el mensaje Esperando a la sincronización y una pequeña animación en los laterales que alterna puntos. Esto refuerza la sensación de que el sistema está esperando que ocurra algo, en este caso que el usuario lo sincronice con la app. 2. S2: este estado es puramente estético, y se produce cuando la comunicación entre app y lector se ha establecido. Puesto que esta comunicación es rápida, la misión de este estado es mostrar una animación durante algunos segundos que permita al usuario apreciar que la sincronización está siendo realizada. Para ello el display muestra el mensaje Sincronizando... ası́ como una barra de progreso. Esta barra se consigue mediante una concatenación de caracteres negros. Una vez completada, se pasa al siguiente estado, como se muestra en el extracto de código 5.15. 1 State S2(){ 2 myLCD.print("Sincronizando..."); 3 ... 4 for(float i=0;i<16;i++){ 5 myLCD.print((char)255); 6 delay((i/16)*400); 7 } 8 ... 9 Simple.Set(S3); 10 } Listing 5.15: Progreso de la sincronización. 3. S3: se trata del primero de los dos estados que gobiernan el funcionamiento en servicio del módulo lector. Una vez se ha entrado en este estado, esto es, la comunicación con la app se ha establecido, se supondrá que son los clientes de la cafeterı́a los que hacen uso del mismo. Por ello este estado muestra un mensaje de bienvenida en el display con la fecha y la hora como muestra la figura 5.33. 113 5.2. MÓDULO LECTOR: FIRMWARE CAPÍTULO 5. SOFTWARE Figura 5.33: Mensaje en estado de espera. Este estado es el estado de espera, pues únicamente se sale de él cuando el usuario activa el lector desde la app (entiéndase activar como habilitar la lectura de tags). 4. S4: el último estado es el segundo de los estados que gobiernan el funcionamiento en servicio del lector. Se entra a este estado cuando se recibe una orden desde la app para activar el lector, esto es, cuando el usuario desee leer tags mediante el lector, que supone la misión de este estado de cara a la app (al usuario). Además, de cara a los clientes, la misión de este estado es hacer entender al cliente el proceder del módulo lector. Esto se consigue activando el led y mostrando los siguientes mensajes por el display: Bienvenido! Acerca tu TAG: se muestra al entrar en el estado S4, independientemente de si se entra en modo automático o mixto. En el caso de activarse en modo automático, tras leer el tag no se vuelve a S3, sino que permanece en S4, por tanto vuelve a aparecer este mensaje tras efectuar la consumición. Mensajes para residentes asociados al régimen de media pensión: con cada consumición validada el display muestra la habitación y el número de menús o desayunos restantes mediante, respectivamente, los mensajes: • Hab: XXX Desayunos: XX • Hab: XXX Menús: XX Mensajes para residentes asociados al régimen de pensión completa: con cada consumición validada el display muestra un mensaje con una de las siguientes estructuras: • Hab: XXX Desay. validada 114 CAPÍTULO 5. SOFTWARE 5.2. MÓDULO LECTOR: FIRMWARE • Hab: XXX Menu validado • Hab: XXX Cons no validada Estos mensajes se muestran en la figura 5.34, y todos se reciben como un String precedido del código CONS (abreviatura de consumición), de manera que es este inicio del mensaje recibido el que hace saber al módulo lector que se ha validado una consumición desde la app. Figura 5.34: Mensajes mostrados en el display en S4. Transiciones Las transiciones entre los estados de la máquina de estados se presentaban simplificadas en el diagrama de la figura 5.32. Cada transición va de un estado A a otro estado B, de manera que la transición se establece en la implementación del estado A. Se detallan a continuación cada una de ellas: 1. S1 → S2: esta transición se lleva a cabo cuando la app manda el mensaje de sincronización. Cabe recordar que la estructura de éste contenı́a el código SYNC BT seguido del String con la fecha y la hora. Por tanto la transición se lleva a cabo cuando dicho mensaje se recibe e interpreta, tal y como muestra el extracto de código 5.16 perteneciente a la implementación del estado S1. 115 5.2. MÓDULO LECTOR: FIRMWARE CAPÍTULO 5. SOFTWARE 1 State S1(){ 2 ... 3 if(!tag.equals(tagOld)){ 4 String s = tag.substring(0,7); 5 if(s.equals("SYNC_BT")){ 6 ... 7 Simple.Set(S2); 8 } 9 } 10 } Listing 5.16: Transición S1 → S2. 2. S2 → S3: esta transición se ejecuta cuando finaliza la animación de la barra de progreso implementada en el estado S2. No requiere por tanto de un código recibido por Bluetooth, pero sı́ que envı́a el mensaje SYNC OK de manera que la app al recibirlo muestra un mensaje informando que la conexión ha sido establecida con éxito. La máquina de estados alterna los estados S3 y S4 a través de sendas transiciones que se ejecutan cuando se cumple alguna condición de las que se enuncian a continuación 3. S3 → S4: esta transición es la que activa al lector. De este modo lo habilita para la lectura de tags. Se ejecuta cuando la app envı́a uno de los siguientes códigos: WAKE READER: recibido cuando el funcionamiento en servicio es en modo mixto y se pulsa el botón (ver figura 5.14). Este código también se recibe desde la activity newTagRoom, que como se explicaba en la sección anterior, también requiere comunicación con el módulo lector. WAKE READER FOREVER: recibido cuando se activa desde la app el modo automático de funcionamiento en servicio. Activa la bandera reader forever (variable booleana) que indica la necesidad de no retornar al estado S3. 4. S4 → S3: es la transición que se ejecuta cuando deja de ser necesario el uso del lector para app. Se puede ejectuar cuando se cumplen diferentes condiciones que se agrupan en dos categorı́as: Desde la app: pueden recibirse por Bluetooth ciertos códigos que impliquen la desactivación del lector. Estos códigos son: • EXIT NEWTAG: cuando la app funciona en modo mixto, se dispone de un tiempo de 10 segundos para que el residente pase el tag por el lector tras activarlo. Si se cancela esta espera, entonces se recibe este 116 CAPÍTULO 5. SOFTWARE 5.2. MÓDULO LECTOR: FIRMWARE código, que hace retornar el sistema al estado de espera S3. También se recibe al salir de la pantalla Servicio, pues en caso de encontrarse en modo automático, si no se envı́a el código, el lector quedarı́a activo. Este código también se recibe cuando se sale manualmente de la activity newTagRoom. • FINISH AUTOMODE: si desde la app se desactiva el modo automático, se envı́a este mensaje al módulo lector. Además al recibir este código se desactiva la bandera reader forever. Desde el propio lector: pueden darse ciertas circunstancias no relativas a la app que provoquen igualmente la desactivación del lector. En efecto, y como ya se ha comentado previamente, en modo mixto la activación del lector se mantiene durante 10 segundos, o hasta que se lea un tag. En cualquiera de estos casos se retorna al estado S3. Por tanto, ya sea por cumplirse el timeout o por ser leı́do un tag, se desactiva el lector si éste trabaja en modo mixto. Cabe destacar que cuando esto ocurre, el lector envı́a a su vez un código a la app, que puede ser: • TAG TIMEOUT: en caso de pasar 10 segundos activo en modo mixto sin leer un tag. Esto hace que en la app emerja un mensaje informando de que han transcurrido 10 segundos sin que se reciba tag alguno. • El tag leı́do en caso de que el residente pase su tag. Este código es el que permite a la app identificar qué habitación, y por tanto, qué residente es el que está pasando el tag. Por útlimo, mencionar que durante la implementación del firmware del módulo lector fueron creadas una serie de funciones auxiliares además de las nativas setup y loop. Estas funciones son llamadas desde la implementación de los diferentes estados presentandos en esta sección, y pueden consultarse en el sketch. 117 5.2. MÓDULO LECTOR: FIRMWARE 118 CAPÍTULO 5. SOFTWARE Capı́tulo 6 EVALUACIÓN Y PROBLEMAS Durante el desarrollo y la evaluación del sistema propuesto han surgido innumerables fallos de funcionamiento que han tenido que ser resueltos. Se presenta en este capı́tulo una recopilación de los más relevantes, esto es, aquellos cuyo origen no era demasiado evidente y que requisieron una considerable inversión de tiempo. Al igual que en el capı́tulo anterior, se dividirá la exposición en dos partes, comentando por separado las pruebas realizadas a ambos módulos que han permitido la evaluación de sus comportamientos, ası́ como la detección y posterior solución de los problemas encontrados durante dicha evaluación. 6.1. 6.1.1. Módulo lector Evaluación La evaluación del comportamiento del módulo lector se puede dividir en dos grandes bloques atendiendo al grado de desarrollo de la app de este trabajo. 6.1.1.1. Primeras pruebas: BlueTerm Cuando se realizaron las primeras pruebas al módulo, la app de este trabajo aún no tenı́a completamente implementadas las funcionalidades que permiten el control del Bluetooth. Por este motivo se recurrió a una app de un tercero para efectuar las pruebas al módulo lector. Las apps más interesantes para este caso son aquellas que emulan un terminal que permite el envı́o y la recepción de texto por Bluetooth. La gama de apps disponi119 6.1. MÓDULO LECTOR CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS bles con estas caracterı́sticas es muy amplia, por lo que se escogió la app BlueTerm 1 por sus buenas valoraciones en Google Play2 . Cabe destacar dos pruebas realizadas mediante BlueTerm: 1. Emparejamiento con el HC-05: mediante la interfaz de búsqueda y emparejamiento de dispositivos de BlueTerm se pudo comprobar cómo el emparejamiento del dispositivo Android y el módulo adquirido era efectiva. 2. Comprobación del funcionamiento del HC-05: tenı́a por objetivo determinar si el módulo adquirido operaba correctamente. La prueba constó a su vez de dos fases: Envı́o de datos: mediante la app se enviaron cadenas de texto que fueron mostradas por el monitor serie del IDE de Arduino, comprobándose que la recepción era correcta. Recepción de datos: se creó un sketch que enviaba programáticamente cadenas de texto que se recibı́an y se mostraban en la terminal de BlueTerm, comprobándose que la transferencia de datos era también correcta. 6.1.1.2. Pruebas con la app Tras comprobar la operatividad del HC-05, la implementación del control del Bluetooth en la app se realizó de manera que la propia app fuera capaz de reproducir las pruebas efectuadas con BlueTerm. Las diferencias fundamentales respecto al modo de ejecutar dichas pruebas fueron: Se programó un emparejamiento automático con el módulo lector, tal y como se justificó en el capı́tulo anterior. Se encapsuló la función de envı́o de datos en botones, de manera que cada botón enviaba un código diferente. Tras comprobar que la app era capaz de comunicarse correctamente con el módulo lector, se implementó la máquina de estados en éste. De este modo, combinando la programación del firmware del lector y la app, se fue depurando el funcionamiento de la máquina de estados hasta que se consiguió el comportamiento descrito en el capı́tulo anterior. No obstante en este proceso surgieron algunos problemas que se presentan, junto a otros, a continuación. 1 Sitio web: http://pymasde.es/blueterm/ BlueTerm en Google Play: https://play.google.com/store/apps/details?id=es. pymasde.blueterm 2 120 CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS 6.1.2. 6.1. MÓDULO LECTOR Problemas encontrados Los principales problemas que ocurrieron durante el desarrollo y evaluación del funcionamiento del módulo lector son: 1. Fallos en los componentes que forman el lector: tal y como se comentó en el capı́tulo 4, a medida que los componentes se adquirieron y recibieron, se probaron. Sin embargo, en ciertas ocasiones las pruebas no pudieron realizarse debido a comportamientos anómalos de los mismos. El ejemplo más relevante es el caso del LCD, que mostraba completamente oscurecidos los caracteres, y de un modo parpadeante. Tras comprobar que no era un problema de ajuste del contraste, se determinó que era un fallo en la soldadura de los pines, solucionando ası́ el problema. 2. Caracteres extraños en el LCD: los caracteres que el chip HD44780 puede representar en el LCD son limitados, y no incluye, entre otros, los caracteres con acento. Al intentar mostrar un mensaje que contenga caracteres ajenos a los nativos, el LCD muestra un caracter extraño. La solución se encontró en la propia documentación del chip, la cual indica un método para crear pı́xel a pı́xel caracteres personalizados. Puede comprobarse la función customO del sketch a modo de ejemplo, que genera una ó. 3. Comandos AT en el HC-05: durante las pruebas realizadas al módulo Bluetooth compatible con Arduino se quiso modificar algunos parámetros (nombre, contraseña de emparejamiento, modo de funcionamiento...) mediante el envı́o de comandos AT. Esto, siguiendo las instrucciones de la bibliografı́a, se intentó a través de la consola del IDE de Arduino, o monitor serie. Sin embargo los mensajes que aparecı́an en él eran incomprensibles al ser cadenas de caracteres aparentemente aleatorios. La solución a este problema se encontró al recapacitar sobre el concepto de baudrate expuesto en el capı́tulo 3. En efecto, el monitor serie de Arduino se inicializa por defecto a 9600 baudios, mientras que el envı́o de comandos AT se realiza a 38400. Ciertamente este valor es configurable, pero para modificarlo hay que enviarle un comando AT, por lo que al menos una vez hay que inicializar el monitor serie a 38400 baudios. De este modo la comunicación fue posible. 4. Funcionamiento anómalo de la máquina de estados: cuando se implementó la máquina de estados, su funcionamiento no era el establecido en su diseño (ver figura 5.32). Por ejemplificar alguno de estos comportamientos erróneos, supóngase que en 121 6.1. MÓDULO LECTOR CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS S3 se recibe el código WAKE READER. En ese caso se produce la transición a S4. Supóngase ahora que se pasa un tag por el lector. Esto produce la desactivación del lector, por lo que vuelve a S3. En este punto, el lector deberı́a permanecer en espera hasta nueva orden, sin embargo se encontró que volvı́a a entrar en el estado S4. Tras analizar el código se determinó que el origen del fallo residı́a en que el código recibido se mantenı́a tras ser leı́do, y por tanto aunque en efecto se retornaba a S3, en la implementación de S3 se volvı́a a leer el último código recibido, que seguı́a siendo WAKE READER, y por tanto entraba de nuevo a S4. La solución a este problema consistió, ya no solo para el ejemplo anterior, sino en general, en crear dos Strings que almacenan los códigos recibidos. Al recibir un código, se almacena en un String. Posteriormente se ejecuta la implementación del estado actual a través de la macro EXEC, y por último se almacena en el segundo String. Este era el funcionamiento elemental de la función loop, presentada en el capı́tulo anterior. Gracias a estas dos variables String se puede garantizar que un código recibido sólamente se tiene en cuenta una vez, mediante la protección presentada en el extracto de código 6.1, pues implica que sólo se tendrá en cuenta si ambos Strings son diferentes, condición que sólo se cumplirá la primera vez que se reciba un código. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 String tag, tagOld; ... void loop(){ ... tag = readKey(); EXEC(Simple); tagOld=tag; } ... State S3(){ if(!tag.equals(tagOld)){ ... Simple.Set(S4); ... } } Listing 6.1: Lectura única de códigos recibidos por Bluetooth. Hay que destacar que este método no serı́a efectivo si se necesitara detectar la recepción de un mismo código varias veces seguidas. No obstante, este paradigma no se da en la máquina de estados diseñada, por lo que es válido para resolver el problema. 122 CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS 6.2. 6.2. CAFETERÍA RUGP Cafeterı́a RUGP Si bien el módulo del lado del usuario (cliente) a nivel hardware no requiere de evaluación alguna al ser un dispositivo Android comercial, no ocurre lo mismo a nivel software. Entre los objetivos establecidos en el primer capı́tulo de esta memoria estaban tanto la familiarización con el entorno de Android con el desarrollo de una app. Como es habitual siempre que se inicia un aprendizaje de un lenguaje de programación, surgen innumerables errores y comportamientos inesperados que han de ser solucionados. No obstante, la bibliografı́a disponible en relación a Android ası́ como foros de consulta han facilitado el desarrollo de la app, cuya evaluación y principales problemas se presentan en esta sección. 6.2.1. Evaluación Las pruebas realizadas a la app se fueron llevando a cabo a medida que ésta se desarrollaba. De este modo la app fue creciendo sobre sustentos sólidos. Las pruebas tuvieron siempre un carácter similar: cada funcionalidad que se implementaba se sometı́a a una evaluación que pretendı́a responder dos preguntas: 1. ¿Hace lo que tiene que hacer? Lo primero que se comprobaba era la eficacia de la funcionalidad, de manera que hasta que el funcionamiento esperado no se conseguı́a, no se pasaba a la siguiente fase. 2. ¿Hace algo que no tiene que hacer? Esto es, en general, más complicado. Se trataba de buscar los puntos débiles a la app, esto es, buscar su fallo. Para ello se usaba la funcionalidad de modo incorrecto. Por citar algunos ejemplos: conectarse al lector sin estar éste encendido, crear fichas de residentes sin completar todos los datos, introducir texto cuando se espera un valor numérico, etc. Mediante estas comprobaciones se determinaban qué situaciones provocaban errores y comportamientos anómalos en la app. De este modo se pudieron corregir, resultando ası́ una app que además de funcionar, es robusta. 123 6.2. CAFETERÍA RUGP 6.2.2. CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS Problemas encontrados La exposición de todos los fallos que se produjeron durante el desarrollo de la app de este trabajo serı́a demasiado extensa, por lo que se remite al lector a la inspección del código, que es donde están implementadas las protecciones ante posibles fallos. Estos fallos han surgido tanto al evaluar las diversas funcionalidades de la app (fallos de funcionamiento) como en la implementación de las mismas (fallos de implementación). Los fallos de funcionamiento son precisamente los que se buscaban en la evaluación descrita previamente al comprobar si la app no hace lo que no debe hacer. Los fallos de implementación de las funcionalidades son fallos cuyo origen está en la incorrecta programación de las mismas. Al tratar de probar la app, aparecı́a en un mensaje de error en la consola de Android Studio. Este mensaje indicaba el tipo de error y dónde se producı́a. Gracias a esta información la solución de los fallos de implementación fue más sencilla. Por citar algunos ejemplos, se mencionan algunos de los fallos más relevantes que surgieron durante el desarrollo de la app: 1. Pérdida de información al rotar el dispositivo: se comprobó cómo algunas activities perdı́an la información que mostraban cuando se cambiaba la orientación del dispositivo. Este fallo se observó en el formulario de creación de una ficha de residente (al rotar el dispositivo, los campos del formulario se borraban, teniendo que volver a rellenarlo) y en la activity Instagram (al rotar el dispositivo se perdı́a la imagen tomada). El origen de este fallo se debe al ciclo de vida de las activities (descrito en el capı́tulo 3, véase la figura 3.8). Ante un cambio de orientación del dispositivo, Android destruye la activity (onDestroy) y la crea de nuevo (onCreate), y por ello se pierde la información. De acuerdo con la prioridad de la información afectada (establecida en los requisitos de la app), merece la pena desarrollar una solución más elaborada o no. La información relativa a los residentes es prioritaria ante la funcionalidad de Instagram. Por ello la solución adoptada para ambos casos difiere. En el caso de Instagram, se ha bloqueado la rotación del dispositivo, de manera que aunque se cambie la orientación, la activity se mantiene. En el caso de la ficha de residente, se ha implementado un método para que no se pierda la información. 124 CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS 6.2. CAFETERÍA RUGP 2. Mı́nima información: algunos comportamientos anómalos detectados tenı́an su origen en la falta de información que se almacenaba en la base de datos. Esta falta de información se produce cuando se crea un residente bien sin nombre, bien sin tipo de pensión, cuando se añade un producto a la lista de la compra sin nombre, etc. Los comportamientos que deriva esta situación son entradas vacı́as y con mensajes erróneos en los RecyclerViews que muestran la información de la base de datos. En efecto, si la información de la base de datos no es adecuada, lo que verá por pantalla el usuario será anómalo. Por este motivo la solución adoptada ha consistido en el establecimiento unos contenidos mı́nimos que se han de introducir antes de almacenar un registro en la base de datos. Ası́, un residente ha de tener al menos nombre, apellidos y tipo de pensión, un producto de la lista de la compra ha de tener al menos nombre y categorı́a, etc. Si no se cumplen los mı́nimos, la app muestra un AlertDialog indicando qué información falta por introducir. 3. Actualización de los RecyclerViews: en la app hay numerosas listas que muestran información de la base de datos representadas en RecyclerViews. Esta información puede ser modificada a su vez desde la app como ya se ha expuesto. El problema detectado fue que en algunos casos al modificar la base de datos, no se actualizaban los RecyclerViews. Para solucionar esto se encapsuló en un método el código que generaba el RecyclerView. Además tuvo que tenerse en cuénta cómo y cuándo se podı́a actualizar la RecyclerView correspondiente. Cuando la base de datos se modificaba en una activity diferente a la que contenı́a la RecyclerView, la actualización de la misma se pudo hacer sin más que llamar al método desde el onResume de la activity. Ası́, al cerrar la activity en la que la base de datos se modificaba, se llama al método, pues al volver a la activity previa Android llama a onResume (como puede observarse en el ciclo de vida en la figura 3.8). Cuando la base de datos se modifica desde la propia activity que contiene la RecyclerView, basta con llamar al método que la muestra tras la ejecución del método que modifica la base de datos. Como puede observarse, la mera exposición de 3 casos en los que se han buscado soluciones a comportamientos anómalos de la app ya es considerablemente extensa. Por ello es recomendable abstraerse de los problemas concretos y concluir que la solución de estos fallos ha permitido garantizar una robustez más que aceptable de la app desarrollada. 125 6.2. CAFETERÍA RUGP CAPÍTULO 6. EVALUACIÓN Y PROBLEMAS Con todo el sistema listo para ser usado, se pudieron realizar pruebas finales de funcionamiento. Para ello se crearon una serie de residentes genéricos de diferentes nombres, tipos de pensión y connotaciones (en algunos casos el campo Notas se rellenaba y en otros no para comprobar que los dialogs mostraban correctamente la información). Estas pruebas finales consistieron en emplear el sistema presuponiendo que éste estuviera ya finalizado. Esto se puede presuponer pues al llegar a este punto ya se habı́an realizado numerosas pruebas unitarias expuestas a lo largo del capı́tulo. Los resultados acompañaron a esta suposición. En efecto, fueron considerablemente buenos, no encontrándose comportamientos anómalos más allá de algún carácter extraño en el LCD, de fácil solución. Ha de observarse que las figuras expuestas en el capı́tulo anterior son precisamente de esta fase de pruebas. Precisamente el llegar a dichas capturas (un ejemplo representativo es el de las gráficas obtenidas) es lo que permite determinar cómo el sistema se comporta adecuadamente ajustándose de manera robusta a los requisitos establecidos. Estas pruebas fueron realizadas junto al cliente (el jefe de la cafeterı́a), que quedó encantado con el funcionamiento, lo cual supone un gran aliciente para considerar funcional el sistema desarrollado. 126 Capı́tulo 7 DIRECCIÓN DEL PROYECTO Este capı́tulo pretende abordar el proyecto desde un nivel superior, englobando los aspectos generales tras haber sido expuestos los detalles concretos en los capı́tulos anteriores. Con este propósito se emplearán determinadas técnicas propias de la Ingenierı́a de Proyectos para abarcar el aquı́ presentado en su conjunto desde los puntos de vista del alcance, temporal y económico. 7.1. Gestión del alcance Tras haber definido el alcance del proyecto (objetivos) en el primer capı́tulo y el alcance del producto desarrollado (caracterı́sticas) en los capı́tulos siguientes, se completa la exposición de la gestión del alcance mediante el estudio de la planificación. La planificación del proyecto pasa por obtener una visión global del mismo (a vista de pájaro). Para ello se emplea una técnica de planificación no temporal como es la Estructura de Descomposición del Proyecto (en adelante EDP). La EDP del proyecto posee un primer nivel de descomposición formado por los grandes bloques en los que puede dividirse. Estos bloques son: Dirección del proyecto. Estudios previos. Desarrollo del sistema. Impactos. 127 7.1. GESTIÓN DEL ALCANCE CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Una vez se tiene constancia de estos bloques fundamentales del proyecto, éste es abordable desde el punto de vista de la planificación sin más que profundizar con algo más de detalle en cada uno de los elementos del primer nivel o nivel superior de la EDP. La figura 7.1 muestra el primer nivel de la EDP formado por los grandes bloques del proyecto identificados previamente. Figura 7.1: Nivel superior de la EDP Las figuras 7.2 y 7.3 exponen la EDP desglosada incluyendo los diferentes niveles y las actividades de cada subnivel. 128 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.1. GESTIÓN DEL ALCANCE Figura 7.2: Desglose de la EDP (1/2) 129 7.1. GESTIÓN DEL ALCANCE CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Figura 7.3: Desglose de la EDP (2/2) 130 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.2. 7.2. GESTIÓN DEL TIEMPO Gestión del tiempo A diferencia de la planificación, la gestión del tiempo requiere del uso de técnicas propias de programación temporal. En este caso se empleará el diagrama de Gantt mediante la herramienta Microsoft Project (todos los derechos reservados). Antes de profundizar en la exposición conviene diferenciar la programación temporal del presente trabajo entendido como proyecto, y la del producto desarrollado en el mismo. En efecto, las actividades y su duración no son las mismas en ambos, por lo que se presentan por separado. El diagrama de Gantt del proyecto muestra un diario de las tareas realizadas durante la elaboración de este trabajo, exponiendo el desglose de las mismas. El diagrama de Gantt del producto muestra la programación temporal del proceso de producción del sistema desarrollado en el proyecto. Los plazos en este caso se reducen al no requerir un diseño excesivamente distinto: basta con cambiar ciertos aspectos para ajustarlos al negocio en el cual se implementarı́a el sistema. Las figuras expuestas en esta sección son de dos tipos: Tareas del diagrama de Gantt: desglose de las tareas con su identificador, nombre, dı́as de duración, fecha de comienzo y fecha de finalización, respectivamente. Diagrama de Gantt propiamente dicho: representa gráficamente la duración de las tareas anteriores. 7.2.1. Diagrama de Gantt del proyecto A continuación se exponen las imágenes que representan el diagrama de Gantt relativo a este trabajo entendido como proyecto. 131 7.2. GESTIÓN DEL TIEMPO CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Figura 7.4: Diagrama de Gantt del proyecto: desglose de tareas. 132 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.2. GESTIÓN DEL TIEMPO Figura 7.5: Diagrama de Gantt del proyecto: diagrama. 133 7.2. GESTIÓN DEL TIEMPO 7.2.2. CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Diagrama de Gantt del producto El sistema de identificación contactless desarrollado en este trabajo ha sido aplicado al servicio de cafeterı́a de una residencia de estudiantes. Sin embargo este tipo de sistemas está presente en multitud de establecimientos. Resulta interesante desde esta perspectiva analizar la programación temporal de la fabricación e instalación de sistemas de identificación similares al de este trabajo, igualmente personalizados en función del cliente. Se considerará una empresa genérica para esbozar la programación temporal de la producción de un sistema de identificación. Supóngase que: ya está instalada la fábrica para la producción, la carcasa se imprime ajustándose a los requisitos del cliente, los componentes electrónicos se compran (subcontratas), se cuenta con suficientes componentes en stock, y se dispone de una app como plantilla que se modificará atendiendo a los requisitos particulares del cliente. La programación temporal de una empresa de estas caracterı́sticas se puede efectuar mediante un razonamiento basado en la identificación de las fases que se llevan a cabo desde la llegada del cliente hasta que el sistema está en funcionamiento: 1. Visita al lugar en el que el sistema será implantado: se buscará junto al cliente la definición del alcance del sistema, es decir, su funcionalidad y el lugar donde se colocarán el(los) lector(lectores). 2. Adaptación del producto: tras generar la oferta y presupuesto del proyecto al cliente, se produce un tiempo de espera hasta que el cliente acepte y firme el contrato. Este tiempo es variable dependiendo de la rapidez del cliente. Tras ser efectuado el pedido, se procede (si es necesario modificar la plantilla) a diseñar la carcasa y a adaptar firmware y app para cumplir los requisitos establecidos en la fase anterior. Se comprobará el correcto funcionamiento del software y finalmente ensamblarlo en la carcasa para proceder con las pruebas finales del sistema. 3. Implementación del sistema: en la fase final del proyecto se incluyen las etapas de instalación y puesta en marcha del sistema. Puede incluirse en esta fase algún tipo de curso o charla sobre el uso del mismo al cliente y a los operarios, por lo que se incluye una etapa de formación. El diagrama de Gantt de la figura 7.6 recopila el razonamiento anterior. Se observa en él la posibilidad de realizar en paralelo la programación del software 134 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.2. GESTIÓN DEL TIEMPO mientras se imprime la carcasa, ası́ como el tiempo de holgura entre las fases 1 y 2 mecionado anteriormente. El tiempo estimado es de unos 3 dı́as, prolongable en función del citado tiempo de holgura. Figura 7.6: Diagrama de Gantt del producto. 135 7.3. GESTIÓN DE COSTES 7.3. CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Gestión de costes De manera análoga a lo que ocurrı́a en la gestión temporal, en la gestión de costes ha de distinguirse entre la contabilidad del presente proyecto y el presupuesto que conlleva manufacturar el producto desarrollado, pues los costes en ambos procesos difieren. 7.3.1. Contabilidad del proyecto En este apartado se detallan los costes asociados a la elaboración de este trabajo, especificando los gastos de personal, hardware y software implicados en él que posteriormente servirán para plantear los capı́tulos del presupuesto. Gasto de personal En lo que al gasto de personal se refiere, el autor es quien ha jugado los diferentes roles durante el desarrollo del trabajo. Por ello se agrupan las horas invertidas (aproximadamente 347 horas) que se han dedicado a las diferentes tareas en 4 categorı́as: Análisis y consultas: se engloban aquı́ todas las tareas asociadas a la documentación previa, reuniones, definición del alcance y objetivos, establecimiento de los requisitos... Esta categorı́a tiene una duración estimada de 30 horas. Diseño: se incluyen aquı́ las tareas relacionadas con el diseño tanto del módulo lector (componentes necesarios, pcb, carcasa, prototipos) como de la app (interfaz gráfica, arquitectura de la app). La duración estimada es de 53 horas. Implementación: todas las tareas asociadas con la programación (app y firmware del lector) ası́ como el montaje de los prototipos y fabricación de elementos computa una cantidad aproximada de 194 horas. Redacción: la elaboración del presente documento se ha llevado a cabo en aproximadamente 70 horas. Por tanto el presupuesto parcial correspondiente al gasto del personal es el especificado en la tabla 7.1. 136 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Num. 1.1 1.2 1.3 1.4 7.3. GESTIÓN DE COSTES Presupuesto parcial no 1: Gastos de personal Ud Descripción Medición Precio Importe h Analista 30 33.00 990 h Diseñador 53 33.00 1749 h Programador 194 25.00 4850 h Responsable de redacción 70 15.00 1050 Total presupuesto parcial no 1: Gastos de personal 8.639,00 Tabla 7.1: Presupuesto parcial del proyecto no 1: Gastos de personal. Gasto de hardware Si bien el usuario empleará su propio dispositivo Android, el módulo lector está enteramente formado por componentes que no posee previamente, por lo que se imputan al presupuesto. Algunos de estos componentes eran propiedad del autor y otros fueron adquiridos para desarrollar el lector. En cualquier caso la tabla 7.2 muestra el coste correspondiente a los componentes necesarios que finalmente forman parte del módulo lector. Obsérvese que no se incluye ni la PCB, al haber sido ésta obtenida por cortesı́a del departamento de Electrónica, ni la carcasa, al haber sido ésta impresa por cortesı́a del departamento de Materiales. Num. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 Presupuesto parcial no 2: Gastos de hardware Ud Descripción Medición Precio Importe uds Arduino NANO 1 33.30 33.30 uds Resistencias 3 0.03 0.09 uds Pines macho 25 0.078 1.95 uds Cables jumper hembra 25 0.057 0.86 uds Display LCD 1 3.52 3.52 uds Módulo Bluetooth HC-05 1 6.75 6.75 uds Sensor RFID-NFC pn532 1 10.36 10.36 uds LED RGB 1 0.90 0.90 uds Tags 130 0.63 81.90 Total presupuesto parcial no 2: Gastos de hardware 139,63 Tabla 7.2: Presupuesto parcial del proyecto no 2: Gastos de hardware. 137 7.3. GESTIÓN DE COSTES CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Gastos de software Durante el proyecto, se han utilizado diferentes herramientas para generar tanto el código de la aplicación la documentación. Por ello se incluyen sus respectivas licencias en el presupuesto parcial de la tabla 7.3, a pesar de que la mayorı́a son gratuitas. Num. 3.1 3.2 3.3 3.4 3.5 Presupuesto parcial no 3: Gastos de software Ud Descripción Medición Precio Importe licencia Arduino IDE 1 0 0 licencia Android Studio + SDK + APIs 1 0 0 licencia Microsoft Office 2013 1 129.00 129.00 licencia Microsoft Project 2013 1 493.00 493.00 licencia TexStudio 1 0 0 Presupuesto parcial no 3: Gastos de software 622,00 Tabla 7.3: Presupuesto parcial del proyecto no 3: Gastos de sofware. Presupuesto de ejecución material La recopilación de los apartados anteriores confecciona el siguiente presupuesto de ejecución material: Proyecto: sistema de identificación contactless Capı́tulo Capı́tulo 1: Gastos de personal Capı́tulo 2: Gastos de hardware Capı́tulo 3: Gastos de software Presupuesto de ejecución material Importe 8639,00 139,63 622,00 9.400,63 Tabla 7.4: Presupuesto de ejecución material. Asciende el Presupuesto de Ejecución Material a la expresada cantidad de NUEVE MIL CUATROCIENTOS EUROS CON SESENTA Y TRES CÉNTIMOS1 . 1 Se ha expuesto el presupuesto con el formato UNE 157001. 138 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.3.2. 7.3. GESTIÓN DE COSTES Presupuesto del producto El presupuesto que ofrecerı́a una empresa por la implantación de un sistema de este tipo en algún establecimiento difiere con el presentado en la sección anterior que se referı́a a este trabajo entendido como proyecto. En primer lugar, el gasto de personal incluye roles diferentes a los del proyecto. Atendiendo a las fases vistas en la programación temporal (visita al cliente, adaptación e implementación del producto) los roles en una hipotética empresa serı́an, respectivamente, los de comercial, desarrollador e instalador. Dichos puestos tendrı́an un salario diferente, con lo que la relación gasto/hora varı́a. En segundo lugar, el gasto de hardware no se desglosarı́a como en el visto anteriormente, sino que contarı́a con la partida de los tags por un lado y el módulo lector por otro, sin desglosar éste último en todos sus componentes. El precio del módulo se calculará sumando el coste del material de la carcasa y las horas de su diseño, los componentes electrónicos, la mano de obra durante el cableado y ensamblaje... En último lugar, el gasto de software consta de dos partidas: Licencia de uso: la empresa habrı́a invertido tiempo y dinero en desarrollar un firmware y una app plantilla que adaptarı́a a gusto del consumidor. Esta inversión se recuperarı́a imponiendo una licencia por el uso de dicho software (las licencias comenzarı́an amortizando para producir beneficios después, tras recuperar la inversión). Personalización del software: partida que incluye los gastos asociados a las horas de adaptación de las plantillas a los requisitos del cliente. Una vez calculado el presupuesto de ejecución material mediante la suma de los capı́tulos anteriores, se establecerı́a el presupuesto que se entrega al cliente mediante la fórmula: Pf = Pem + G + B + I donde: Pf ≡ Presupuesto final. Pem ≡ Presupuesto de ejecución material. G ≡ Gastos generales. B ≡ Beneficio que obtendrı́a la empresa. I ≡ Imprevistos. 139 7.3. GESTIÓN DE COSTES CAPÍTULO 7. DIRECCIÓN DEL PROYECTO Al ser muy amplio el abanico de establecimientos en los que implantar un sistema de este tipo, se pondrá como ejemplo el presupuesto que una empresa entregarı́a a la cafeterı́a de la Residencia Universitaria Gómez-Pardo para la implantación de este sistema. Presupuesto parcial no 1: Gastos de personal Num. Ud Descripción Medición Precio Importe 1.1 h Comercial 6 33.00 198.00 1.2 h Desarrollador 35 12.00 420.00 1.3 h Instalador 7 30.00 210.00 o Total presupuesto parcial n 1: Gastos de personal 828,00 Tabla 7.5: Presupuesto parcial del producto no 1: Gastos de personal. Presupuesto parcial no 2: Gastos de hardware Num. Ud Descripción Medición Precio Importe 2.1 uds Módulo lector 1 50.00 50.00 2.2 uds Tags 130 0.63 81.90 o Total presupuesto parcial n 2: Gastos de hardware 131,90 Tabla 7.6: Presupuesto parcial del producto no 2: Gastos de hardware. Num. 3.1 3.2 Presupuesto parcial no 3: Gastos de software Ud Descripción Medición Precio Importe licencia Firmware del lector y app Android 1 50.00 50.00 h Personalización del software 5 75.00 375.00 Presupuesto parcial,no 3: Gastos de software 425,00 Tabla 7.7: Presupuesto parcial del producto no 3: Gastos de sofware. Proyecto: instalación de un sistema de identificación contactless en la RUGP Capı́tulo Importe Capı́tulo 1: Gastos de personal 828,00 Capı́tulo 2: Gastos de hardware 131,90 Capı́tulo 3: Gastos de software 425,00 Presupuesto de ejecución material 1.384,90 Tabla 7.8: Presupuesto de ejecución material del producto. 140 CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 7.3. GESTIÓN DE COSTES Para finalizar, al resultado anterior hay que añadir los restantes términos de la fórmula del presupuesto. Estos valores son: Gastos generales: partida destinada a ofrecer servicios auxiliares al cliente (soporte técnico, garantı́a, etc). G = 200 ¤ Beneficio: suele calcularse como un porcentaje del presupuesto de ejecución material. Para un valor del 15 %: B = 207,7 ¤ Imprevistos: suele calcularse como un porcentaje del beneficio. Para un valor del 10 %: I = 20,77 ¤ Por tanto el presupuesto presentado al cliente asciende a: P = 1,813,41 ¤ Figura 7.7: Representación gráfica del desglose del presupuesto. 141 7.3. GESTIÓN DE COSTES CAPÍTULO 7. DIRECCIÓN DEL PROYECTO 142 Capı́tulo 8 LÍNEAS FUTURAS El sistema desarrollado es susceptible de mejorar a pesar de haber obtenido unos resultados que satisfacen los objetivos iniciales y cumplen las expectativas del cliente. En este sentido se presentan 5 posibles lı́neas de mejora del sistema: 1. Portabilidad de la app Cafeterı́a RUGP a la plataforma iOS. De este modo el sistema seguirı́a siendo funcional aunque el cliente cambie sus dispositivos Android por terminales de Apple1 como el iPhone o el iPad. 2. Integrar varios de estos sistemas formando una red comunicada. Esto mejorarı́a el sistema en momentos de saturación o en otras circunstancias (diferentes zonas donde efectuar una consumición, catering en espacios abiertos, etc) en las que se disponga de varios puntos de venta. 3. Modificar el método de asociación entre tags y habitaciones. Aunque la comunicación NFC es bidireccional, el sistema presentado se limita a leer tags y programáticamente asociar los códigos a las habitaciones, por lo que la identificación de habitaciones se produce de manera indirecta. Esto mejorarı́a si la propia app implementase una funcionalidad que permitiera al usuario escribir en el tag la habitación a la que se asocia. Ası́ la lectura de la habitación serı́a directa. 4. Creación de una app para los residentes complementaria al sistema. En la actualidad hay una gran cantidad de dispositivos móviles que cuentan con NFC, de manera que puede ser interesante el desarrollo de una app para residentes. Esta hipotética app podrı́a implementar funcionalidades como: Escritura de datos en tags. Si el residente es quien se encarga de escribir sus datos en el tag se agilizarı́a el proceso de modificación de la base de 1 Sitio web oficial: http://www.apple.com/ 143 CAPÍTULO 8. LÍNEAS FUTURAS datos para almacenar esta información. Cada tag identificarı́a al residente que lo posee. Sustitución del tag por el dispositivo. Si el dispositivo del residente posee NFC, podrı́a usarse éste en lugar del tag para identificarse en el módulo lector. 5. Comunicación entre ambas apps. Se ha comprobado en el sistema presentado cómo es posible establecer una sincronización entre dispositivos gracias a información en la nube accesible desde ellos. Como extensión de esta funcionalidad, podrı́a considerarse la posibilidad de que tanto la app del cliente como la hipotética app de los residentes estuviesen comunicadas a través de la nube. De este modo los residentes podrı́an reservar una consumición sin necesidad de identificarse en el lector. La nube almacenarı́a la cola de peticiones que serı́an leı́das desde la app del cliente. Esto ayudarı́a además al cliente a tener una mejor previsión y planificación de la actividad que tendrá durante el horario de servicio. 144 Capı́tulo 9 CONCLUSIONES Como se expuso en el capı́tulo 2, existen numerosas aplicaciones del NFC en la actualidad. En concreto, la identificación basada en tecnologı́as inalámbricas está asimismo ampliamente implantada (baste mencionar el abono transporte del metro o autobús). Se ha desarrollado un módulo lector similar a los existentes y se ha creado un app Android para, entre otras cosas, controlar dicho lector. El conjunto forma un sistema de identificación contactless que cuenta con funcionalidades que van más allá de la identificación, modernizando y agilizando al cliente la gestión de su negocio. La realización de este trabajo ha sido posible mediante la integración de diferentes conocimientos y destrezas adquiridas a lo largo del Grado. Ası́, la programación en C y orientada objetos ha sido esencial para la elaboración del firmware y la app respectivamente, el diseño por computador a través de Catia ha permitido el diseño de la carcasa del lector, las técnicas de Ingenierı́a de Proyectos han permitido contemplar globalmente el proyecto a nivel de planificación, programación temporal y de costes, etc. Además, durante el desarrollo del trabajo se han adquirido otras aptitudes tales como el diseño y fabricación de una PCB, la ejecución de tareas de soldadura y verificación de circuitos, la programación de apps en Android, la capacidad de encontrar ayuda en documentaciones oficiales, etc. Este trabajo ha empapado al autor en la esencia de la naturaleza del ingeniero: la resolución de problemas. En efecto, se detectó la necesidad de modernizar el sistema de identificación de la cafeterı́a, y se consiguió no sólo resolver dicho problema, sino crear una herramienta de gestión del negocio al cliente personalizada a gusto del mismo, que la hace única frente a herramientas similares en el mercado. El autor cierra tanto su Grado como su periodo en la residencia mediante una humilde aportación a ésta, la cual ha sido su hogar durante aquél. 145 CAPÍTULO 9. CONCLUSIONES 146 Apéndice A IMPACTOS A.1. Impacto ambiental El sistema presentado en este trabajo ha permitido eliminar la identificación de residentes y gestión de base de datos mediante papel y bolı́grafo para sustituirla por un app compatible con dispositivos Android y un lector. Cualquiera de los métodos predecesores (cuadernos con tablas, vales entregados a los alumnos (más de 55.000 al año), etc) conllevaba un gasto considerable de papel. Gracias al sistema desarrollado, se elimina el gasto del papel, generando ası́ un impacto positivo sobre el medio ambiente. El principal impacto ambiental durante el uso del sistema es el consumo energético del mismo, al estar basado en componentes electrónicos que necesitan electricidad para funcionar. No obstante, el consumo energético del dispositivo Android y del módulo lector no son excesivos, aunque no por ello deja de ser un impacto sobre el medio ambiente. El impacto ambiental de los componentes electrónicos es importante tanto en la extracción de las materias primas como cuando dejan de ser útiles [13]. Cuando se convierten en residuos, es importante un adecuado reciclaje de estos componentes, pues contienen elementos que tienen riesgo de cara al medio ambiente por contaminación de espacios verdes, emisiones a la atmósfera de estos elementos tóxicos, etc. 147 A.2. IMPACTO SOCIAL A.2. APÉNDICE A. IMPACTOS Impacto social Se pueden mencionar también algunos impactos que tiene el sistema desarrollado desde la perspectiva social. Por una parte, desde un punto de vista socioeconómico, el principal impacto del sistema es la mejora de la productividad, si bien éste era el gran objetivo del trabajo. Además, este sistema es un aliciente para el atractivo del servicio de cafeterı́a, y por extensión, de la residencia, favoreciendo con el conjunto de aspectos positivos de la misma a un aumento de la demanda de plaza en ella, lo cual repercute positivamente en los ingresos. Por otra parte, desde un punto de vista de sostenibilidad tecnológica, cabe destacar la innovación que supone este trabajo en la cafeterı́a, que induce nuevas capacidades en los usuarios sobre el uso de este tipo de sistemas. Por último destacar como impactos positivos también a tener en cuenta la asequibilidad del producto ası́ como la robustez que se le ha conferido. 148 Bibliografı́a [1] Arduino. Official website. http://arduino.cc. [2] IES Bezmiliana. Criptografı́a de reducción. www.clubcientificobezmiliana.org/revista/index. php?option=com_content&view=article&id=102% 3Aserie-criptografia-firmas-digitales&catid=28% 3Aarticulos&Itemid=39&limitstart=1, 2009. http:// [3] SIG Bluetooth. http://www.bluetooth.com/Pages/ Bluetooth-Home.aspx, 2012. [4] BotScience. Historia de arduino y su https://botscience.wordpress.com/2012/06/05/ historia-de-arduino-y-su-nacimiento/. nacimiento. [5] Android Developer. Dashboards. http://developer.android.com/ intl/es/about/dashboards/index.html. [6] M.F. Carignano, P. Ferreyra. Tecnologı́a inalámbrica near field communication y sus aplicaciones en sistemas embebidos. Congreso Argentino de Sistemas Embebidos, 2011. [7] NFC Forum. Especificaciones técnicas. http://members.nfc-forum. org/specs/spec_list/#protts. [8] NFC Forum. Nfc record type definition (rtd). technical specification. http: //www.cardsys.dk/download/NFC_Docs/NFC%20Record%20Type% 20Definition%20(RTD)%20Technical%20Specification.pdf. [9] Gigatecno. Diferencias y similitudes entre nfc y bluetooth. http://gigatecno.blogspot.com.es/2014/09/ diferencias-y-similitudes-entre-nfc-y.html. [10] Comunidad Informática. 69-como-funciona-bluetooth. 149 http://es.ccm.net/contents/ BIBLIOGRAFÍA BIBLIOGRAFÍA [11] Desvarı́os Informáticos. https://rooibo.wordpress.com/2008/10/ 13/un-vistazo-profundo-a-bluetooth-y-su-seguridad/, 2008. [12] Sakshat Virtual Labs. http://vlssit.iitkgp.ernet.in/ant/ant/9/ theory/. [13] Janet Lara. Residuos electrónicos. http:// losresiduoselectronicos.blogspot.com.es/2010/03/ que-son-los-residuos-electronicos.html, 2010. [14] F. Matı́a, A. Jiménez, R. Aracil, E. Pinto. Teorı́a de Sistemas. 4 edition, 2003. [15] PROMETEC. http://www.prometec.net/bt-hc06/. [16] James Revelo. Hermosa programación. //www.hermosaprogramacion.com/2014/10/ android-sqlite-bases-de-datos/, 2014. http: [17] Universität Rostock. http://www.amd.e-technik.uni-rostock.de/ ma/gol/lectures/wirlec/bluetooth_info/k2_sdap.html. [18] J. Seguı́. Aplicaciones prácticas de nfc. http://www.3ciencias.com/ wp-content/uploads/2013/01/NFC.pdf, 2012. [19] Telekitar. Android: versión y nivel https://telekita.wordpress.com/2012/01/31/ version-de-android-y-nivel-de-api/. de api. [20] Wikipedia. Android. https://es.wikipedia.org/wiki/Android. [21] Palo Wireless. http://www.palowireless.com/bluearticles/cc1_ security1.asp, 2010. [22] Xakata. 2011, el año de la tecnologı́a nfc. http://www.xatakamovil.com/ conectividad/2011-el-ano-de-la-tecnologia-nfc. 150