Mein Code liest mqtt nicht

Hallo,
ich benötige mal eure Wissen.

Mein Python-Code zum versenden der mqtt-Daten und Brocker läuft auf einem Rapberry.
Auf dem Raspberry kann ich mit, mosquitto_sub -t "soc" -v ,den Wert sehen. "soc 50"

Meine ersten Schritte in Richtung auf dem Arduino mqtt sehen so aus.

#include <ArduinoMqttClient.h>
#include <Ethernet.h>

//Ethernet
IPAddress ip(192, 168, 178, 29);
const char hostname[] = "optasolar";

EthernetClient lanclient;
MqttClient mqttclient(lanclient);
const char broker[] = "solarsteuerung";
int port = 1883;
const char topic[] = "soc";

void setup() {
  Serial.begin(9600);

mqttclient.connect(broker, 1883);

  // Ethernet
  Ethernet.setHostname(hostname);
  Ethernet.begin();
  // Connect to MQTT broker
  if (!mqttclient.connect(broker, 1883)) {
    Serial.print("[MQTT]: MQTT Fehler! Code = ");
    Serial.println(mqttclient.connectError());
    while (1);
  }

  Serial.println(broker);
}



void loop() {

int messageSize = mqttclient.parseMessage();
Serial.println("Topic-Länge :" + messageSize);

  while (mqttclient.available()) {
    Serial.print("SOC : "(char)mqttclient.read());
  }
  Serial.println("-");

  delay(2000);
}

Im Serial, sehe ich nichts.
Wo könnte mein Fehler liegen?
Habe ich mqtt noch nicht richtig verstanden?

Gruss Ralf

Der Connect zu MQTT vor der Ethernetverbindung ist nicht gut.

Gruß Tommy

Teste ich, Danke :wink:

Auch unnötig, da die Funktion in der nachfolgenden if aufgerufen wird.

Ich kenn mich mit der Bibliothek nicht aus. Aber wo im Code wird eigentlich das Topic abonniert?
Gibt es keine Beispiele zur Bibliothek?

mqttclient.subscribe(topic); muss noch im void setup eingefügt werden.

Gerade mal in die Lib geschaut :slight_smile:

Ich teste morgen

Was heißt nichts?
Das fehlt auch in der Ausgabe?

Welchen Arduino und Aufbau hast du da?

Serial funktioniert schon.
Nur meine Ausgaben ```
Serial.print("SOC : "(char)mqttclient.read());
kommen nicht.

Auf der Python-Seite habe ich die Pausen heraus genommen.
Dann kommt etwas auf der Arduino Seite.
Topic-Länge ist dann 5, was ja (soc 50) sein sollte. Also 5 Zeichen.
Mit der Adresse vom Brocker kommt er scheinbar nicht zurecht. Bin von IP auf Hostname umgestiegen.
Frage muss der Client also der Arduino zeitgleich mit dem Brocker sein?
Get das gesendete von Python -> Brocker ------ Arduino verloren, oder speichert der Brocker bis zur nächsten Abfrage?

Könnte es sein, das die ArduinoMqttClient.h nur für Wlan ist und ich deshalb meine Probleme habe?

Alles wird gut.

Mann oder Frau benutze mqttclient.poll(); damit regelmäßig abgefragt wird.
Man benutze mqttclient.subscribe(topic); und eventuell mqttclient.onMessage(onMqttMessage);

#include <ArduinoMqttClient.h>
#include <Ethernet.h>

//Ethernet
IPAddress ip(192, 168, 178, 29);
const char hostname[] = "optasolar";

EthernetClient lanclient;
MqttClient mqttclient(lanclient);
const char broker[] = "solaranzeige";
int port = 1883;
const char topic[] = "soc";

void setup() {
  Serial.begin(9600);



  // Ethernet
  Ethernet.setHostname(hostname);
  Ethernet.begin();
  // Connect to MQTT broker
  mqttclient.connect(broker, 1883);
  mqttclient.subscribe("soc");
    // set the message receive callback
  mqttclient.onMessage(onMqttMessage);
}



void loop() {

 mqttclient.poll();

 
  delay(1000);

 
}

void onMqttMessage(int messageSize) {
  // we received a message, print out the topic and contents
  Serial.print("Received a message with topic '");
  Serial.print(mqttclient.messageTopic());
  Serial.print("', length ");
  Serial.print(messageSize);
  Serial.println(" bytes:");

  // use the Stream interface to print the contents
  while (mqttclient.available()) {
    Serial.print((char)mqttclient.read());
  }
  Serial.println();

  Serial.println();
}

Danke an alle