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.

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
dondemosquitto_sub
se subscribe al canalEm50L/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 casocomando2
es :mosquitto_pub -s -L mqtt://iot.eclipse.org/Em50L/o
dondemosquitto_pub
publica el dato en el canalEm50L/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-feedSi 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.