Ir al contenido

Cliente MQTT en Raspberry PLC

Un Raspberry PLC puede funcionar como broker y como cliente a la vez. En esta lección publica y se suscribe con Node-RED y con Python. Usa el broker Mosquitto local del PLC, configurado como en la lección de Mosquitto (con usuario y contraseña). Los brokers públicos como test.mosquitto.org o broker.emqx.io son prácticos para aprender porque no necesitan configuración, pero cualquiera puede leer lo que publiques en ellos: úsalos solo para demos con datos de prueba, nunca con datos reales de planta.

Node-RED

Abre el editor de Node-RED en el navegador, en la dirección que muestra node-red-start, normalmente http://10.10.10.20:1880. Arrastra un nodo MQTT in y un nodo MQTT out y configura el broker en ambos:

  • Server: localhost (el broker del propio PLC).
  • Port: 1883.
  • Protocol: MQTT V3.1.1.
  • Pestaña Security: el usuario y la contraseña del broker.

Usa el topic is/testIn en el nodo MQTT in y is/testOut en el nodo MQTT out. Deja el resto por defecto y conecta un nodo Inject y un nodo Debug. Después de desplegar el flujo, haz clic en el botón de inject para publicar el timestamp en is/testOut; el nodo Debug muestra lo que llega a is/testIn.

Flujo de Node-RED con nodos MQTT in, MQTT out, Inject y Debug

Terminal usando mosquitto_pub y mosquitto_sub

Python

El paquete Paho ofrece lo necesario para crear un sistema MQTT completo en Python. Instálalo en un entorno virtual (las versiones recientes de Raspberry Pi OS no permiten instalaciones de pip a nivel de sistema):

python3 -m venv ~/mqtt-env
. ~/mqtt-env/bin/activate
pip install paho-mqtt

Este ejemplo publica un contador una vez por segundo, 5 veces:

import time
import paho.mqtt.client as paho

broker = 'localhost'
port = 1883
topic = "is/testIn"

def on_publish(client, userdata, mid, reason_code, properties):
    print("Callback, data published!")

def on_disconnect(client, userdata, disconnect_flags, reason_code, properties):
    print("Callback, client disconnected ok")

def connect_mqtt():
    client = paho.Client(paho.CallbackAPIVersion.VERSION2)
    client.username_pw_set("plcuser", "your-password")
    client.on_publish = on_publish
    client.on_disconnect = on_disconnect
    client.connect(broker, port)
    client.loop_start()   # network loop in a background thread
    return client

def publish(client):
    for msg_count in range(1, 6):
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        if result[0] == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")

def run():
    client = connect_mqtt()
    publish(client)
    client.loop_stop()
    client.disconnect()

if __name__ == '__main__':
    run()

El script tiene estos bloques:

  1. Definición del broker: el broker, el puerto 1883 y el topic donde se publican los datos, is/testIn.
  2. Callbacks: funciones que se llaman cuando el cliente publica datos o se desconecta. Son útiles cuando necesitas hacer algo justo después de publicar.
  3. Conexión: connect_mqtt() crea el cliente, define las credenciales, registra los callbacks e inicia el bucle de red.
  4. Publicación: publish() envía un contador cada segundo, 5 veces.
  5. Código principal: run() conecta, publica y desconecta.

Salida en terminal del ejemplo MQTT en Python

Descubre la gama de Raspberry PLC en www.industrialshields.com.

Calificación
1 0

No hay comentarios por ahora.

para ser el primero en comentar.