Sistema de Monitoreo de Velocidad GPS
Sistema de Monitoreo de Velocidad GPS
SEDE GUAYAQUIL
PROYECTO TÉCNICO
Autores:
Tutor:
GUAYAQUIL – ECUADOR
2019
CERTIFICADO DE RESPONSABILIDAD Y AUTORÍA
_____________________________ _________________________
(f) Paul Cevallos Peñaherrera (f) Alberto Alvarez Morales
C.I: 0918475898 C.I: 0926812488
II
DOCUMENTO DERECHOS DE AUTOR
_____________________________ _______________________
III
CERTIFICADO DE DIRECCIÓN DEL TRABAJO DE
TITULACIÓN
Atentamente
_____________________________
IV
DEDICATORIA
Este trabajo de titulación quiero dedicarlo en primer lugar a Dios por ser el principal
motor de mi vida, a mi madre que ha sido mi guía y el pilar principal para mi formación
personal y profesional. A mis abuelitos que han estado conmigo desde el inicio de mi
vida. A mi esposa por ser mi compañera de vida y apoyarme en todo momento en mi
carrera universitaria. A mi compañero de tesis y amigo con quien he compartido toda
mi formación académica y a todas las personas que de alguna u otra forma aportaron
para mi formación íntegra, social y profesional durante mi carrera universitaria.
Paul Cevallos
V
DEDICATORIA.
El presente proyecto investigativo quiero dedicarle en primer lugar a Dios por ser la
razón principal de tenerme sano y con vida para poder seguir alcanzando cada una
de mis metas propuestas, a mis padres Alberto Alvarez Muñoz y Fanny Morales
Freire por sus valores y principios inculcados en mí desde muy pequeño que han
servido como enseñanza para enfrentar la vida cada día, dándome siempre su apoyo
y confianza para nunca desmayar, por dar todo de ellos y ver a su hijo cumplir sus
metas, dándome siempre ánimos y ese impulso por seguir adelante, también a mi
querida universidad, directivos, docentes y amigos, quienes me han transmitido sus
conocimientos a través de estos años, para ser un profesional capaz y brindar
excelente aporte a la sociedad para progresar.
Alberto Alvarez
VI
AGRADECIMIENTO
Nuestros más sinceros agradecimientos a nuestro Padre Celestial quien nos orienta
y nos da la fortaleza espiritual necesaria para seguir hacia adelante día a día, a
nuestros padres quienes siempre estuvieron apoyándonos desde el primer instante
de nuestras vidas y nos han dado las pautas necesarias para enfrentar las
dificultades de la etapa universitaria. A cada uno de los docentes que nos han
impartido sus conocimientos, los cuales fueron necesarios para la realización de esta
obra escrita. A nuestros amigos con quienes compartimos muchos momentos que
alegraron y enriquecieron nuestra vida universitaria.
VII
RESUMEN
El estado del bus será visible desde el internet, mediante un servidor alojado en la
nube el cual mostrará los registros en una aplicación web.
VIII
ÍNDICE GENERAL
IX
2.12. Sistema Operativo ............................................................................ 11
2.13. Arduino ............................................................................................. 12
2.14. Servidor web .................................................................................... 13
2.15. HTTP ................................................................................................ 15
2.16. HTTPS ............................................................................................. 17
2.17. PHP .................................................................................................. 18
2.18. Framework web ................................................................................ 18
2.19. Laravel ............................................................................................. 19
2.20. Base de datos .................................................................................. 20
2.21. MySQL ............................................................................................. 22
2.22. Python .............................................................................................. 22
2.23. GPS.................................................................................................. 23
3. MARCO METODOLÓGICO ..................................................................... 24
3.1. Descripción General............................................................................. 24
3.2. Módulo GPS......................................................................................... 25
3.3. Validación de la parada del bus ........................................................... 27
3.4. Captura de fotos .................................................................................. 27
3.5. Base de datos ...................................................................................... 29
3.5.1. Tabla de estaciones permitidas ..................................................... 29
3.5.2. Tabla de usuarios registrados ....................................................... 30
3.6. Interfaz web ......................................................................................... 30
3.6.1. Interfaz de inicio de sesión ............................................................ 30
3.6.2. Interfaz de administración ............................................................. 31
3.6.3. Interfaz de creación de paradas .................................................... 33
3.6.4. Interfaz de eliminación de estaciones ........................................... 34
3.6.5. Interfaz de cambio de credenciales ............................................... 34
3.7. Servidor web ........................................................................................ 35
3.8. Supervisión remota .............................................................................. 37
4. ANÁLISIS DE RESULTADOS ................................................................. 38
4.1. Diagrama de bloques del biométrico .................................................... 38
4.2. Implementación del proyecto ............................................................... 40
4.3. Diagrama de Flujos .............................................................................. 44
CONCLUSIONES ............................................................................................. 47
RECOMENDACIONES ..................................................................................... 48
Bibliografía ........................................................................................................ 49
ANEXOS ........................................................................................................... 53
X
PRESUPUESTO .......................................................................................... 53
CRONOGRAMA DE ACTIVIDADES ............................................................. 54
CÓDIGO FUENTE ........................................................................................ 55
LECTURA DEL DATOS DEL GPS CON ARDUINO ..................................... 55
MANIPULACIÓN DE LOS DATOS DEL GPS ............................................... 57
TOMAR FOTOS ........................................................................................... 59
GESTION DEL SERVIDOR .......................................................................... 60
RUTAS DE LA APLICACIÓN........................................................................ 63
TABLA DE PARADAS EN LA BASE DATOS................................................ 64
VISTAS DE LA APLICACIÓN ....................................................................... 65
APLICACIÓN DEL SERVIDOR..................................................................... 75
XI
ÍNDICE DE FIGURAS
Figura 7 - Placa de arduino con cada una de las especificaciones del Arduino Mega
2560 (UGE-ONE, 2016) ......................................................................................... 13
XII
Figura 25 - Diagrama de flujo de captura de fotos ................................................. 28
XIII
Figura 51 - Diagrama de flujo del control de puertas .............................................. 44
XIV
ÍNDICE DE TABLAS
XV
1. INTRODUCCIÓN
La ciudad de Guayaquil es una de las urbes más importantes del Ecuador, con mayor
número poblacional y con más número de vehículos. En el 2016 la ATM matriculó
334 mil vehículos dando un estimado del parque automotor de 334 mil vehículos.
Debido al alto número de vehículos y buses que transitan por la urbe muchas zonas
y arterias principales son saturadas. Varios editoriales de periódico ya han informado
de dicho problema. La ATM afirmó que en 5 calles de Guayaquil existen
congestionamiento vehicular las cuales son la Av. Francisco de Orellana, Juan Tanca
Marengo, de las Américas, Carlos Julio Arosemena y la Av. Del Bombero. El Diario
El Telégrafo señaló también que en las calles del centro de la urbe existe atasco
vehicular, “Entre las calles más señaladas como congestionadas están las avenidas
Quito, Machala, 10 de agosto, Clemente Ballén, Víctor Manuel Rendón, Panamá y
Boyacá” (El Telégrafo , 2017).
Por otra parte, las leyes de tránsito establecen para el transporte urbano un límite de
velocidad máxima de 40 Km/h, pero muchos choferes conducen con exceso de
velocidad, poniendo la vida de los pasajeros y peatones en riesgo.
El Diario El Universo publicó que “el número de multas por exceso de velocidad, que
es el 30% del salario básico ($ 112,50), va en aumento. Pasaron de 15.572 en todo
el 2014 a 260.063 durante noviembre de 2017, según cifras de la Agencia Nacional
de Tránsito (ANT) –entidad que planifica, regula y controla la gestión del transporte
terrestre, tránsito y seguridad vial en el país. Solo la Autoridad de Tránsito Municipal
de Guayaquil (ATM) ha emitido 232.913 multas por exceso de velocidad desde
agosto de 2015, cuando asumió la competencia hasta el mismo mes de este año
(noviembre 2017)”.
1.2.1. Temporal
1.2.2. Académica
1.3. Antecedentes
Ese incremento brota debido al mayor acceso a los automóviles y vehículos pesados,
al crecimiento poblacional, la prolongación del poder adquisitivo de las clases de
ingresos medios y la enorme cantidad de ofertas y créditos que hoy en día existen
más la reventa de carros usados. Aparte la necesidad de poder transportarse de
lugares lejanos o apartados y sobre todo a las escasas políticas estructurales en el
transporte público urbano.
Por otra parte, como fue escrito en el diario El Telégrafo “de acuerdo con datos del
Municipio de Quito, a inicios de esta década el incremento del parque automotor
superó ampliamente al aumento poblacional. Mientras el número de vehículos se
elevó un 11% anual en promedio, el poblacional es de alrededor del 2%. De los
4’565.000 desplazamientos que ocurren a diario por la ciudad, el 84% utiliza
transporte público o auto privado”.
2
1.4. Importancia
1.5. Alcance
• Elaborar un software web mediante el cual se pueda crear, editar y eliminar las
paradas permitidas en las que le bus podrá abrir sus puertas.
• Tomar una ráfaga de fotos cada vez que las puertas del bus se encuentren
abiertas
1.6. Justificación
Esto produce un caos vehicular el cual se agrava en las horas pico y en zonas de
alta congestión vehicular, por esta razón es necesario que los buses de transporte
urbano no se detengan en cualquier lugar, simplemente en las zonas previamente
definidas, ya que estas zonas fueron analizadas y diseñadas para interferir lo menos
posible en el tráfico.
3
Desde el 2017 en la ciudad de Guayaquil se viene dando una transformación vial con
la implementación del llamado ‘Corredor vial’ que es un tramo de 26 km para uso
exclusivo de 70 buses urbanos pertenecientes a 4 líneas de buses. El objetivo del
corredor es que los buses paren, recojan o dejen a los pasajeros en los 104
paraderos ya predefinidos por la ATM.
1.7. Objetivos
• Diseñar una plataforma web para administrar las paradas autorizadas usando el
lenguaje de servidor PHP y que se ejecute en la Raspberry Pi.
4
2. MARCO TEÓRICO REFERENCIAL
En el primer capítulo se describió, que el exceso de velocidad y el tráfico ocasionado
por los conductores que paran a dejar y recoger pasajeros en cualquier lugar, es un
constante problema que se vive en Guayaquil. Ante dicha problemática, este trabajo
de titulación tiene como solución la implementación de un sistema de monitoreo de
velocidad para transporte urbanos y control de puertas en paradas autorizadas
mediante la utilización de un módulo GPS conectado a un Arduino, y este
interconectado con una Raspberry PI (Blum, 2013).
Por otra parte, ya se han registrado estudios relacionados con proyectos que también
usan esta versátil herramienta llamada Raspberry PI. A continuación, se describen
dichos proyectos relacionados.
5
2.2. Sistema de control
Se define como un espacio que recibe acciones del exterior, denominadas también,
variables de entradas; las mismas que se procesan en el sistema, dando como
respuesta las variables de salidas. Se conoce que existen dos clases de acciones
externas: las variables de control, las cuales son las variables que se pueden
cambiar; y las de perturbación, a las que no se les puede realizar ningún cambio.
Como lo detalla Vélez (2017), por lo tanto, un sistema de control ideal debe certificar
la estabilidad y ser fuerte ante las perturbaciones en los modelos; ser lo más efectivo
posible, de acuerdo al criterio; ser amigable en su implementación y cómodo de
manejar en tiempo real con ayuda de un computador.
2.3. Geolocalización
El sistema del GPS funciona mediante el uso de los satélites que existen en órbita,
en la actualizada existen varios satélites en diferentes posiciones orbitando el
planeta, el GPS necesita tener acceso al menos a tres para que mediante la
6
diferencia horaria entre los satélites se pueda triangular la posición Figura #1 del
dispositivo GPS (Monk, 2012).
2.4. Raspberry PI
Es una minicomputadora de placa única, es decir que todos los componentes vienen
integrados en una misma placa, el diseño incluye un SOC que contiene la CPU, GPU
y memoria RAM
• 256 MB de RAM
• USB
7
• Modelo A con un puerto USB
Su tamaño tan reducido es lo que facilita para poder llevarlos a varios lugares y
además tiene un precio muy reducido.
Como medio de almacenamiento usa una tarjeta SD lo que hace fácil que se pueda
instalar y actualizar el sistema a través de otro ordenador, además, las tarjetas se
pueden fácilmente cambiar proporcionado de esta forma entornos de software
distintos.
8
2.5. SOC
Son las siglas de system-on-a-chip (SOC) lo que quiere decir que dentro de un mismo
integrado se incluyen las principales partes de un sistema, es decir es un integrado
que contiene las partes principales de un equipo.
2.6. CPU
2.7. GPU
9
2.8. Linux
Para que los beneficiarios accedan a todos los servicios que facilita el Raspberry,
anterior a esto se necesita el montaje de un sistema operativo Linux, para el caso de
esta aplicación se ha seleccionado el SO Raspabian.
Se conoce como Linux al kernel creado a partir de UNIX por Linus Trovalds, este es
uno de los ejemplos elementales de software libre. Linux es un Unix libre, en otras
palabras, Linux es como el sistema operativo Windows, pero con la diferencia que
este tiene propietarios. Linux ha evolucionado por miles de usuarios de
computadores a través del mundo y su creador fue un estudiante llamado Linux
Torvalds que inicialmente fue realizado como un hobby por un estudiante joven, en
la universidad de Helsinki de Finlandia.
2.9. Kernel
10
2.10. Raspbian
2.11. Debian
Es uno de los suministros más antiguos y estables de Linux que existe, de ella se
derivan sientas de otras distribuciones, como por ejemplo Ubuntu, se caracteriza por
su estabilidad y practicidad, además que es gratis, no cuenta con licencia para los
usuarios.
Son aquellos sistemas que conservan a uno o más hadware unidos a través de algún
medio de información (físico o no) con el propósito elemental de poder compartir los
diferentes recursos hardware y software.
11
2.13. Arduino
Arduino puede medir el entorno a través del ingreso de entradas desde una gran
cantidad de sensores y afecta a lo que lo rodea por medio de control de iluminación
y otros artefactos. “Se programa el microcontrolador de la placa, usando el Arduino
Programming Language (basado en Wiring1) y el Arduino Development Environment
(basado en Processing2). Los proyectos de arduino son de dos tipos: autónomos o
los que se comunican con software en ejecución a un computador” (Hidalgo, 2015).
• Entrada de alimentación.
• Oscilador de trabajo.
12
• Circuito de RESET.
• Conexión USB.
• Accesos a las líneas de entrada y salida.
Estas placas son las que ayudan a capacitar cada una de las incorporaciones, en
donde se contiene la matriz de cada uno de los terminales, en donde se añade el
hardware en consideración a los requerimientos de los prototipos a desarrollarse.
“Un servidor web sirve contenido estático a un navegador, carga un archivo y lo sirve
a través de la red al navegador de un usuario, este intercambio es mediado por el
navegador y el servidor que hablan el uno con el otro mediante HTTP, este se puede
utilizar para varias tecnologías en el servidor para aumentar así la potencia más allá
de su capacidad de entregar páginas HTML; éstas incluyen scripts CGI, seguridad
SSL y páginas activas del servidor (ASP).” (Silva, 2014).
13
Figura #8 - Servidor Web (Barrios, 2011)
Muchos de los equipos son aceptados por medio de peticiones “http” del navegador
web del usuario, entregando así las páginas web para poder así ver cuáles son las
paginas HTML en donde se enlazará las imágenes y ficheros, en otras palabras,
cuando alguien desea entrar a una página web en cuestión pinchado en un enlace,
estos ordenadores lanzan peticiones al servidor web donde dicha página está
alojada.
14
Figura #9 - Sistema de monitoreo y control (Speraccess, 2015)
2.15. HTTP
15
Muchas de las actividades que se ejecutan sobre la plataforma de web se relacionan
desde consultas del correo electrónico, la banca en internet, redes sociales,
comercios y demás, en donde por medio de estos procesos se intercambia
informaciones personales y que deberían de ser confidenciales, dado que la mayoría
de estas son transmitidas por medio de mecanismos de naturaleza inseguro, siendo
este el punto a tratar.
El servidor http es un programa que el servidor corre, el mismo que escucha lo que
solicitan las HTTP, y las realiza. De acuerdo del tipo de solicitud, el servidor web
busca una página web o ejecuta un programa del servidor. De todas formas, siempre
va a entregar un resultado HTML al cliente o a quien haya navegado solicitando. Este
servidor es fundamental en la realización de aplicaciones de lado del servidor, debido
a que se va a ejecutar sobre él.
16
2.16. HTTPS
No es laborioso nombrar algunas razones por las que es recomendable usar HTTPS
antes que HTTP. Al cifrar la comunicación entre usuario y servidor, evitamos los
ataques man-in-the-middle o eavesdropping, por medio de los cuales un intruso
podría conseguir, por ejemplo, el usuario y contraseña de un sitio web porque irían
en texto plano (Pérez, 2017).
Se puede lograr distinguir que la comunicación o las páginas web segura, se debe
identificar que el URL debe de comenzar con “[Link] el cual es empleado por el
puerto numero 443 por defecto, mientras que el tradicional “[Link] está siendo
empleado por 80 puertos por defecto. Es por ello que originalmente el HTTPS solo
es utilizable en la encriptación SSL, para poder ser reemplazado por el TLS, para lo
cual el HTTPS es adoptado como estándares web por grupos como IETF
17
2.17. PHP
Es un lenguaje de código abierto que se usa del lado del servidor para generar
páginas web dinámicas, este lenguaje es el más usado del lado del servidor y permite
fácil comunicación con todo tipo de bases de datos.
Por lo general esto es ejecutable dentro de un servidor Web, tomando como entrada
el código en PHP y así crear páginas web como salida, en donde se despliega y en
casi todos los sistemas operativos y plataformas sin ningún costo la mayoría de los
servidores web.
• Lenguaje multiplataforma
• Capacidades de conexión con la mayoría de manejadores que están inscritos en
la base de datos utilizando en la actualidad, destacando así su conectividad con
el MySQL.
• Es de libre ingreso, por lo cual se expone como una de las alternativas de fácil
comunicación para los que deseen utilizarlos.
• Este permite que las técnicas de programación que está orientada en objetos,
también permitan que las conexiones respecto a los diferentes tipos de
servidores de bases de datos tales como: MySQL, ODBC, DB2, Microsoft SQL
Server, Firebird y el SQLite.
Es una estructura definida para el diseño de software, trae patrones de diseño los
cuales definen en forma general como se debe desarrollar software y como este
estará estructurado, incorpora una serie de librerías y componentes los cuales están
predefinidos y realizan tareas comunes al área en la que se aplica el framework.
18
• Implementa buenas prácticas de diseño de software
• Permite crear más y mejores cosas en un tiempo menor
2.19. Laravel
Laravel busca ofrecer una sintaxis de fácil uso facilitando la reutilización de código,
aprovecha todas las funcionalidades que brindan otros frameworks y utiliza
correctamente las últimas particularidades de PHP.
19
• make:command — Generar un nuevo class
• make:console — Genera un nuevo Artisan command
• make:controller — Genera un nuevo resource controller class
• make:event — Genera un nuevo event class
• make:middleware — Genera un nuevo middleware class
• make:migration — Genera un nuevo migration file
• make:model — Genera un nuevo Eloquent model class
• make:provider — Genera un nuevo service provider class
• make:request — Genera un nuevo form request class
• event:generate — Crea una lista con los controladores y eventos perdidos
Laravel dispone de una serie de paquetes los cuales reducen el trabajo a la hora de
desarrollar una aplicación web, entre ellos trae controladores de bases de datos,
sistema de eventos y su propio gestor de plantillas llamado Blade.
Las data son lugares donde se guarda información de acuerdo a diferentes formas
de organización. Una base de datos está representada por varios aspectos del
mundo real, especialmente, aquellos que le interesan al usuario. Los datos son
hechos que se conocen, y que se pueden registrar (Gutierrez, 2016).
Dado que la base de datos es una colección de datos los cuales se almacenan y se
organizan por medio de programas de ordenadores para que estos puedan
seleccionarse de forma rápida y capaz de ser recobrados, insertados, actualizados y
capaces de ser borrados, dado que son registrados por medio de archivos
electrónicos.
20
Figura #14 - Proceso de almacenamiento de información en la data
(Engloba Systems, 2014)
Las informaciones no son un dato cualquiera, sino más bien son las colecciones
respecto a los hechos significativos y pertinentes, en donde le organismo y las
organizaciones se perciben, dado que las definiciones de las informaciones son
conformadas por medio de conjunto de datos significativos y pertinentes en donde
estos describen cada uno de los sucesos o entidades representativas.
Características de la Data
21
2.21. MySQL
Está escrito en C/C++ y permite una facilidad de conexión con los principales
lenguajes de programación más importantes de la actualidad como PHP, PEARL o
JAVA.
2.22. Python
22
• Corre en casi cualquier sistema operativo (Multiplataforma)
• Se compila y ejecuta al momento de ejecución (Interpretado)
• Orientado a objetos
• Sintaxis clara
• Gran cantidad de librerías y software libre para reutilizar
2.23. GPS
El GPS se basa en los cerca de 200 satélites que se encuentran orbitando el planeta,
estás perfectamente distribuidos de forma que siempre tengamos al menos 3
satélites visibles en todo momento.
Cada uno de estos satélites conoce la hora exacta y cuando un dispositivo les envía
un mensaje en base a la diferencia de tiempo entre el que envia y recibe se puede
calcular el espacio, al saber a qué distancia la persona se encuentra de los 3 satélites
el dispositivo puede triangular fácilmente su posición como se puede observar en la
Figura #17.
23
3. MARCO METODOLÓGICO
3.1. Descripción General
En la Figura #18 se aprecia el diagrama general del sistema en donde consta como
parte principal del prototipo la interconexión entre la Raspberry PI y el Arduino, donde
a su vez el arduino lleva conectado un sistema GPS que arrojará la ubicación actual
del transporte.
Todo este sistema podrá ser accedido por medio de los dispositivos móviles a través
de un servidor web.
24
Figura #19 - Diagrama de bloque del sistema
El módulo GPS Figura #20 es un modelo GY-GPS6MV2, el cual viene equipado con
una Placa de Circuito Impreso, provista de conectores para la alimentación y
transmisión de datos.
El chip EEPROM que permite guardar los datos de configuración cuando se apaga
el GPS, indicadores LED de señal y una antena de cerámica.
Este modelo a su vez contiene pines o conectores que pueden ser utilizados para la
conexión de algún tipo de microcontrolador por medio de una interfaz serial.
25
Figura #21 - Pruebas de funcionamiento del GPS en prototipo
Dentro del sistema, mediante el GPS se permitirá obtener parámetros tales como la
velocidad y la posición actual del transporte por medio del posicionamiento del
satélite, los cuales se irán guardando para un posterior envió, para esto el GPS
estará interconectado con el arduino para la lectura de los datos que el GPS estará
enviando. A continuación, la Figura #22 detalla la conexión del GPS con el arduino.
• El pin 3.3V del Arduino UNO será conectado al pin Vcc del módulo GPS.
26
• El pin GND del Arduino UNO será conectado al pin GND del módulo GPS.
• El pin digital 4 del Arduino UNO será conectado al pin Tx del módulo GPS.
• EL pin digital 3 del Arduino UNO será conectado al pin Rx del módulo GPS.
Debido a las imprecisiones propias del GPS, ya que su rango de exactitud puede
llegar a metros, es necesario que las paradas tengan un rango, es decir no son un
punto exacto en el mapa, en su lugar es un área circular de un radio determinado.
EL sistema debe capturar de forma automática fotos siempre que la puerta esté
abierta, es decir cuando el sensor de las puertas detecte que las puertas estén
abiertas independientemente de si el conductor del bus las abrió o no, se tomará una
ráfaga de fotos con la cámara de la Raspberry Pi que se puede observar en la Figura
#24.
27
Figura #24 - Cámara de la Raspberry Pi (Amazon)
En la Figura #26 se puede apreciar una foto del interior del bus de transporte urbano,
la foto fue tomada con la cámara de la Raspberry Pi.
28
Figura #26 - Foto del interior del bus de transporte urbano
29
En la tabla se almacenarán tanto longitud como latitud de las paradas donde el bus
podrá abrir sus puertas, cada una de estas paradas tendrá un nombre y junto con
ellas se guardarán ciertos campos de auditorías más como las fechas de creación,
edición y eliminación de la parada.
Además de las paradas permitidas se debe tener una tabla para almacenar los
usuarios con acceso a la aplicación, el formato de la tabla se describe en la Tabla 2
- Tabla de usuarios.
Para poder agregar y eliminar las paradas permitidas es necesario que exista una
base de datos donde se almacenen las mismas, por este motivo se utilizó MySQL es
el gestor del data que almacenará todos los registros.
Pero para que los usuarios finales puedan agregar, editar y eliminar paradas es
necesario disponer de alguna interfaz, para este fin se optó por utilizar una interfaz
web.
Como las únicas ubicaciones donde el bus podrá abrir sus puertas están definidas
en la data es importante que no cualquiera pueda modificar dichas paradas, por eso
para poder acceder a la interfaz de administración de las paradas es necesario pasar
primero por un inicio de sesión como seobserva en la Figura #27 - Interfaz de inicio
de sesión.
30
Figura #27 - Interfaz de inicio de sesión
Esta interfaz pedirá los datos al usuario administrador y validará si este tiene acceso
o no las paradas.
31
Figura #29 - Interfaz de administración
Esta interfaz es una interfaz web, lo que significa que puede verse desde cualquier
dispositivo el cual tenga instalado un navegador web, esto incluye teléfonoo
celulares, tablets e incluso cualquier dispositivo inteligente como televisores y hasta
relojes, sin que el desarrollador de un soporte especial.
32
3.6.3. Interfaz de creación de paradas
Una de las principales funcionalidades del sistema es que cualquier usuario que no
tenga experiencia en programación ni en bases de datos, sea capaz de gestionar él
mismo las paradas permitidas del bus.
La lectura de datos consiste en adquirir los datos del usuario mediante la interfaz
web, es decir se muestra un formulario el cual llenará el usuario con la información
necesaria para crear una nueva parada tal como se ve en la Figura #32, este
formulario recogerá los datos y los enviará a la siguiente fase de validación
33
Una vez los datos sean correctamente validados estos serán almacenados en la
base de datos previamente definida y se desplegará un mensaje de afirmacion de
los datos como se puede observar en la Figura #33.
Cuando hay una estación en la que el bus ya no pueda detenerse tanto por cambios
de recorrido como por reducción de paradas, estas paradas deben ser eliminadas de
la aplicación para que el sistema bloquee la apertura de las puertas.
Para eso cada parada dispone de un botón de eliminar el cual al darle clic mostrará
un mensaje de confirmación como se observa en la Figura #34, para evitar que se
borren paradas por clics accidentales.
En la Figura #35 se puede apreciar cómo se solicita la nueva contraseña dos veces
con el fin de validar que se la haya escrito correctamente antes de aplicar el cambio,
cabe resaltar que esta interfaz para el cambio de contraseña solo está disponible
34
para usuarios autenticados en la aplicación, es decir se debe haber iniciado sesión
previamente para poder cambiar la contraseña de la sesión actual.
El sistema se basa en que la Raspberry Pi funcione como servidor web para que
cualquier pueda conectarse a ella, para eso se instaló el software apache, el cual es
el servidor web más usado del mundo.
Se desea generar una página diferente en base a los datos que están almacenados
en el gestor de bases de datos, para eso es necesario que con la petición web se
ejecute un código PHP el cual se conecte a la base de datos y genere una respuesta
dinámica como se observa en la Figura #37.
35
Figura #37 - Generación de contenido dinámico
La petición viaja desde el cliente hasta el servidor web (apache) el cual delega PHP
el manejo de la misma, PHP consulta en la data MySQL para determinar que
contenido se debe mostrar en la página web y genera una página HTML
personalizada para cada consulta.
En la Figura #38 se observa el diagrama de bloques del servidor web que está
configurado en la Raspbery Pi.
36
3.8. Supervisión remota
Para llevar un mejor control de los buses, se creó un sistema de supervisión remota,
que consiste un sitio web el cual muestra la posición del bus dentro del mapa,
mediante una interfaz web.
La interfaz web permitirá ver la ubicación en tiempo real del bus, así como su
velocidad, esta interfaz solamente mostrará un mapa para poder visualizar los datos,
para esto se utilizó lo servicios de Google Maps, como se puede observa en la Figura
#39.
37
4. ANÁLISIS DE RESULTADOS
En el presente proyecto de titulación se propuso como objetivo el diseño de un
sistema de control basado en geolocalización que se integre con el sistema de
transporte actual para evitar que estos abran y cierren las puertas en zonas no
autorizadas disminuyendo la congestión vehicular, los resultados obtenidos de la
elaboración del proyecto se detallan acontinuación.
Para poder determinar la posición del carro en todo momento, es preciso adecuar un
dispositivo GPS el cual entregará la información al Arduino Nano el cual procesará y
validará realizando varias peticiones de geolocalización para poder descartar las
peticiones erróneas reduciendo el margen de error del sistema de geolocalización.
38
Figura #41 - Interfaz de gestión de paradas
39
Figura #43 - Cilindro neumático para control de puertas
Adicional el sistema cuenta con una cámara para la captura de fotos del interior del
vehículo cuando las puertas se abra.
Es importante que la antena esté lo más expuesta al exterior que sea posible con el
fin de mejorar su sensibilidad y ubicarla en el interior del carro podría llegar a suponer
problemas de precisión con la lectura del GPS.
40
El sistema dispone también de una cámara como la que se ve en la Figura #45
mediante la cual se tomará fotos del interior del automóvil cada vez que se abren las
puertas, sin importar si el automóvil se encuentra o no en una parada permitida, esto
agraga una capa de seguridad al sistema de bloqueo de paradas.
41
Figura #46 - Instalación del sistema
42
Figura #48.
El sistema dispone de dos botones manuales para poder abrir y cerrar las puertas en
caso de emergencias, ya que en caso de alguna avería en la Raspberry Pi o de
alguno de sus componentes como por ejemplo error en la placa de GPS, el sistema
al no ser capaz de detectar correctamente las coordenadas bloqueará las puertas,
pero este sistema manual evitará que se produzcan situaciones donde las personas
quedan atrapadas en el interior del vehículo.
43
Figura #50 - Controles manuales para emergencias
El sistema leerá los datos del GPS y si se encuentra en una de las paradas
previamente establecidas se desbloquearán las puertas, caso contrario se
bloquearán las puertas para que se pueda entrar o salir del automóvil fuera de
lasparadas establecidas, tal cual se ve en la Figura #51.
Para identidificar si se encuentra en una parada se debe recorrer todas las paradas
existentes y comaprar los valores de latotud y longitud, para esto se diseño el
algoritmo de la Figura #52, el cual recorre todas las paradas existentes en la base de
datos y una por una compara la latitud y la longitud de las mismas para poder
determinar si se encuentra o no en esa parada.
44
Figura #52 - Algoritmo de busqueda de paradas
45
Figura #54 - Algoritmo de gestión de memoria en disco duro
46
CONCLUSIONES
Se hizo evidente el gran alcance del que dispone el arduino ya que mediante una
placa de GPS se puede geolocalizar el bus en cualquier parte del mundo.
Se logró verificar el sistema de control que permite la apertura y cierre de las puertas
desde la Raspberry mediante una electroválvula.
47
RECOMENDACIONES
Se debe ubicar el dispositivo en un área donde tenga la temperatura adecuada para
poder operar.
Se recomienda usar una batería externa para el dispositivo ya que esto asegurará
que siempre tengamos la ubicación del bus aun cuando el bus esté apagado o la
batería se haya agotado.
Para poder lograr una mayor precisión del GPS es necesario que este esté lo más
cerca posible del exterior del vehículo, para evitar retrasos o pérdidas de datos.
No se deben exponer los equipos al agua ni al sol de forma directa ya que estos
pueden degradar y dañar de forma permanente los equipos.
El interior del bus debe tener una correcta iluminación para asegurar fotos de buena
calidad cada vez que se abren las puertas.
Para el acceso a internet del dispositivo se recomienda usar la conexión vía modem
ya que es la que asegura una mejor disponibilidad.
48
BIBLIOGRAFÍA
B. Navya Rupa, G. K.-h. (2015). Test Report Generation Using JSON. International
Journal of Software Engineering and Its Applications.
49
Chávez, & Yuquilema. (2013). Aplicaciones con minicomputadores raspberry pi
provisto de módulo gps y acelerómetro para control de velocidad y posicionamiento.
El Telégrafo . (2017).
50
Kilicdagi, A. (2014). Laravel Design Patterns and Best Practices.
Mishra, A. (2014). Critical Comparison Of PHP And [Link] For Web Development.
INTERNATIONAL JOURNAL OF SCIENTIFIC & TECHNOLOGY RESEARCH
VOLUME 3,. Obtenido de [Link]
[Link]
Molloy, D. (2016). Exploring Raspberry Pi: Interfacing to the Real World with
Embedded Linux. Obtenido de
[Link]
Monk, S. (2012). Programming the Raspberry Pi: Getting Started with Python.
Mulloy, B. (2012). Web API Design, Crafting Interfaces that Developers Love. apigee.
Oracle. (2011). PHP Scalability and High Availability Database Resident Connection
Pooling and Fast Application Notification.
Purdum, J. J. (2012). Beginning C for Arduino: Learn C Programming for the Arduino.
Sepulcre, M., Mittag, J., Santi, P., Hartenstein, H., & Gozalvez, J. (2011). Congestion
and awareness control in cooperative vehicular systems. Proceedings of the IEEE,
1260-1279.
51
Spectator, C. (2016). Comparativa de rendimiento de la red entre distintos
proveedores Cloud desde diferentes localizaciones geográficas.
52
ANEXOS
PRESUPUESTO
53
CRONOGRAMA DE ACTIVIDADES
54
CÓDIGO FUENTE
#include "U8glib.h"
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#define SpeedLED 13
#define GPSECHO false
#define speeds 60
double lonGPS=0;
double latGPS=0;
boolean usingInterrupt = false;
void useInterrupt(boolean);
void setup()
{
pinMode(SpeedLED, OUTPUT);
[Link](19200);
[Link](9600);
[Link](PMTK_SET_NMEA_OUTPUT_RMCGGA);
[Link](PMTK_SET_NMEA_UPDATE_1HZ);
[Link](PGCMD_ANTENNA);
useInterrupt(true);
delay(1000);
[Link](PMTK_Q_RELEASE);
[Link]("o");
}
SIGNAL(TIMER0_COMPA_vect) {
char c = [Link]();
#ifdef UDR0
if (GPSECHO)
if (c) UDR0 = c;
#endif
}
void useInterrupt(boolean v) {
if (v) {
OCR0A = 0xAF;
55
TIMSK0 |= _BV(OCIE0A);
usingInterrupt = true;
} else {
TIMSK0 &= ~_BV(OCIE0A);
usingInterrupt = false;
}
}
[Link]("{\"state\":\""+String(FIXED)+"\",\"latitude\":\""+String(latGPS,6)+"\",\"
longitude\":\""+String(lonGPS,6)+"\",\"speed\":\""+String([Link]*2,2)+"\"}");
if([Link]*2>=speeds){
digitalWrite(SpeedLED,HIGH);
}else{
digitalWrite(SpeedLED,LOW);
}
}
else
{
[Link]("{\"state\":\""+String(NO_FIX)+"\"}");
}
}
}
if ([Link]()) {
if ())
return;
56
}
En la Raspberry Pi se leerán los datos del puerto serie, entre ellos los datos del GPS,
luego consultará las posiciones registradas en la base de datos y validará si la puerta
se debe o no abrir.
print("entra")
ledBlanco = [Link](26)
ledAzul = [Link](27)
ledMulti = [Link](22)
dist = 0.0003
latArray=[]
lonArray=[]
db=_mysql.connect("localhost","pi","raspberry","control_bus")
[Link]("""SELECT longitude, latitude FROM stations WHERE deleted_at
is Null""")
r=db.store_result()
for x in range(0,r.num_rows()):
query=r.fetch_row()[0]
[Link](float(query[1]))
[Link](float(query[0]))
[Link]()
while True:
try:
estadoSerial=False
57
arraySerial=['/dev/ttyUSB0','/dev/ttyUSB2','/dev/ttyUSB1']
while estadoSerial==False:
for serial in arraySerial:
try:
arduino = Serial(serial,19200)
estadoSerial=True
break
except SerialException as error:
print(error)
[Link]()
[Link]()
while True:
estdoLed = False
[Link]('y')
serial_data=[Link]('{','}')
json=json_decoder(serial_data)
if json['state']=='0x02':
print("ok")
[Link]()
latGPS = float(json['latitude'])
lonGPS = float(json['longitude'])
speed = float(json['speed'])
url='[Link]
ude={longitude}&speed={speed}'.format(latitude=latGPS,longitude=lonGPS,spee
d=speed)
response=[Link](url)
for x in range(0,len(latArray)):
lat=latArray[x]
lon=lonArray[x]
58
[Link]()
except Exception as error:
[Link]()
[Link]()
[Link]()
print(error)
TOMAR FOTOS
Mientras la puerta esté abierta se deben tomar fotos del interior del bus, para eso
necesario leer el estado del sensor de la puerta y si este indica que la puerta está
abierta tomar una ráfaga de fotos.
import gpiozero
import os
from picamera import PiCamera
ledAmarillo = [Link](17)
buttonSystem = [Link](6)
buttonPhoto = [Link](5)
frame = 1
camera = PiCamera()
while True:
if buttonSystem.is_pressed==True:
[Link]('sudo shutdown -h now')
try:
if buttonPhoto.is_pressed==True:
print("entra")
[Link]()
if frame==1:
f=[Link]("sudo TZ=America/Guayaquil date +%F_%H-%M-
%S")
now=[Link]()
now=now[0:-1]
[Link]("sudo mkdir /var/www/html/photo/"+now)
[Link]("sudo chmod 777 /var/www/html/photo/"+now)
[Link]=(2592,1944)
[Link]('/var/www/html/photo/'+now+'/%[Link]' %
frame,resize=(1280,720))
frame+=1
print("sale")
else:
[Link]()
frame=1
except Exception as error:
59
print(error)
<?php
namespace App\Http\Controllers;
use App\Libraries\Redirector\Redirector;
use App\Libraries\Tools\Paginator;
use App\Station;
use App\User;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\Auth;
function showLogin(){
return view('login', [
]);
}
function isLogin(Request $request){
$loginData=$request->only(['email','password']);
if(!Auth::attempt($loginData))
{
return Redirector::error('Credenciales inválidas',['No existe un
usuario con los datos ingresados']);
}
return redirect('/viewStation');
}
function isLogout()
{
Auth::logout();
return redirect('/');
}
function viewStation(){
$stations = Station::orderBy('created_at','desc')->paginate(24);
60
return view('stations', [
'stations' => $stations,
]);
}
function createStation(Request $request){
try{
$station=new Station();
$station->name=$request->name;
$station->latitude=$request->latitude;
$station->longitude=$request->longitude;
$station->save();
return Redirector::success('Estación creada',['La
estación fue creada correctamente']);
}catch (QueryException $e){
return Redirector::warning('No se pudo crear la estación',[$e-
>getMessage()]);
}
}
function editStation(Request $request)
{
try{
$station=Station::find($request->station_id);
$station->name=$request->name;
$station->latitude=$request->latitude;
$station->longitude=$request->longitude;
$station->save();
return Redirector::primary('Estación actualizada',['La estación fue
actualizada correctamente']);
}catch (QueryException $e){
return Redirector::warning('No se pudo editar la estación',[$e-
>getMessage()]);
}
}
function deleteStation(Request $request){
try{
$station=Station::find($request->station_id);
$station->delete();
return Redirector::error('Estación eliminada',['La estación fue
eliminada correctamente']);
}catch (QueryException $e){
return Redirector::warning('No se pudo eliminar la estación',[$e-
>getMessage()]);
}
}
function viewVideos(){
$handleCarpetas = opendir('photo/');
61
$carpetas=array();
$photos=array();
$arrayPhotos=array();
while (false !== ($carpeta = readdir($handleCarpetas))) {
if ($carpeta!= "." && $carpeta!= "..") {
$carpetas[] = $carpeta;
}
}
closedir($handleCarpetas);
rsort($carpetas);
foreach($carpetas as $carpeta){
unset($photos);
$photos=array();
$handlePhoto = opendir('photo/'.$carpeta.'/');
while (false !== ($carpeta = readdir($handlePhoto)))
{
if ($carpeta!= "." && $carpeta!= "..") {
$photos[] = $carpeta;
}
}
sort($photos);
$arrayPhotos[] = $photos;
closedir($handlePhoto);
}
$carpetas=Paginator::paginate($carpetas,12,'/viewVideos');
return view('videos', [
'carpetas' => $carpetas,
'photos'=>$arrayPhotos
]);
}
function viewPhoto($carpeta,$foto){
$path=public_path().'/../photo/'.$carpeta.'/'.$foto;
return \Response::make(file_get_contents($path),200,[
'Content-Type'=>'application',
'Content-Disposition'=>'inline;filename="'.$path.'"'
]);
}
function editUser(Request $request){
if(strcmp($request->pass,$request->passRepeat)===0){
try{
$id=Auth::id();
$user=User::find($id);
$user->password=bcrypt($request->pass);
$user->save();
return Redirector::success('Datos
actualizados',['Los datos fueron actualizados correctamente']);
}catch (QueryException $e){
62
return Redirector::warning('No se pudo
actualizar los datos',[$e->getMessage()]);
}
}else{
return Redirector::warning('No coincidencia',['No son
iguales las contraseñas ingresadas']);
}
}
}
RUTAS DE LA APLICACIÓN
Las rutas son los puntos de acceso de todas las aplicaciones web, estas definen
como se puede acceder a las funcionalidades que ofrece la aplicación.
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get(__('[Link]'),'Controller@isLogout');
Route::get(__('[Link]'),'Controller@viewStation');
Route::get(__('[Link]'),'Controller@viewVideos');
Route::post(__('[Link]'),'Controller@createStation');
Route::post(__('[Link]'),'Controller@editStation');
Route::post(__('[Link]'),'Controller@deleteStation');
Route::post(__('[Link]'),'Controller@editUser');
63
Route::get(__('[Link]',['carpeta'=>'{carpeta}','foto'=>'{foto}']),'Controller@vi
ewPhoto');
});
Los datos de las paradas deben ser almacenadas de forma permanente, para luego
poder ser consultadas y permitir o no abrir las puertas, por eso es necesario
almacenar la latitud y la longitud, así como un nombre para cada una de las paradas
permitidas.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('stations');
64
}
}
VISTAS DE LA APLICACIÓN
Para que el usuario final pueda acceder de forma sencilla a la aplicación esta debe
tener una interfaz de usaurio, para el caso actual hemos creado una interfaz web.
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Login</div>
<div class="panel-body">
<form class="form-horizontal" method="POST" action="{{
route('login') }}">
{{ csrf_field() }}
<div class="col-md-6">
<input id="email" type="email" class="form-control"
name="email" value="{{ old('email') }}" required autofocus>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
<div class="col-md-6">
65
<input id="password" type="password" class="form-
control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<div class="checkbox">
<label>
<input type="checkbox" name="remember" {{
old('remember') ? 'checked' : '' }}> Remember Me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-8 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Login
</button>
@extends('[Link]')
66
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Register</div>
<div class="panel-body">
<form class="form-horizontal" method="POST" action="{{
route('register') }}">
{{ csrf_field() }}
<div class="col-md-6">
<input id="name" type="text" class="form-control"
name="name" value="{{ old('name') }}" required autofocus>
@if ($errors->has('name'))
<span class="help-block">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
</div>
<div class="col-md-6">
<input id="email" type="email" class="form-control"
name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
</div>
</div>
67
<div class="form-group{{ $errors->has('password') ? ' has-
error' : '' }}">
<label for="password" class="col-md-4 control-
label">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-
control" name="password" required>
@if ($errors->has('password'))
<span class="help-block">
<strong>{{ $errors->first('password') }}</strong>
</span>
@endif
</div>
</div>
<div class="form-group">
<label for="password-confirm" class="col-md-4 control-
label">Confirm Password</label>
<div class="col-md-6">
<input id="password-confirm" type="password"
class="form-control" name="password_confirmation" required>
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary">
Register
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
68
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
69
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-
toggle="dropdown" role="button" aria-expanded="false">
{{ Auth::user()->name }} <span
class="caret"></span>
</a>
@yield('content')
</div>
@component('[Link]')
70
<nav class="navbar navbar-expand-sm bg-dark navbar-dark sticky-top">
<a class="navbar-brand" href="#">Control Bus</a>
<div class="container-fluid">
<button type="button" class="btn btn-success" data-toggle="modal"
data-target="#myModal">Crear Parada</button>
<button type="button" class="btn btn-primary" data-toggle="modal"
data-target="#myModalChange">Cambiar Credenciales</button>
<a class="btn btn-dark" href="{{__('[Link]')}}">Fotos</a>
</div>
{{csrf_field()}}
<div class="form-group">
<label for="name">Nombre</label>
<input type="text" class="form-control" id="name"
name="name" required>
</div>
<div class="form-group">
<label for="latitude">Latitud</label>
<input type="number" class="form-control"
id="latitude" name="latitude" step="any" max=9999 min=-9999 required>
</div>
71
<div class="form-group">
<label for="longitude">Longitud</label>
<input type="number" class="form-control"
id="longitude" name="longitude" step="any" max=9999 min=-9999 required>
</div>
</div>
</form>
</div>
</div>
</div>
{{csrf_field()}}
<div class="form-group">
<label for="pass">Nueva Contraseña</label>
<input type="password" class="form-control" id="pass"
name="pass" required>
</div>
<div class="form-group">
<label for="passRepeat">Repetir Nueva
Contraseña</label>
72
<input type="password" class="form-control"
id="passRepeat" name="passRepeat" required>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="container-fluid"><br>
<div class="row">
@foreach ($stations as $station)
73
<div class="modal-dialog modal-lg">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h4 class="modal-title">Eliminar Parada</h4>
<button type="button" class="close" data-
dismiss="modal">×</button>
</div>
<form action="{{__('[Link]')}}" method="post">
{{csrf_field()}}
<input type="hidden" class="form-control"
id="station_id" name="station_id" value="{{$station->id}}" required>
<!-- Modal footer -->
<div class="modal-footer">
<button type="submit" class="btn btn-
danger">Eliminar</button>
</div>
</form>
</div>
</div>
</div>
74
<input type="number" class="form-control"
id="latitude" name="latitude" value="{{$station->latitude}}" step="any" max=9999
min=-9999 required>
</div>
<div class="form-group">
<label for="longitude">Longitud</label>
<input type="number" class="form-control"
id="longitude" name="longitude" value="{{$station->longitude}}" step="any"
max=9999 min=-9999 required>
</div>
</div>
<!-- Modal footer -->
<div class="modal-footer">
<button type="submit" class="btn btn-
primary">Editar</button>
<!--<button type="button" class="btn btn-secondary"
data-dismiss="modal">Cerrar</button>-->
</div>
</form>
</div>
</div>
</div>
@endforeach
</div>
</div><br>
<div class="row">
<div class="mx-auto">
{{$stations->links()}}
</div>
</div><br>
@endcomponent
<?php
/*
|--------------------------------------------------------------------------
75
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/','SpaController@index');
Route::get('/api/locations/create','Api\LocationsController@create');
Route::get('/api/locations/last','Api\LocationsController@last');
<template lang="pug">
.full-page(v-bind:id='id')
</template>
<script>
import Format from '../tools/Format'
export default {
props: {
id: {
required: true,
type: String
},
latitude: {
required: true,
type: Number
},
longitude: {
required: true,
type: Number
},
speed: {
required: true,
type: Number
}
},
data(){
return{
position:null,
map:null,
marker:null
}
76
},
watch:{
latitude(){
[Link]()
},
longitude(){
[Link]()
}
},
mounted(){
[Link]()
},
methods:{
drawMap(){
const canvas=[Link]([Link])
[Link]=new
[Link]([Link],[Link])
const mapOptions={
center:[Link],
zoom:18
}
[Link]=new [Link](canvas,mapOptions)
},
drawMarker(){
[Link]=new
[Link]([Link],[Link])
if([Link]!=null){
[Link](null)
}
const markerOptions={
position:[Link]
}
[Link]=new [Link](markerOptions)
[Link]([Link])
77
VISTA PRINCIPAL DE LA APLICACIÓN
<!doctype html>
<html lang="{{app()->getLocale()}}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="csrf-token" content="{{csrf_token()}}">
<meta name="viewport" content="width=device-width, initial-
scale=1">
<title>
GPS Bus
</title>
<link type="text/css" rel="stylesheet" href="{{mix('css/[Link]')}}">
<script
src="[Link]
0iwfoHPAjF_zxtLv8"></script>
</head>
<body>
<div id="app">
<app/>
</div>
<script src="{{mix('js/[Link]')}}"></script>
</body>
</html>
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
78
$table->float('longitude',10,7);
$table->float('speed');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('locations');
}
}
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Location;
79