Saltearse al contenido

Unidad 7

En unidades anteriores, exploraste cómo conectar un dispositivo físico (micro:bit) a una aplicación web usando Web Serial y también cómo conectar dos ventanas del navegador en tu propio computador usando Node.js y Socket.IO.

Ahora, daremos un paso más allá en la conectividad. Usaremos un dispositivo que llevas contigo a todas partes, tu teléfono celular, como un dispositivo de entrada. Capturaremos los eventos táctiles (touch) en una página web simple en tu celular y enviaremos esa información en tiempo real a una aplicación p5.js, que se ejecutará en el navegador de tu computador.

Para lograr este “puente” entre dispositivos, utilizaremos Node.js y Socket.IO como servidor intermediario, similar a la unidad anterior. Sin embargo, como tu celular y tu computador no estarán (inicialmente) en la misma red local o no podrán “verse” directamente, introduciremos una herramienta poderosa: Microsoft Dev Tunnels (accesible a través de VS Code) para exponer de forma segura nuestro servidor local a Internet.

Set: ¿Qué aprenderás en esta unidad? 💡

Sección titulada «Set: ¿Qué aprenderás en esta unidad? 💡»

Al finalizar esta unidad, serás capaz de:

  • Configurar y utilizar VS Code Port Forwarding (Dev Tunnels) para exponer un servidor Node.js local a Internet de forma segura.
  • Implementar una aplicación cliente en un dispositivo móvil (teléfono) que capture eventos táctiles y los envíe a un servidor Node.js usando Socket.IO.
  • Implementar una aplicación cliente en un computador de escritorio que reciba datos en tiempo real desde el servidor Node.js (originados en el móvil) y los utilice para controlar una visualización p5.js.
  • Utilizar JSON para estructurar y transmitir datos complejos (coordenadas táctiles) entre cliente y servidor.
  • Analizar y comprender el flujo completo de datos: Móvil (Touch) -> Servidor Node.js (vía Dev Tunnel) -> Escritorio (Visualización).
  • Crear tu propia aplicación interactiva que conecte un dispositivo móvil y un computador usando las tecnologías aprendidas.

👣 Pasos:

  1. Prepara el proyecto:
    • Descarga o clona el código del caso de estudio en tu computador. El código está en este repositorio.
    • Abre una terminal en la carpeta raíz del proyecto.
    • Ejecuta npm install para instalar las dependencias (express, socket.io). Haz esto solo la primera vez.
  2. Inicia el servidor local:
    • Abre la carpeta del proyecto en VS Code.
    • Abre una terminal integrada en VS Code (View > Terminal).
    • En la terminal, ejecuta npm start.
    • Deberías ver el mensaje: Server is listening on http://localhost:3000. ¡Pero aún no accedas a esa URL!
  3. Expón el servidor con Dev Tunnels:
    • Selecciona PORTS. Click en Forward a Port (Dev Tunnels).
    • En el número de puerto, selecciona 3000 (¿Por qué este?)
    • En la columna Visibility, selecciona Public. Esto permitirá que el túnel sea accesible desde cualquier lugar.
    • Copia la URL que aparece en la columna Forwarded Address. Esta URL es la que usarás para acceder al servidor desde tu celular.
    • Envía esta URL a tu celular. Se verá algo como https://TU-TENDRAS-UNA-DIFERNTE.use2.devtunnels.ms/.
  4. Accede a las aplicaciones:
    • En tu Computador: abre un navegador web y ve a la URL: http://localhost:3000/desktop/. Deberías ver el canvas de p5.js con un círculo rojo.
    • En tu Celular: abre un navegador web y ve a la URL que enviaste pero añadiendo /mobile/ al final. Algo así como esto: https://TU-TENDRAS-UNA-DIFERNTE.use2.devtunnels.ms//mobile/ (Asegúrate de añadir /mobile/ al final). Deberías ver el canvas de p5.js con el texto “Touch to move the circle”.
  5. Prueba la interacción:
    • Toca y mueve el dedo sobre la pantalla de tu celular.
    • Observa el navegador de tu computador. El círculo rojo debería moverse siguiendo tu dedo.
    • Observa la terminal donde corre server.js. Deberías ver mensajes “New client connected”, “Received message => …”, y “Client disconnected” cuando cierras las pestañas.
  6. Cierra el Port: una vez termines de hacer las pruebas NO OLVIDES CERRAR el puerto.
  7. ¿Si cerraste el puerto?

👣 Pasos: (Explicación conceptual)

  1. El problema de la conexión directa:

    • Cuando ejecutas npm start, el servidor escucha en localhost:3000. localhost (o 127.0.0.1) es una dirección especial que siempre se refiere a tu propia máquina.
    • Si intentaras acceder a http://localhost:3000 desde tu celular, este buscaría un servidor en el propio celular, no en tu computador.
    • Podrías usar la IP local de tu computador (ej. 192.168.1.X), pero esto solo funciona si ambos dispositivos están en la misma red Wi-Fi y no hay firewalls bloqueando. No funcionaría si tu celular usa datos móviles o está en otra red.
    • Necesitamos una dirección pública y accesible desde cualquier lugar.
  2. La solución: VS Code Dev Tunnels (Port Forwarding):

    • Dev Tunnels actúa como un intermediario seguro. Crea un túnel desde una URL pública en Internet (la que obtuviste, como https://TU-TENDRAS-UNA-DIFERNTE.use2.devtunnels.ms/) hasta el puerto 3000 de tu localhost.
    • Cuando tu celular (o cualquier cliente en Internet) se conecta a la URL pública de Dev Tunnels, el servicio de Dev Tunnels reenvía esa conexión de forma segura a través del túnel hasta tu servidor Node.js local.
    • Del mismo modo, las respuestas de tu servidor local viajan de vuelta por el túnel hasta el servicio Dev Tunnels, que las entrega al cliente (celular/escritorio).
    • Analogía: Es como tener un número de teléfono público (la URL de Dev Tunnels) que redirige las llamadas a tu teléfono privado en casa (localhost:3000), sin exponer directamente tu número privado.
  3. Capturando la entrada: eventos táctiles en p5.js (mobile/sketch.js):

    • p5.js ofrece funciones específicas que se ejecutan automáticamente cuando ocurren eventos táctiles en un dispositivo móvil (o simulación en escritorio).
    • touchMoved(): es la función clave aquí. Se llama continuamente mientras el usuario mantiene un dedo presionado y lo mueve sobre el canvas. Dentro de esta función, mouseX y mouseY contienen las coordenadas actuales del toque.
    • Optimización (threshold): el código no envía un mensaje en cada pequeño movimiento detectado por touchMoved(). Comprueba si el movimiento desde la última vez que se envió (lastTouchX, lastTouchY) supera un umbral (threshold). Esto evita inundar la red con mensajes si el dedo tiembla o se mueve mínimamente, enviando solo cambios significativos.
    • Otras funciones útiles (no usadas en este caso base, pero relevantes):
      • touchStarted(): se llama una vez cuando el usuario toca la pantalla por primera vez.
      • touchEnded(): se llama una vez cuando el usuario levanta el dedo de la pantalla.

Reflect: Consolidación y metacognición 🤔

Sección titulada «Reflect: Consolidación y metacognición 🤔»

Para esta fase de pediré que hagas un diagrama que explique cómo funciona tu aplicación y cómo se comunican los diferentes componentes.