This article can be read in english here
Wearlive es acesible en https://wearlive.davidestebanmunoz.com
Wearlive está dividido en dos partes diferentes, una aplicación Android Wear y un servicio web. Ambas han sido desarrolladas al 100% por mi .
Wearlive Android Wear app
Wearlive es una app nativa android, desarrollada para android wear en Java utilizando Android Studio como IDE.
Cada 5 segundos, recibe la ubicación GPS desde el sistema Android y la manda al servidor wearlive.tk mediante paquetes UDP.
Su utilidad se maximiza si tenemos un smartwatch con e-sim ya que permite hacer seguimiento online de un reloj, sin necesidad de portar el smartphone con nosotros.
Antes de empezar a utilizarla, debemos registrar el numero de serie de nuestro reloj Android Watch en https://wearlive.davidestebanmunoz.com .
Con el objetivo de guardar la privacidad de sus usuarios, se permite proteger los tracks mediante una contraseña, en ese caso, habrá que activar el switch «Protect» antes de darle a Start tracking
Una vez que hemos registrado el número de serie, simplemente pulsamos sobre el switch de «Start tracking» y podemos empezar con nuestra actividad, la app lanzará un servicio de background que enviará nuestra ubicación cada 5 segundos. La propia aplicación muestra cuando está realizando el live tracking y cuando Android ha conseguido una ubicación GPS correcta.
Una de las características especiales de esta app, es que va a funcionar aunque el APN de nuestro operador movil no esté correctamente configurado. El motivo de esto es que en abril de 2021, Movistar decidió desactivar el proxy HTTP y dado que Android Wear no permite modificar los APN , esto hace imposible establecer una comunicación HTTP desde nuestro reloj.
Al utilizar el protocolo UDP sin otras capas por encima, bypaseamos esta limitación , asimismo gracias a que UDP es un protocolo no orientado a conexión, se reduce el gasto de batería.
Utilizando un Xiaomi Mi Watch, esta aplicación ha consumido un 38% de batería para 10Km y 56 minutos de actividad.
Servidor Web Wearlive
El servidor web de Wearlive está formado utilizando diferentes tecnologías y contenedores dockers:
El stack azul es el mismo que vimos anteriormente en otros posts y su explicación se puede ver aquí.
El stack verde, tiene un NGINX para servidor web, un docker PHP para obtener las ubicaciones GPS desde la base de datos MariaDB asi como para registrar los usuarios. El contenedor de Python recibe paquetes UDP en el puerto 20002 y si su información es válida y el numero de serie del dispositivo android ha sido registrado, introducirá la posición GPS en la MariaDB.
La receta de docker-compose del stack verde se puede ver aqui:
version: '3'
services:
db_wearlivetk:
image: mariadb:10.5
container_name: db_wearlivetk
restart: unless-stopped
env_file: .env
environment:
- MYSQL_DATABASE=$WEARLIVE_MYSQL_DATABASE
- MYSQL_USER=$WEARLIVE_MYSQL_USER
- MYSQL_PASSWORD=$WEARLIVE_MYSQL_PASSWORD
- MYSQL_ROOT_PASSWORD=$WEARLIVE_MYSQL_ROOT_PASSWORD
volumes:
- "/home/ubuntu/dockers/wearlive/data/db/:/var/lib/mysql"
#command: '--default-authentication-plugin=mysql_native_password'
networks:
- david
webwearlive:
container_name: webwearlive
depends_on:
- db_wearlivetk
build:
dockerfile: Dockerfile_php
image: php7-fpm_mysqli
volumes:
- "/home/ubuntu/dockers/wearlive/data/html:/var/www/html"
env_file: .env
environment:
- DB_HOST=db_wearlivetk:3306
- DB_USER=$WEARLIVE_MYSQL_USER
- DB_PASSWORD=$WEARLIVE_MYSQL_PASSWORD
- DB_NAME=$WEARLIVE_MYSQL_DATABASE
networks:
- david
wearlive_receiver:
depends_on:
- db_wearlivetk
build:
dockerfile: Dockerfile_wearlive_receiver
image: wearlive_receiver:0.0.1
container_name: wearlive_receiver
restart: unless-stopped
env_file: .env
environment:
- DB_HOST=db_wearlivetk
- DB_USER=$WEARLIVE_MYSQL_USER
- DB_PASSWORD=$WEARLIVE_MYSQL_PASSWORD
- DB_NAME=$WEARLIVE_MYSQL_DATABASE
volumes:
- "/home/ubuntu/dockers/wearlive/data/receiver:/code/"
networks:
- david
command: python /code/udp_server.py
ports:
- 20002:20002/udp
wearlive_nginx:
image: nginx
depends_on:
- webwearlive
container_name: wearlive_nginx
networks:
- proxy_nginx-proxy
- david
environment:
- VIRTUAL_HOST=wearlive.davidestebanmunoz.com
- LETSENCRYPT_HOST=wearlive.davidestebanmunoz.com
volumes:
- "/home/ubuntu/dockers/wearlive/data/nginx/etc_nginx:/etc/nginx"
- "/home/ubuntu/dockers/wearlive/data/html:/var/www/html"
phpmyadmin:
image: arm64v8/phpmyadmin
container_name: phpmyadmin
depends_on:
- db_wearlivetk
links:
- db_wearlivetk:db
networks:
- david
environment:
PMA_HOST: db_wearlivetk
PMA_PORT: 3306
PMA_ARBITRARY: 1
MYSQL_ROOT_PASSWORD: $WEARLIVE_MYSQL_ROOT_PASSWORD
restart: always
ports:
- 8081:80
networks:
david:
proxy_nginx-proxy:
external: true
Tal y como se puede ver , en este caso se han utilizado dockerfiles para los dockers de PHP (webwearlive) y Python(wearlive_receiver), en ambos casos es para instalar soporte de MySQL.
FROM php:7-fpm
RUN docker-php-ext-install mysqli
RUN docker-php-ext-enable mysqli
FROM python:3.8-slim
RUN pip install pymysql
El servidor Wearlive está basado en código PHP, Javascript y HTML. Mediante el uso de procedimientos AJAX, y basandose en OpenStreetMaps, la ubicación se lee mediante PHP de la BD y se dibuja sobre una capa de mapa.
En el caso de que el usuario haya elegido proteger sus tracks con una contraseña, esta es preguntada antes de mostrar cualquier ubicación.
- Tipo: App Android + Servicio Web
- Ubicación: App Android en smartwatch + Contenedores Docker en VPS
- Lenguajes y tecnologías utilizados: Java, GPS, UDP, Python, SQL, PHP, HTML, Javascript
- Repositorio Github: No
[…] Este artículo se puede leer en castellano aquí […]