EN

Payload-Format

Payload-Format (Nutzlast-Format)

Innerhalb jedes MeshCore-Pakets befindet sich eine Nutzlast (Payload), die über den Payload-Typ im Paketkopf identifiziert wird. Folgende Payload-Typen existieren:

  • Node Advertisement (Knotenbekanntmachung)
  • Acknowledgement (Empfangsbestätigung)
  • Returned Path (Rückpfad)
  • Request (Anfrage – enthält Ziel-/Quell-Hashes + MAC)
  • Response (Antwort auf REQ oder ANON_REQ)
  • Plain Text Message (Klartextnachricht)
  • Anonymous Request (Anonyme Anfrage)
  • Group Text Message (Gruppentext-Nachricht, unverifiziert)
  • Group Datagram (Gruppen-Datagramm, unverifiziert)
  • Multi-Part Packet (Mehrteiliges Paket)
  • Control Data Packet (Steuerdatenpaket)
  • Custom Packet (benutzerdefiniertes Paket – rohe Bytes, eigene Verschlüsselung)
Dieses Dokument beschreibt die Struktur jedes einzelnen dieser Payload-Typen. HINWEIS: Alle 16- und 32-Bit-Ganzzahlfelder sind im Little-Endian-Format (niedrigstwertiges Byte zuerst) gespeichert.

Wichtige Konzepte

  • Node Hash (Knoten-Hash): Das erste Byte des öffentlichen Schlüssels eines Knotens.

Node Advertisement (Knotenbekanntmachung)

Dieser Payload-Typ informiert Empfänger darüber, dass ein Knoten existiert, und liefert Informationen über den Knoten.

FeldGröße (Bytes)Beschreibung
public key32Öffentlicher Ed25519-Schlüssel des Knotens
timestamp4Unix-Zeitstempel der Bekanntmachung
signature64Ed25519-Signatur über öffentlichen Schlüssel, Zeitstempel und App-Daten
appdataRest des PayloadsOptional, siehe unten

Appdata

FeldGröße (Bytes)Beschreibung
flags1Gibt an, welche der folgenden Felder vorhanden sind (siehe unten)
latitude4 (optional)Dezimaler Breitengrad multipliziert mit 1.000.000, als Ganzzahl
longitude4 (optional)Dezimaler Längengrad multipliziert mit 1.000.000, als Ganzzahl
feature 12 (optional)Reserviert für zukünftige Verwendung
feature 22 (optional)Reserviert für zukünftige Verwendung
nameRest der AppdataName des Knotens

Appdata Flags

WertNameBeschreibung
0x01is chat nodeBekanntmachung für einen Chat-Knoten
0x02is repeaterBekanntmachung für einen Repeater (Weiterleitungsknoten)
0x03is room serverBekanntmachung für einen Raumserver
0x04is sensorBekanntmachung für einen Sensorserver
0x10has locationAppdata enthält Breiten-/Längengrad-Informationen
0x20has feature 1Reserviert für zukünftige Verwendung
0x40has feature 2Reserviert für zukünftige Verwendung
0x80has nameAppdata enthält einen Knotennamen

Acknowledgement (Empfangsbestätigung)

Eine Bestätigung, dass eine Nachricht empfangen wurde. Bei Returned-Path-Nachrichten kann eine Empfangsbestätigung auch im „Extra"-Payload mitgesendet werden (siehe Returned Path), anstatt als separates Bestätigungspaket verschickt zu werden. CLI-Befehle lösen keine Empfangsbestätigungen aus – weder als eigenes Paket noch als Extra-Payload.

FeldGröße (Bytes)Beschreibung
checksum4CRC-Prüfsumme über Nachrichtenzeitstempel, Text und öffentlichen Schlüssel des Absenders

Returned Path, Request, Response und Plain Text Message

Returned Path (Rückpfad), Request (Anfrage), Response (Antwort) und Plain Text Message (Klartextnachricht) verwenden alle dasselbe Grundformat. Details zum Klartext-Inhalt des jeweiligen Chiffretexts finden sich in den nachfolgenden Unterabschnitten.

FeldGröße (Bytes)Beschreibung
destination hash1Erstes Byte des öffentlichen Schlüssels des Zielknotens
source hash1Erstes Byte des öffentlichen Schlüssels des Quellknotens
cipher MAC2MAC (Message Authentication Code) für die verschlüsselten Daten im nächsten Feld
ciphertextRest des PayloadsVerschlüsselte Nachricht, Details siehe Unterabschnitte unten

Returned Path (Rückpfad)

Returned-Path-Nachrichten beschreiben die Route, die ein Paket vom ursprünglichen Absender genommen hat. Empfänger senden Returned-Path-Nachrichten an den Absender der Originalnachricht zurück.

FeldGröße (Bytes)Beschreibung
path length1Länge des nächsten Feldes
pathsiehe obenEine Liste von Node-Hashes (jeweils ein Byte pro Knoten)
extra type1Typ des zusätzlich mitgesendeten Payloads, z. B. Acknowledgement oder Response. Verwendet dieselben Werte wie im Paketformat
extraRest der DatenInhalt des zusätzlich mitgesendeten Payloads, folgt demselben Format wie die in diesem Dokument definierten Hauptinhalte

Request (Anfrage)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
request dataRest des PayloadsAnwendungsspezifischer Anfrage-Inhalt

Für die gängigen Chat-/Server-Hilfsfunktionen in BaseChatMesh sind derzeit folgende Request-Typ-Werte definiert:

WertNameBeschreibung
0x01get statsStatistiken eines Repeaters oder Raumservers abrufen
0x02keepaliveKeep-Alive-Anfrage für aufrechterhaltene Verbindungen

Get Stats

Ruft Informationen über den Knoten ab, die unter anderem Folgendes umfassen können:

  • Batteriestand (in Millivolt)
  • Aktuelle Länge der Sendewarteschlange
  • Aktuelle Länge der freien Warteschlange
  • Letzter RSSI-Wert (Empfangssignalstärke)
  • Anzahl empfangener Pakete
  • Anzahl gesendeter Pakete
  • Gesamte Sendezeit / Airtime (in Sekunden)
  • Gesamte Betriebszeit / Uptime (in Sekunden)
  • Anzahl der als Flood gesendeten Pakete
  • Anzahl der direkt gesendeten Pakete
  • Anzahl der als Flood empfangenen Pakete
  • Anzahl der direkt empfangenen Pakete
  • Fehler-Flags
  • Letzter SNR-Wert (Signal-Rausch-Verhältnis)
  • Anzahl der Duplikate bei direkten Routen
  • Anzahl der Duplikate bei Flood-Routen
  • Anzahl geposteter Nachrichten (?)
  • Anzahl der Post-Pushes (?)

Get Telemetry Data

Nicht in BaseChatMesh definiert. Sensor- und anwendungsspezifische Anfrage-Payloads können von übergeordneter Firmware implementiert werden.

Get Telemetry

Nicht in BaseChatMesh definiert.

Get Min/Max/Ave (Sensorknoten)

Nicht in BaseChatMesh definiert.

Get Access List

Nicht in BaseChatMesh definiert.

Get Neighbors

Nicht in BaseChatMesh definiert.

Get Owner Info

Nicht in BaseChatMesh definiert.

Response (Antwort)

FeldGröße (Bytes)Beschreibung
contentRest des PayloadsAnwendungsspezifischer Antwort-Inhalt

Der Inhalt einer Response besteht aus opaken Anwendungsdaten (d. h. die Struktur wird von der jeweiligen Anwendung bestimmt). Es gibt kein allgemeines Response-Format über den oben gezeigten verschlüsselten Payload-Wrapper hinaus.

Plain Text Message (Klartextnachricht)

FeldGröße (Bytes)Beschreibung
timestamp4Sendezeit (Unix-Zeitstempel)
txt_type + attempt1Die oberen sechs Bits enthalten den txt_type (siehe unten), die unteren zwei Bits die Versuchsnummer (0–3)
messageRest des PayloadsDer Nachrichteninhalt, siehe nächste Tabelle

txt_type

WertBeschreibungNachrichteninhalt
0x00KlartextnachrichtDer Klartext der Nachricht
0x01CLI-BefehlDer Befehlstext der Nachricht
0x02Signierte KlartextnachrichtDie ersten vier Bytes sind das Präfix des öffentlichen Schlüssels des Absenders, gefolgt von der Klartextnachricht

