MQTT PubSubClient callback - payload Bytes in Integer umwandeln

Moin.

Um mittels MQTT ein Netzwerk aufzubauen taste ich mich an die PubSubClient Library ran.

Nun bekomme ich die Werte aus der Subscription in Bytes, möchte aber einen Integer daraus machen um damit den PWM Ausgang zu schalten nachdem ich den Wert normalisiert habe.

Nach elendigem googlen, konnte ich nichts finden, wie ich die Bytes zu einer Zahl zusammenfügen kann.

Bei der Zahl 1423 z.B., befinden sich die Zahlen "1", "4", "2" und "3" als einzelne Werte im Array. Nur wie füge ich die jetzt zusammen? über den Umweg als String?

Meine callback Funktion sieht folgendermaßen aus:

void callback(char* topic, byte* payload, unsigned int length) 
{
  Serial.println();
  Serial.print("Topic is : [");
  Serial.print(topic);
  Serial.print("]");
  Serial.println();

  int payload_int;
  for(int i=0;i<length;i++){
   payload_int += (payload[i]);  //kläglicher Versuch die Bytes zum einem Integer zusammenzufügen
   Serial.write(payload[i]);         //gibt byteweise korrekt den Wert aus
  }

  Serial.print("Value is : [");
  Serial.print(payload_int);        //gibt selbstverständlich totalen Murks aus :(
  Serial.print("]");
} //end callback

Bei der Zahl 1423 z.B., befinden sich die Zahlen "1", "4", "2" und "3" als einzelne Werte im Array.

Wieso machst du sowas? Jede Ziffer als einzelnes Byte zu übertragen ist unsinnig. Da kannst du gleich einen String senden.

Am einfachsten ist bei sowas immer eine Union aus der Zahl und einem Array gleicher Größe. z.B. int und ein Byte Array der Größe sizeof(int) (2 oder 4 Byte je nach System).

Ansonsten musst du vor der Addition den aktuellen Gesamtwert mit 10 multiplizieren:
0 * 10 = 0
0 + 1 = 1
1 * 10 = 10
10 + 2 = 12
12 * 10 = 120
120 + 3 = 123
...

Serenifly:
Wieso machst du sowas? Jede Ziffer als einzelnes Byte zu übertragen ist unsinnig. Da kannst du gleich einen String senden.

Vielen Dank erstmal für Antwort.

Mir wird ein Byte-Array von der library-Funktion ausgegeben. (Oder was ist der Typ "byte*"? man beachte das Sternchen...)
Und dieses möchte ich in einen Integer wandeln. Nur wie am einfachsten?

Und dieses möchte ich in einen Integer wandeln. Nur wie am einfachsten

Am einfachsten, wenn der byte* Zeiger in Wirklichkeit ein int* wäre. Dann würde ein cast reichen.

Aber bei dir ist die byte* Payload vermutlich ein Text ohne Endezeichen, dafür mit Längenangabe.
Wenn ich dich richtig verstehe...

void callback(char* topic, byte* payload, unsigned int length)
{
  Serial.println();
  Serial.print("Topic is : [");
  Serial.print(topic);
  Serial.println("]");

  int payload_int = 0;
  for(int i=0;i<length;i++){
    char c = payload[i];
    if (c >= '0' && c <= '9')
      payload_int = payload_int*10 + c - '0';  //einzelne Ziffern zu einem Integer zusammenfügen
    else {
      Serial.print ((int)c);
      Serial.println(" war so nicht erwartet");
    }
  }

  Serial.print("Value is : [");
  Serial.print(payload_int);   
  Serial.print("]");
} //end callback

Das hat Serenifly versucht, dir zu erklären.

Mir wird ein Byte-Array von der library-Funktion ausgegeben. (Oder was ist der Typ "byte*"? man beachte das Sternchen...)

Du musst erst mal rausfinden was da wirklich drinsteht. Es gibt Libraries die senden Null-terminierte Strings, aber verwedenen byte* als Datentyp damit die Funktionen flexibel sind (man kann also auch Binärdaten senden). Durch Casts kann man dann einfach auf den eigentlichen Datentyp kommen

Wenn der String richtig terminiert ist geht auch das:

int value = atoi((char*)payload);

Dazu muss aber am Ende eben NULL stehen! Sonst bricht atoi() nicht richtig ab

Wenn nur einzelne ASCII Zeichen gesendet werden aber keine Terminierung, dann muss du es per Hand machen. Von ASCII auf eine Integer Ziffer kommt man durch Substraktion von '0' (siehe ASCII Tabelle!). Dann eben den aktuellen Wert mit 10 multiplizieren und die jeweilige Ziffer addieren