PROTOTIPO DE SISTEMA DE SEGURIDAD EN VEHÍCULOS DE TRANSPORTE PUBLICO QUE PERMITE LA CAPTURA DE IMAGEN FOTOGRÁFICA, POSICIONAMIENTO GLOBAL Y ALMACENAMIENTO EN BASE DE DATOS AUTORES: JONATHAN FERNEY GONZALEZ BENAVIDES CARLOS ARTURO MARIN MENDEZ UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS FACULTAD TECNOLÓGICA PROYECTO CURRICULAR DE INGENIERIA EN TELECOMUNICACIONES Bogotá D.C., Colombia 2015 PROTOTIPO DE SISTEMA DE SEGURIDAD EN VEHÍCULOS DE TRANSPORTE PUBLICO QUE PERMITE LA CAPTURA DE IMAGEN FOTOGRÁFICA, POSICIONAMIENTO GLOBAL Y ALMACENAMIENTO EN BASE DE DATOS JONATHAN FERNEY GONZALEZ BENVIDES CARLOS ARTURO MARIN MENDEZ Código: 20122273010 Código: 20122273002 Monografía presentada como requisito parcial para optar al título de: Ingeniería en Telecomunicaciones Director: HERMES JAVIER ESLAVA BLANCO, M.Sc. Ph.D(c) UNIVERSIDAD DISTRITAL FRANCISCO JOSÉ DE CALDAS FACULTAD TECNOLÓGICA PROYECTO CURRICULAR DE INGENIERIA EN TELECOMUNICACIONES Bogotá D.C., Colombia 2015 PROTOTIPO DE SISTEMA DE SEGURIDAD EN VEHÍCULOS DE TRANSPORTE PUBLICO QUE PERMITE LA CAPTURA DE IMAGEN FOTOGRÁFICA, POSICIONAMIENTO GLOBAL Y ALMACENAMIENTO EN BASE DE DATOS PÁGINA DE APROBACIÓN Observaciones __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ _______________________________ Hermes Javier Eslava Blanco, m.sc. ph.d(c) Director Del Proyecto _______________________________ José David Cely Callejas Jurado Fecha de Presentación: Resumen El objeto principal del proyecto es el diseño de un dispositivo de seguridad en vehículos capaz de capturar datos de posición geográfica, tomar fotografías y enviar esta información vía internet, para ser alojados en una base de datos y visualizados a través de una página web. Este prototipo se diseñó usando la plataforma Raspberry Pi 2 Modelo B, la cual proporciona mayores garantías en términos de compatibilidad y versatilidad. Se diseñó una base de datos en un servidor remoto con MySQL para la importación de la información recibida y permitirle al usuario final previamente registrado, consultar esta información vía web. Con este prototipo se pretende ofrecer una alternativa tecnológica para mitigar la inseguridad en vehículos de trasporte público y reforzar el sistema integral de seguridad para el beneficio de la comunidad en general. Abstract The main purpose of the project is the design of a vehicle safety device enable for capturing geographical positional data, take pictures and send information by Internet, to be housed in a database and displayed through a web page. This prototype was designed using the platform Raspberry Pi 2 Model B, this platform provides greater guarantees in terms of compatibility and versatility. The database was designed on a remote server with MySQL for the import of the information received and permits the end user previously registered, access this information via the web. With this prototype is intended to provide a technological alternative to mitigate insecurity in public transport vehicles and reinforce the comprehensive security system for benefit of the community. 4 Contenido Resumen................................................................................................................................................... 4 Contenido ................................................................................................................................................. 5 Lista de tablas ........................................................................................................................................... 8 Lista de figuras ......................................................................................................................................... 9 Lista de términos .................................................................................................................................... 10 Glosario .................................................................................................................................................. 11 Introducción ........................................................................................................................................... 12 1. DESCRIPCIÓN DEL PROYECTO ........................................................................................................ 13 1.1. 2. OBJETIVOS .............................................................................................................................. 13 1.1.1. Objetivo General ............................................................................................................ 13 1.1.2. Objetivos Específicos ...................................................................................................... 13 METODOLOGÍA............................................................................................................................... 14 2.1. Diseño del Hardware .............................................................................................................. 14 2.2. Diseño Web y base de datos .................................................................................................. 14 2.3. Fases del proyecto.................................................................................................................. 15 3. MODELO DE FACTIBILIDAD TECNOLÓGICA .................................................................................... 17 4. MARCO TEÓRICO ............................................................................................................................ 21 4.1. HTML (HyperText Markup Language) .................................................................................... 21 4.1.1. 4.2. Estructura de cabecera................................................................................................... 21 PHP (Hypertext Preprocessor) ............................................................................................... 21 4.2.1. Características PHP ......................................................................................................... 22 4.3. WAMP SERVER ....................................................................................................................... 22 4.4. CSS .......................................................................................................................................... 23 4.5. JAVA SCRIPT............................................................................................................................ 24 4.5.1. API de Google Maps ....................................................................................................... 24 5 4.6. SERVIDOR WEB ....................................................................................................................... 25 4.7. SERVIDOR FTP......................................................................................................................... 25 4.8. MD5 (Message-Digest Algorithm) .......................................................................................... 25 4.9. BASES DE DATOS .................................................................................................................... 25 4.9.1. Tipos de bases de datos ................................................................................................. 26 4.9.2. Sistema Gestor de Base de Datos ................................................................................... 28 4.9.3. MySQL............................................................................................................................. 28 4.9.4. Modelo de Entidad – Relación....................................................................................... 29 4.10. GPS...................................................................................................................................... 30 4.10.1. Introducción ................................................................................................................... 30 4.10.2. Elementos que lo componen.......................................................................................... 30 4.10.3. Funcionamiento.............................................................................................................. 30 4.10.4. Fiabilidad de los datos .................................................................................................... 31 4.10.5. Fuentes de error ............................................................................................................. 31 4.10.6. GPS diferencial................................................................................................................ 32 4.10.7. Coordenadas GPS ........................................................................................................... 32 4.10.8. Múltiples sistemas de coordenadas para coordenadas geográficas .............................. 33 4.10.9. Unidades de medida para las coordenadas GPS ............................................................ 34 4.11. TRANSMISIÓN DE DATOS EN LA RED CELULAR .................................................................. 35 4.11.1. Telefonía Móvil 3G ......................................................................................................... 35 4.11.2. Comparación de la velocidad de los estándares de la telefonía móvil .......................... 36 4.12. RASPBERRY PI ..................................................................................................................... 37 4.12.1. Hardware Raspberry Pi ................................................................................................... 37 4.12.2. Accesorios para Raspberry Pi ......................................................................................... 39 4.12.3. Software para Raspberry Pi ............................................................................................ 41 4.13. PYTHON Y RASPBERRY ........................................................................................................ 42 4.13.1. 5. Python ............................................................................................................................ 42 DESARROLLO DEL PROYECTO ......................................................................................................... 44 5.1. DISEÑO DE HARDWARE .......................................................................................................... 44 5.1.1. Inicio de Raspberry Pi ..................................................................................................... 45 5.1.2. Adaptación de módulos y Programación de Raspberry Pi ............................................. 51 5.1.3. Internet móvil con el modem 3G USB Huawei E173 en la Raspberry ............................ 59 6 5.2. 6. DISEÑO DE APLICATIVO .......................................................................................................... 63 5.2.1. Instalación WAMP Server: .............................................................................................. 63 5.2.2. Transferencia de información ........................................................................................ 64 5.2.3. Creación de base de datos, tabla y conexión de MySQL con PHP ................................. 65 5.2.4. Visualización ................................................................................................................... 72 Pruebas técnicas............................................................................................................................. 75 6.1. Prueba de Estrés: ................................................................................................................... 76 7. Conclusiones................................................................................................................................... 78 A. Anexo: Script “principal.py” ........................................................................................................... 79 B. Anexo: Script “pulsador.py” ........................................................................................................... 80 D. Anexo: Script “picam.py” ............................................................................................................... 82 E. Anexo: Script “iniciogps.py” ........................................................................................................... 85 F. Anexo: Script “envioFTP.py” .......................................................................................................... 87 H. Anexo: Script “mapa.php” .............................................................................................................. 89 8. Bibliografía ..................................................................................................................................... 90 7 Lista de tablas Tabla 1: Fases del proyecto .................................................................................................................... 16 Tabla 2: Comparación entre plataformas electrónicas modernas compuestas. ................................... 17 Tabla 3: Comparación entre lenguajes de programación. ..................................................................... 18 Tabla 4: Comparación entre servidores de mapas. ................................................................................ 20 Tabla 5: Comparación entre los tiempos de respuesta de los mapas.................................................... 20 Tabla 6: Correlación entre coordenadas Decímales y Sexagesimales. [21] .......................................... 34 Tabla 7: Comparación de la velocidad de los estándares de la telefonía móvil. [23] ............................ 36 Tabla 8: Conexiones GPIO. [26] .............................................................................................................. 38 Tabla 9: Extensión de conexiones GPIO para modelo B versión 2. [26]................................................. 39 Tabla 10: Es pesificaciones técnicas del módulo GPS. [30] .................................................................... 41 Tabla 11: Tabla de Monitoreo en MySQL ............................................................................................... 66 Tabla 12: Tabla de registro ..................................................................................................................... 67 8 Lista de figuras Figura 1: Modelo Top-Down para el diseño de Hardware. .................................................................... 14 Figura 2: Modelo cascada para el diseño de software ........................................................................... 15 Figura 3: Entorno de Administración WampServer. [5] ......................................................................... 23 Figura 4. Representación de mapa en Google Maps. [8] ....................................................................... 24 Figura 5: Gestores de bases de datos. [14] ............................................................................................ 28 Figura 6: Cálculo de la posición usado tres satélites. [17] ..................................................................... 31 Figura 7. División de la superficie terrestre en paralelos y meridianos. [20]......................................... 33 Figura 8: Placa Raspberry pi. [24] ........................................................................................................... 37 Figura 9: Raspberry pi Modelo B. [25].................................................................................................... 38 Figura 10: Modulo cámara para Raspberry pi. [28] ............................................................................... 39 Figura 11: Modulo GPS Ublox NEO 6M. [29] .......................................................................................... 40 Figura 12: Interfaz del programa SD Formatter. [34] ............................................................................. 45 Figura 13: Pantalla inicial de Pi Recovery. [36] ...................................................................................... 47 Figura 14: Menú principal de configuración de Raspbian. [36] ............................................................. 47 Figura 15: Menú de opciones de internacionalización de Raspbian. [36] ............................................. 48 Figura 16: XMING con Raspberry Pi iniciar startlxde. [38] ..................................................................... 50 Figura 17: Conexión de la cámara a la interfaz CSI de la Raspberry Pi. [39] .......................................... 53 Figura 18: Esquema y conexión de módulo Ublox M6 a Raspberry pi. [41] .......................................... 56 Figura 19: Pantalla de terminal con datos del GPS. [41] ........................................................................ 57 Figura 20: Correo electrónico recibido de emergencia.......................................................................... 58 Figura 21: Datos almacenados para la importación en la base de datos............................................... 58 Figura 22: Pantalla inicial de Sakis 3G interactivo. ................................................................................. 62 Figura 23: Interfaz de logeo de phpMyAdmin ....................................................................................... 64 Figura 24: Interfaz TYPSoft FTP Server ................................................................................................... 65 Figura 25: Esquema entidad relación ..................................................................................................... 68 Figura 26: Diagrama de bloques del registro de usuario ....................................................................... 70 Figura 27: Diagrama de bloques inicio sesión ........................................................................................ 71 Figura 28: Entorno Web, consulta sin datos de tabla monitoreo .......................................................... 72 Figura 29: Entorno Web consulta datos tabla monitoreo ..................................................................... 72 Figura 30: Captura de coordenadas en Google Maps ............................................................................ 73 Figura 31: Google Developers equipo escritorio. ................................................................................... 75 Figura 32: Google Developers dispositivo móvil. ................................................................................... 76 Figura 33. Prueba de carga de conexión con 25 usuarios. ..................................................................... 76 Figura 34. Respuesta de páginas y estilos. ............................................................................................. 77 Figura 35. Tiempo respuesta plataforma web. ...................................................................................... 77 9 Lista de términos CSS: Cascading Style Sheets XML: eXtensible Markup Language WML: Wireless Markup Language MD5: Message-Digest Algorithm 5 DBA: Data Base Administrator SGBD: Data Base Management System SQL: Structured Query Language C: Lenguaje de programación NAVSTAR: Navigation System Using Timing and Ranging GNSS: Global Navigation Satellite System GLONASS: Global'naya Navigatsionnaya Sputnikovaya Sistema WAAS: Wide Area Augmentation System EGNOS: European Geostationary Navigation Overlay Service MSAS: Multi-functional Satellite Augmentation System GAGAN: GPS Aided Geo Augmented Navigation GPRS: General Packet Radio Service EDGE: Enhanced Data rates for GSM Evolution UMTS: Universal Mobile Telecommunications System WCDMA: Wideband Code Division Multiple Access CDMA: Code Division Multiple Access HSDPA: High Speed Downlink Packet Access LTE: Long Term Evolution SBC: Single Board Computer GPIO: General Purpose Input/Output IDE: Integrated Development Environment UNIX: Sistema operativo 10 Glosario 3G: Abreviatura de tercera generación de transmisión de voz y datos a través de la telefonía móvil. Browser: Software, aplicación o programa que permite la navegación en la web. API: (Application Programming Interface), interfaz de programación de aplicaciones. Apache: Servidor HTTP Apache de código abierto, para plataformas Linux, Microsoft, Macintosh etc. Cámara: Dispositivo tecnológico cuyo objetivo es la captura de imágenes. Directorio: Contenedor virtual de archivos. Google Maps: Servidor de aplicaciones de mapas en la web, pertenece a la empresa Google. GPS: (Global Position System) Sistema de posicionamiento global que permite determinar la posición de un objeto (persona, un vehículo etc.). FTP: (File Text Protocol), transferencia de archivos entre dispositivos que proporciona seguridad y orden en la transferencia. HTML: Lenguaje de marcas de hipertexto para la elaboración de páginas web. HTTP: (Hypertext Transfer Protocol) usado para la transacción de la World Wide Web. JavaScript: Lenguaje de programación de uso principalmente para desarrollo de páginas web dinámicas. MySQL: Gestor de bases de datos relacional, multihilo y multiusuario. Raspberry PI: Mini ordenador que puede ser usado como servidor de contenidos. Raspbian: Sistema operativo Linux para Raspberry basado en Debian. PHP: (Hypertext PreProcessor), lenguaje de código abierto especialmente adecuado para desarrollo web y puede ser incrustado en HTML. Python: Lenguaje de programación de alto nivel, interpretado y multipropósito. SHELL: Término usado en informática para referirse a un intérprete de comandos. WampServer: Entorno de desarrollo web (Windows-Apache-MySQL-Php/Phyton/Perl). 11 Introducción Pensando en la vinculación de proyectos que contribuyan a la mejora y desarrollo de los sistemas de seguridad ciudadana, surge la necesidad de elaborar alternativas y estrategias en búsqueda del fortalecimiento integral de seguridad. La inseguridad en la ciudad es uno de los problemas más sentidos por la población, que afecta las diversas actividades económicas, sociales, recreativas, educativas, entre otras, con diferente intensidad. Según el Observatorio de Seguridad de Bogotá de la Cámara de Comercio, la percepción de seguridad en el primer semestre del 2013 es la siguiente. El taxi es la modalidad de transporte público considerada más segura por los encuestados; no obstante, su percepción positiva se reduce en 7 puntos. El Transmilenio es señalado seguro solo por el 23% de los encuestados y el taxi por el 18%. En el caso del taxi, indican que la posibilidad de solicitarlo directamente a la empresa, es la razón principal para percibirlo como un medio de trasporte seguro. Quienes lo consideran inseguro, señalan la posibilidad de ser víctima de paseo millonario y de fleteo. Quienes consideran que el Transmilenio es seguro, señalan como razones más importantes la presencia de policía y de vigilancia privada. Los demás argumentan que hay exceso de personas e indican que se presentan casos de robos y atracos. De esta manera, la Cámara de Comercio informa que el transporte público de pasajeros sigue siendo uno de los escenarios donde se registra la mayor victimización, los más altos niveles de percepción de inseguridad y de conflictividad en la ciudad. Por tanto, es preciso mejorar la calidad de la información a fin de comprender la magnitud de los hechos que ocurren en el sistema de transporte de la ciudad y proponer estrategias concretas y públicas que permitan mejorar las condiciones de seguridad. [1] En este caso, el proyecto está enfocado al diseño y desarrollo de un prototipo tecnológico de seguridad vehicular, que busca satisfacer las necesidades básicas mediante envío de reportes periódicos a una base de datos, de localización geográfica del vehículo a través de GoogleMaps, capturas fotográficas al interior del vehículo, dirección, estado de activación automática o de emergencia, fecha y hora, de tal manera que esta información pueda ser consultada cuando el usuario lo requiera en internet. La proyección a futuro, es que el prototipo sirva como base para elaborar una plataforma más robusta, que contenga mayores elementos en los reportes y mejoras en la eficiencia operativa para proporcionar un sistema de seguridad más optimizado. 12 1. DESCRIPCIÓN DEL PROYECTO 1.1. 1.1.1. OBJETIVOS Objetivo General Diseñar y desarrollar un sistema de seguridad en vehículos de transporte público de pasajeros, realizando captura de imágenes fotográficas y simultáneamente obteniendo la ubicación del vehículo, esta información adquirida podrá ser consultada por el usuario interesado vía web. 1.1.2. Objetivos Específicos Diseñar el sistema físico y operacional capaz de capturar imágenes fotográficas y coordenadas de posicionamiento, transmitiendo los datos obtenidos a través de la red celular a un servidor remoto. Diseñar una base de datos para almacenar la información recibida y ser consultada vía web. Validar, comparar y analizar la veracidad de los datos transmitidos y recibidos, realizando diversas pruebas en vehículos y ubicaciones diferentes. 13 2. METODOLOGÍA A continuación, se describe la metodología implementada para el diseño del hardware y el software utilizado para el funcionamiento general del proyecto. 2.1. Diseño del Hardware Para el desarrollo completo del dispositivo físico se realizó con el diseño Top-Down. El diseño TopDown consiste en capturar una idea con un alto nivel de abstracción, implementarla partiendo de la misma, e incrementar el nivel de detalle según sea necesario. El sistema inicial se va subdividiendo en módulos, estableciendo una jerarquía. Cada módulo se subdivide cuantas veces sea necesario hasta llegar a los componentes primarios del diseño como muestra el esquema de la figura. Figura 1: Modelo Top-Down para el diseño de Hardware. 2.2. Diseño Web y base de datos Para el desarrollo WEB y creación de la base de datos, la elección del modelo de software para este caso fue el modelo cascada, el desarrrollo secuencial de las fases permite que a medida que se termina un bloque, le de vida al siguiente y permita compactar y complementar el desarrollo y ejecución del diseño. Este modelo, fue la mejor práctica encontrada para el tipo de proyecto implementado. A continuación la respresentación del esquema. 14 Figura 2: Modelo cascada para el diseño de software 2.3. Fases del proyecto Para dar cumplimiento a los objetivos específicos, se siguieron una serie de actividades, las cuales dan indicios del proceso seguido para la finalidad del proyecto. En la siguiente tabla, se relacionan las actividades principales. Investigación y análisis de las posibilidades de dispositivos electrónicos y nuevas tecnologías que faciliten la creación del hardware requerido. Elección de la mejor opción en relación costo-beneficio y adquisición de los materiales indispensables para la fabricación del hardware. Diseño del sistema físico local Diseño de un diagrama del circuito, acoplando los diferentes módulos que interfieren en el dispositivo. Acoplamiento e implementación de los módulos electrónicos para la función requerida. Pruebas y revisión del funcionamiento del dispositivo, verificando la compatibilidad, tiempos de respuesta y capacidad de almacenamiento. Diseño del sistema físico remoto Evaluar características, ventajas y desventajas sobre el servidor a utilizar para el desarrollo, procesamiento y visualización de la información. Integración y configuración del servidor remoto, para el almacenamiento de archivos FTP, base de datos y pagina web. 15 Configuración local de red del servidor para ser identificado en internet y lograr recibir información externa enviada del dispositivo Raspberry. Estudio sobre los diferentes lenguajes de programación necesarios. Manejo de comandos en la Shell del sistema operativo de la Raspberry. Programación de código fuente Creación del código en Python para el control de los módulos y el procesamiento de los archivos en la Raspberry Pi. Manejo y aplicación del API de Google Maps para la incorporación y modificación, en código JavaScript, PHP y HTML. Importación de la información recibida con sentencias SQL, y programación en HTML, PHP y JavaScript para la publicación de la información. Adquisición de los datos primordiales, como imágenes y coordenadas de posicionamiento. Validación, comparación y análisis de los datos transmitidos y recibidos Pruebas de captura de imágenes, con diferentes entornos y cambios de iluminación, al igual que el almacenamiento de manera local. Validación de la transmisión de los datos a través de la red local y la red 3G, diagnosticando tiempos, cantidad de datos, costos y perdidas de conectividad. Revisión de la veracidad y concordancia de los datos transmitidos con los recibidos, registrados en la base de datos y visualización en la página web por usuario registrado. Tabla 1: Fases del proyecto 16 3. MODELO DE FACTIBILIDAD TECNOLÓGICA Tabla 2: Comparación entre plataformas electrónicas modernas compuestas. 17 Tabla 3: Comparación entre lenguajes de programación. 18 19 Tabla 4: Comparación entre servidores de mapas. Tabla 5: Comparación entre los tiempos de respuesta de los mapas. 20 4. MARCO TEÓRICO 4.1. HTML (HyperText Markup Language) Es el lenguaje que se emplea para el desarrollo de páginas de internet. HTML es un lenguaje de marcado que nos permite indicar la estructura de nuestro documento mediante etiquetas. Este lenguaje nos ofrece una gran adaptabilidad, una estructuración lógica y es fácil de interpretar tanto por humanos como por máquinas, ya que siguen un esquema de árbol donde existe un elemento raíz y donde el resto de etiquetas se insertan de manera lógica y estructurada. Además, se trata de un fichero de texto, y solo se necesita un editor como el bloc de notas para generar un documento HTML. 4.1.1. Estructura de cabecera Información contextual de la página. Estos metadatos nos permiten indicar información que puede no quedar clara en el contenido. Referencia a otros ficheros. Todos aquellos recursos que necesite nuestra página deben estar referenciados desde la cabecera. Por ejemplo, archivos de CSS y JavaScript, el icono de la barra de direcciones, etc. Scripts y estilos. Si estos no se definen en un fichero independiente, se incluyen en la sección de cabecera para que estén disponibles en todo el documento y no tener que repetirlos. Por otro lado, en el cuerpo se encuentra todo el contenido de la página, desde el texto a las imágenes, pasando por vídeos, enlaces, etc. Este contenido debe estar estructurado en diferentes secciones y marcado correctamente. [2] 4.2. PHP (Hypertext Preprocessor) A diferencia de Java o JavaScript que se ejecutan en el navegador, PHP se ejecuta en el servidor, por eso nos permite acceder a los recursos que tenga el servidor; ejemplo: una base de datos. El programa PHP es ejecutado en el servidor y el resultado enviado al navegador. Al ser PHP un lenguaje 21 que se ejecuta en el servidor, no es necesario que su navegador lo soporte, es independiente del navegador, sin embargo para que las páginas PHP funcionen, el servidor donde están alojadas debe soportar PHP. [3] 4.2.1. Características PHP Algunas de las características más relevantes de PHP son: 1. Libertad de elegir el sistema operativo y el servidor web. Además, se tiene la posibilidad de utilizar programación por procedimientos o programación orientada a objetos (POO), o una mezcla de ambas. 2. Una de las características más potentes y destacables de PHP es su soporte para un amplio abanico de bases de datos. Escribir una página web con acceso a una base de datos es simple utilizando una de las extensiones específicas de bases de datos (ejemplo: MySQL) o utilizar una capa de abstracción como PDO, o conectarse a cualquier base de datos que admita el estándar de Conexión Abierta a Bases de Datos por medio de la extensión ODBC. 3. PHP también cuenta con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros. También se pueden crear sockets de red puros e interactuar usando cualquier otro protocolo. [4] 4.3. WAMP SERVER Es un acrónimo para describir un sistema de infraestructura que usa las siguientes herramientas (Windows-Apache-MySQL-PHP, Perl o Python), este entorno de desarrollo web permite tener un servidor propio o host local (instalado en el equipo). Es usado (entre otros) por desarrolladores y/o programadores para realizar prácticas de sus proyectos web antes de subirlos al servidor web en internet. [5] Características: Manejo de Bases de datos con MySQL Software para servidor web Apache Software para poder programar script con PHP (generalmente). Permite el manejo sencillo de Bases de Datos con PHPMyAdmin y SQLiteManager Es gratuito. 22 Figura 3: Entorno de Administración WampServer. [5] 4.4. CSS El concepto de hojas de estilo apareció por primera vez en 1996 cuando W3C publicó una recomendación nueva intitulada "Hojas de estilo en cascada" o CSS, su sigla en inglés. El principio de las hojas de estilo, consiste en la utilización de un solo documento para almacenar las características de presentación de las páginas asociadas a grupos de elementos. Esto implica nombrar un conjunto de definiciones y características de presentación de las páginas, y activar esos nombres para aplicarlos a una parte del texto. Por ejemplo, se pueden configurar los títulos de una sección para que aparezcan en fuente Arial, en color verde y en cursiva. Las hojas de estilo se desarrollaron para compensar los defectos de HTML con respecto a la presentación y al diseño de las páginas. HTML tiene varias etiquetas para modificar la presentación y definir los estilos del texto, pero cada elemento tiene su propio estilo, independientemente de los elementos que lo rodean. Al utilizar hojas de estilo, cuando se necesite cambiar la apariencia de un sitio que tiene cientos de páginas Web todo lo que hay que hacer es editar las definiciones de la hoja de estilo en un solo lugar para cambiar la apariencia del sitio completo. Se denominan "hojas de estilo en cascada" porque se pueden definir múltiples hojas y los estilos pueden aplicarse a todas las páginas (con un sistema predefinido para resolver conflictos). Las hojas de estilo pueden utilizarse para: Lograr una apariencia uniforme de todo el sitio al activar una sola definición de estilo en cada página. Cambiar un aspecto en todo el sitio Web con tan sólo editar unas pocas líneas. Hacer que los códigos HTML sean más fáciles de leer ya que los estilos se definen por separado. Permitir que las páginas se carguen más rápido ya que hay menos cantidad de HTML en cada página. Posicionar los elementos de la página de una manera más uniforme. [6] 23 4.5. JAVA SCRIPT JavaScript es un sencillo lenguaje de programación, que presenta una característica especial: sus programas, llamados comúnmente scripts, se enlaza en las páginas HTML y se ejecutan en el navegador (Mozilla Firefox, Microsoft Internet Explorer,...). Estos scripts normalmente consisten en unas funciones que son llamadas desde el propio HTML cuando algún evento sucede. De ese modo, podemos añadir efectos como que un botón cambie de forma al pasar el ratón por encima, o abrir una ventana nueva al pulsar en un enlace. [7] 4.5.1. API de Google Maps Es sólo HTML, CSS y JavaScript trabajando junto. Los mapas son solo imágenes que se cargan en el fondo a través de peticiones ejecutadas por la tecnología de AJAX, y se insertan en un <div> en la página HTML. Mientras navegas en el mapa, el API envía información acerca de las nuevas coordenadas y los niveles de “zoom” del mapa a través de AJAX y esto retorna las imágenes. El API consiste de archivos JavaScript que contienen las clases, métodos y propiedades que se usan para el comportamiento de los mapas. La última versión del API es la 3.0. Figura 4. Representación de mapa en Google Maps. [8] Las coordenadas están expresadas usando números decimales separados por coma. La latitud siempre precede la longitud. La latitud es positiva si va después del punto mostrado en el mapa y negativo si va antes. La longitud es positiva si va arriba del punto y negativa si va debajo. El código a utilizar es el siguiente: <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script> Es importante que el código mencionado anteriormente, se encuentre debajo del elemento <script> que incluye el API, para que así se pueda cargar todas las clases, métodos y propiedades a usar. Las clases, métodos y propiedades comienzan con google.maps. A eso se le conoce como namespace. [8] 24 4.6. SERVIDOR WEB Los servidores web son los encargados de recibir las peticiones referidas a páginas o elementos de la web a través del protocolo http o https y de devolver el resultado de la petición, que suele ser un recurso alojado en el servidor. Normalmente es el navegador el que pide al servidor web el recurso que desea el usuario, para finalmente recibir dicho recurso (si fue válida la petición) y traducirle si es necesario a su forma legible por el usuario (es decir la traducción de HTML la hace el navegador). [9] 4.7. SERVIDOR FTP Uno de los servicios más antiguos de Internet, File Transfer Protocol permite mover uno o más archivos con seguridad entre distintos ordenadores proporcionando seguridad y organización de los archivos así como control de la transferencia. La seguridad se ha convertido en un tema candente. Durante años, los servidores ftp comunicaban con los clientes "en abierto," es decir, que la información de la conexión y de la contraseña era vulnerable a la interceptación. Ahora, los servidores ftp, tales como BulletProof FTP, SecureFTP, SurgeFTP, TitanFTP, y WS_FTP, soportan SSL/TLS y utilizan el mismo tipo de cifrado presente en los sitios web seguros. Con SSL/TLS, los servidores ftp pueden cifrar los comandos de control entre los clientes del ftp y el servidor, así como los datos del archivo. Con la ayuda del PGP, como en WS_FTP pro, los datos del archivo se aseguran todavía más con el cifrado público. [10] 4.8. MD5 (Message-Digest Algorithm) El algoritmo MD5 se utiliza como una función de codificación o huella digital de un archivo. A menudo empleado para codificar contraseñas en bases de datos, el MD5 es igualmente capaz de generar una huella de archivo para asegurar que no haya cambios en el mismo tras una transferencia, por ejemplo. Un hash MD5 está compuesto por 32 caracteres hexadecimales. [11] 4.9. BASES DE DATOS Un sistema de bases de datos sirve para integrar los datos, organizar campos, registros y archivos. Lo componen los siguientes elementos: Hardware. Máquinas en las que se almacenan las bases de datos. Incorporan unidades de almacenamiento masivo para este fin. Software. Es el sistema gestor de bases de datos. El encargado de administrar las bases de datos. 25 Datos. Incluyen los datos que se necesitan almacenar y los metadatos que son datos que sirven para describir lo que se almacena en la base de datos. Usuarios. Personas que manipulan los datos del sistema. Hay tres categorías: Usuarios finales. Aquellos que utilizan datos de la base de datos para su trabajo cotidiano que no tiene por qué tener que ver con la informática. Normalmente no utilizan la base de datos directamente, si no que utilizan aplicaciones creadas para ellos a fin de facilitar la manipulación de los datos. Estos usuarios sólo acceden a ciertos datos. Desarrolladores. Analistas y programadores encargados de generar aplicaciones para los usuarios finales. Administradores. También llamados DBA (Data Base Administrator), se encargan de gestionar las bases de datos. [12] 4.9.1. Tipos de bases de datos Las bases de datos se pueden clasificar de varias maneras, según el contexto que se esté manejando o su utilidad. Según variabilidad de datos. Bases de datos estáticas Estas son bases de datos de solo lectura, utilizadas primordialmente para almacenar datos históricos que posteriormente se pueden utilizar para estudiar el comportamiento de un conjunto de datos a través del tiempo, realizar proyecciones y tomar decisiones. Bases de datos dinámicas Estas son bases de datos donde la información almacenada se modifica con el tiempo, permitiendo operaciones como actualización, borrado y adición de datos, además de las operaciones fundamentales de consulta. De acuerdo a su modelo de administración de datos: Bases de datos Jerárquicas En este modelo los datos se organizan en una forma similar a un árbol (visto al revés), en donde un nodo padre de información puede tener varios hijos. El nodo que no tiene padres es llamado raíz, y a los nodos que no tienen hijos se los conoce como hojas. Son especialmente útiles en el caso de aplicaciones que manejan un gran volumen de información y datos muy compartidos permitiendo crear estructuras estables y de gran rendimiento. Bases de datos de red 26 Éste es un modelo ligeramente distinto del jerárquico; la diferencia fundamental es la modificación del concepto de nodo: se permite que un mismo nodo tenga varios padres (posibilidad no permitida en el modelo jerárquico). Mejora la redundancia de datos sin embargo la administración es más compleja y limita el uso del usuario final. Bases de datos transaccionales Son bases de datos cuyo único fin es el envío y recepción de datos a grandes velocidades, estas bases son muy poco comunes y están dirigidas por lo general al entorno de análisis de calidad, datos de producción e industrial. Bases de datos relacionales Éste es el modelo utilizado en la actualidad para modelar problemas reales y administrar datos dinámicamente. En este modelo, el lugar y la forma en que se almacenen los datos no tienen relevancia (a diferencia de otros modelos como el jerárquico y el de red). Esto tiene la considerable ventaja de que es más fácil de entender y de utilizar para un usuario esporádico de la base de datos. La información puede ser recuperada o almacenada mediante "consultas" que ofrecen una amplia flexibilidad y poder para administrar la información. Bases de datos multidimensionales Son bases de datos ideadas para desarrollar aplicaciones muy concretas, los campos o atributos de una tabla pueden ser de dos tipos, o bien representan dimensiones de la tabla, o bien representan métricas que se desean estudiar. Bases de datos orientadas a objetos Este modelo, bastante reciente, y propio de los modelos informáticos enfocado a objetos, trata de almacenar en la base de datos los objetos completos (estado y comportamiento). Paradigma, herencia y polimorfismo son de los principales conceptos que incorpora el paradigma de objetos. Bases de datos documentales Permiten la indexación a texto completo, y en líneas generales realizar búsquedas más potentes. Tesaurus es un sistema de índices optimizado para este tipo de bases de datos. Bases de datos deductivas Es un sistema de base de datos pero con la diferencia de que permite hacer deducciones a través de inferencias. Se basa principalmente en reglas y hechos que son almacenados en la base de datos. Las bases de datos deductivas son también llamadas bases de datos lógicas, a raíz de que se basa en lógica matemática. [13] 27 4.9.2. Sistema Gestor de Base de Datos Un Sistema Gestor de Base de Datos (SGBD) es un sistema de software que permite la definición de bases de datos; así como la elección de las estructuras de datos necesarios para el almacenamiento y búsqueda de los datos, ya sea de forma interactiva o a través de un lenguaje de programación. Un SGBD relacional es un modelo de datos que facilita a los usuarios describir los datos que serán almacenados en la base de datos junto con un grupo de operaciones para manejar los datos. Los SGBD relacionales son una herramienta efectiva que permite a varios usuarios acceder a los datos al mismo tiempo. Brindan facilidades eficientes y un grupo de funciones con el objetivo de garantizar la confidencialidad, la calidad, la seguridad y la integridad de los datos que contienen, así como un acceso fácil y eficiente a los mismos. [14] Algunos de los principales gestores de bases de datos son: MySQL Microsoft SQL Server PostgreSQL Oracle Figura 5: Gestores de bases de datos. [14] 4.9.3. MySQL Es un sistema gestor de bases de datos relacionales rápido, sólido y flexible. Es idóneo para la creación de bases de datos con acceso desde páginas web dinámicas, así como para la creación de cualquier otra solución que implique el almacenamiento de datos, posibilitando realizar múltiples y rápidas consultas. Está desarrollado en C y C++, facilitando su integración en otras aplicaciones desarrolladas también en esos lenguajes. Es un sistema cliente/servidor, por lo que permite trabajar como servidor multiusuario y de subprocesamiento múltiple, o sea, cada vez que se crea una conexión con el servidor, el programa servidor establece un proceso para manejar la solicitud del cliente, controlando así el acceso simultáneo de un gran número de usuarios a los datos y asegurando el acceso a usuarios autorizados solamente. [15] 28 4.9.4. Modelo de Entidad – Relación El Modelo de Entidad Relación es un modelo de datos basado en una percepción del mundo real que consiste en un conjunto de objetos básicos llamados entidades y relaciones entre estos objetos, implementándose en forma gráfica a través del Diagrama Entidad Relación. Hablamos de ejemplares cuando nos referimos a una clase de objetos con características similares (ejemplares=registros). Se puede definir como Entidad a cualquier objeto, real o abstracto, que existe en un contexto determinado o puede llegar a existir y del cual deseamos guardar información. Los Atributos son características o propiedades asociadas a la entidad que toman valor en una instancia particular. Ejemplo: nombre, cédula, teléfono. Clave primaria: Se denomina Clave principal o primaria al atributo o conjunto mínimo de atributos (uno o más campos) que permiten identificar en forma única cada instancia de la entidad, es decir, a cada registro de la tabla. Las claves principales se utilizan cuando se necesita hacer referencia a registros específicos de una tabla desde otra tabla. En un principio se puede identificar más de un atributo que cumpla las condiciones para ser clave, los mismos se denominan Claves candidatas. Tipos de relaciones Clasificación por cardinalidad: Relación Uno a Uno: Cuando un registro de una tabla sólo puede estar relacionado con un único registro de la otra tabla y viceversa. En este caso la clave foránea se ubica en alguna de las 2 tablas. Relación Uno a Muchos: Cuando un registro de una tabla (tabla secundaria) sólo puede estar relacionado con un único registro de la otra tabla (tabla principal) y un registro de la tabla principal puede tener más de un registro relacionado en la tabla secundaria. En este caso la clave foránea se ubica en la tabla secundaria. Relación Muchos a Muchos: Cuando un registro de una tabla puede estar relacionado con más de un registro de la otra tabla y viceversa. En este caso las dos tablas no pueden estar relacionadas directamente, se tiene que añadir una tabla entre las dos (Tabla débil o de vinculación) que incluya los pares de valores relacionados entre sí. Clasificación por modalidad: Dadas las tablas A y B, que se encuentran relacionadas: Si para todo registro de A debe existir siempre al menos un registro de B asociado, se dice que la relación en sentido A->B es Obligatoria. Si para todo registro de A, pueden existir o no, uno o varios registros de B asociados, se dice que la relación en sentido A->B es optativa. La modalidad de las relaciones se debe analizar en ambos sentidos. [16] 29 4.10. GPS Dado que el concepto principal de nuestro proyecto se basa en la tecnología GPS, veremos a continuación algunos conceptos básicos sobre el Sistema de Posicionamiento Global, GPS. 4.10.1. Introducción El Global Positioning System (GPS) o Sistema de Posicionamiento Global originalmente llamado NAVSTAR, es un Sistema Global de Navegación por Satélite (GNSS) el cual permite determinar en todo el mundo la posición de una persona, un vehículo o una nave, con una desviación de cuatro metros. El sistema fue desarrollado e instalado, y actualmente es operado, por el Departamento de Defensa de los Estados Unidos. 4.10.2. Elementos que lo componen Sistema de satélites: Formado por 21 unidades operativas y 3 de repuesto en órbita sobre la tierra a 20.200 km con trayectorias sincronizadas para cubrir toda la superficie del globo. Se abastecen mediante paneles de energía solar. Estaciones terrestres: Envían información de control a los satélites para controlar las órbitas y realizar el mantenimiento de toda la constelación. Terminales receptores: Nos indica la posición en la que estamos, conocidas también como Unidades GPS, son las que podemos adquirir en las tiendas especializadas. 4.10.3. Funcionamiento El receptor GPS funciona midiendo su distancia de los satélites, y usa esa información para calcular su posición. Esta distancia se mide calculando el tiempo que la señal tarda en llegar al receptor. Conocido ese tiempo y basándose en el hecho de que la señal viaja a la velocidad de la luz (salvo algunas correcciones que se aplican), se puede calcular la distancia entre el receptor y el satélite. Cada satélite indica que el receptor se encuentra en un punto en la superficie de la esfera con centro en el propio satélite y de radio la distancia total hasta el receptor. Obteniendo información de dos satélites se nos indica que el receptor se encuentra sobre la circunferencia que resulta cuando se intersectan las dos esferas. Si adquirimos la misma información de un tercer satélite notamos que la nueva esfera solo corta el círculo anterior en dos puntos. Uno de ellos se puede descartar porque ofrece una posición absurda. De esta manera ya tendríamos la posición en 3-D. Sin embargo, dado que el reloj que incorporan los receptores GPS no está sincronizado con los relojes atómicos de los satélites GPS, los dos puntos determinados no son precisos. 30 Teniendo información de un cuarto satélite, eliminamos el inconveniente de la falta de sincronización entre los relojes de los receptores GPS y los relojes de los satélites. Y es en este momento cuando el receptor GPS puede determinar una posición 3-D exacta (latitud, longitud y altitud). Al no estar sincronizados los relojes entre el receptor y los satélites, la intersección de las cuatro esferas con centro en estos satélites es un pequeño volumen en vez de ser un punto. La corrección consiste en ajustar la hora del receptor de tal forma que este volumen se transforme en un punto. Figura 6: Cálculo de la posición usado tres satélites. [17] 4.10.4. Fiabilidad de los datos Debido al carácter militar del sistema GPS, el Departamento de Defensa de los Estados Unidos se reserva la posibilidad de incluir un cierto grado de error aleatorio que puede variar de los 15 a los 100 metros. Aunque actualmente no aplique tal error inducido, la precisión intrínseca del sistema GPS depende del número de satélites visibles en un momento y posición determinados. Sin aplicar ningún tipo de corrección y con ocho satélites a la vista, la precisión es de 6 a 15 metros; pero puede obtenerse más precisión usando sistemas de corrección (Ej: DGPS). 4.10.5. Fuentes de error Retraso de la señal en la ionosfera y troposfera. Señal multirruta, producida por el rebote de la señal en edificios y montañas cercanos. Errores de orbitales, donde los datos de la órbita del satélite no son completamente precisos. Número de satélites visibles. Geometría de los satélites visibles. Errores locales en el reloj del GPS. 31 4.10.6. GPS diferencial DGPS (Differential GPS) o GPS diferencial es un sistema que proporciona a los receptores de GPS correcciones a los datos recibidos de los satélites GPS. Estas correcciones, una vez aplicadas, proporcionan una mayor precisión en la posición calculada. El sistema de correcciones funciona de la siguiente manera: Una estación base en tierra, con coordenadas muy bien definidas, escucha los satélites GPS. Calcula su posición por los datos recibidos de los satélites. Dado que su posición está bien definida, calcula el error entre su posición verdadera y la calculada, estimando el error en cada satélite. Se envía estas correcciones al receptor a través de algún medio. Existen varias formas de obtener las correcciones DGPS. Las más usadas son: Recibidas por radio a través de algún canal preparado para ello, como el RDS en una emisora de FM. Descargadas de Internet con una conexión inalámbrica. Proporcionadas por algún sistema de satélites diseñado para tal efecto. En Estados Unidos existe el WAAS, en Europa el EGNOS, en Japón el MSAS y en India el GAGAN, todos compatibles entre sí. Para que las correcciones DGPS sean válidas, el receptor tiene que estar relativamente cerca de alguna estación DGPS, generalmente, a menos de mil kilómetros. La precisión lograda puede ser de unos dos metros en latitud y longitud, y unos tres metros en altitud. [18] 4.10.7. Coordenadas GPS Las coordenadas geográficas son un conjunto de líneas imaginarias que permiten ubicar con exactitud un lugar en la superficie de la Tierra. Este conjunto de líneas corresponden a los meridianos y paralelos. Estas líneas o círculos son trazados por los cartógrafos sobre los mapas. Cualquier punto de nuestro planeta puede ubicarse al conocerse el meridiano de longitud y el paralelo de latitud. [19] 32 Figura 7. División de la superficie terrestre en paralelos y meridianos. [20] Latitud La latitud de un punto es la medida del ángulo formado por el plano ecuatorial con la línea que une a éste punto al centro de la tierra. Por regla general está comprendido entre -90 ° y 90 °. Los valores negativos son para ubicaciones en el hemisferio sur, y el valor de la latitud es de 0 ° en el ecuador. Longitud La longitud tiene el mismo principio, con la diferencia en que no existe una referencia natural como lo es el ecuador para la latitud. La referencia para la longitud ha sido establecida arbitrariamente en el Meridiano de Greenwich (que pasa a través del Real Observatorio de Greenwich en las afueras de Londres), y la longitud de un punto es la medida angular formada por el semiplano del eje de la tierra que pasa por el meridiano de Greenwich, y el semiplano del eje de la tierra que pasa por el punto. Como hay 180 meridianos en cada hemisferio, la mayor longitud que se puede medir en cada uno es de 180°, tanto en dirección este como en dirección oeste. Un tercer componente Los lectores meticulosos habrán notado que hace falta un tercer elemento para localizar un punto, este es la altitud. En la mayoría de los casos las coordenadas GPS son necesarias para ubicar lugares en la superficie terrestre, lo que le resta importancia a dicho parámetro. Sin embargo, es igual de necesario que la latitud y longitud para poder definir una ubicación GPS de manera completa y precisa. 4.10.8. Múltiples sistemas de coordenadas para coordenadas geográficas Como hemos visto, las definiciones anteriores toman en cuenta varios parámetros que deben ser establecidos o identificados para futuras referencias: 33 El plano ecuatorial y el modelo de la forma de la tierra elegida. Un conjunto de puntos de referencia. La posición del centro de la tierra. El eje de la tierra. El meridiano de referencia. Estos cinco criterios son las bases de los distintos sistemas de coordenadas usados a través de la historia. Actualmente el sistema geodésico más usado es el WGS 84 (usado mayormente para las coordenadas GPS). 4.10.9. Unidades de medida para las coordenadas GPS Las dos principales unidades de medidas son las coordenadas decimales y sexagesimales. Coordenadas decimales La latitud y longitud son números decimales con las siguientes características: - Latitud entre 0° y 90 °: Hemisferio Norte. - Latitud entre 0° y -90°: Hemisferio Sur. - Longitud entre 0° y 180°: Al este del meridiano de Greenwich. - Longitud entre 0° y -180°: Al oeste del meridiano de Greenwich. Coordenadas sexagesimales Las coordenadas sexagesimales tienen tres componentes: grados, minutos y segundos. Cada uno de estos componentes suele ser un número entero, pero se puede usar un número decimal en los segundos si se desea una mayor precisión. Un grado tiene 60 minutos y un minuto consiste de 60 segundos de ángulo del arco. A diferencia de las coordenadas decimales, las sexagesimales no pueden ser negativas. En dicho caso, las letras E u O son añadidas a la longitud para especificar la posición este-oeste desde el meridiano de Greenwich, y a la latitud se le agregan las letras N o S para designar el hemisferio (Norte o Sur). [21] Coordenadas Decimales Coordenadas Sexagesimales Latitud Longitud Latitud Longitud 0° a 90° 0° a 180° N E 0° a 90° 0° a -180° N O 0° a -90° 0° a 180° S E 0° a -90° 0° a -180° S O Tabla 6: Correlación entre coordenadas Decímales y Sexagesimales. [21] 34 4.11. TRANSMISIÓN DE DATOS EN LA RED CELULAR Para reflejar la evolución de las tecnologías utilizadas en la telefonía móvil se utiliza el concepto de “generación”, de forma que cada generación engloba un conjunto de estándares de transmisión de datos (y de voz) que ofrecen unas determinadas prestaciones y calidad de servicio. 1G – Fue la primera generación de telefonía móvil y utilizaba tecnología analógica para la transmisión de información. Se utilizó en los años 80. 2G – Es la segunda generación de telefonía móvil que utiliza fundamentalmente GSM (Global System for Mobile Communications, sistema global para las comunicaciones móviles) como estándar de transmisión de telefonía digital. Permite la transmisión tanto de voz como de datos (por ejemplo, mensajes cortos de texto o SMS). Utiliza varias bandas de frecuencia dependiendo de la región o país. 4.11.1. Telefonía Móvil 3G El primer estándar 3G: EDGE EDGE (Enhanced Data rates for GSM of Evolution o Tasas de Datos Mejoradas para la evolución de GSM) también conocida como EGPRS (Enhanced GPRS) es el siguiente estándar que aparece en la telefonía móvil para la transmisión de datos. Esta tecnología funciona con redes GSM que tengan implementado GPRS y las actualizaciones necesarias propias de EDGE, por lo que es relativamente sencilla su implementación por parte de los operadores. Debido a su compatibilidad con GSM hay autores que la consideran una tecnología puente entre 2G y 3G, es decir, 2.5G. Sin embargo, EDGE puede alcanzar una velocidad de transmisión teórica de 384 Kbps, con lo cual cumple los requisitos de la ITU para una red 3G, también ha sido aceptado por la ITU como parte de IMT-2000, de la familia de estándares 3G. EDGE utiliza modulación GMSK (Gaussian Minimum-Shift Keying) y modulación 8-PSK (8 Phase Shift Keying) para algunos de los esquemas de modulación y codificación de datos aumentando así su eficacia. Banda ancha en la telefonía móvil: UMTS UMTS (Universal Mobile Telecommunications System o Servicio Universal de Telecomunicaciones Móviles) es el nombre con el que se engloban todas las tecnologías incluidas en 3G desligadas de las redes GSM. Precisamente el hecho de que los operadores hayan necesitado una gran inversión para implantar las redes UMTS ha ocasionado un gran retraso en su implementación. Este retraso ha sido cubierto en muchos casos con las tecnologías intermedias 2.5G. La tecnología de transmisión utilizada en UMTS es WCDMA. WCDMA es una tecnología móvil inalámbrica de tercera generación que aumenta las tasas de transmisión de datos de los sistemas GSM. Utiliza como técnica de 35 multiplexación CDMA (multiplexación por división de código). Soporta de manera satisfactoria una tasa transferencia de datos que va de 144 hasta 512 Kbps para áreas de cobertura amplias aunque en el estándar se especifican velocidades de hasta 2 Mbps. El estándar de WCDMA fue desarrollado como el proyecto de la sociedad 3GPP, que es el acrónimo de 3rd Generation Partnership Project. Esta organización realiza la supervisión del proceso de elaboración de estándares relacionados con 3G. El despliegue de redes UMTS facilita la aparición del servicio conocido como Internet móvil ya que las velocidades que se pueden alcanzar con esta tecnología permiten hacer uso de una gran parte de los servicios ofrecidos en Internet, típicamente la navegación web. De esta forma aparecen en el mercado tanto teléfonos móviles que soportan la tecnología 3G como módems 3G utilizados para proporcionar conectividad a ordenadores. Normalmente la conexión de estos dispositivos al ordenador es mediante un puerto USB. [22] 4.11.2. Comparación de la velocidad de los estándares de la telefonía móvil Tabla con la comparación de la velocidad de transmisión de subida y bajada, que permiten los distintos estándares funcionando actualmente en la telefonía celular. Tecnología Velocidad promedio de bajada Velocidad promedio de subida GSM (2G) 1.8 kB/s 1.8 kB/s GPRS (2.5G) 7.2 kB/s 3.6 kB/s CDMA2000 1×RTT 18 kB/s 18 kB/s EDGE (2.75G) 29.6 kB/s 29.6 kB/s UMTS 3G 48 kB/s 48 kB/s EDGE (type 2 MS) 59.2 kB/s 59.2 kB/s EDGE Evolution (type 1 MS) 148 kB/s 59 kB/s EDGE Evolution (type 2 MS) 237 kB/s 118 kB/s HSPA (3.5G) 1,706 kB/s 720 kB/s HSPA+ 5.25 MB/s 1.437 MB/s LTE (2×2 MIMO) 21.625 MB/s 7.25 MB/s LTE (4×4 MIMO) 40.750 MB/s 10.750 MB/s Tabla 7: Comparación de la velocidad de los estándares de la telefonía móvil. [23] 36 4.12. RASPBERRY PI Raspberry Pi es una placa computadora (SBC) de bajo costo desarrollada en Reino Unido por la Fundación Raspberry Pi. En realidad, se trata de una diminuta placa base de 85 x 54 milímetros (del tamaño aproximado de una tarjeta de crédito) en el que se aloja un chip Broadcom BCM2835 con procesador ARM hasta a 1 GHz de velocidad (modo Turbo haciendo overclock), GPU VideoCore IV y 512 Mbytes de memoria RAM (Las primeras placas contaban con sólo 256MB de RAM). Figura 8: Placa Raspberry pi. [24] 4.12.1. Hardware Raspberry Pi Con unas dimensiones de placa de 8.5 por 5.3 cm, en su corazón tiene un chip integrado Broadcom BCM2835, que contiene un procesador ARM11 con varias frecuencias de funcionamiento y la posibilidad de subirla (haciendo overclocking) hasta 1 GHz sin perder la garantía, un procesador gráfico VideoCore IV, y 512MB de memoria RAM. La última Raspberry Pi 2 cuenta con 1GB de memoria RAM. Todo ello equivale en la práctica a un ordenador con unas capacidades gráficas similares a la XBOX de Microsoft y con la posibilidad de reproducir vídeo en 1080p. En la placa nos encontramos además con una salida de vídeo y audio a través de un conector HDMI, con lo que conseguiremos conectar la tarjeta tanto a televisores como a monitores que cuenten con dicha conexión. En cuanto a vídeo se refiere, también cuenta con una salida de vídeo compuesto y una salida de audio a través de un minijack. Posee una conexión Ethernet 10/100. En su parte inferior cuenta con un lector de tarjetas SD (micro SD para los modelos A+, B+ y Pi 2), lo que abarata enormemente su precio y da la posibilidad de instalar un sistema operativo en una tarjeta de memoria de 4 GB o más (clase 4 o clase 10). De esta forma tenemos también la posibilidad de minimizar el espacio que necesitamos para tener todo un ordenador en un volumen mínimo. [24] 37 Figura 9: Raspberry pi Modelo B. [25] Conexiones GPIO Raspberry Pi A +, B + y 2 B incluyen 40 pines GPIO. Los modelos A y B tienen sólo los primeros 26 pines. GPIO # Función Pin # Pin # Función GPIO # N/A + 3V3 1 2 + 5V N/A GPIO2 SDA1 (I2C) 3 4 + 5V N/A GPIO3 SCL1 (I2C) 5 6 GND N/A GPIO4 GCLK 7 8 TXD0 (UART) GPIO14 N/A GND 9 10 RXD0 (UART) GPIO15 GPIO17 Gen0 11 12 GEN1 GPIO18 GPIO27 GEN2 13 14 GND N/A GPIO22 GEN3 15 16 GEN4 GPIO23 N/A + 3V3 17 18 GEN5 GPIO24 GPIO10 MOSI (SPI) 19 20 GND N/A GPIO9 MISO (SPI) 21 22 GEN6 GPIO25 GPIO11 SCLK (SPI) 23 24 CE0_N (SPI) GPIO8 N/A GND 25 26 CE1_N (SPI) GPIO7 (Modelos A y B paran aquí) EEPROM ID_SD 27 28 ID_SC EEPROM GPIO5 N/A 29 30 GND N/A GPIO6 N/A 31 32 - GPIO12 GPIO13 N/A 33 34 GND N/A GPIO19 N/A 35 36 N/A GPIO16 GPIO26 N/A 37 38 Digital IN GPIO20 N/A GND 39 40 OUT digital GPIO21 Tabla 8: Conexiones GPIO. [26] 38 Modelo B revisión 2 también tiene un pad (llamado P5 en el tablero y P6 en los esquemas) de 8 pines que ofrecen acceso a un adicional de 4 conexiones GPIO. GPIO # Función Pin # Pin # Función GPIO # N/A + 5V 1 2 + 3V3 N/A GPIO28 GPIO_GEN7 3 4 GPIO_GEN8 GPIO29 GPIO30 GPIO_GEN9 5 6 GPIO_GEN10 GPIO31 N/A GND 7 8 GND N/A Tabla 9: Extensión de conexiones GPIO para modelo B versión 2. [26] Modelos A y B proporcionan acceso GPIO para el LED de estado ACT usando GPIO 16. Modelos A+ y B+ proporcionan acceso GPIO para el LED de estado ACT usando GPIO 47, y el LED de estado de alimentación usando GPIO 35. [26] 4.12.2. Accesorios para Raspberry Pi Cuando adquirimos la Raspberry Pi recibimos exactamente eso, una placa sin más. Para ponerla en funcionamiento necesitamos de una serie de accesorios tales como una fuente de alimentación de al menos 1000mah, un cable HDMI, una tarjeta de memoria SD/microSD con el Sistema Operativo y un adaptador WiFi o un cable RJ45 para poder conectarnos a internet. Además por estética o por protección podemos adquirir una de las muchas cajas que existen a la venta. [24] Otros periféricos y carcasas son comercializados por empresas ajenas a la fundación. Por ejemplo la Gertboard, que ha sido creada con propósito educativo, sirve para hacer uso del puerto GPIO y poder interaccionar con LEDs, interruptores, señales analógicas, sensores, y otros dispositivos. También incluye un controlador opcional para Arduino para poder interaccionar con el Raspberry Pi. [27] Cámara Es una cámara capaz de capturar vídeo con una resolución de 1080p. La cámara cuenta con un sensor Omnivisión de 5 megapíxeles que además de vídeo en alta definición y a 30 fotogramas por segundo, es capaz de hacer fotos con una resolución de 2.592 X 1.944 píxeles. La conexión de este pequeño módulo se vende con el tradicional acabado de Raspberry Pi (o lo que es lo mismo, sin ningún acabado, en un circuito puro y duro) como podemos observar en la imagen. Figura 10: Modulo cámara para Raspberry pi. [28] 39 Carcasa Otro de los accesorios imprescindible si se quiere resguardar la Raspberry Pi es la carcasa. Las hay de todos los colores, formatos, materiales, diseños e incluso carcasas caseras fabricadas por los mismos usuarios. [28] Modulo GPS Ublox NEO 6M El módulo NEO 6M de la empresa suiza UBlox es una excelente alternativa de precisión y costo beneficio. Es de un tamaño reducido por lo que es fácilmente portable en tus proyectos. Se comunica a través de puerto serial UART. Esta presentación viene en modo modular para que se pueda usar en cualquier plataforma como Arduino, Raspberry Pi, pcDuino o con un Laptop. Mide parámetros como latitud, longitud, velocidad, altitud. Figura 11: Modulo GPS Ublox NEO 6M. [29] Características: - Ultra sensibilidad: -165dBm - 22 tracking/66 acquisition-channel receiver - Soporta estándares WAAS/EGNOS/MSAS/GAGAN - Frecuencia de actualización 5Hz - Velocidad de desplazamiento máxima: 500m/seg - Protocolo NMEA (a 9600bps) - 01 puerto serial - Antena incorporada de 18.2 x 18.2 x 4.0 mm - Rango de temperatura: -40 to 85 C - Cumple estándar RoHS - Tamaño reducido, 30mm x 20mm x 11.4mm [30] Especificaciones: Tipo de receptor Sensibilidad Precisión Tiempo de lectura L1 frequency band, C/A code 22 Tracking / 66 Canales de lectura Tracking -165dBm Acquisition -148dBm Posición 3mts. 3D RMS sin SA Velocidad 0.1m/s sin SA Timing (PPS) 60ns RMS Cold Start 36s 40 Warm Start Hot Start Re-Acquisition Tracking Acquisition Sleep/Standby Consumo de energía Frecuencia de actualización de datos de 1Hz navegación Altitude Límites de operación Velocity Aceleración OutlineDimension Center Frequency Bandwidth Antenna Specifications Impedance Axial Ratio Polarization Dimensiones Dimensiones y peso Peso VCC Fuente de poder Corriente Temperatura de operación Temperatura de Entorno almacenamiento Humedad 33s 1s <1s <30mA @ 3V Vcc 40mA TBD Max 18,000m Max 515m/s Menor a 4g 18.2 x 18.2 x 4.0 mm 1575 ± 3 MHz 10 MHz min 50 Ω 3 dB max RHCP 30mm x20mm x 11.4mm 9g 5V ±5% 55mA(typical) 40 ~ +85 (sin batería de respaldo) 0 ~ +125 Tabla 10: Es pesificaciones técnicas del módulo GPS. [30] 4.12.3. Software para Raspberry Pi El Raspberry Pi usa mayoritariamente sistemas operativos basados en el núcleo Linux. Raspbian, una distribución derivada de Debian que está optimizada para el hardware de Raspberry Pi, se lanzó durante julio de 2012 y es la distribución recomendada por la fundación para iniciarse. El chip ARM11 en el corazón del Pi (modelos de primera generación) se basa en la versión 6 de la ARM . Las versiones actuales de varias versiones populares de Linux, incluyendo Ubuntu , no se ejecutarán en el ARM11. No es posible ejecutar Windows en el Raspberry Pi original, aunque en el nuevo Raspberry Pi 2 es capaz de ejecutar Windows 10 . El Raspberry Pi 2 actualmente sólo es compatible con Ubuntu Snappy Core , Raspbian , OpenELEC y RISC OS. [27] Software Incluido en Raspbian La distribución viene con algunas aplicaciones preinstaladas como los navegadores Midori, Dillo y NetSurf. Además contiene herramientas de desarrollo como IDLE para el lenguaje de programación Python o Scratch, y diferentes ejemplos de juegos usando los módulos Pygame. Destaca también el menú “raspi-config” que permite configurar el sistema operativo sin tener que modificar archivos de configuración manualmente y el wifi-config, el cual permite configurar redes inalámbricas si usamos un receptor WiFi USB. [31] 41 4.13. PYTHON Y RASPBERRY La fundación Raspberry Pi recomienda el uso de Python como lenguaje de programación, sin embargo, no limitan el uso de lenguaje C, C++, Java, Scratch y Ruby ya que vienen instalados por defecto en Raspbian. Es posible utilizar cualquier software de programación siempre y cuando pueda ser ejecutado en un procesador ARMv6. El entorno de desarrollo integrado (IDE) para programar en Python viene incluido en Raspbian, se llama IDLE. [32] 4.13.1. Python Python es un lenguaje de programación creado por Guido van Rossum a principios de los años 90 cuyo nombre está inspirado en el grupo de cómicos ingleses “Monty Python”. Es un lenguaje similar a Perl, pero con una sintaxis muy limpia y que favorece un código legible. Se trata de un lenguaje interpretado o de script, con tipado dinámico, fuertemente tipado, multiplataforma y orientado a objetos. Lenguaje interpretado o de script Un lenguaje interpretado o de script es aquel que se ejecuta utilizando un programa intermedio llamado intérprete, en lugar de compilar el código a lenguaje máquina que pueda comprender y ejecutar directamente una computadora (lenguajes compilados). La ventaja de los lenguajes compilados es que su ejecución es más rápida. Sin embargo los lenguajes interpretados son más flexibles y más portables. Python tiene, no obstante, muchas de las características de los lenguajes compilados, por lo que se podría decir que es semi interpretado. En Python, como en Java y muchos otros lenguajes, el código fuente se traduce a un pseudo código máquina intermedio llamado bytecode la primera vez que se ejecuta, generando archivos .pyc o .pyo (bytecode optimizado), que son los que se ejecutarán en sucesivas ocasiones. Tipado dinámico La característica de tipado dinámico se refiere a que no es necesario declarar el tipo de dato que va a contener una determinada variable, sino que su tipo se determinará en tiempo de ejecución según el tipo del valor al que se asigne, y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo. Fuertemente tipado 42 No se permite tratar a una variable como si fuera de un tipo distinto al que tiene, es necesario convertir de forma explícita dicha variable al nuevo tipo previamente. Por ejemplo, si tenemos una variable que contiene un texto (variable de tipo cadena o string) no podremos tratarla como un número (sumar la cadena “9” y el número 8). En otros lenguajes el tipo de la variable cambiaría para adaptarse al comportamiento esperado, aunque esto es más propenso a errores. Multiplataforma El intérprete de Python está disponible en multitud de plataformas (UNIX, Solaris, Linux, DOS, Windows, OS/2, Mac OS, etc.) por lo que si no utilizamos librerías específicas de cada plataforma nuestro programa podrá correr en todos estos sistemas sin grandes cambios. Orientado a objetos La orientación a objetos es un paradigma de programación en el que los conceptos del mundo real relevantes para nuestro problema se trasladan a clases y objetos en nuestro programa. La ejecución del programa consiste en una serie de interacciones entre los objetos. Python también permite la programación imperativa, programación funcional y programación orientada a aspectos. [33] 43 5. DESARROLLO DEL PROYECTO La idea de este proyecto es crear un localizador GPS portátil con Raspberry Pi que almacene en un archivo local su posición exacta cada cierto tiempo o evento especial, acoplar una cámara fotográfica para capturar imágenes en el mismo instante que la posición. Inmediatamente almacenados estos archivos, se transmitirán a un servidor remoto a través de internet, haciendo uso de la red móvil 3G y almacenando estos datos definitivos en el servidor de base de datos. Posteriormente se podrá visualizar la foto, accediendo de forma remota a una página web, al igual que la posición, la cual representaremos en un mapa interactivo de Google Maps aprovechando su API. Al realizar el prototipo como objeto principal del proyecto, hubo varios factores decisivos, antes, al inicio y en el proceso del desarrollo, los cuales se tuvieron en cuenta para lograr los mejores resultados, sin afectar el presupuesto, el rendimiento y utilizando medios tecnológicos implementados en los sistemas modernos. Dando cumplimiento a lo anterior, se escogieron componentes de hardware y software, con facilidad de adquisición, versátil, compatibilidad para acoplamiento y buenas fuentes de documentación y de conocimiento. El diseño del prototipo se distribuye en varias fases correlacionadas entre sí. Iniciando con el diseño y acople del dispositivo físico y los módulos necesarios con funciones específicas. Posteriormente, se debe configurar y programar el dispositivo en su totalidad para controlar su funcionamiento, según lo requerido y con un rendimiento óptimo. Luego, se realiza el diseño de la base de datos y el montaje del servidor, donde se alojará la base de datos y se almacenarán los datos finales. Finalmente, se crea una plataforma web, la cual podrá ser consultada por el usuario final, para realizar consulta de la base de datos existente, con los archivos y datos correspondientes. 5.1. DISEÑO DE HARDWARE Como base del hardware, se utilizó la plataforma educativa “Raspberry Pi 2 Modelo B”, la cual presenta varias ventajas relacionándolo con sus antecesores y con otros dispositivos de fines similares. Al tratarse de un ordenador de placa reducida, podemos encontrar gran diversidad de funcionalidades, sin que el dispositivo sufra saturación o bajo rendimiento. Entre otras, las principales ventajas que se puede encontrar son, el costo y facilidad de adquisición, compatibilidad con diferentes sistemas operativos, facilidad en la configuración y programación al 44 encontrar gran cantidad de documentos explicativos que tratan sobre el dispositivos y sus diferentes módulos, versatilidad para trabajar en diferentes ámbitos y contextos. 5.1.1. Inicio de Raspberry Pi Materiales Necesarios Como mínimo, para iniciar a funcionar el Raspberry Pi, se necesita: Memoria micro SD de al menos 4 GB. Adaptador micro SD a SD. Computador con lector de tarjetas SD. Adaptador de alimentación micro USB. Teclado. Mouse. Cable HDMI o bien adaptador activo de HDMI a VGA. Televisor o monitor. Software Necesario Paso 1. Preparar la tarjeta SD para copiar el Sistema Operativo En el siguiente link se puede descargar la aplicación que permite formatear la tarjeta. El software se llama SD Formatter, de los mismos creadores del estándar para almacenar información en las tarjetas SD, por lo tanto es seguro de utilizar. https://www.sdcard.org/downloads/formatter_4/SDFormatter4exe.zip Una vez el archivo ha sido descargado, descomprimir el archivo y hacer clic en el archivo con el nombre setup.exe. Este programa inicializará el proceso de instalación, instalar con las opciones predeterminas. Figura 12: Interfaz del programa SD Formatter. [34] 45 Insertar la tarjeta SD en el lector del PC o portátil. Una vez ha sido reconocida por el sistema, ejecutar el programa instalado. Utilizar las opciones predeterminadas, sin embargo, hay que fijarse bien en utilizar la opción “QUICK FORMAT” para que borre toda la información de la tarjeta en el menor tiempo posible. A partir de este momento, toda la información contenida en la tarjeta será borrada permanentemente. Este proceso tomara unos minutos dependiendo de la capacidad de la tarjeta. Con la tarjeta SD formateada, ahora es posible instalar el sistema operativo con NOOBS. Esto se hace mediante una copia directa de los archivos en la tarjeta SD. Para hacer la copia se debe seguir los siguientes pasos. [34] Paso 2. Descarga de Noobs y copia en la tarjeta SD Descargar el Sistema Operativo directamente del sitio oficial de Raspberry Pi (http://www.raspberrypi.org/downloads), en este link se encuentra que hay diferentes versiones disponibles. Lo recomendable es inicialmente utilizar NOOBS, el cual contiene las siguientes versiones de sistemas operativos: Archlinux OpenELEC Pidora RISC OS RaspBMC Raspbian Seleccionar el archivo con el nombre NOOBS. Después de unos segundos el archivo empezará a descargarse, esto tomará bastante tiempo ya que el archivo es de 737 MB. Una vez el archivo ha descargado por completo, descomprimir el archivo en un lugar conocido. Al final debería obtener una carpeta. Esta carpeta es la que contiene todo el sistema operativo. Luego abrir la carpeta donde se descargó el sistema operativo y proceder a copiar o mover todo el contenido. Con estos pasos, el sistema operativo ha sido copiado en la tarjeta SD y ahora se puede proceder a instalar el sistema operativo. [35] Paso 3. Instalación y configuración inicial del Raspberry Pi (raspi-config) Una vez la tarjeta ha sido preparada y NOOBS ha sido copiado, el sistema operativo se reinicia y el primer programa que se ejecuta es Pi Recovery, este programa sirve para instalar la versión del sistema operativo deseada. En la pantalla inicial, seleccionar Raspbian para instalar el sistema operativo. Este proceso tomará entre 15 a 20 minutos. 46 Figura 13: Pantalla inicial de Pi Recovery. [36] Después que Raspbian “Wheezy” ha sido instalado, hay que configurar el Sistema operativo para que funcione en español. Los siguientes pasos muestran las diferentes opciones disponibles. Al reiniciar el dispositivo el primer programa que se ejecuta se llama raspi-config, este programa solo se ejecuta en inglés. En caso de que ya haya instalado el sistema operativo y se desee realizar alguna de estas modificaciones, se puede hacer ejecutando el siguiente comando desde la terminal: sudo raspi-config El primer menú que muestra contiene 9 diferentes opciones disponibles, a continuación se revisará cada una de las opciones disponibles: Figura 14: Menú principal de configuración de Raspbian. [36] 1. 2. 3. 4. Expandir el sistema de archivos (Expand Filesystem). Cambiar la contraseña del usuario Pi (Change User Password). Activar el escritorio al iniciar (Entable Boot to Desktop). Opciones de internacionalización (Internationalisation Options). 47 Esta opción permite modificar el lenguaje del sistema operativo, la zona horaria y la distribución de su teclado. Figura 15: Menú de opciones de internacionalización de Raspbian. [36] La opción I1 sirve para indicar donde se encuentra ubicado, esta opción configura el lenguaje del sistema operativo, los caracteres, la denominación de la moneda, etc. Buscar y seleccionar el modo de codificación: es_CO. UTF-8 UTF-8 Para confirmar oprimir espacio y luego enter. La opción I2, sirve para cambiar la zona horaria del sistema, la cual se ajusta de acuerdo a la ciudad donde vive o la más cercana. El sistema ha sido configurado como Colombia, Bogotá. La opción I3, permitirá cambiar la configuración del teclado, si la marca y tipo del teclado no aparece, seleccionar el predeterminado “PC genérico 105 teclas (intl)”. Luego seleccionar el idioma del teclado, si en la primera pantalla no aparece Español seleccionar otro. En la siguiente ventana hay una lista de opciones, seleccionar “Español” o “Español (Latinoamericano)”. Luego seleccionar la distribución del teclado, se recomienda utilizar la primera opción, solo “Español Latinoamericano”. 5. Activar la cámara (Enable camera) Esta opción sirve para dar soporte a la cámara de Raspberry Pi, permite activar el puerto para que haya comunicación entre la CPU y el controlador de la cámara. Seleccionar la opción “Enable”, ya que posteriormente se hará uso del módulo de la cámara. 6. Adicionar a Rastrack (Add to Rastrack) 7. Overclockig 8. Opciones avanzadas (Advanced Options) [36] Paso 4. Conexión del Raspberry Pi a Internet usando cable de red 48 Es recomendable que el Raspberry Pi tenga conexión disponible a Internet para poder actualizar programas. Existen 3 diferentes métodos para conectar la Raspberry Pi, entre ellos están: Conexión directa a través del Router Conexión con dongle WiFi Conexión directa al PC Para realizar la conexión con cable de red se necesitan los siguientes materiales. Router con puerto RJ-45 disponible (Puede ser o no WiFi) Conexión a internet Cable RJ-45 La manera más sencilla de conectar el Raspberry Pi a internet o a la red casera es a través del puerto RJ-45 del router inalámbrico. Para esto solamente hay que conectar el cable de red RJ-45 directamente desde el Raspberry Pi al router. Para la mayoría de los routers que se encuentran en nuestra casa, el Raspberry Pi debería conectarse directamente sin ninguna otra conexión extra. En caso que no se pueda conectar, verifiicar que el router está configurado para DHCP (Dynamic Host Configuration Protocol), el cual le asigna aleatoriamente la dirección IP al dispositivo. Para verificar si la conexión es exitosa, es necesario cerciorarse que el Router le ha asignado una dirección IP al Raspberry Pi. Esto se puede hacer desde la línea de comando utilizando el siguiente comando: ifconfig –a Si el Router asignó una dirección IP al Raspberry Pi, ahora puede verificar si está conectado a internet. [37] Paso 5. Conexión remota al Raspberry Pi usando Xming En el mundo Linux existen muy buenas alternativas para ejecutar escritorios remotos. Una opción, entre varias es XMING. Esta opción permite ejecutar el escritorio remoto del Raspberry Pi usando el sistema de gestión gráfico llamado X11 o X Windows. Esta es una aplicación tipo cliente-servidor, donde se necesita instalar aplicaciones en ambos lados tanto en el servidor como en el cliente. Para este caso el servidor es el Raspberry Pi y el cliente un PC con Windows. El Raspberry Pi usa X Windows como el gestor de su ambiente gráfico, por ende no se necesita instalar nada adicional. Sin embargo, para el PC con Windows, es necesario instalar la aplicación Xming para que pueda interpretar los comandos recibidos por el Raspberry Pi en un ambiente gráfico. Hay que tener en cuenta que Xming transfiere la información gráfica a través de Putty, por lo tanto este debe ser instalado con anterioridad, y los pasos a seguir. 49 El programa que se tiene que instalar en el PC se llama XMING, este se puede descargar directamente de la página del desarrollador en el link http://sourceforge.net/projects/xming/. Descargar el archivo y luego ejecutar el instalador con todos los parámetros que trae por defecto. Una vez haya terminado la instalación, ahora es necesario crear un archivo de configuración para conectarse al Raspberry Pi, para esto buscar la aplicación Xlaunch en el escritorio o en la barra de inicio, dependiendo de la versión de Windows que se tenga instalada. Al ejecutar la aplicación, la primera pantalla indica como desea que se ejecute el ambiente X Windows. Para poder terminar la conexión, necesitará hacer click derecho sobre Xming en la barra de tareas y luego cerrar. En la siguiente opción, seleccionar “start a program”. Esto indicará que tan pronto inicie Xming, esta aplicación se debe ejecutar desde el Raspberry Pi. Como el interés es ejecutar el escritorio del Raspberry Pi llamado LXDE, se debe hacer el llamado de esta aplicación. Para esto en el campo start program ingresar startlxde. En el cuadro de la configuración, seleccionar Using PuTTY (plink.exe). En el campo “connect to computer” ingresar la dirección IP de la Raspberry Pi. En el campo login user ingresar el nombre del usuario del Raspberry Pi, en este caso es el común “Pi”, siguiente a esto la contraseña que se haya asignado a este usuario, el predeterminado es “raspberry”. Figura 16: XMING con Raspberry Pi iniciar startlxde. [38] Si se desea copiar texto entre el PC y el Raspberry Pi, dejar activada la casilla Clipboard. Esta función es muy práctica cuando desean copiar textos entre los ambientes. Sin embargo, copiar imágenes o archivos en general no es posible con este método. Una vez se haya terminado, volverá a la venta anterior. Ahora solo es necesario hacer click en “finish” y se ejecutará la conexión remota al Raspberry Pi. [38] 50 5.1.2. Adaptación de módulos y Programación de Raspberry Pi A continuación se hará una descripción de las conexiones de los módulos requeridos con el propósito ya sabido. Así mismo, se incluirá la configuración y programación indispensable para el satisfactorio acople de todos y cada uno. Para los scripts programados en la plataforma de la Raspberry, se usó el lenguaje de programación Python, instalado de forma predeterminada con el sistema operativo Raspbian. A lo largo del capítulo se hará mención de varios scripts en Python y una descripción de las funciones de cada uno y su relación entre sí, los cuales son “principal.py”, “pulsador.py”, “temporales.py”, “picam.py”, ”iniciogps.py”, “envioFTP.py”, “envioEmail.py” y un script en PHP nombrado “mapa.php”. Todos estos códigos están guardados en la ruta “/home/pi” de la Raspberry Pi y podrán ser observados con detalle en los anexos. Scripts iniciales Habrán tres scripts que se ejecutarán automáticamente al iniciar el arranque con el encendido de la Raspberry Pi y controlan la ejecución de los demás scripts. A continuación, se adiciona el código del script “principal.py”, este es el primero en iniciar y estará en ejecución constantemente para realizar captura de datos de la cámara y el GPS automáticamente cada 10 minutos contados a partir de la última captura finalizada. Este script hace un llamado de la función “principal” en el script “picam.py” y define el estado como “Automático”, este mismo se incluirá en la publicación final de la página web y se tendrá en cuenta en los siguientes scripts. Seguido a esto, se inicia el script “pulsador.py”, el cual tiene como función testear continuamente la pulsación del botón de pánico incorporado a los pines GPIO 03 (numeración BCM) y Ground o pines GPIO 05 y 09 (numeración estándar). Se toma el pin GPIO 03, aprovechando su resistencia de pull-up interna que viene activada por defecto, así no es necesario agregar resistencias externas. Este script también está en continua ejecución, esperando un voltaje bajo en el pin 03 configurado como entrada. Al tener un estado bajo en el GPIO 03, inicialmente se modifica el estado a “S.O.S.” o de emergencia. Seguidamente, se hace llamado a la función “principal” en picam.py. Este último proceso, permitirá grabar un video de 10 segundos, configurables, ya que al tratarse de un estado de 51 emergencia, requerirá de mayor precisión en los datos, por esto obtendremos mejor visualización de la situación con un video y no con una fotografía, como en el caso del estado “Automático”. Por último, se inicia el script “temporales.py”. El propósito de este script es, intentar realizar una conexión efectiva con el servidor para enviar los archivos que estén en la carpeta “/home/pi/TemporalEnvio”, los cuales están almacenados y que no lograron ser enviados al servidor en el momento de obtenerlos, por alguna falla en la conexión. Este proceso se repite cada 5 minutos, intentando realizar conexión con el servidor en cada momento. Para iniciar los scripts al encender la Raspberry se utiliza la herramienta “cron” de los sistemas Unix, cron es un administrador de procesos en segundo plano. Al agregar líneas de texto en el archivo “crontab” se incluyen estos procesos al cron, dependiendo de su configuración. En este caso se agregan las siguientes líneas: Conexión y configuración de la Cámara Antes de conectar la cámara, localizar la CSI y luego tirar de la pestaña suavemente hacia arriba. Ahora empujar el cable plano del módulo de la cámara en la ranura, con los contactos de plata en el cable de espaldas al puerto Ethernet. Recordar que no se debe empujar el cable muy profundo. 52 Ahora mantenerlo en su lugar con una mano y empujar la lengüeta CSI hacia abajo con la otra mano para bloquear la cinta de la cámara. Figura 17: Conexión de la cámara a la interfaz CSI de la Raspberry Pi. [39] Con el hardware en su lugar, ahora es el momento de instalar el software. Antes de activar la cámara, asegurar de que se está ejecutando la última versión del firmware Raspberry Pi con estos comandos: sudo apt-get update sudo apt-get upgrade Dependiendo de qué tan antigua es la instalación de Raspbian, y la velocidad de conexión a internet, estos comandos pueden tomar más de media hora para completar. Una vez que se ha completado, iniciar el script "ROSSP-config", este ayuda a configurar la Pi: sudo ROSSP-config Desplazarse por la lista hasta el elemento que dice "Enable Camera" y pulsar la tecla enter. En la siguiente pantalla, se pedirá confirmar la elección seleccionando la opción "Enable". A continuación, volverá a la pantalla principal de la utilidad de configuración. Ahora puede seleccionar la opción "Finish" y reiniciar el Raspberry Pi. Una vez que se haya reiniciado el Raspberry Pi, ahora se puede usar las dos utilidades de línea de comandos, raspistill y raspivid para capturar imágenes fijas y vídeos respectivamente. [40] Detección de movimiento Para detectar el movimiento con la cámara se utiliza el script en Python escrito por miembros de la comunidad de Raspberry Pi. El script se basa en la biblioteca de imágenes de Python que es una biblioteca para el análisis y la manipulación de las imágenes, así que hay que realizar la siguiente instalación: sudo apt-get install python-imagen-tk Ahora, se debe guardar el script y hacerlo ejecutable: 53 wget –c http://pastebin.com/?raw.php i = Yh77jhZ9W –o picam.py chmod +x picam.py Después que el script “principal.py” o “pulsador.py” hagan el llamado de la función “principal.picam (estado)”, empezará a ejecutarse el código de “picam.py”, con el cual se busca detectar movimiento antes de tomar una fotografía. Tendremos que ajustar algunos aspectos de la secuencia de comandos para asegurar que funciona para nuestras necesidades. Básicamente, se realizaron modificaciones en el script en la parte de la toma de la fotografía final y el almacenamiento de la misma. El script está diseñado para almacenar las imágenes en un directorio llamado "PICAM" bajo el directorio personal, pero para nuestra conveniencia esta ruta se modificó por /home/pi/TemporalEnvio. El script encenderá el LED de color rojo de la cámara y empezará a tomar imágenes de baja resolución. Luego va a compararlas y determinar si hay movimiento mediante la comparación de los píxeles de las imágenes. Si detecta cambios, el script capturará una imagen de mayor resolución. El script es muy eficiente y elimina automáticamente las imágenes de baja resolución que captura para la comparación y sólo almacena las imágenes de alta resolución que han capturado el movimiento. Al lograr detectar una variación considerable en los pixeles de las imágenes de test, se modifica el valor de la variable takePicture (takePicture = True), de esta manera la condición y el código mostrado en la imagen se ejecutan. A continuación, se invoca la función interna “saveImage (camerasettings, saveWidth, saveHeight, saveQuality, diskSpaceToreserve)”. En estas líneas de código es donde se obtiene la fotografía o video definitivo con la configuración, resolución y calidad, predefinidos al inicio del script, para lograr una estabilidad entre calidad de la imagen y el tamaño de almacenamiento. El nombre del archivo de la foto está definido como “image + fecha + hora + .jpg”, por ejemplo “image20150715164615.jpg”, asegurando que ningún nombre de archivo se pueda repetir, evitando perdida de información. Y análogamente el nombre de archivo del video está definido de igual forma, únicamente cambiando la palabra “image” por “video” y el formato por .mp4, por ejemplo “video20150715164615.mp4”. Estos archivos se enviarán seguidamente al servidor FTP, en caso de no lograr enviarlo o de no poder conectar con el servidor, serán almacenados en la carpeta “/home/pi/TemporalEnvio”, a la espera de poder ser enviados. 54 La variable “FTPnamePic” hace referencia al nombre con el cual se guardará la imagen en el servidor de archivos, lo cual es necesario especificar al realizar el envío de los archivos a través del protocolo FTP. Después de guardar la foto o video se ejecuta el script “iniciogps.py” con la ayuda de la función “os.system ()”, que permite escribir líneas de comando de la Shell del sistema. Con este script se obtendrán datos como coordenadas GPS, dirección, fecha y hora de la adquisición de los datos, todos estos alojados en un archivo temporal en la ruta “/home/pi/datos.txt”. En este mismo archivo de texto se adiciona la ruta de almacenamiento de la imagen en el servidor, el estado, anteriormente mencionado y el identificador de dispositivo. Más adelante, se hará referencia a dicho archivo con más detalle. Conexión y configuración del módulo GPS El módulo no tiene pines soldados donde conectar los cables, así que, o se sueldan los cables directamente a la placa, o se adquiere una cabecera de pines y se sueldan. Para comunicar el módulo Ublox M6 con la Raspberry Pi se usará el puerto serie “/dev/ttyAMA0”. Para ello se conecta el módulo GPS a la Raspberry tal como indica el esquema, los cables TX y RX deben estar cruzados, es decir, el pin TX de la Raspberry va conectado al pin RX del módulo GPS y el 55 pin RX de la Raspberry va conectado al pin TX del módulo GPS. Se alimenta el módulo desde los pines GPIO de 3.3V y GND de la Raspberry. Figura 18: Esquema y conexión de módulo Ublox M6 a Raspberry pi. [41] El puerto serie “dev/ttyAMA0”, no está disponible por defecto y hay que desbloquearlo. Para ello se abre el archivo “/boot/cmdline.txt”, desde la Raspberry y cambiar: dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait por: dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait Seguidamente abrir el archivo “/etc/inittab”, y en la última línea poner un ‘#’. Modificaría: T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 Por: #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 Para que estos cambios tengan efecto reiniciar la Raspberry Pi, una vez reiniciada ya se tiene el puerto serie listo para usarlo. Ahora instalar algunas dependencias que harán falta para interpretar los datos del módulo GPS con este comando desde la terminal: sudo apt-get install gpsd gpsd-clients python-gps GPSD es una aplicación que corre en segundo plano y que recoge los datos GPS del módulo y los envía a través de un socket que necesita ser activado cada vez que inicia la Raspberry, por eso introducir en la terminal: 56 sudo gpsd /dev/ttyAMA0 -F /var/run/gpsd.sock Para que el socket se inicie automáticamente al arrancar la Raspberry, se abre el archivo “etc/rc.local” y se pone justo antes de “exit 0”, la línea anterior. Si se ha hecho todo bien al introducir el comando “cgps -s”, debería mostrar algo como esto: Figura 19: Pantalla de terminal con datos del GPS. [41] Ahora que las pruebas de conexión del GPS con la Raspberry Pi están finalizadas y satisfactorias se puede implementar un script para su accionar. [41] Al tener iniciado el socket GPSD y ya teniendo el receptor GPS activado y conectado con los satélites, solo basta obtener las coordenadas de posición. En el script, constantemente está obteniendo los datos latitud y longitud, en busca de valores efectivos, por esto se realiza una condición para que al obtener datos diferentes a 0 (cero), guarde las coordenadas en variables locales y al igual la dirección de esa ubicación. El script “iniciogps.py” importa, entre otras, principalmente las librerías “gps” y “pygeocoder”, librerías exclusivas para el uso con un receptor GPS. La primera, se encarga de crear un streaming de datos GPS y constantemente está obteniendo datos de posición, y la segunda tiene como único propósito traducir las coordenadas geográficas obtenidas, en una dirección legible, conocido como geo codificación inversa. 57 Al obtener las coordenadas y la dirección, se realiza validación si el estado actual es “S.O.S.” para hacer un envío inmediato de un correo electrónico con los datos básicos de ubicación, haciendo un llamado a la función “enviar” en el script “envioEmail.py”. Esto, con el propósito de poder tener una reacción oportuna a la emergencia. Se podrá ver en detalle el código del script “envioEmail.py” en los anexos. Figura 20: Correo electrónico recibido de emergencia. Posteriormente, se realiza lectura del archivo “mapa.php” guardado con anterioridad en la ruta “/home/pi/mapa.php”, se busca la palabra clave “coordenadas” dentro de todo el texto en el archivo y se modifica por “latitud, longitud”, siendo latitud y longitud las coordenadas obtenidas por el GPS. Se guarda el archivo modificado en la ruta “/home/pi/TemporalEnvio” con un nombre diferente de la misma forma en que se nombró la imagen, quedando como “map + fecha + hora + .html”. Adicionalmente, se crea un archivo temporal “datos.txt” para agregar los datos obtenidos (latitud, longitud, dirección, fecha, hora, URL del mapa, …). Al finalizar el script de “iniciogps.py” y retomar el final del script “picam.py” se adicionan más datos al archivo “datos.txt” (…, URL de la imagen, estado, idUser). Al completar la escritura de este archivo se guarda en la ruta “/home/pi/TemporalEnvio” con el mismo formato para el nombre utilizado para la imagen y el mapa, quedando como “date + fecha + hora + .txt”. En la siguiente imagen se observa la forma en que se guarda el texto. Figura 21: Datos almacenados para la importación en la base de datos. Obsérvese que cada dato está encerrado entre los caracteres “|”. La finalidad de este carácter especial está en la importación de estos datos a la base de datos, previo envío del archivo al servidor, y ya encontrándose guardado en una carpeta exclusiva dentro del servidor. 58 Los archivos definitivos se almacenan en conjunto en la ruta “/home/pi/TemporalEnvio”, como ya se ha mencionado. Al final de los scripts “iniciogps.py” y “picam.py” se intenta realizar el envío inmediato de los archivos respectivos al servidor a través del protocolo FTP. Es en este momento, cuando se realiza el llamado de la función “enviar” dentro del script “envioFTP.py” Transmisión de archivos al servidor remoto Como ya se ha venido mencionando, el envío de los archivos se hace a un servidor de archivos a través del protocolo FTP, mientras se tenga una conexión estable a internet. La librería “ftplib” importada en el script “envioFTP.py” permite de forma sencilla realizar el envío de los archivos. Para concretar la transacción, inicialmente se debe establecer una conexión con el servidor, por esto se debe indicar el nombre del servidor o su IP publica, usuario, clave y carpeta donde se guardará el archivo. Si la conexión es satisfactoria, se realiza el envío indicando la ruta de archivo origen y ruta de archivo destino. Finalizada la transacción el archivo enviado se elimina del almacenamiento local. Si por cualquier motivo no se logra concretar la conexión con el servidor y/o no se puede enviar el archivo, el script “envioFTP.py” finalizará su ejecución sin insistir en la conexión y el archivo seguirá guardado temporalmente en el dispositivo local, hasta que se ejecute el script “temporales.py” y seguida la función “listaArchivos” del script “envioFTP.py” y se realice nuevamente un intento satisfactorio de conexión con el servidor, enviando efectivamente los archivos pendientes. La intención de la función “listaArchivos” es realizar un listado de todos los archivos guardados en la carpeta “/home/pi/TemporalEnvio”, los cuales se encuentran en espera de envío al servidor. Este programa es ejecutado por el script “temporales.py” y se ejecuta automáticamente desde el arranque de la Raspberry Pi, realizando el mismo proceso cada 5 minutos. Para dar cumplimiento, se agrega una línea de código en el “crontab”, ya mostrado anteriormente. 5.1.3. Internet móvil con el modem 3G USB Huawei E173 en la Raspberry La instalación de un modem 3G / 4G USB en un Raspberry Pi no es una tarea sencilla. El principal problema es que la mayoría de los módems USB actúan como dos dispositivos, un dispositivo de almacenamiento USB y un módem USB. Cuando se conecta a la Raspberry PI el dispositivo es por lo general iniciado en modo de almacenamiento USB. Hay un programa llamado usb_modeswitch que podemos utilizar para hacer la conmutación. Inicialmente, se debe instalar el programa con el siguiente comando. sudo apt-get install usb-modeswitch Se tiene que conseguir los códigos del dispositivo USB en el modo de almacenamiento USB y el modo de módem USB. Conectar el módem USB y reiniciar el Raspberry PI sin LAN o conexión WiFi. sudo reboot 59 Una vez reiniciado, abrir una ventana de terminal y escribir “lsusb”. La salida será similar a la siguiente imagen. El módem debe ser catalogado como uno de los dispositivos USB. Hay que tener en cuenta los números subrayados, estos son los códigos de proveedores de productos y dispositivos. En este caso aparece 12d1: 1c24. Este código hace referencia a la conexión en modo de almacenamiento. Se puede comprobar escribiendo “tail –f /var/log/messages”, y se observa que el modem se inició como “cdrom”. Si ahora se desconecta el modem y se vuelve a conectar, se verá modificación en el modo de conexión del modem, ya es reconocido en modo modem USB. 60 Es decir, se ha cambiado correctamente. Aparece en ttyUSB0, ttyUSB1, ttyUSB2 y ttyUSB3 conexiones de modem GSM, y luego la tarjeta SD. Y podemos ver la actuación de usb_modeswitch, cambiando el código a 12d1:1c23. Escribir “lsusb” para corroborar: Ahora lo que se debe lograr es que este cambio se realice siempre, desde el inicio de la Raspberry o en cualquier momento que se conecte el modem. Para lograrlo, hay que añadir lo siguiente en el archivo “/etc/rc.local”, antes de la línea “exit 0”: sudo service udev stop sleep 2 sudo service udev start El “/etc/rc.local” se ejecuta en cada arranque, y al añadir esas líneas se está diciendo que pare el servicio udev, espere 2 segundos y lo vuelva a arrancar. Instalando pppd, UMTSKeeper y Sakis3G El programa más utilizado para realizar la conexión 3G es Sakis3g. Sin embargo, antes de instalarlo, se tiene que saber que es muy frecuente perder la conexión 3G cada cierto tiempo, por lo que se suele recurrir a otro programa, UMTSKeeper, que está constantemente comprobando la conexión y recuperándola cuando se cae. Este último programa también realiza la instalación de Sakis3G. Lo primero es instalar el servicio pppd: sudo apt-get install ppp A continuación, instalar UMTSKeeper: cd ~ mkdir umtskeeper cd umtskeeper wget http://mintakaconciencia.net/squares/umtskeeper/src/umtskeeper.tar.gz tar -xzvf umtskeeper.tar.gz chmod +x sakis3g umtskeeper Ahora, configurar sakis: sudo ./sakis3g --interactive 61 Figura 22: Pantalla inicial de Sakis 3G interactivo. Seleccionar los siguientes ítems, en orden de aparición, dando enter sobre la opción: Connect with 3G. USB device. Huawei mobile. Interface #2. Reported by your modem (internet.comcel.com.co). Usuario de APN: comcel. Clave de APN: comcel. Al finalizar estos pasos satisfactoriamente, ya está conectado a la red móvil 3G a través de “Claro” utilizando el protocolo ppp0. Y por último, configurar UMTSKeeper, según los parámetros que se escogieron anteriormente al ejecutar Sakis3G. Ejecutar el siguiente comando (una sola línea), que luego se añadirá a “crontab” para que se ejecute siempre que se arranque la Raspberry Pi: sudo /home/pi/UMTSkeeper/umtskeeper --sakisoperators "OTHER='USBMODEM' USBMODEM='12d1:1c23' USBINTERFACE='2' APN='internet.comcel.com.co' APN_USER='comcel' APN_PASS='comcel'" Consultar el fichero /var/log/umtskeeper.log y ver que está todo en orden. Probar a desconectar y reconectar el modem, y que tras medio minuto vuelve a conectarse automáticamente. 62 5.2. 5.2.1. DISEÑO DE APLICATIVO Instalación WAMP Server: El entorno de desarrollo escogido para el almacenamiento, captura y procesamiento de la información fue WAMP server v2.2, Apache v2.2.22, MySQL v5.2.24 y PHP v5.4.3 este entorno fue instalado en un equipo con Sistema Operativo Windows 7. Configuraciones iniciales para el funcionamiento del servidor 1. Se cambió el puerto de escucha por defecto “80” por el puerto “81”, realizando modificación httpd.conf en sus líneas 46 y 171. También se modifica el archivo wampmanager.tpl, en las líneas 121 y 122 de esta versión. Al realizar estas modificaciones siempre se realiza reinicio de los servicios para que los cambios tomen efecto. 2. En el archivo Host del equipo se asigna la IP pública como “localhost”, de este modo y solicitando la apertura del puerto 81, será posible visualizar el contenido de la información vía web a través del enlace: http://miippublica:81/, internamente http://localhost:81 o http://miipprivada:81. Configuraciones básicas de seguridad del servidor 1. Realizar los cambios respectivos de permisos de tal manera que el acceso al phpmyadmin, se pueda realizar únicamente de manera local: <Directory "c:/wamp/apps/phpmyadmin3.5.1/"> Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Deny from all Allow from 192.168.0.100 </Directory> 2. Establecer una contraseña a la consola MySQL con el comando SET PASSWORD FOR root@localhost=PASSWORD('Su_Clave_Aqui'); 63 3. Modificar el archivo config.inc.php, para que se solicite el usuario y contraseña para acceder al phpmyadmin: se configura el usuario y contraseña y se modifica para que en el acceso pida la contraseña: Figura 23: Interfaz de logeo de phpMyAdmin 5.2.2. Transferencia de información Para el transporte de la información, se utilizará el protocolo FTP, haciendo uso de la librería “ftplib” en la Raspberry PI, para el envío de archivos hacia el Servidor FTP. En el caso del almacenamiento de la información en el servidor, se utilizó el servidor FTP TYPSoft. En este servidor se configuran los diferentes usuarios FTP para diferentes dispositivos y se asignan los respectivos permisos a las carpetas a las que tendrán acceso. 64 Figura 24: Interfaz TYPSoft FTP Server 5.2.3. Creación de base de datos, tabla y conexión de MySQL con PHP Para la creación y modificación de las base de datos y tablas, se manejaron de 2 maneras: Usando la consola MySQL o a través de phpmyadmin: Diseño y creación de base de datos: Para el diseño y creación de la base de datos, era necesario pensar desde la perspectiva del usuario final. Los datos relevantes que requiere un usuario es acceder, consultar y visualizar la información del dispositivo que monitorea su vehículo, que sea muy intuitiva y entendible. Por tal motivo, en el desarrollo se realizó la creación de 2 tablas en la base de datos para la importación y procesamiento de la información: Tabla monitoreo En esta tabla se importará la información almacenada en el servidor FTP de manera automática gracias al servicio de Windows instalado. La tabla está compuesta por los siguientes campos: CREATE TABLE IF NOT EXISTS `monitoreo` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `latitud` varchar(100) DEFAULT NULL, `longitud` varchar(100) DEFAULT NULL, `direccion` varchar(100) DEFAULT NULL, `fecha` varchar(100) DEFAULT NULL, `hora` varchar(100) DEFAULT NULL, `mapa` varchar(100) DEFAULT NULL, 65 `foto` varchar(100) DEFAULT NULL, `estado` varchar(100) DEFAULT NULL, `id_user` text DEFAULT Ninguna, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=41 ; Tabla 11: Tabla de Monitoreo en MySQL Campo id: Este campo es tipo entero e incremental, de esta manera permitirá tener un conteo global de todos los registros importados para el administrador de la base. También juega un rol importante en la publicación de los registros vía web de manera ordenada y descendente, lo que permite visualizar del último registro importado al primero. Campo latitud: Almacena la información de la latitud del registro importado. Campo longitud: Almacena la información de la longitud del registro importado. Campo dirección: Almacena la información de la dirección del registro importado, generada por la función codificada de georreferenciación inversa. Campo fecha: Almacena la información de la fecha del registro importado. Campo hora: Almacena la información de la hora del registro importado. Campo mapa: Almacena la información del link de acceso al mapa del registro importado. En la visualización web por medio de un icono redirecciona por hipervínculo a una nueva pestaña al archivo *.html almacenado en el servidor que contiene el mapa con su respectivo marcador. Campo foto: Almacena la información del link de acceso a la foto del registro importado. En la visualización web por medio de un icono redirecciona por hipervínculo a una nueva pestaña al archivo de la foto o el almacenamiento del video, esto depende del estado reportado en el campo estado. 66 Campo estado: Este campo almacena el estado automático o S.O.S, dependiendo del estado reportado, el campo foto puede tener un link que direccione a una foto o video. Campo id_user: Este campo almacena el ID del dispositivo de cada reporte, es de vital importancia para el acceso del usuario registrado y para el filtrado de la información. Tabla registro En esta tabla se almacenará la información correspondiente a los usuarios registrados, la contraseña es codificada con MD5 para brindar una mayor seguridad de la información. CREATE TABLE IF NOT EXISTS `registro` ( `id_user` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `nickname` varchar(100) NOT NULL, `pass` varchar(32) NOT NULL, PRIMARY KEY (`id_user`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ; Tabla 12: Tabla de registro Campo id_user: Este campo es tipo entero e incremental, de esta manera permitirá tener un conteo global de todos los usuarios registrados, para el administrador de la base. La importancia de este campo, radica en que será el ID de usuario otorgado para que la persona pueda ingresar a la plataforma una vez realizado el proceso de registro. Campo name: En este campo se almacena el nombre de la persona que se registra. Es un campo obligatorio para realizar el registro de manera satisfactoria. Campo nickname: Este campo no solo es obligatorio para realizar el registro de manera satisfactoria, sino también para acceder a los registros en la plataforma web mediante autenticación de usuario. Campo pass: Campo obligatorio que almacena la contraseña en codificación MD5, por seguridad este campo es necesario para la autenticación del usuario registrado. Diagrama Entidad- Relación En el diagrama se encuentran las tablas “monitoreo” y “registro” creadas en la base de datos “php”, estas contienen información de los usuarios registrados y de los reportes generados para cada uno de los dispositivos. 67 Figura 25: Esquema entidad relación Conexión MySQL con PHP Para establecer la conexión es necesario configurar los campos de: IP del servidor. Nombre de usuario. Contraseña. Base de datos. Formulario de registro Para el formulario de registro, serán requeridos 4 campos a ingresar en la página registro.html: Nombres y Apellidos. Nick Usuario. Contraseña. Repetir contraseña. Cuando el usuario llena los campos y procede a finalizar el registro, en la página registro.php se valida que los campos de contraseña y repetir contraseña sean iguales para hacer efectivo el registro. Si el registro se realiza de manera satisfactoria se almacenarán los datos en la tabla “registro”, y al usuario le indicará por medio de un aviso “registrado correctamente” con su respectivo ID de dispositivo, de lo contrario indicará si las contraseñas no coinciden o si no ha llenado alguno de los campos requeridos. Importación de datos La importación de datos es posible realizarla, gracias a un servicio Windows que siempre está activo. Este servicio realiza la tarea de importación automática cada 15 segundos, sobre los archivos de datos “*.txt” enviados desde la Raspberry a la carpeta /captura/CapturaArchivos. 68 Para que el servicio funcione es necesario establecer la conexión a la base de datos y colocar la URL de la carpeta donde se almacenarán los archivos a importar. También se configura en una variable las líneas para la importación de los archivos. El complemento adicional de este servicio es que cada vez que importa un archivo lo elimina de la carpeta dejando limpio el almacenamiento y a la espera de un nuevo archivo a importar. 69 Figura 26: Diagrama de bloques del registro de usuario Inicio de Sesión Para el inicio de sesión del usuario registrado, se creó la página principal “index.html”, donde se solicita ingresar el nombre de usuario y contraseña. En el caso de la contraseña la entrada se coloca de tipo “password”, de esa manera la contraseña estará oculta a la vista del usuario. Cuando se ingresan los datos, son validados en la página “login.php”, si son incorrectos saldrá un mensaje advirtiendo que el usuario y/o contraseña no son válidos, de lo contrario establece una sesión y guarda los datos. Después de validar, el usuario es direccionado a la página principal “index.php”. En esta página se asociará el número de ID asociado, que posteriormente será utilizado para el filtrado de contenido y 70 que únicamente pueda visualizar la información que le corresponde al ID del dispositivo. Ejemplo: http://miippublica:81/index.php?userid=”$userid”. En el siguiente código se podrá observar que se almacena como variable global la información del “userid”, obtenida de la dirección URL. Esto con el objetivo de identificar el ID del dispositivo autenticado y proceder a comparar con el ID de dispositivo de la tabla, de esa manera garantizar que únicamente publique la información cuando el “userid” obtenido de la dirección del link sea igual al ID de dispositivo de la tabla. Figura 27: Diagrama de bloques inicio sesión Por otra parte, se ingresa una variable como “bandera” para identificar cuando el usuario registrado tiene datos almacenados y cuando no los tiene. Cuando el estado de la bandera está en “1”, significa que ya se ha cargado información procedente de la Raspberry, el estado de la bandera en “0”, significa que para el usuario autenticado no se ha enviado información o no se ha configurado el dispositivo para el envío, por tanto se publicará información sobre los campos “no data load”. 71 Figura 28: Entorno Web, consulta sin datos de tabla monitoreo El campo “estado” puede ser “Automático” o “S.O.S.”. En el primer caso, la Raspberry inicia en estado “Automático”, enviando un reporte cada 10 minutos, con una fotografía adjunta. El estado “S.O.S” se activa cuando se pulsa el botón de emergencia, envía un reporte con un video adjunto. Posteriormente, continúa en estado “Automático”. 5.2.4. Visualización Visualización página web Los datos que el usuario podrá visualizar, serán los enviados desde la Raspberry e importados en la tabla “monitoreo” en un entorno más amigable como se observa en la siguiente figura. Figura 29: Entorno Web consulta datos tabla monitoreo En la parte izquierda aparece filtrado por el ID del dispositivo, en los demás campos de la tabla aparecerá la información relevante como Latitud, Longitud, Dirección, Fecha, Hora, Mapa, Foto y Estado. Visualización mapa en Google Maps Para el campo Mapa, está relacionado un icono que funciona como hipervínculo hacia la URL donde se almacenó el archivo en el servidor y cuyo nombre de archivo contiene fecha y hora de captura. Por ejemplo, http://miippublica:81/captura/mapa+fecha+hora.html. 72 El archivo “*.html” del mapa se envía ya creado desde la Raspberry. Este archivo contiene las coordenadas obtenidas por el dispositivo GPS y por medio de un script, se invoca la API de Google Maps, que está abierta a los desarrolladores y al público en común, y por medio de parámetros en una función, se definen las características de la publicación y la inclusión de las coordenadas para la ubicación en el mapa. Georreferenciación Inversa: Como se explica en el marco teórico, la georreferenciación inversa hace posible que a partir de las coordenadas obtenidas, se pueda traducir a una dirección legible e interpretable por el usuario común por medio de un marcador como se observa en la siguiente figura. Figura 30: Captura de coordenadas en Google Maps 73 Visualización Foto La visualización de la foto, es un icono referenciado a un hipervínculo que apunta a la URL donde se encuentra almacenado el archivo “*.JPG”. Por ejemplo, https://miipublica:81/captura/imagen+fecha+hora.jpg. 74 6. Pruebas técnicas Se realiza una última prueba en una página de Google llamada https://developers.google.com/speed/pagespeed/insights/, en esta se permite analizar la experiencia de usuario navegando en la página desde un ordenador de escritorio así como de un dispositivo móvil. A continuación se observa que la calificación para la navegación desde un equipo de escritorio es de 95/100, donde las recomendaciones es hacer cambios en la ejecución de JavaScript y CCS. Figura 31: Google Developers equipo escritorio. En cuanto a la experiencia en móviles hacen observaciones respecto a incorporar y adecuar el tamaño de los botones para facilitar el manejo táctil. La puntuación fue de 71/100. 75 Figura 32: Google Developers dispositivo móvil. 6.1. Prueba de Estrés: Para llevar a cabo las pruebas, una herramienta disponible vía web es: http://loadimpact.com. Con esta herramienta web, se puede poner a prueba escenarios de conexión múltiple y reflejar los tiempos de respuesta a medida que se aumenta la carga de usuarios. Como se puede observar en la siguiente figura, la convención “VU load time” hace referencia a la traza del tiempo de carga a medida que se incrementan los usuarios, cuya convención es “VUs active”. Se puede apreciar que el tiempo promedio de carga esta en 1.2 s. Este tiempo promedio de carga para tratarse de un servidor local en un equipo de hogar es bueno e indica que los tiempos de respuesta y eficiencia de operatividad mejorarían significativamente si los serivicios son migrados a un servidor público con mayores recursos y disponibilidad. Figura 33. Prueba de carga de conexión con 25 usuarios. 76 También pueden ser evaluados los tiempos de respuesta de los estilos gráficos e imágenes. Figura 34. Respuesta de páginas y estilos. Pruebas de conexión y tiempos de respuesta: Para evaluación de tiempo de respuesta se realizó a través de la herramienta web http://www.webpagetest.org/, donde se ingresa la dirección a ser consultada, en este caso la dirección principal “http://miipublica:81/index.php”. En la siguiente imagen se aprecia como la segunda consulta a diferencia de la primera es mucho más rápida, tanto en la carga de documentos así como en la carga completa de la página Figura 35. Tiempo respuesta plataforma web. 77 7. Conclusiones Se logró diseñar e implementar el prototipo de seguridad de manera eficiente y apropiada para el desarrollo del proyecto. El estudio de la viabilidad técnica y la creación de nuevas plataformas y dispositivos electrónicos multilenguaje y compatibles con diversos sistemas operativos fueron facilitadores en la integración de los componentes Hardware y Software. La georreferenciación es una herramienta potente y debe seguir siendo aprovechada al máximo en las diferentes aplicaciones informáticas, de seguridad, ubicación, etc. Contar con este recurso tecnológico permitió generar mapas de localización con un rango de error muy bajo y acoplado con el “reverse Geocoding” permite conocer la dirección física donde se encuentra el vehículo, haciendo que el prototipo sea confiable en la veracidad de la información que proporciona. El desarrollo de la base de datos, le permite a los usuarios consultar vía WEB de manera amigable y entendible la información que le corresponde del dispositivo al que está relacionado. Este logro es fundamental porque muchos proyectos, incluyendo este, están orientados al usuario común. La integración de los lenguajes (HTML, PHP, JavaScript, Phyton) optimizan significativamente el rendimiento e integración de las aplicaciones. Contar con un sistema robusto y actualizado en sus tecnologías permite ofrecer un dispositivo de alta fidelidad sin importar, en ocasiones, la limitación de los recursos que se puedan tener. 78 A. Anexo: Script “principal.py” import picam from time import * estado = "Automatico" iduser = ‘5’ while (True): StateFile = open("/home/pi/estado.txt", 'w') StateFile.write(estado) StateFile.close() picam.principal(estado, iduser) sleep (600) 79 B. Anexo: Script “pulsador.py” import os import time import RPi.GPIO as GPIO import picam GPIO.setmode(GPIO.BCM) GPIO.setup(3,GPIO.IN) estado = "S.O.S." iduser = ‘5’ while True: input = GPIO.input(3) if (input==0): print ("Boton pulsado") StateFile = open("/home/pi/estado.txt", 'w') StateFile.write(estado) StateFile.close() picam.principal(estado, iduser) 80 C. Anexo: Script “temporales.py” #!/usr/bin/env python # -*- coding: utf-8 from envioFTP import listaArchivos from time import * while True: listaArchivos() sleep(300) 81 D. Anexo: Script “picam.py” #!/usr/bin/python import StringIO import subprocess import os import time from datetime import datetime from PIL import Image import picamera import envioFTP tiempo = time.strftime threshold = 20 sensitivity = 30 forceCapture = False forceCaptureTime = 60 * 60 filepath = "/home/pi/Temporalenvio" PrefixPic = "image" PrefixDate = "date" diskSpaceToreserve = 40 * 1024 * 1024 camerasettings = "" prefixWeb = "http://186.154.5.153:81/captura/" saveWidth = 1296 saveHeight = 972 saveQuality = 10 testWidth = 100 testHeight = 75 testAreaCount = 1 testBorders = [ [[1,testWidth],[1,testHeight]] ] debugMode = False def captureTestImage(settings, width, height): command = "raspistill %s -w %s -h %s -t 200 -e bmp -n -o -" % (settings, width, height) imageData = StringIO.StringIO() imageData.write(subprocess.check_output(command, shell=True)) imageData.seek(0) im = Image.open(imageData) buffer = im.load() imageData.close() return im, buffer def saveImage(settings, width, height, quality, diskSpaceToReserve, estado): keepDiskSpaceFree(diskSpaceToReserve) global localNamePic 82 global FTPnamePic global horaArchivo horaArchivo = tiempo("%Y%m%d_%H%M%S") horaPublicar = tiempo("%A, %d/%m/%Y, %X") if estado == 'Automatico': localNamePic = filepath + "/" + PrefixPic + horaArchivo + ".jpg" FTPnamePic = PrefixPic + horaArchivo + ".jpg" with picamera.PiCamera(resolution=(width, height), led_pin=False) as foto: foto.annotate_text = horaPublicar time.sleep(0.05) foto.capture(localNamePic, quality=quality) foto.close() print "Captured %s" % localNamePic elif estado == 'S.O.S.': localNamePic = filepath + "/" + PrefixVid + horaArchivo + ".mp4" FTPnamePic = PrefixVid + horaArchivo + ".mp4" with picamera.PiCamera(resolution=(640,480)) as camera: time.sleep(0.1) camera.start_recording('/home/pi/video.h264', quality=25) camera.wait_recording(10) camera.stop_recording() comando = "MP4Box -fps 30 -add /home/pi/video.h264 %s" %(localNamePic) os.system (comando) def keepDiskSpaceFree(bytesToreserve): if (getFreeSpace() < bytesToreserve): for localNamePic in sorted(os.listdir(filepath + "/")): if localNamePic.startswith(PrefixPic) and localNamePIc.endswith(".jpg"): os.remove(filepath + "/" + localNamePic) print "Deleted %s/%s to avoid filling disk" % (filepath,localNamePic) if (getFreeSpace() > bytesToreserve): return def getFreeSpace(): st = os.statvfs(filepath + "/") du = st.f_bavail * st.f_frsize return du def principal(estado, iduser): image1, buffer1 = captureTestImage(camerasettings, testWidth, testHeight) lastCapture = time.time() while (True): image2, buffer2 = captureTestImage(camerasettings, testWidth, testHeight) changedPixels = 0 takePicture = False if (debugMode): debugimage = Image.new("RGB",(testWidth, testHeight)) debugim = debugimage.load() for z in xrange(0, testAreaCount): for x in xrange(testBorders[z][0][0]-1, testBorders[z][0][1]): for y in xrange(testBorders[z][1][0]-1, testBorders[z][1][1]): if (debugMode): debugim[x,y] = buffer2[x,y] 83 if ((x == testBorders[z][0][0]-1) or (x == testBorders[z][0][1]-1) or (y == testBorders[z][1][0]-1) or (y == testBorders[z][1][1]-1)): debugim[x,y] = (0, 0, 255) pixdiff = abs(buffer1[x,y][1] - buffer2[x,y][1]) if pixdiff > threshold: changedPixels += 1 if (debugMode): debugim[x,y] = (0, 255, 0) if (changedPixels > sensitivity): takePicture = True if ((debugMode == False) and (changedPixels > sensitivity)): break if ((debugMode == False) and (changedPixels > sensitivity)): break if ((debugMode == False) and (changedPixels > sensitivity)): break if (debugMode): debugimage.save(filepath + "/debug.bmp") print "debug.bmp saved, %s changed pixel" % changedPixels if forceCapture: if time.time() - lastCapture > forceCaptureTime: takePicture = True if takePicture: saveImage(camerasettings, saveWidth, saveHeight, saveQuality, diskSpaceToreserve) os.system("sudo python /home/pi/iniciogps.py") datos = open("/home/pi/datos.txt", 'a') datos.write("|%s%s|%s|%s" %(prefixWeb, FTPnamePic, estado, iduser)) print (estado) datos.close() horaArchivo = tiempo("%Y%m%d_%H%M%S") localNameDate = filepath + "/" + PrefixDate + horaArchivo + ".txt" FTPnameDate = "CapturaArchivos/" + PrefixDate + horaArchivo + ".txt" os.rename("/home/pi/datos.txt",localNameDate) envioFTP.enviar (localNameDate, FTPnameDate) envioFTP.enviar (localNamePic, FTPnamePic) break image1 = image2 buffer1 = buffer2 84 E. Anexo: Script “iniciogps.py” #! /usr/bin/python # -*- coding: utf-8 import os from gps import * from time import * import time import threading import envioFTP from pygeocoder import Geocoder import envioEmail tiempo = time.strftime filepath = "/home/pi/TemporalEnvio" PrefixMapa = "map" prefixWeb = "http://190.26.41.106:81/captura/" gpsd = None os.system('clear') class GpsPoller(threading.Thread): def __init__(self): threading.Thread.__init__(self) global gpsd gpsd = gps(mode=WATCH_ENABLE) self.current_value = None self.running = True def run(self): global gpsd while gpsp.running == True: gpsd.next() if __name__ == '__main__': gpsp = GpsPoller() try: gpsp.start() senal = 0 StateFile = open("/home/pi/estado.txt", 'r') estado = StateFile.read() while True: os.system('clear') print 'Latitud: ' , gpsd.fix.latitude print 'Longitud: ' , gpsd.fix.longitude print 'Estado: ', estado 85 if abs(gpsd.fix.latitude) > 0.0 and abs(gpsd.fix.longitude) > 0.0: print "GPS OK" latitud = "%s" %(gpsd.fix.latitude) longitud = "%s" %(gpsd.fix.longitude) direccion = Geocoder.reverse_geocode(gpsd.fix.latitude, gpsd.fix.longitude) if estado == 'S.O.S.': envioEmail.enviar (direccion, tiempo("%X, %d/%m/%Y")) horaArchivo = tiempo("%Y%m%d_%H%M%S") horaPublicar = tiempo("%A, %d/%m/%Y|%X") localNameMapa = filepath + "/" + PrefixMapa + horaArchivo + ".html" FTPnameMapa = PrefixMapa + horaArchivo + ".html" mapa = open("/home/pi/mapa.php", 'r') mapa_nuevo = mapa.read() mapa_nuevo = mapa_nuevo.replace("coordenadas", latitud + "," + longitud) mapa.close() nuevo = open(localNameMapa,'w') nuevo.write(mapa_nuevo) nuevo.close() datos = open("/home/pi/datos.txt", 'w') datos.write("|%s|%s|%s|%s|%s%s" %(latitud, longitud, direccion[0], horaPublicar, prefixWeb, FTPnameMapa)) datos.close() envioFTP.enviar (localNameMapa, FTPnameMapa) break else: print "Esperando GPS..." if estado == "Automatico": if senal == 60: horaPublicar = tiempo("%A, %d/%m/%Y|%X") datos = open("/home/pi/datos.txt", 'w') datos.write("|Sin senal|Sin senal|No hay dato|%s|No existe archivo" %(horaPublicar)) datos.close() break senal = senal + 1 sleep (1) gpsp.running = False gpsp.join() except (KeyboardInterrupt, SystemExit): print "\nDesconectando GPS..." print "Ok.\nSaliendo..." 86 F. Anexo: Script “envioFTP.py” #!/usr/bin/env python # -*- coding: utf-8 import ftplib import os global s path ftp_servidor ftp_usuario ftp_clave ftp_raiz = = = = = '/home/pi/TemporalEnvio/' '190.26.41.106' 'gps' '4m3r1c42014*' '/captura' def enviar (archivoOrigen, archivoDestino): fichero_origen = archivoOrigen fichero_destino = archivoDestino try: s = ftplib.FTP(ftp_servidor, ftp_usuario, ftp_clave) try: f = open(fichero_origen, 'rb') s.cwd(ftp_raiz) s.storbinary('STOR ' + fichero_destino, f) f.close() s.quit() except: print "No se ha podido encontrar el fichero " + fichero_origen else: os.remove(fichero_origen) except: print "No se ha podido conectar al servidor " + ftp_servidor def listaArchivos (): lstFiles = [] lstDir = os.walk(path) #os.walk()Lista directorios y ficheros try: s = ftplib.FTP(ftp_servidor, ftp_usuario, ftp_clave) for root, dirs, files in lstDir: for fichero in files: (nombreFichero, extension) = os.path.splitext(fichero) if(extension == ".txt"): lstFiles.append(nombreFichero+extension) enviar (path + nombreFichero + extension, "CapturaArchivos/" + nombreFichero + extension) else: lstFiles.append(nombreFichero+extension) enviar (path + nombreFichero + extension, nombreFichero + extension) except: print "No se ha podido conectar al servidor " + ftp_servidor 87 G. Anexo: Script “envioEmail.py” #!/usr/bin/python # -*- coding: utf-8 import import import import import smtplib mimetypes email email.mime.application sys msg = email.mime.Multipart.MIMEMultipart() msg['Subject'] = 'Activacion boton S.O.S.' msg['From'] = '[email protected]' msg['To'] = '[email protected]' def enviar (direccion, hora): cuerpo = ("Se ha detectado la activación del botón de pánico en su vehículo.\n\nDirección: %s\nHora: %s\n\nPodra visualizar la foto y la ubicación en el mapa accediendo a su cuenta a través del siguiente link. \n\nhttp://181.130.15.178:81/index.php" %(direccion[0],hora)) print "Enviando correo a " ,msg['To'] body = email.mime.Text.MIMEText(cuerpo) msg.attach(body) s = smtplib.SMTP('smtp.gmail.com:587') s.starttls() s.login('[email protected]','raspberrypi') s.sendmail('[email protected]',['[email protected]'], msg.as_string()) s.quit() print "Email enviado" 88 H. Anexo: Script “mapa.php” <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> <meta charset="utf-8"> <title>Localización GPS Raspberry Pi</title> <style> html, body, #map-canvas { height: 100%; margin: 0px; padding: 0px; } var var var var </style> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true"></script> <script> geocoder; map; infowindow = new google.maps.InfoWindow(); marker; function initialize() { geocoder = new google.maps.Geocoder(); var latlng = new google.maps.LatLng(coordenadas); var mapOptions = { zoom: 20, center: latlng, mapTypeId: 'hybrid' } map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); codeLatLng(); } function codeLatLng() { var latlng = new google.maps.LatLng(coordenadas); geocoder.geocode({'latlng': latlng}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { if (results[0]) { map.setZoom(20); marker = new google.maps.Marker({ position: latlng, map: map }); infowindow.setContent(results[0].formatted_address); infowindow.open(map, marker); } else { window.alert('No results found'); } } else { window.alert('Geocoder failed due to: ' + status); } }); } google.maps.event.addDomListener(window, 'load', initialize); </script> </head> <body> <div id="map-canvas"></div> </body> </html> 89 8. Bibliografía [1] Concejo de Bogotá D.C., “POR EL CUAL SE IMPLEMENTA UN SISTEMA TECNOLÓGICO DE SEGURIDAD EN VIDEO VIGILANCIA Y BOTONES DE PÁNICO EN EL SERVICIO DE TRANSPORTE PÚBLICO INDIVIDUAL Y COLECTIVO DE PASAJEROS EN EL DISTRITO CAPITAL.” Abril de-2014. [2] “¿Cuáles son las características principales del HTML?,” Postgrado en Marketing Online, comunicación, Marketing Digital, postgrado online, uab, barcelona. . [3] Rosselott, “Manual de PHP Básico - WebEstilo.” Jun-2003. [4] PHP Group, “PHP 5.4.45 Released.” 2015-2001. [5] Olga Cirauqui Elorz, “Instalar WAMP.” 02-Mar-2012. [6] “CSS: Hojas de estilo,” CCM. [Online]. Available: http://es.ccm.net/contents/156-css-hojas-deestilo. [Accessed: 06-Sep-2015]. [7] “Java Script,” prezi.com. [Online]. Available: https://prezi.com/_kd-lnphaoq6/java-script/. [Accessed: 06-Sep-2015]. [8] “Google Maps API V3 introducción y primeros pasos,” Maestros del Web. . [9] Jorge Sánchez Asenjo, “Servidores de Aplicaciones Web.” 2012. [10] Masadelante.com, “¿Qué es un servidor FTP (FTP Servers)?” 2015-1999. [11] MD5online.org, “MD5 Online.” 2015-2012. [12] Jorge Sánchez, “Diseño Conceptual de Bases de Datos.” 2004. [13] “Tipos De Bases De Datos,” El blog de base de datos. [Online]. Available: http://basededatos.over-blog.net/article-tipos-de-bases-de-datos-68319538.html. [Accessed: 06Sep-2015]. [14] “¿Qué es un gestor y cuáles son sus tipos?” . [15] EcuRed, “Sistema Gestor de Base de Datos.” . [16] “Base de datos modelo entidad relacion,” 20:20:14 UTC. [17] Carl Rod Nave, “Satélites de Posicionamiento Global.” 2010. [18] “Qué es el GPS, funcionamiento general,” Penyagolosa.net - Senderismo en Castellón, 2015-2006. [Online]. Available: http://www.penyagolosa.net/informacion-general/que-es-el-gpsfuncionamiento-general.html. [19] Querelle y Cia Ltda., “Coordenadas geográficas,” Profesor en Linea. [Online]. Available: http://www.profesorenlinea.cl/geografiagral/Coordenadasgeog.htm. [20] “Coordenadas geográficas.” [Online]. Available: http://www.portaleducativo.net/quintobasico/684/Coordenadas-geograficas. [Accessed: 06-Sep-2015]. [21] “Sistema de Coordenadas,” Coordenadas GPS, 2015. [Online]. Available: http://www.coordenadas-gps.com/sistema-de-coordenadas. [22] ms.gonzalez, “La transmisión de datos en la telefonía móvil | Redes Telemáticas.” . [23] “Las redes de transmisión de datos usadas en los teléfonos celulares,” NorfiPC. [Online]. Available: http://norfipc.com/celulares/redes-transmision-datos-usadas-telefonos-celulares.php. [Accessed: 07-Sep-2015]. 90 [24] “Raspberry Pi,” Raspberry Shop, 2015-2011. [Online]. Available: http://www.raspberryshop.es/index.php. [25] winfernux, “Nuevo modelo de Raspberry Pi: La Model B+,” Life Bit Blog. . [26] “Raspberry Pi,” Wikipedia, the free encyclopedia. 09-Sep-2015. [27] “Raspberry Pi,” Wikipedia, la enciclopedia libre. 03-Aug-2015. [28] “Accesorios para Raspberry Pi,” Raspberry Shop, 2015-2011. [Online]. Available: http://www.raspberryshop.es/accesorios-raspberry-pi.php. [29] “Modulo Gps Ublox NEO-6M,” arm32. [Online]. Available: http://www.arm32.cl/wireless/32modulo-gps-ublox-neo-6m.html. [Accessed: 10-Sep-2015]. [30] Botscience EIRL, “Módulo GPS para Arduino UBlox NEO 6M,” BOT Science, 2013. [Online]. Available: http://botscience.net/store/index.php?route=product/product&product_id=73. [31] “RASPBERRY PI | Historia de la Informática.” . [32] “Programando con Raspberry Pi B+ | botboss.” . [33] “Python PARA TODOS.” [Online]. Available: http://www.academia.edu/8911458/Python_PARA_TODOS. [Accessed: 10-Sep-2015]. [34] “Tutorial 1 - Preparando la tarjeta SD para instalar el sistema operativo,” Frambuesa Pi Colombia - Raspberry Pi en español. . [35] “Tutorial 2 - Descarga de NOOBS y copia en la tarjeta SD,” Frambuesa Pi Colombia - Raspberry Pi en español. . [36] S. G. B. M. P. R. at C. U. L. de F. P. Estudi and o un P. de I. B. en C. U. L. E. y promotor de los principios de R. P. para los que hablamos español, “Tutorial 3 - Instalación y configuración de inicial del Raspberry Pi (raspi-config),” Frambuesa Pi Colombia - Raspberry Pi en español. . [37] “Tutorial 4 (Parte 1) - Conexión del Raspberry Pi a Internet usando cable de red,” Frambuesa Pi Colombia - Raspberry Pi en español. . [38] “Tutorial 7 - Conexión remota al Raspberry Pi usando Xming,” Frambuesa Pi Colombia - Raspberry Pi en español. . [39] “Raspberry Pi NoIR Infrared Camera Board v1.3 (5MP, 1080p),” Pi Supply. . [40] “Use the Raspberry Pi as a DIY Surveillance camera,” Make Tech Easier. [Online]. Available: https://www.maketecheasier.com/raspberry-pi-as-surveillance-camera/. [Accessed: 10-Sep2015]. [41] “Tracker GPS con Raspberry Pi y el módulo Ublox M6,” fpaez.com. . 91