Wearlive

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

Un comentario

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *