Binär-Datei übertragen mit LoRa und im SPIFFS ablegen

Hallo zusammen,

ich möchte eine neue Firmware über LoRa (LoRaWAN) übertragen und sie dann im SPIFFS beim ESP32 speichern. Meine erste Frage lautet:

Im welchem Format schreibe ich in einer Binär-Datei? In Bytes oder nicht?

Dadurch das ich LoRa verwendet wird die Firmware gesplittet und es werden nur 52 Bytes jeweils versendet. Da ich die Daten in er Firmware.bin anhangen muss nutze ich:

File file = SPIFFS.open("/Firmware.bin", "a");

Ist die Vorgehensweise erstmal so richtig?

Viele Grüße
Marcel

Warum schaust Du Dir nicht einfach die Beispiele zum SPIFFS an und probierst es aus?

Gruß Tommy

Die Vorgehensweise wie SPIFFS funktioniert habe ich verstanden. Aber das Beispiel zeigt mir nicht, wie ich etwas in einer Binären-Datei schreibe.

Die Daten kommen in HEX an und sollen in der Firmware.bin geschrieben werden.

Warum sendest Du sie nicht gleich binär?

Gruß Tommy

Weil ich ein Backend nutze welches die Daten nur in base64 überträgt.

Dann solltest Du einfach mal "esp32 base64 decode" in dieSuchmaschine Deiner Wahl eingeben und z.B. das hier finden.
Nur mal nebenbei: Wie prüfst Du, dass Deine Code richtig angekommen ist? Nicht dass nach 1 Jahr Übertragung plötzlich nichts geht.

Gruß Tommy

Wenn du dich an folgende Fair-Use Policy von TTN hältst:
the downlink messages to 10 messages per day (24 hours) per node.

520 byte am Tag ohne Flow-Control.
Gratuliere.

Diese Netzwerkinfrastruktur gibt das nicht her.

noiasca:
Wenn du dich an folgende Fair-Use Policy von TTN hältst:
the downlink messages to 10 messages per day (24 hours) per node.

520 byte am Tag ohne Flow-Control.
Gratuliere.

Diese Netzwerkinfrastruktur gibt das nicht her.

https://www.thethingsnetwork.org/docs/lorawan/duty-cycle.html#maximum-duty-cycle
https://www.thethingsnetwork.org/forum/t/limitations-data-rate-packet-size-30-seconds-uplink-and-10-messages-downlink-per-day-fair-access-policy-guidelines/1300

Ist mir alles bekannt und wird berücksichtigt. Die Einschränkungen von 10 Nachrichten pro Tag, wird nicht mehr so eng gesehen und mehrere Nachrichten sind möglich.

Tommy56:
Dann solltest Du einfach mal "esp32 base64 decode" in dieSuchmaschine Deiner Wahl eingeben und z.B. das hier finden.
Nur mal nebenbei: Wie prüfst Du, dass Deine Code richtig angekommen ist? Nicht dass nach 1 Jahr Übertragung plötzlich nichts geht.

Gruß Tommy

Wird in HEX ausgeben. Ich möchte es aber in Byte haben, weil ich die Daten in einer BIN-File in Bytes sind, oder?

Muss die decodierung so aussehen:

bytes * decoded = base64_decode((const unsigned char *)toDecode, strlen(toDecode), &outputLength);

Das steht so in dem Beispiel drin.

Wie wäre es, wenn Du Dir einen einfachen Sketch schreibst und einfach mal etwas selbst testest?

Gruß Tommy

Trotzdem beantwortet es nicht meine Frage, wie etwas in einer BIN-Datei gespeichert werden muss.

Dann würde ich meinen vorhandenen Sketch nehmen und etwas selbst testen.

Schau Dir mal die Doku zu write an.

Gruß Tommy

Neben Tommys richtiger Antwort "mit write"

ist eine andere richtige Antwort auf "wie etwas in einer BIN-Datei gespeichert werden muss" ?
Wie du willst. Schreiber und Leser müssen den gleichen Regeln folgen, ansonsten ist es dir freigestellt.

Hallo,

MauFau:
Ist mir alles bekannt und wird berücksichtigt. Die Einschränkungen von 10 Nachrichten pro Tag, wird nicht mehr so eng gesehen und mehrere Nachrichten sind möglich.

