MQTT payload mit ESP unter Arduino IDE

Hallo im Forum,

mal eine Frage zum payload und MQTT. Ich betreibe einen Brocker auf Rasp 3 und sende Daten (Sensoren) an ein ESP Modul. Jetzt möchte ich, für weitere Verarbeitung, den Payload in eine Globale Variable speichern. (deklariert als int freq = 0;)

void callback(char* topic, byte* payload, unsigned int length) {
  //Serial.print("Nachricht eingegangen [");
  //Serial.print(topic);
  //Serial.print("] ");
  for (int i = 0; i < length; i++) {
    //Serial.print((char)payload[i]);
      payload[length] = '\0';
      String s = String((char*)payload);
      freq = s.toInt();
      Serial.println(freq);
    }

Es wird der richtige Wert geprintet aber immer 6 mal untereinander. Wie ändere ich den Code um nur eine Ausgabe zu bekommen??

Danke im vorraus…

Hallo,

Du hast zuviel dringelassen, die for Schleife ist überflüssig geworden.

void callback(char* topic, byte* payload, unsigned int length) {
  //Serial.print("Nachricht eingegangen [");
  //Serial.print(topic);
  //Serial.print("] ");
   String s = String(payload);
   freq = s.toInt();
   Serial.println(freq);
  }

sollte reichen. Den cast auf char* brauchst Du nicht, die Stringklasse kann auch mit byte* umgehen.
length wird erst wichtig, wenn Du binär-Daten im payload hast, in denen 0x00 innerhalb der Daten vorkommen darf. Zumindest der PubSubClient hängt offenbar das 0-Byte selbst an, habe ich aber nicht nachgeschaut.

Gruß aus Berlin
Michael

......das mag der Compiler nicht......
String s= String(payload);

bei:

String s = String((char*)payload);

compiliert er und gibt nurnoch zwei Werte aus, wobei der erste Murks ist und der zweite stimmt...

Hallo,

Shunth:
......das mag der Compiler nicht......
String s= String(payload);

bei:

String s = String((char*)payload);

compiliert er und gibt nurnoch zwei Werte aus, wobei der erste Murks ist und der zweite stimmt...

ok, laß den cast drin. Müßten wir vermutlich jetzt lib-Versionen vergleichen.

2 Werte in einer zeile oder in 2 Zeilen? Ich habe doch eigentlich nur ein Serial.println(freq); dringelassen?
Laß Dir mal mit Serial.println(s); ausgeben, wie Dein payload genau aussieht und mit Serial.println(length); die Anzahl Bytes, die ankommen.

Gruß aus Berlin
Michael

.....in zwei Zeilen....

Serial.println(length);
zeigt 5 und Serial.print(s); zeigt 40.60......

Hmmm