Ejecutar scripts al recibir comandos mediante MQTT

MQTT es un protocolo similar a HTTP, pero mucho más liviano, utilizado hoy en día principalmente para el Internet de las cosas.

Vamos a describir un proyecto en el cual se utiliza una Raspberry Pi, la cual esta constantemente monitorizando un servicio de notificaciones, en el cual tenemos una notificación especifica que se lanza cada 15 días, a las 05:00 de la mañana, pero el script que ejecuta la tarea principal esta alojado en otro ordenador.

El ordenador principal realiza a través de una aplicación una serie de informes que una vez completados son enviados a diferentes destinatarios. Este ordenador corre un script a la espera de recibir un comando enviado a través de MQTT.

Cuando la Raspberry Pi lanza la notificación, envía un comando por MQTT, el ordenador principal recibe el comando MQTT, compara la instrucción recibida, y si es correcta, ejecuta un script, el cual se encarga de generar los informes y enviarlos a sus destinatarios.

Para que funcione el protocolo MQTT, se debe instalar en los ordenadores implicados en las tareas.

Antes de instalar el Broken de MQTT (Mosquitto) en nuestra Raspberry Pi, actualizamos los paquetes:

sudo apt update
sudo apt upgrade
sudo reboot

Luego instalamos mosquitto y su software cliente:

sudo apt-get install mosquitto mosquitto-clients

El archivo de configuración generado por defecto (mosquitto.conf) se encuentra en el directorio /etc/mosquitto.

Una vez instalado podemos revisar que se está ejecutando correctamente:

sudo systemctl status mosquitto.service

Para que el servicio se ejecuta cada vez que se inicia la Raspberry Pi, ejecutamos:

sudo systemctl enable mosquitto.service

En nuestro ordenador principal tambien debemos instalar un Broken de MQTT. Si tenemos instalada la aplicación brew, en Mac OS X, la instalación es muy sencilla, ejecutamos:

brew install mosquitto

En la Raspberry Pi, cuando la notificación alcanza la fecha prevista, llamamos a la función:

def Script_Envio_Informes():
    call('mosquitto_pub -h 192.168.1.43 -t script_enviar_informes -m "Realizar"', shell = True)
  • -h, especifica la IP de la máquina destino del mensaje MQTT.
  • -t, topic, es la palabra con la que se publica (el emisor) y se suscribe (el receptor), en como el nombre del canal al que se esta suscrito.
  • -m, es el mensaje que se envía.
  • call, es una función que se ejecuta a traves de la terminal.

El ordenador principal ejecuta en siguiente script:

#!/usr/bin/python

import paho.mqtt.client as mqtt
from captura_web import Explorar
from notifica import notify

broker_address = "localhost"
broker_port = 1883
topic = "script_enviar_informes"

def on_message(client, userdata, message):
    print("Mensaje recibido=", str(message.payload.decode("utf-8")))
    print("Topic=", message.topic)
    print("Nivel de calidad [0|1|2]=", message.qos)
    print("Flag de retención =", message.retain)
    #ejecutamos script, llamamos a la función del script
    if str(message.payload.decode("utf-8")) == "Realizar":
        Explorar()
        notify("MQTT", "Se ha ejecutado el script Envio Informes")

client = mqtt.Client('Cliente1') 
client.on_message = on_message 
client.connect(broker_address, broker_port, 60) 
client.subscribe(topic) # Subscripción al topic
client.loop_forever()

Este script se ejecutar constantemente, está a la espera de recibir algun mensaje.

  • broker_address, ejecuta el broken en el ordenador local.
  • broker_port, es el puerto por defecto utilizado por el broken.
  • topic, es al canal que nos suscribimos. El mismo canal que ha publicado el emisor.
  • if str(message.payload.decode(“utf-8”)) == “Realizar”, si el mensaje recibido es igual a Realizar, se ejecutan las siguientes funciones.
  • Explorar(), esta función genera diferentes informes y realiza los envios a sus destinatarios.
  • notify(“MQTT”, “Se ha ejecutado el script Envio Informes”), crea una notificación en la pantalla del ordenador, informa de las tareas realizadas.

El código de notify es:

import os

def notify(title, text):
    os.system("""
              osascript -e 'display notification "{}" with title "{}"'
              """.format(text, title))

El envío de mensajes a traves de diferentes dispositivos puede servir para realizar las más variadas tareas. Es muy comun su utilización en placas arduino con sensores de temperatura, humedad y presión, u otro tipo de sensores, que mediante el protocolo MQTT va enviando periodicamente los datos que obtiene, a un ordenador que los procesa o almacena, como podria ser una Raspberry Pi.

La comunicación MQTT también se utiliza para la comunicación entre dispositivos Tuya y Smart Life y las aplicaciones que gestionan estos dispositivos.

Share

Comments are closed.