Jump to content


Photo

Experimentando con "Message Brokers" (Mosquitto)


  • Please log in to reply
7 replies to this topic

#1 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 11 November 2013 - 01:39 PM

Hace tiempo hable por aquí acerca de lo que era un "Message Broker". Para aquellos que no se acuerden un Broker permite que varios clientes se conecten a un servidor y recibir/enviar mensajes agrupados por temas, por ejemplo si los clientes A y B estan suscritos al tema "Test" y un cliente C publica un mensaje en el tema "Test" inmediatamente A y B reciben ese mensaje. Yo, de una forma muy modesta, intente montar el mio propio con un protocolo muy sencillo, dando como resultado el programa de chat que publique aquí mismo. Desde entonces no he dejado de darle vueltas al asunto, y al final he decidido probar con un protocolo estándar en vez de inventarme uno propio.

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  :D ... 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:


delphi
  1. 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:


delphi
  1. Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3
  2. Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9
  3. Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2
  4. Topic: events/temperature_sensor/outdoor_rear/humidity Payload: 98
  5. Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3
  6. Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9
  7. Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2
  8. Topic: events/temperature_sensor/outdoor_rear/humidity Payload: 98
  9. Topic: events/temperature_sensor/outdoor_rear/battery Payload: 3
  10. Topic: events/temperature_sensor/outdoor_rear/signal Payload: 9
  11. Topic: events/temperature_sensor/outdoor_rear/temperature Payload: 13.2



Que creo que se corresponde a alguien que tiene sensores por toda la casa  :D

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:


delphi
  1. MQTTClient.exe test.mosquitto.org 1883 # -S



Ahora vamos a un ejemplo mas concreto tecleando esto:


delphi
  1. start MQTTClient.exe test.mosquitto.org 1883 delphiaccess/test -S
  2. start MQTTClient.exe test.mosquitto.org 1883 delphiaccess/test -S
  3. 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  ;)

Attached Files


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14448 posts
  • LocationMéxico

Posted 11 November 2013 - 02:43 PM

Hola amigo seoane, ya veo en que te ocupaste mientras DA estuvo en la congeladora :D :D :D

Ya lo veremos, es un tema interesante y me parece que con un poco de trabajo adicional sería un buen negocio :)

Saludos
  • 0

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 11 November 2013 - 03:25 PM

Bueno, antes de que se me quejen  ^o| ... aquí va la "versión Poliburro"  ;)

Lo mismo que lo anterior pero al final hay que añadir: proxy puertodelproxy usuario:password

Por ejemplo:


delphi
  1. MQTTClient.exe test.mosquitto.org 1883 # -S 222.179.234.110 9999



O autentificado (los "dos puntos" entre el usuario y la clave son importantes


delphi
  1. MQTTClient.exe test.mosquitto.org 1883 # -S 222.179.234.110 9999 usuario:password



Esta "versión Poliburro" no la continuare porque la conexión a través del proxy es "un poco" chapuza  :D

Attached Files


  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 11 November 2013 - 11:10 PM

Bueno, antes de que se me quejen  ^o| ... aquí va la "versión Poliburro"  ;)


*-)  *-) ¿Me hablan?
  • 0

#5 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 12 November 2013 - 01:26 AM

*-)  *-) ¿Me hablan?

¿Se dio por aludido?  *-) *-)
  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 12 November 2013 - 09:31 AM

¿Se dio por aludido?  *-) *-)


jajaja creo que si. con eso de que poliburro solo hay uno ajajaja :p
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 12 November 2013 - 10:19 AM

jajaja creo que si. con eso de que poliburro solo hay uno ajajaja :p

Pues nada a probarlo que ahora ya no hay excusas  :D ... lo de versión Poliburro es porque en el hilo de Chat dijiste que no podías probarlo si no podía salir a través de un proxy
  • 0

#8 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 12 November 2013 - 11:12 AM


Pues nada a probarlo que ahora ya no hay excusas  :D ... lo de versión Poliburro es porque en el hilo de Chat dijiste que no podías probarlo si no podía salir a través de un proxy


Ahora caigo, :D muchas gracias por la consideración amigo mio
  • 0




IP.Board spam blocked by CleanTalk.