Hallo zusammen,
ich bin neu unterwegs mit den ESPs und deren Programmierung..
Bis dato habe ich auch einige hinbekommen auch wenn mir die Stings OK Array in Char doch einiges an Probleme bereitet wenn man von VB, VBA usw. kommt.
Aktuell beisse ich mir die Zähne an der MQTT Payload die Zähne aus.
Ich habe einen fhem Broker laufen und dem ich zum testen über MQTT.fx mit Topic und payload füttere.
Bei den Bespielen die ich gefunden habe findet man immer diese Zeile
void callback(char* topic, byte* payload, unsigned int length)
als Funktionsheader. Das byte* payload sagt doch eigentlich aus, dass die Rückgabe in byte sprich Zahlen 0-255 sein soll oder ?
Wenn dem so ist warum bekomme ich dann auch Text zurück ??
Bei dem folgenden Code habe ich das Problem wenn ich dem Topic die Payload mit abc mitgebe erhalte ich abc
und die Stinglänge ist 4.
Wenn ich der Payload nun abcd mitgebe erhalte ich ⸮bcd"⸮⸮?⸮⸮⸮?⸮ @
und die Stringlänge ist 16. ![]()
Bei einer Payload von 123 erhalte ich 123 und bei 1234 erhalte ich 1234"⸮⸮?⸮⸮⸮?⸮ @.
Ich verstehe es nicht.
Hier mein Beispielcode mit der Callback funktion.
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Received message [");
Serial.print(topic);
Serial.print("] ");
char msg[length+1];
Serial.println("*********************");
for (int i = 0; i < length ; i++) {
// Serial.print((char)payload[i]);
msg[i] = (char)payload[i];
Serial.print("Zähler: ");
Serial.println(i, DEC);
Serial.print("Zeichen: ");
Serial.println(msg[i]);
Serial.println();
}
msg[i] = '\0';
Serial.print("*********************");
// Serial.println(length);
// Serial.println(msg.length(), DEC);
String myString = String(msg);
Serial.println();
Serial.print("Payload: ");
// msg[length] = '\0';
Serial.println(myString);
Serial.println(myString.length());
Serial.println(sizeof(msg));
if(strcmp(topic, "MQTT/TestSystem/relais/1") == 0){
if(strcmp(msg,"open")==0){
digitalWrite(ledPin1, HIGH);
} else if(strcmp(msg,"closed")==0){
digitalWrite(ledPin1, LOW);
}
} else if(strcmp(topic, "MQTT/TestSystem/relais/2") == 0){
if(strcmp(msg,"on")==0){
digitalWrite(ledPin2, HIGH);
} else if(strcmp(msg,"off")==0){
digitalWrite(ledPin2, LOW);
}
}
memset(msg,'\0',sizeof(msg));
}
Hier die Ausgaben vom Code mit den Unterschiedlichen Topics
abc =
18:47:25.030 -> Received message [MQTT/TestSystem/relais/1] *********************
18:47:25.030 -> Zähler: 0
18:47:25.030 -> Zeichen: a
18:47:25.030 ->
18:47:25.030 -> Zähler: 1
18:47:25.030 -> Zeichen: b
18:47:25.030 ->
18:47:25.030 -> Zähler: 2
18:47:25.030 -> Zeichen: c
18:47:25.030 ->
18:47:25.030 -> *********************
18:47:25.030 -> Payload: abc
18:47:25.030 -> 3
18:47:25.030 -> 4
abcd =
18:48:40.099 -> Received message [MQTT/TestSystem/relais/1] *********************
18:48:40.099 -> Zähler: 0
18:48:40.099 -> Zeichen: a
18:48:40.099 ->
18:48:40.099 -> Zähler: 1
18:48:40.099 -> Zeichen: b
18:48:40.099 ->
18:48:40.099 -> Zähler: 2
18:48:40.099 -> Zeichen: c
18:48:40.099 ->
18:48:40.099 -> Zähler: 3
18:48:40.099 -> Zeichen: d
18:48:40.099 ->
18:48:40.099 -> *********************
18:48:40.099 -> Payload: abcd"⸮⸮?⸮⸮⸮?⸮ @
18:48:40.099 -> 16
18:48:40.099 -> 5
Was muss ich hier verändern damit die Texte die ich der Payload mitgebe auch hier richtig angezeigt werden ?
Dann kann ich in der weiteren Verarbeitung auch richtig z.B. meine Relais schalten.
Wo kann ich mich als Anfänger gut einlesen ?
Vielen Dank schon mal
Sven