Binäre Daten über Mqtt senden

Hi,
ich, Laie, versuch mir grad ein lora Gateway zu bauen mit einem esp32 der über MQTT mit pubsubclient Daten an Node Red sendet.
Die Datenpakete wollte ich dann binär an Node Red senden und sie erst dort dekodieren, denn das Gateway wollte ich auf dem Dach an nem Masten befestigen und so spare ich mir die Firmwareupdates jedesmal bei nen neuen Nodetyp.
So, das war grob der Plan.
Jetzt ist es aber so dass jedesmal wenn eine Nachricht einen byte mit dem wert 0 enthält die Nachricht abgeschnitten wird, ist anscheinend nullteminiert. Das dürfte es aber eigendlich nicht sein laut einem Kommentar auf der Github library seite.

What you should use is publish(topic,payload,length) (api docs) and specify the correct length for the data you are publishing.

Von der Dokumentation der Library api:

int publish (topic, payload, length)

Publishes a message to the specified topic.
Parameters

    topic - the topic to publish to (const char[])
    payload - the message to publish (byte[])
    length - the length of the message (byte)

Returns

    false - publish failed, either connection lost, or message too large
    true - publish succeeded

aus meinem Sketch:

      uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
      uint8_t buflen = sizeof(buf);
     
      char msg[buflen];

      for (int i = 0; i < buflen; i++) {
        msg[i] = (byte) buf[i];
        }

      client.publish("sensor", msg, sizeof(msg));

Ausgaben:

2 33 33 AF 41 CD CC 74 42 A0 FF                 --> Serial monitor Esp32
<Buffer 02 66 66 ae 41 33 33 75 42 9b ff>     --> Node Red console.log

2 66 66 AE 41 0 0 74 42 A5 FF                     --> Serial monitor Esp32
<Buffer 02 66 66 ae 41>                             --> Node Red console.log

Jetzt versuche ich seit zwei Tagen erfolglos die Daten irgendwie umzupacken.
Ich bastel da irgendwie daran die bytes in ascii umzuwandeln in JSON oder in nen “String”, irgendwie kommt mir aber vor dass ich da auf dem Holzweg bin.
Ich bräuchte da irgendwie einen schubs in die richtige Richtung.

Dankeschön

Andonoc: Jetzt ist es aber so dass jedesmal wenn eine Nachricht einen byte mit dem wert 0 enthält die Nachricht abgeschnitten wird, ist anscheinend nullteminiert. Das dürfte es aber eigendlich nicht sein laut einem Kommentar auf der Github library seite.

Doch Char-arrays (topic) sind immer 0-terminiert.

Gruß Tommy

Hallo Tommy, heisst das char[] == byte[] ??? Danke für die Antwort

Nein, nicht ganz. Ein byte[] kann Nullbytes beinhalten, bei der Bearbeitung eines char[] kennzeichnet das 0-Byte das Ende der Zeichenkette für alle Funktionen, die mit char[] arbeiten.

Gruß Tommy

Achsoooooo…!!!

char mit byte ausgetauscht und es macht was es soll

wenn ich noch ne frage stellen darf,
ist uint8_t dann dasselbe wie byte oder gibt es da auch noch unterschiede?

      uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
      uint8_t buflen = sizeof(buf);
     
      byte msg[buflen];

      for (int i = 0; i < buflen; i++) {
        msg[i] = (byte) buf[i];
        }

      client.publish("sensor", msg, sizeof(msg));
[code]

Hi

Ist identisch. byte==uint8_t (unsigned, 8 Bit breit, 0...255)

Vielen Dank, ihr habt mir mal wieder den Tag gerettet Dankeschön