Este es un proyecto de aplicación para Android, desarrollado en B4A (Basic4android), diseñado para funcionar como un servidor de sensores. Su función principal es capturar datos en tiempo real del acelerómetro y el magnetómetro del dispositivo móvil y retransmitirlos a través de la red local a uno o varios clientes usando el protocolo UDP.
La aplicación no solo envía datos, sino que también gestiona una lista de clientes, permitiendo que múltiples dispositivos se suscriban para recibir la información de los sensores.
La interfaz de la aplicación es sencilla y está diseñada para la monitorización directa de los datos.
- Muestra los valores de los ejes X, Y, Z tanto para el acelerómetro como para el magnetómetro en etiquetas de texto (
Label). - También muestra la dirección IP del servidor (es decir, la IP del propio teléfono en la red WiFi) para que los clientes sepan a dónde conectarse.
- Inicialización: En el arranque (
Activity_Create), la aplicación inicializa los sensores de tipoTYPE_ACCELEROMETERyTYPE_MAGNETIC_FIELDdel teléfono. - Recepción de Datos: Los eventos
SensorAcc_SensorChangedySensorMag_SensorChangedse disparan cada vez que hay una nueva lectura. Los valores de los ejes (X, Y, Z) se almacenan en variables globales para su posterior envío.
Esta aplicación actúa como un servidor UDP que realiza dos tareas principales:
-
Escucha de Clientes:
- Se inicializa un socket UDP (
UDPSocket) que escucha en el puerto 51042. - Cuando un cliente quiere recibir datos, debe enviar un mensaje de texto con la palabra
"HOLA"a la IP del teléfono en el puerto 51042. - El evento
UDP_PacketArrivedrecibe este mensaje, extrae la dirección IP del remitente (el cliente) y la añade a una lista interna (ListaDeClientes), siempre que no estuviera ya registrada. De esta forma, se crea una lista de "suscripción".
- Se inicializa un socket UDP (
-
Publicación de Datos:
- Un temporizador (
Timer1) se configura para ejecutarse cada 200 milisegundos. - Cada vez que el temporizador se activa, llama a la subrutina
EnviarDatosUDP. - Esta subrutina recopila los últimos valores leídos del acelerómetro y el magnetómetro.
- Los datos se empaquetan en un formato JSON estructurado, similar a este:
{ "accelerometer": { "x": 1.23, "y": 0.45, "z": 9.81 }, "magnetometer": { "x": 30.1, "y": -15.6, "z": 22.8 } } - Finalmente, la aplicación recorre la
ListaDeClientesy envía este paquete JSON a cada cliente registrado, usando el puerto de destino 51043.
- Un temporizador (
- El código gestiona correctamente el ciclo de vida de la aplicación de Android. En
Activity_Resumese inician los sensores y el temporizador, y enActivity_Pausese detienen para no consumir batería cuando la app está en segundo plano. - Se declara el permiso de
INTERNETen el manifiesto para permitir la comunicación por red.
- El usuario inicia la aplicación en su teléfono Android. La app muestra la IP del teléfono y los datos de los sensores.
- Un programa cliente (en un PC, Raspberry Pi, etc.) en la misma red envía el mensaje
"HOLA"a la IP del teléfono, puerto51042. - La aplicación recibe el "HOLA", registra la IP del cliente.
- Cada 200 ms, la aplicación envía un paquete JSON con los datos actualizados de los sensores a la IP del cliente, al puerto
51043. - Este proceso se repite para todos los clientes que se hayan registrado.
En conclusión, es una solución eficiente y ligera para usar un teléfono Android como un dispositivo de medición inercial (IMU) inalámbrico, perfecto para proyectos de robótica, sistemas de control, o cualquier aplicación que requiera datos de movimiento y orientación en tiempo real.