naja, mit den 520 Byte wäre eine Firmware 1 - 1 1/2 Jahre, mit der wieviel Message pro Tag willst Du das LoraWAN da zumüllen?
Aber wenn man eben mit dem Kopf durch die Wand will...

Wenn Du Base64 schickst, mußt es eben auf der Empfangsseite wieder mit Base64 dekodieren, dann hast Du Deine Binärdaten und die schreibst Du eben, wie es schon gesaht wurde, mit SPIFFS.write() ins Filesystem.
write erwartet die Daten in einem uint_8 als Datentyp.

Gruß aus Berlin
Michael

Die Frage nach der Verifizierung der empfangenen Daten hat er bisher auch ignoriert. Dabei ist die Wahrscheinlichkeit wohl nahe 1, dass in dem > 1 Jahr mal ein Bit umkippt.

Vor allem, wenn er bereits bei so vergleichsweise einfachen Sachen wie write schon nicht klar kommt, wie will er dann das OTA-System umprogrammieren?

Gruß Tommy

Hallo,

Tommy56:
Die Frage nach der Verifizierung der empfangenen Daten hat er bisher auch ignoriert. Dabei ist die Wahrscheinlichkeit wohl nahe 1, dass in dem > 1 Jahr mal ein Bit umkippt.

Vor allem, wenn er bereits bei so vergleichsweise einfachen Sachen wie write schon nicht klar kommt, wie will er dann das OTA-System umprogrammieren?

Hab Dich doch nicht so :slight_smile:
Prüfsumme über alles und eben am Ende feststellen, daß irgendwo Müll ist und von vorn anfangen...

OTA ist eigentlich relativ einfach machbar, Anleihen beim Web Updater dürften am überschaubarsten sein.
Können wir ja nächstes Jahr klären, da wird auch wieder Winter.
Vermutlich aber vergraulen wir ihn aber mit unseren Bemerkungen nur.
Wenn ich in seinem Porjekt nur einen Funken von praktisch nutzbar finden würde, täte ich mir das vielleicht sogar genauer ansehen...

Gruß aus Berlin
Michael

amithlon:
Prüfsumme über alles und eben am Ende feststellen, daß irgendwo Müll ist und von vorn anfangen...

Da wäre ich eher für eine CRC pro Block und eine Rückmeldung, ob er ok war oder nicht. Danach entscheidet das sendende System, ob es den gleichen Block nochmal sendet oder den nächsten.

Gruß Tommy

Guten Morgen,

Tommy56:
Die Frage nach der Verifizierung der empfangenen Daten hat er bisher auch ignoriert. Dabei ist die Wahrscheinlichkeit wohl nahe 1, dass in dem > 1 Jahr mal ein Bit umkippt.

Vor allem, wenn er bereits bei so vergleichsweise einfachen Sachen wie write schon nicht klar kommt, wie will er dann das OTA-System umprogrammieren?

Gruß Tommy

Ich habe meine Frage falsch formuliert. Das ich die Daten mit SPIFFS.write im Flash schreibe, das ist mir bewusst. Meine Frage war, ob ich die Daten in HEX,Byte oder sonstiges reingeschrieben werden. Da ich nachher die BIN-Datei mit dieser Anleitung Flashen möchte.

Tommy56:
Da wäre ich eher für eine CRC pro Block und eine Rückmeldung, ob er ok war oder nicht. Danach entscheidet das sendende System, ob es den gleichen Block nochmal sendet oder den nächsten.

Gruß Tommy

Ich hätte dich noch nach der Prüfsumme gefragt, aber erst eins nach dem anderen. :wink:

Viele Grüße
Marcel

Wird in HEX ausgeben. Ich möchte es aber in Byte haben, weil ich die Daten in einer BIN-File in Bytes sind, oder?

Sprichst du über dir binäre Struktur der Daten oder über die sichtbare Repräsentation?

Darüber solltest du dir klar werden.
Dann erledigt sich das Problem von selber.

combie:
Sprichst du über dir binäre Struktur der Daten oder über die sichtbare Repräsentation?

Darüber solltest du dir klar werden.
Dann erledigt sich das Problem von selber.

Über die binäre Struktur.

Über die binäre Struktur.

Die ist immer binär.
Die kennt kein Dezimal oder Hexadezimal.
:o :o :o

Dezimal oder Hexadezimal sind Repräsentationen binärer Symbolgruppen, welche für menschliche Augen bestimmt sind.