Que es un socket?
Seguramente encontrará variadas definiciones de lo que es un Socket en redes informáticas, sin embargo desde el punto de vista de la electrónica con microcontroladores, podríamos simplemente decir que es el RS-232 de TCP-IP.
Una de las formas mas simples de conectar un microcontrolador, PLC o electrónica en general a una computadora es a través de una UART con el conocido protocolo RS-232. Un socket hace eso mismo, establece una conexión entre dos puntos, sin importar donde se encuentren estos puntos y esto si es una gran diferencia con el viejo RS-232.
Podemos hacer una medición de voltaje, temperatura, humedad o lo que fuera necesario verificar y transmitir estos datos a cualquier parte del mundo por TCP-IP para esto solo necesitamos tres cosas:
- Una dirección IP donde enviar los datos.
- Un puerto virtual donde los datos será recogidos.
- El conocimiento para darle forma a la idea
Un poco de teoría.
Hay varios tipos de socket pero dos son de uso mas común.
- Los socket de flujo o SOCK_STREAM que son transportados por TCP (Protocolo de Control de Transmisión) y asegura que los mensajes lleguen en el mismo orden que fueron enviados y sin errores. Telnet, los navegadores y muchas aplicaciones usan este tipo de conexión fiable y segura.
- Los socket de datagrama o SOCK_DGRAM son transportados por UDP (Protocolo de Datagramas de Usuario), Es la forma mas simple de enviar datos por la red. Simplemente montamos un paquete le damos una dirección destino y un puerto y listo!! El SOCK_DGRAM es mas rápido que el anterior pero claro aquí no importa el orden en que los paquetes llegan y varias cosas mas no son tomadas en cuenta motivo por el cual es mas rápido. Pero cuando lo que enviamos son simples datos de una medición o el estado de una máquina y solo estaremos usando la conexión para enviar datos sueltos y esporádicos (mismo que hacemos con RS-232 y microcontroladores) este tipo de socket es ideal para mover datos con nuestra electrónica.
El socket servidor.
Esta forma de comunicarnos es cliente-servidor. En el ejemplo que vemos estamos haciendo una medición de voltaje con un conversor A/D, esta medición la montamos en un paquete y lo enviamos a una dirección y puerto en la red.
El programa usado es Python corriendo en GNU-Linux Debian (pero podemos ejecutar el script en cualquier sistema que tenga el interprete Python).
En estas líneas el socket es creado:
UDP_IP ="201.187.1.168" # ip del socket
UDP_PORT = 6000 # Puerto del socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) <<<< Socket UDP
sock.bind((UDP_IP, UDP_PORT))
Los datos son recibidos en data:
El resultado final.
Para poder recibir los datos en Linux deberemos solicitar permisos en el firewall.
El socket cliente.
Del lado de la electrónica y para simplificar las cosas estamos usando una placa Raspberry con un conversor analógico SPI de Microchip y el código completo del cliente es el siguiente.
La implementación de Socket es muy útil y práctico incluso para mover datos dentro de una red interna pudiendo usar los propios sistemas WiFi de los equipos involucrados, también podemos trabajar con distintos puertos para diferentes datos. (Algo así como canales distintos para diferentes datos en una misma dirección).
En una conexión Ethernet por ejemplo con un controlador mas modesto que una Raspberry podríamos mover datos en la red por UDP de la misma forma que en otro tiempo usábamos RS-232 en los microcontroladores de 8 bits pero a una velocidad mucho mayor y sin límites de distancias.
Información extraída de nuestro libro Electrónica con MicroPython.