Para acceder a codificación ingrese:
Se ha desarrollado un sistema IoT para visualizar y controlar el estado de un dispositivo remoto. Se ha diseñado un servidor en Java para gestionar las solicitudes de los clientes. Cada cliente corresponde a un Microcontrolador ESP32 equipado con un sensor simulado por un potenciómetro y un LED, el cual es controlado directamente por el servidor. Además de esto, el servidor aloja una página web que permite revisar varios clientes, leer el estado de los sensores y controlar los LED de la MCU. Tanto la página web como el servidor Java están alojados en Aragorn, utilizando dos puertos libres para cada tipo de cliente.
Volver al IndiceLos sistemas IoT se han convertido en los principales protagonistas de la era más reciente, siendo conocidos comúnmente hoy en día como 'la nube'. Actualmente, todo se realiza en este entorno: almacenar fotos, guardar archivos, controlar las luces del hogar e incluso manejar camiones a kilómetros de distancia. ¿Cuál es el origen de esta revolución tecnológica? ¿Nos enfrentamos a una nueva tecnología? Para abordar estas y otras preguntas, se plantea el diseño de un sistema IoT utilizando un Microcontrolador ESP32 en conjunto con el servidor del departamento de Electrónica Aragorn.
En primer lugar, al tratarse de un dispositivo remoto, es necesario implementar sockets que posibiliten la comunicación entre el servidor y el cliente. Se requiere establecer un servidor en Aragorn para que el MCU pueda conectarse e iniciar la comunicación. ¿Por qué no montar el servidor directamente como servidor, ya que este es el que envía los datos? La respuesta radica en que, al tratarse de un dispositivo remoto fuera de la misma red, resulta imposible que un cliente ubicado en Aragorn localice al MCU, dado que este último se encuentra detrás de una NAT (Traducción de Dirección de Red). En Aragorn, existen puertos abiertos a Internet, lo que permite que cualquier persona externa acceda mediante la dirección IP y un puerto específico. Para mostrar los datos en una página web, también se emplea un puerto libre diferente al del MCU, con el objetivo de evitar conflictos entre ambos tipos de clientes.
La comunicación entre el cliente y los servidores se lleva a cabo mediante paquetes UDP para el MCU y paquetes TCP para el montaje de la página web. Para esta última, se emplea un código en JavaScript que proporciona el diseño a la página escrita en HTML.
Volver al IndiceSe muestra un diagrama de alto nivel con la estructura del sistema. Se observa que el servidor Java en Aragorn se comunica bidireccionalmente con el ESP32, mediante el uso de paquetes UDP, el puerto que se utiliza para montar el socket es el 47204. Luego para montar pagina web se utiliza paquetes TCP, mediante el protocolo HTTP. Este utiliza el puerto 47203.
El cliente, un Microcontrolador ESP32, se comunica con el servidor Java en Aragorn. Este envía los datos del sensor al servidor y recibe comandos para controlar el LED a través de un socket UDP conectado al servidor en Aragorn. Esta parte se darrolla en el IDE de arduino en formato .io, el cual está basado en C++. En este se debe montar el socket de comunicación, para esto se guarda la IP de aragorn y el puerto 47204, para iniciar el cliente ahí. Tambien se utiliza las funciones de la libreria "WiFiUDP" para enviar y recibir dichos paquetes. Una vez conectado al servidor, el dispositivo comienza a generar y enviar constantemente paquetes UDP con los datos. Simultáneamente, permanece atento a cualquier paquete UDP entrante a través del socket correspondiente. En caso de recibir información en uno de estos paquetes, el MCU reacciona modificando el estado del LED, ya sea encendiéndolo o apagándolo. Los datos enviados se originan en sensores; en este caso, se simulan utilizando un potenciómetro. Luego, mediante un ADC interno, se convierten para ser transmitidos al servidor.
Este programa Java es un servidor web básico que inicia un ServerSocket en los puertos 47204 y 47203 para escuchar al MCU y a la página web respectivamente. Utiliza hebras para gestionar estas conexiones. Por un lado, se crea un socket para el ESP32 que recibe paquetes UDP y envía respuestas para controlar actuadores, como un LED. Por otro lado, en el lado del graficador, se generan hebras individuales para cada cliente que se conecta. Esta parte del código crea una página web utilizando un archivo HTML y un código CSS que deben ubicarse en el directorio donde está alojado el servidor.
Esta sección consta de tres archivos: un archivo .html que define la estructura de la página web, un archivo .css que establece el estilo visual de la página y, por último, un archivo .js que se encarga de actualizar los datos y dibujar la gráfica de la señal de interés recibida. Es importante destacar que estos archivos deben estar ubicados en el mismo directorio que el servidor Java para que este pueda desplegarlos y utilizarlos adecuadamente.
Se logró exitosamente montar el servidor en Aragorn para recibir y mostrar los datos enviados por el ESP32 en la página web. La página se actualiza automáticamente para reflejar los datos del MCU sin necesidad de recargarla. Cualquier persona con la dirección IP y el puerto puede conectarse como cliente mediante un navegador web, lo que permite la conexión simultánea de varios clientes al sistema. Es importante mencionar que el graficador registra la hora de conexión de los clientes para recibir los datos, lo que puede no ser consistente entre diferentes clientes. Además, la funcionalidad del botón para controlar el LED está operativa, aunque presenta ciertos errores si se pierden paquetes o si varios clientes intentan cambiar el estado del LED al mismo tiempo.
Volver al IndiceEl desarrollo de un sistema IoT implica principalmente el uso e implementación de Sockets y la comunicación remota entre procesos, conceptos que se estudian en profundidad en ELO-330 Programación de Sistemas. Estos conceptos, aunque no son nuevos, han sido impulsados por los avances en la electrónica de los dispositivos, lo que ha propiciado la expansión de los sistemas IoT. En este caso, se implementan de manera sencilla sockets y transmisión de paquetes UDP en el ESP32, lo cual ejemplifica el estado avanzado de estos sistemas en la actualidad. Es importante mencionar que, si bien en este proyecto se ha utilizado Aragorn para montar un servidor, existen numerosos servidores gratuitos disponibles para desarrollar sistemas IoT, incluso algunos proporcionados por Arduino
Para futuros trabajos, sería beneficioso implementar un sistema de seguridad robusto que restrinja el acceso a la página web únicamente a ciertos clientes autorizados. Esto garantizaría la privacidad y seguridad de los datos. Además, se podría establecer un sistema de autenticación para controlar qué clientes pueden acceder a determinada información. Dado que los puertos están abiertos a Internet, existe una vulnerabilidad potencial que podría permitir que terceros observen y manipulen los datos, incluso haciéndose pasar por el ESP32. Implementar un protocolo de autenticación seguro y posiblemente un cifrado de extremo a extremo serían medidas importantes para mitigar estos riesgos y garantizar la integridad de los datos transmitidos.
También sería viable implementar un sistema de base de datos. De esta manera, se podría acceder a la información histórica en cualquier momento. Esta base de datos permitiría almacenar registros pasados, facilitando el análisis de datos históricos, tendencias y patrones de comportamiento del sistema IoT.
Finalmente, la implementación de más sensores y actuadores puede mejorar considerablemente el sistema. Esta ampliación permitiría una recopilación más completa de datos y la capacidad de controlar y reaccionar ante una variedad más amplia de aspectos del entorno. Con más sensores, se obtendría una visión más detallada y precisa, mientras que la inclusión de más actuadores ofrecería un mayor control y capacidad de intervención en el entorno conectado. Esta expansión en la cantidad de dispositivos conectados enriquecería significativamente las capacidades y funcionalidades del sistema IoT.
Volver al Indice