Control Remoto con MQTT

MQTT (Message Queuing Telemetry Transport) es un protocolo(libre),
enfocado a la conectividad Machine-to-Machine (M2M) muy empleado en la comunicación entre sensores ,
sobre todo dentro del Internet de las Cosas (IOT) y el mundo de la Domotica.
En este ejemplo lo utilizaremos para construir un control remoto muy sencillo. (con un solo comando)
El utilizar un servidor MQTT nos permitira saltarnos CGNAT ,cortafuegos routers… sin tener que configurar nada en la red.

  • nota1: El protocolo mqtt es un protocolo orientado a la comunicacion maquina-maquina M2M pensado para sensores e IOT.
    Este articulo esta pensado con propositos educativos. De ningun modo aconsego usar esta tecnica en un entorno productivo.
  • nota2: Hay dos formas de publicar subscribirse a los canales en mosquitto. personalmente prefiero mqtt:// aunque tambien he puesto la antigua por motivos de compatibilidad. por eso los comandos estan dos veces.

Comandos a ejecutar: (para control Remoto via mqtt)

  • Servidor (espera comando lo procesa y envia respuesta)

    mosquitto_sub -C 1 -L mqtt://iot.eclipse.org/Em50L/cmd | sh | mosquitto_pub -s -L mqtt://iot.eclipse.org/Em50L/o
    mosquitto_sub -C 1 -h iot.eclipse.org -t Em50L/cmd | sh | mosquitto_pub -s -h iot.eclipse.org -t Em50L/o
    


  • Cliente (ver comandos)

    mosquitto_sub -v -L mqtt://iot.eclipse.org/Em50L/#
    mosquitto_sub -v -h iot.eclipse.org -t Em50L/# 
    


  • Cliente enviar comandos y respuestas

    mosquitto_pub -d -L mqtt://iot.eclipse.org/Em50L/cmd -m pwd
    mosquitto_pub -d -h iot.eclipse.org -t Em50L/cmd -m pwd
    

Ejemplo de uso

Si en el Servidor a controlar ejecuto el comando. (ver imagen)

Aparentemente no aparece nada.
(Mosquito_client permanecera a la espera de que llegue un comando.)

Pero si en otro equipo ejecuto los siguientes comandos.

mosquitto_sub -v -L mqtt://iot.eclipse.org/Em50L/# -C 2& 
sleep 1;mosquitto_pub -L mqtt://iot.eclipse.org/Em50L/cmd -m hostname

mosquitto_sub -v -h iot.eclipse.org -t Em50L/# -C 2& 
sleep 1;mosquitto_pub -d -h iot.eclipse.org -t Em50L/cmd -m hostname

Entonces Vere la salida del comando ejecutado en el lado del servidor.

ejemplo uso 1
En este caso vere la salida del comando hostname ejecutado en un servidor alpine
En la imagen se ve como he lanzado una orden desde un movil.
Dicha orden se ha mandado por mqtt a traves de iot.eclipse.org
La ha recogido y ejecutado una Maquina (VPS) servidor situada a miles de km del movil.
y todo sin configurar redes.
(ni tuneles ni nat ni reenvio de puertos)

Explicacion:

  • La estructura base es:
    comando1 | sh | comando2 .
    Es una doble tuberia o pipe. (paso la salida de comando1 a sh y la salida de sh a comando2.)

    • En este caso comando1 es : mosquitto_sub -C 1 -L mqtt://iot.eclipse.org/Em50L/cmd donde mosquitto_sub se subscribe al canal Em50L/cmd recibiendo 1 solo dato -C 1

    • | sh recibira el dato proveniente de comando 1 y lo ejecutara.

      (en el ejemplo he enviado el dato hostname y se ha ejecutado devolviendome el nombre de la maquina.
    • | comando2 recibe la salida del comando ejecutado y la reenvia de nuevo por mqtt (asi desde el cliente vere el resultado)
      En este caso comando2 es : mosquitto_pub -s -L mqtt://iot.eclipse.org/Em50L/o donde mosquitto_pub publica el dato en el canal Em50L/o


Conclusion de seguridad.

  • Obiamente Lo comentado en nota1 es un protocolo para comunicaciones sencillas dentro de redes protegidas Hay servidores publicos como iot.eclipse.org pero solo los utilizaria para pruebas y aprendizaje. Nunca para un entorno productivo.

  • Si quieres un entorno un poco mas seguro podeis usar el plan gratuito (CuteCat) de cloudmqtt.com que permite 5 conexiones crear y manejar usuarios, contraseñas, conexiones y certificados ssl.

  • Otro servicio orientado a IOT es https://io.adafruit.com/ que te permite crear tus propios paneles/dashboards. Limitado a 30 mensajes por minuto y 10 conexiones. es un poco engorroso de pillar al principio. (cuesta pillar que todos los topic tienen que empezar por el nombre del usuario) con este comando ahorraras tiempo: mosquitto_sub -v -h io.adafruit.com -u usuario -P AIO_KEY -t "usuario/#
    despues inserta datos desde la web para ver somo se crean. Mas tutos aqui: https://learn.adafruit.com/adafruit-io-basics-feeds/editing-a-feed

  • Si quieres algo “Interno” solo visible desde tu lan puedes optar por una raspberry pi o un movil android con termux

  • Para algo mas avanzado. (mas conexiones ancho de banda etc.) creo que es mejor saltar a un servidor propio ej un OpenVz Pero aqui hay que currar mas. claro esta.

Enlaces de interes

http://www.mqtt-dashboard.com/
https://www.cloudmqtt.com/plans.html (plan free 5 usuarios/conexiones)
https://io.adafruit.com/
https://learn.adafruit.com/adafruit-io-basics-feeds/editing-a-feed
MqttDash (Aplicacion Android)

Otras versiones de los comandos anteriores

en el mundo de la informatica hay muchas maneras de hacer lo mismo asi que aqui dejo otras opciones de los comandos anteriores a modo de tormenta de ideas.
$(mosquitto_sub -C 1 -L mqtt://iot.eclipse.org/Em50L/cmd ) | mosquitto_pub -s -L mqtt://iot.eclipse.org/Em50L/o
$(mosquitto_sub -C 1 -h iot.eclipse.org -t Em50L/cmd) | mosquitto_pub -s -h iot.eclipse.org -t Em50L/cmd
$(mosquitto_sub -C 1 -L mqtt://iot.eclipse.org/Em50L/cmd ) 

Por hacer

  • Tengo pensado un articulo de un chat simple via mqtt
  • y tengo tambien scripts completos para automatizar tareas.