Ir al contenido

Cliente MQTT en PLC Arduino y ESP32 por Ethernet

Cliente MQTT en PLC Arduino y ESP32 por Ethernet

Ya has visto cómo trabajar con Eclipse Mosquitto en un Raspberry PLC. En esta lección, un PLC Arduino o ESP32 se conecta a ese broker por Ethernet como cliente MQTT, publica un mensaje y se suscribe a un topic.

Software

La librería PubSubClient gestiona la comunicación MQTT. Descárgala desde su repositorio de GitHub o instálala desde el gestor de librerías de Arduino IDE. El mismo ejemplo está en el IDE en File → Examples → PubSubClient → mqtt_basic.

  1. Inicializa Ethernet y define la dirección IP del PLC:
    #include <Ethernet.h>
    
    byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    IPAddress ip(10, 42, 0, 100);
    
    EthernetClient ethClient;
    
    // In setup():
    Ethernet.begin(mac, ip);
  2. Configura el cliente MQTT con la dirección del broker y un callback que se ejecuta cuando llega un mensaje:
    #include <PubSubClient.h>
    
    IPAddress server(10, 42, 0, 1);
    PubSubClient client(ethClient);
    
    void callback(char* topic, byte* payload, unsigned int length) {
      Serial.print("Message arrived [");
      Serial.print(topic);
      Serial.print("] ");
      for (unsigned int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
      }
      Serial.println();
    }
    
    // In setup():
    client.setServer(server, 1883);
    client.setCallback(callback);
  3. Añade una función de reconexión, por si se cae la conexión, y llama a client.loop() en cada ciclo. Si tu broker exige usuario y contraseña (como debería, consulta la lección de Mosquitto), pásalos a connect():
    void reconnect() {
      // Loop until we are reconnected
      while (!client.connected()) {
        Serial.print("Attempting MQTT connection...");
        // Client ID, user and password of the broker
        if (client.connect("arduinoClient", "plcuser", "your-password")) {
          Serial.println("connected");
          // Once connected, publish an announcement...
          client.publish("outTopic", "hello world");
          // ... and resubscribe
          client.subscribe("inTopic");
        } else {
          Serial.print("failed, rc=");
          Serial.print(client.state());
          Serial.println(" try again in 5 seconds");
          // Wait 5 seconds before retrying
          delay(5000);
        }
      }
    }
    
    void loop() {
      if (!client.connected()) {
        reconnect();
      }
      client.loop();
    }

Usa un client ID distinto para cada PLC: dos clientes con el mismo ID se desconectan mutuamente del broker.

Hardware

Conecta el PLC al PC (o al Raspberry PLC) con un cable Ethernet y comprueba estos puntos antes de probar:

  • El PLC y el broker están en la misma subred. El código anterior usa la IP 10.42.0.100 para el PLC y 10.42.0.1 para el broker. Para que coincidan en el Raspberry PLC, añade la dirección a su puerto Ethernet:
    sudo ip address add 10.42.0.1/24 dev <eth_interface>
  • La Ethernet del PLC Arduino / ESP32 está activa. El LED naranja debe estar encendido, lo que indica que la interfaz tiene enlace y está lista para intercambiar paquetes. El LED verde indica la velocidad del puerto (apagado para 10 Mbps, encendido para 100 Mbps).

Comprueba que los dispositivos se ven entre sí. Desde el Raspberry PLC:

ping -I <eth_interface> 10.42.0.100

Probar MQTT

Abre un terminal y suscríbete al topic outTopic en el broker:

mosquitto_sub -h 10.42.0.1 -u plcuser -P 'your-password' -t "outTopic"

Abre otro terminal y publica en inTopic:

mosquitto_pub -h 10.42.0.1 -u plcuser -P 'your-password' -t "inTopic" -m "Hello World"

El PLC recibe el mensaje y lo imprime en el monitor serie. Cuando el PLC se reinicia, se conecta al broker y publica en outTopic, y el terminal lo muestra.

Monitor serie del ESP32 PLC mostrando un mensaje recibido

Terminal con mosquitto_sub recibiendo el mensaje del PLC

Elige tu PLC en www.industrialshields.com.

Calificación
0 0

No hay comentarios por ahora.

para ser el primero en comentar.