Anonymous Request (Anonyme Anfrage)

FeldGröße (Bytes)Beschreibung
destination hash1Erstes Byte des öffentlichen Schlüssels des Zielknotens
public key32Öffentlicher Ed25519-Schlüssel des Absenders
cipher MAC2MAC für die verschlüsselten Daten im nächsten Feld
ciphertextRest des PayloadsVerschlüsselte Nachricht, Details siehe unten

Room Server Login (Raumserver-Anmeldung)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
sync timestamp4Zeitstempel des Absenders für „Nachrichten seit Zeitpunkt X synchronisieren"
passwordRest der NachrichtPasswort für den Raum

Repeater/Sensor Login (Repeater-/Sensor-Anmeldung)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
passwordRest der NachrichtPasswort für den Repeater/Sensor

Repeater – Regions Request (Regionen-Anfrage)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
req type10x01 (Unter-Anfragetyp)
reply path len1Pfadlänge für die Antwort
reply path(variabel)Antwortpfad

Repeater – Owner Info Request (Besitzerinformations-Anfrage)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
req type10x02 (Unter-Anfragetyp)
reply path len1Pfadlänge für die Antwort
reply path(variabel)Antwortpfad

Repeater – Clock and Status Request (Uhrzeit- und Statusanfrage)

FeldGröße (Bytes)Beschreibung
timestamp4Absenderzeit (Unix-Zeitstempel)
req type10x03 (Unter-Anfragetyp)
reply path len1Pfadlänge für die Antwort
reply path(variabel)Antwortpfad

Group Text Message (Gruppentext-Nachricht)

FeldGröße (Bytes)Beschreibung
channel hash1Erstes Byte des SHA256-Hashs des gemeinsamen Kanalschlüssels
cipher MAC2MAC für die verschlüsselten Daten im nächsten Feld
ciphertextRest des PayloadsVerschlüsselte Nachricht, Details siehe unten

Der im Chiffretext enthaltene Klartext entspricht dem Format, das unter Plain Text Message (Klartextnachricht) beschrieben ist. Konkret besteht er aus einem vier Byte langen Zeitstempel, einem Flags-Byte und der eigentlichen Nachricht. Das Flags-Byte ist in der Regel 0x00, da es sich um eine „Klartextnachricht" handelt. Die Nachricht hat die Form : (z. B. user123: Bin unterwegs).

Group Datagram (Gruppen-Datagramm)

FeldGröße (Bytes)Beschreibung
channel hash1Erstes Byte des SHA256-Hashs des gemeinsamen Kanalschlüssels
cipher MAC2MAC für die verschlüsselten Daten im nächsten Feld
ciphertextRest des PayloadsVerschlüsselte Daten, Details siehe unten

Die im Chiffretext enthaltenen Daten verwenden das folgende Format:

FeldGröße (Bytes)Beschreibung
data type2Kennung für den Datentyp (siehe number_allocations.md)
data len1Länge der Daten in Bytes
dataRest des PayloadsAbhängig vom Datentyp

Control Data (Steuerdaten)

FeldGröße (Bytes)Beschreibung
flags1Die oberen 4 Bits enthalten den sub_type (Untertyp)
dataRest des PayloadsÜblicherweise unverschlüsselte Daten

DISCOVER_REQ (sub_type)

FeldGröße (Bytes)Beschreibung
flags10x8 (obere 4 Bits), prefix_only (niedrigstes Bit)
type_filter1Bit-Maske für jeden ADV_TYPE_*
tag4Vom Absender zufällig generierter Wert
since4(Optional) Epoch-Zeitstempel (standardmäßig 0)

DISCOVER_RESP (sub_type)

FeldGröße (Bytes)Beschreibung
flags10x9 (obere 4 Bits), node_type (untere 4 Bits)
snr1Vorzeichenbehafteter Wert, SNR×4
tag4Vom DISCOVER_REQ zurückgespiegelter Tag-Wert
pubkey8 oder 32Knoten-ID (vollständig oder nur Präfix)

Custom Packet (Benutzerdefiniertes Paket)

Benutzerdefinierte Pakete haben kein festgelegtes Format.

Quelle: docs.meshcore.io