Antecedentes:
El protocolo por el que me he decidido es el MQQT ( http://mqtt.org/ ), en gran medida porque es muy sencillo, no en vano fue diseñado por trabajadores de IBM para comunicar entre si aparatos con pocas capacidades de calculo, o poco ancho de banda, como sensores de temperatura, televisiones, tostadoras ... aunque es suficientemente potente como para que aplicaciones como "Facebook Messenger" lo utilicen para algunas tareas. ( http://en.wikipedia....metry_Transport )
Servidor:
Hay varios servidores que podemos instalar ( aqui la lista: http://mqtt.org/wiki/doku.php/brokers ), pero a mi me ha gustado uno llamado "Mosquitto" que es un proyecto "Open Source" disponible en la mayoria de distribuciones linux (incluso para Raspberry) a traves de sus repositorios, y para windows a través de un sencillo instalador ( http://mosquitto.org/download/ ). Ademas su creador a puesto a disposición de todo el mundo un servidor de prueba en la siguiente dirección: "test.mosquitto.org"
Cliente (aquí viene el codigo )
Ahora que ya tenemos decidido el protocolo y disponemos de un servidor (instalado por nosotros o el de pruebas de Mosquitto) nos podemos centrar en crear un cliente que nos permita enviar/recibir mensajes. El código esta hecho en Freepascal concretamente con Lazarus, para la comunicación utilizo directamente la API de windows (nada de Indy, ni de Synapse), apoyándome en una pequeña clase (TBufferedStream) que me he hecho que me permite leer los datos del socket usando un buffer intermedio.
Y vamos al asunto. La aplicación es de consola así que para probarla nos tendremos que ir a la consola de comandos y teclear:
MQTTClient.exe test.mosquitto.org 1883 events/# -S
Donde "test.mosquitto.org" es el servidor, 1883 el puerto, "events/#" es el tema y "-S" que nos queremos suscribir a ese tema.
Obtendremos a intervalos regulares algo como esto:
Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3 Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9 Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2 Topic: events/temperature_sensor/outdoor_rear/humidity Payload: 98 Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3 Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9 Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2 Topic: events/temperature_sensor/outdoor_rear/humidity Payload: 98 Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3 Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9 Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2
Que creo que se corresponde a alguien que tiene sensores por toda la casa
Como veis el "tema" tiene una estructura jerarquizada (al igual que los archivos den un disco), y cuando se "suscribe" podemos usar caracteres comodín como #. Al recibir o enviar el mensaje el mensaje sin embargo se usa la ruta completa, por eso en el ejemplo anterior nos suscribimos a "events/#" pero recibimos "events/temperature_sensor/outdoor_rear/temperature".
Por si tenéis curiosidad podéis hacer esto y ver todo lo que se "cuece" en el servidor:
MQTTClient.exe test.mosquitto.org 1883 # -S
Ahora vamos a un ejemplo mas concreto tecleando esto:
start MQTTClient.exe test.mosquitto.org 1883 delphiaccess/test -S start MQTTClient.exe test.mosquitto.org 1883 delphiaccess/test -S MQTTClient.exe test.mosquitto.org 1883 delphiaccess/test "Hola mundo"
Las dos primeras lineas abren dos ventanas nuevas, que se conectan al servidor y se suscriben al tema "delphiaccess/test". La tercera linea publica el mensaje "Hola mundo" a ese mismo tema, por lo que inmediatamente aparece en las otras dos ventanas que abrimos antes.
Adjunto dejo un zip con el código fuente y el ejecutable ya compilado. Revisarlo y me sacáis los fallos