{"id":178,"date":"2021-12-12T20:31:00","date_gmt":"2021-12-12T19:31:00","guid":{"rendered":"https:\/\/www.davidestebanmunoz.com\/?p=178"},"modified":"2023-11-01T18:45:07","modified_gmt":"2023-11-01T17:45:07","slug":"wearlive-2","status":"publish","type":"post","link":"https:\/\/www.davidestebanmunoz.com\/?p=178&lang=es","title":{"rendered":"Wearlive"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.davidestebanmunoz.com\/?p=153\">This article can be read in english here<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wearlive es acesible en <a href=\"https:\/\/wearlive.davidestebanmunoz.com\">https:\/\/wearlive.davidestebanmunoz.com<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wearlive est\u00e1 dividido en dos partes diferentes, una aplicaci\u00f3n Android Wear y un servicio web. Ambas han sido desarrolladas al 100% por mi .<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wearlive Android Wear app <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wearlive es una app nativa android, desarrollada para android wear en Java utilizando Android Studio como IDE.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"367\" height=\"352\" src=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen.png\" alt=\"\" class=\"wp-image-154\" srcset=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen.png 367w, https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen-300x288.png 300w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cada 5 segundos, recibe la ubicaci\u00f3n GPS desde el sistema Android y la manda al servidor wearlive.tk mediante paquetes UDP. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de empezar a utilizarla, debemos registrar el numero de serie de nuestro reloj Android Watch en  <a href=\"https:\/\/wearlive.davidestebanmunoz.com\">https:\/\/wearlive.davidestebanmunoz.com<\/a> .<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Con el objetivo de guardar la privacidad de sus usuarios, se permite proteger los tracks mediante una contrase\u00f1a, en ese caso, habr\u00e1 que activar el switch \u00abProtect\u00bb antes de darle a Start tracking<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez que hemos registrado el n\u00famero de serie, simplemente pulsamos sobre el switch de \u00abStart tracking\u00bb y podemos empezar con nuestra actividad, la app lanzar\u00e1 un servicio de background que enviar\u00e1 nuestra ubicaci\u00f3n cada 5 segundos. La propia aplicaci\u00f3n muestra cuando est\u00e1 realizando el live tracking y cuando Android ha conseguido una ubicaci\u00f3n GPS correcta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las caracter\u00edsticas especiales de esta app, es que va a funcionar aunque el APN de nuestro operador movil no est\u00e9 correctamente configurado. El motivo de esto es que en abril de 2021, Movistar decidi\u00f3 desactivar el proxy HTTP y dado que Android Wear no permite modificar los APN , esto hace imposible establecer una comunicaci\u00f3n HTTP desde nuestro reloj.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al utilizar el protocolo UDP sin otras capas por encima, bypaseamos esta limitaci\u00f3n , asimismo gracias a que UDP es un protocolo no orientado a conexi\u00f3n, se reduce el gasto de bater\u00eda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizando un Xiaomi Mi Watch, esta aplicaci\u00f3n ha consumido un 38% de bater\u00eda para 10Km y 56 minutos de actividad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Servidor Web Wearlive<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El servidor web de Wearlive est\u00e1 formado utilizando diferentes tecnolog\u00edas y contenedores dockers:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"282\" src=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/wearlive_server.png\" alt=\"\" class=\"wp-image-155\" srcset=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/wearlive_server.png 612w, https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/wearlive_server-300x138.png 300w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">El stack azul es el mismo que vimos anteriormente en otros posts y su explicaci\u00f3n se puede ver <a href=\"https:\/\/www.davidestebanmunoz.com\/?p=105&amp;lang=es\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00f3n es v\u00e1lida y el numero de serie del dispositivo android ha sido registrado, introducir\u00e1 la posici\u00f3n GPS en la MariaDB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La receta de docker-compose del stack verde se puede ver aqui:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nversion: '3'\nservices:\n    db_wearlivetk:\n        image: mariadb:10.5\n        container_name: db_wearlivetk\n        restart: unless-stopped\n        env_file: .env\n        environment:\n            - MYSQL_DATABASE=$WEARLIVE_MYSQL_DATABASE\n            - MYSQL_USER=$WEARLIVE_MYSQL_USER\n            - MYSQL_PASSWORD=$WEARLIVE_MYSQL_PASSWORD\n            - MYSQL_ROOT_PASSWORD=$WEARLIVE_MYSQL_ROOT_PASSWORD\n        volumes:\n            - \"\/home\/ubuntu\/dockers\/wearlive\/data\/db\/:\/var\/lib\/mysql\"\n        #command: '--default-authentication-plugin=mysql_native_password'\n        networks:\n          - david\n    webwearlive:\n        container_name: webwearlive\n        depends_on:\n          - db_wearlivetk\n        build:\n            dockerfile: Dockerfile_php\n        image: php7-fpm_mysqli\n        volumes:\n            - \"\/home\/ubuntu\/dockers\/wearlive\/data\/html:\/var\/www\/html\"\n        env_file: .env\n        environment:\n          - DB_HOST=db_wearlivetk:3306\n          - DB_USER=$WEARLIVE_MYSQL_USER\n          - DB_PASSWORD=$WEARLIVE_MYSQL_PASSWORD\n          - DB_NAME=$WEARLIVE_MYSQL_DATABASE\n        networks:\n          - david\n          \n    wearlive_receiver:\n        depends_on:\n          - db_wearlivetk\n        build:\n            dockerfile: Dockerfile_wearlive_receiver\n        image: wearlive_receiver:0.0.1\n        container_name: wearlive_receiver\n        restart: unless-stopped\n        env_file: .env\n        environment:\n          - DB_HOST=db_wearlivetk\n          - DB_USER=$WEARLIVE_MYSQL_USER\n          - DB_PASSWORD=$WEARLIVE_MYSQL_PASSWORD\n          - DB_NAME=$WEARLIVE_MYSQL_DATABASE\n        volumes:\n            - \"\/home\/ubuntu\/dockers\/wearlive\/data\/receiver:\/code\/\"\n        networks:\n          - david\n        command: python \/code\/udp_server.py\n        ports:\n            - 20002:20002\/udp\n    \n\n    wearlive_nginx:\n        image: nginx\n        depends_on:\n          - webwearlive\n        container_name: wearlive_nginx\n        networks:\n          - proxy_nginx-proxy\n          - david\n        environment:\n            - VIRTUAL_HOST=wearlive.davidestebanmunoz.com\n            - LETSENCRYPT_HOST=wearlive.davidestebanmunoz.com\n        volumes:\n            - \"\/home\/ubuntu\/dockers\/wearlive\/data\/nginx\/etc_nginx:\/etc\/nginx\"\n            - \"\/home\/ubuntu\/dockers\/wearlive\/data\/html:\/var\/www\/html\"\n            \n    phpmyadmin:\n        image: arm64v8\/phpmyadmin\n        container_name: phpmyadmin\n        depends_on:\n          - db_wearlivetk\n        links:\n          - db_wearlivetk:db\n        networks:\n          - david\n        environment:\n          PMA_HOST: db_wearlivetk\n          PMA_PORT: 3306\n          PMA_ARBITRARY: 1\n          MYSQL_ROOT_PASSWORD: $WEARLIVE_MYSQL_ROOT_PASSWORD\n        restart: always\n        ports:\n          - 8081:80\nnetworks:\n    david:\n    proxy_nginx-proxy:\n        external: true            \n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM php:7-fpm\nRUN docker-php-ext-install mysqli\nRUN docker-php-ext-enable mysqli<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM python:3.8-slim\nRUN pip install pymysql<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El servidor Wearlive est\u00e1 basado en c\u00f3digo PHP, Javascript y HTML. Mediante el uso de procedimientos AJAX, y basandose en OpenStreetMaps, la ubicaci\u00f3n se lee mediante PHP de la BD y se dibuja sobre una capa de mapa.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"956\" height=\"756\" src=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/mapa.png\" alt=\"\" class=\"wp-image-156\" srcset=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/mapa.png 956w, https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/mapa-300x237.png 300w, https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/mapa-768x607.png 768w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En el caso de que el usuario haya elegido proteger sus tracks con una contrase\u00f1a, esta es preguntada antes de mostrar cualquier ubicaci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"146\" src=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen-1.png\" alt=\"\" class=\"wp-image-157\" srcset=\"https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen-1.png 519w, https:\/\/www.davidestebanmunoz.com\/wp-content\/uploads\/2021\/12\/imagen-1-300x84.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tipo: App Android + Servicio Web<\/li>\n\n\n\n<li>Ubicaci\u00f3n: App Android en smartwatch + Contenedores Docker en VPS<\/li>\n\n\n\n<li>Lenguajes y tecnolog\u00edas utilizados: Java, GPS, UDP, Python, SQL, PHP, HTML, Javascript<\/li>\n\n\n\n<li>Repositorio Github: No<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/www.davidestebanmunoz.com\/?p=178&#038;lang=es\">Read More<span class=\"screen-reader-text\">Wearlive<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21],"tags":[63,25,71,61,65,75,67,69,73],"class_list":["post-178","post","type-post","status-publish","format-standard","hentry","category-proyectos-personales","tag-android-es","tag-docker","tag-html-es","tag-java-es","tag-javascript-es","tag-php-es","tag-python-es","tag-sql-es","tag-udp-es","excerpt"],"_links":{"self":[{"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/posts\/178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=178"}],"version-history":[{"count":6,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions"}],"predecessor-version":[{"id":287,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=\/wp\/v2\/posts\/178\/revisions\/287"}],"wp:attachment":[{"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davidestebanmunoz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}