Innerhalb jedes MeshCore-Pakets befindet sich eine Nutzlast (Payload), die durch den Payload-Typ im Paket-Header identifiziert wird. Die Payload-Typen sind:
- Knoten-Ankündigung (Node advertisement).
- Bestätigung (Acknowledgment).
- Rückgegebener Pfad (Returned path).
- Anfrage (Request) (Ziel-/Quell-Hashes + MAC).
- Antwort (Response) auf REQ oder ANON_REQ.
- Klartextnachricht (Plain text message).
- Anonyme Anfrage (Anonymous request).
- Gruppen-Textnachricht (Group text message) (unverifiziert).
- Gruppen-Datagramm (Group datagram) (unverifiziert).
- Mehrteiliges Paket (Multi-part packet)
- Kontrolldatenpaket (Control data packet)
- Benutzerdefiniertes Paket (Custom packet) (Rohdatenbytes, benutzerdefinierte Verschlüsselung).
Dieses Dokument definiert die Struktur jedes dieser Payload-Typen.
HINWEIS: Alle 16- und 32-Bit-Ganzzahlenfelder sind Little Endian (die am wenigsten signifikanten Bytes stehen an erster Stelle).
Wichtige Konzepte:
- Node-Hash (Knoten-Hash): Das erste Byte des öffentlichen Schlüssels des Knotens.
Knoten-Ankündigung (Node advertisement)
Diese Art der Nutzlast benachrichtigt Empfänger über die Existenz eines Knotens und liefert Informationen über diesen Knoten.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| public key (öffentlicher Schlüssel) | 32 | Ed25519 öffentlicher Schlüssel des Knotens |
| timestamp (Zeitstempel) | 4 | Unix-Zeitstempel der Ankündigung |
| signature (Signatur) | 64 | Ed25519 Signatur des öffentlichen Schlüssels, des Zeitstempels und der App-Daten |
| appdata (App-Daten) | Rest der Nutzlast | optional, siehe unten |
App-Daten (Appdata)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags (Flags) | 1 | gibt an, welche der Felder vorhanden sind, siehe unten |
| latitude (Breitengrad) | 4 (optional) | Dezimaler Breitengrad multipliziert mit 1000000, Ganzzahl |
| longitude (Längengrad) | 4 (optional) | Dezimaler Längengrad multipliziert mit 1000000, Ganzzahl |
| feature 1 (Merkmal 1) | 2 (optional) | reserviert für zukünftige Verwendung |
| feature 2 (Merkmal 2) | 2 (optional) | reserviert für zukünftige Verwendung |
| name (Name) | Rest der App-Daten | Name des Knotens |
App-Daten-Flags (Appdata Flags)
| Wert | Name | Beschreibung |
|---|
0x01 | is chat node (ist Chat-Knoten) | Ankündigung ist für einen Chat-Knoten |
0x02 | is repeater (ist Repeater) | Ankündigung ist für einen Repeater (Signalverstärker) |
0x03 | is room server (ist Raum-Server) | Ankündigung ist für einen Raum-Server |
0x04 | is sensor (ist Sensor) | Ankündigung ist für einen Sensor-Server |
0x10 | has location (hat Standort) | App-Daten enthalten Breiten-/Längengrad-Informationen |
0x20 | has feature 1 (hat Merkmal 1) | Reserviert für zukünftige Verwendung. |
0x40 | has feature 2 (hat Merkmal 2) | Reserviert für zukünftige Verwendung. |
0x80 | has name (hat Namen) | App-Daten enthalten einen Knotennamen |
Bestätigung (Acknowledgement)
Eine Bestätigung, dass eine Nachricht empfangen wurde. Beachten Sie, dass für Rückpfad-Nachrichten eine Bestätigung auch in der "Extra"-Nutzlast (siehe Returned Path) gesendet werden kann, anstatt als separates Bestätigungspaket. CLI-Befehle (Kommandozeilen-Befehle) lösen keine Bestätigungsantworten aus, weder diskrete noch zusätzliche.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| checksum (Prüfsumme) | 4 | CRC-Prüfsumme des Nachrichtenzeitstempels, des Textes und des öffentlichen Schlüssels des Absenders |
Rückgegebener Pfad (Returned path), Anfrage (request), Antwort (response) und Klartextnachricht (plain text message)
Rückgegebene Pfade, Anfragen, Antworten und Klartextnachrichten sind alle auf dieselbe Weise formatiert. Weitere Details zur zugehörigen Klartextdarstellung des Chiffretextes finden Sie im Unterabschnitt.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| destination hash (Ziel-Hash) | 1 | erstes Byte des öffentlichen Schlüssels des Zielknotens |
| source hash (Quell-Hash) | 1 | erstes Byte des öffentlichen Schlüssels des Quellknotens |
| cipher MAC (Verschlüsselungs-MAC) | 2 | MAC (Message Authentication Code) für verschlüsselte Daten im nächsten Feld |
| ciphertext (Chiffretext) | Rest der Nutzlast | verschlüsselte Nachricht, siehe Unterabschnitte unten für Details |
Rückgegebener Pfad (Returned path)
Rückgegebene Pfad-Nachrichten (Returned path messages) beschreiben den Weg, den ein Paket vom ursprünglichen Absender genommen hat. Empfänger senden Rückpfad-Nachrichten an den Absender der ursprünglichen Nachricht.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| path length (Pfadlänge) | 1 | Länge des nächsten Feldes |
| path (Pfad) | siehe oben | eine Liste von Node-Hashes (jeweils ein Byte) |
| extra type (Extra-Typ) | 1 | zusätzlicher, gebündelter Payload-Typ, z. B. Bestätigung oder Antwort. Gleiche Werte wie in Packet Format |
| extra (Extra) | Rest der Daten | zusätzlicher, gebündelter Payload-Inhalt, folgt dem gleichen Format wie der Hauptinhalt, der in diesem Dokument definiert ist |
Anfrage (Request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| request data (Anfragedaten) | Rest der Nutzlast | Anwendungsdefinierter Anfragen-Payload-Body |
Für die gängigen Chat-/Server-Helfer in BaseChatMesh sind die aktuellen Anfragetyp-Werte:
| Wert | Name | Beschreibung |
|---|
0x01 | get stats (Statistiken abrufen) | Statistiken eines Repeaters oder Raumservers abrufen |
0x02 | keepalive (Verbindung aufrechterhalten) | Keep-Alive-Anfrage, die für aufrechterhaltene Verbindungen verwendet wird |
Statistiken abrufen (Get stats)
Ruft Informationen über den Knoten ab, möglicherweise einschließlich der folgenden:
- Batteriestand (Millivolt)
- Aktuelle Länge der Sende-Warteschlange
- Aktuelle Länge der freien Warteschlange
- Letzter RSSI-Wert (Received Signal Strength Indicator)
- Anzahl der empfangenen Pakete
- Anzahl der gesendeten Pakete
- Gesamte Airtime (Sekunden)
- Gesamte Betriebszeit (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 direkter Route
- Anzahl der Duplikate bei Flood-Route
- Anzahl der geposteten (?) Inhalte
- Anzahl der Post-Pushes (?)
Telemetriedaten abrufen (Get telemetry data)
Nicht in BaseChatMesh definiert. Sensor- und anwendungsspezifische Anfragen-Nutzlasten können von höherer Firmware implementiert werden.
Telemetrie abrufen (Get Telemetry)
Nicht in BaseChatMesh definiert.
Min/Max/Durchschnitt abrufen (Sensor Nodes) (Get Min/Max/Ave (Sensor nodes))
Nicht in BaseChatMesh definiert.
Zugriffsliste abrufen (Get Access List)
Nicht in BaseChatMesh definiert.
Nachbarn abrufen (Get Neighbors)
Nicht in BaseChatMesh definiert.
Nicht in BaseChatMesh definiert.
Antwort (Response)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| content (Inhalt) | Rest der Nutzlast | Anwendungsdefinierter Antwort-Body |
Antwortinhalte sind opake Anwendungsdaten. Es gibt keinen einzigen generischen Antwort-Umschlag, der über den oben gezeigten verschlüsselten Payload-Wrapper hinausgeht.
Klartextnachricht (Plain text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Sendezeit (Unix-Zeitstempel) |
| txt_type + attempt (Texttyp + Versuch) | 1 | obere sechs Bits sind txt_type (siehe unten), untere zwei Bits sind die Versuchsnummer (0..3) |
| message (Nachricht) | Rest der Nutzlast | der Nachrichteninhalt, siehe nächste Tabelle |
txt_type (Texttyp)
| Wert | Beschreibung | Nachrichteninhalt |
|---|
0x00 | plain text message (Klartextnachricht) | der Klartext der Nachricht |
0x01 | CLI command (CLI-Befehl) | der Befehlstext der Nachricht |
0x02 | signed plain text message (signierte Klartextnachricht) | erste vier Bytes sind das Präfix des öffentlichen Schlüssels des Absenders, gefolgt von der Klartextnachricht |
Anonyme Anfrage (Anonymous request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| destination hash (Ziel-Hash) | 1 | erstes Byte des öffentlichen Schlüssels des Zielknotens |
| public key (öffentlicher Schlüssel) | 32 | öffentlicher Ed25519-Schlüssel des Absenders |
| cipher MAC (Verschlüsselungs-MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext (Chiffretext) | Rest der Nutzlast | verschlüsselte Nachricht, siehe unten für Details |
Raumserver-Login (Room server login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| sync timestamp (Synchronisierungszeitstempel) | 4 | Zeitstempel des Absenders für "Nachrichten synchronisieren SEIT x" |
| password (Passwort) | Rest der Nachricht | Passwort für den Raum |
Repeater-/Sensor-Login (Repeater/Sensor login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| password (Passwort) | Rest der Nachricht | Passwort für den Repeater/Sensor |
Repeater - Regionen-Anfrage (Repeater - Regions request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| req type (Anfragetyp) | 1 | 0x01 (Anfrage-Untertyp) |
| reply path len (Antwort-Pfadlänge) | 1 | Pfadlänge für die Antwort |
| reply path (Antwort-Pfad) | (variabel) | Antwort-Pfad |
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| req type (Anfragetyp) | 1 | 0x02 (Anfrage-Untertyp) |
| reply path len (Antwort-Pfadlänge) | 1 | Pfadlänge für die Antwort |
| reply path (Antwort-Pfad) | (variabel) | Antwort-Pfad |
Repeater - Uhrzeit- und Statusanfrage (Repeater - Clock and status request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp (Zeitstempel) | 4 | Absenderzeit (Unix-Zeitstempel) |
| req type (Anfragetyp) | 1 | 0x03 (Anfrage-Untertyp) |
| reply path len (Antwort-Pfadlänge) | 1 | Pfadlänge für die Antwort |
| reply path (Antwort-Pfad) | (variabel) | Antwort-Pfad |
Gruppen-Textnachricht (Group text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| channel hash (Kanal-Hash) | 1 | erstes Byte des SHA256 des gemeinsamen Schlüssels des Kanals |
| cipher MAC (Verschlüsselungs-MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext (Chiffretext) | Rest der Nutzlast | verschlüsselte Nachricht, siehe unten für Details |
Der im Chiffretext enthaltene Klartext entspricht dem Format, das in plain text message beschrieben ist. Speziell besteht er aus einem vier Byte Zeitstempel, einem Flags-Byte und der Nachricht. Das Flags-Byte ist im Allgemeinen 0x00, da es sich um eine "Klartextnachricht" handelt. Die Nachricht hat das Format : (z. B. user123: Ich bin unterwegs).
Der Absendername ist ein unverifizierter Nachrichtentext. Gruppen-Nachrichten enthalten keine Absender-Signatur, sodass jeder Inhaber des Kanal-Schlüssels einen beliebigen Absendernamen wählen kann.
Gruppen-Datagramm (Group datagram)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| channel hash (Kanal-Hash) | 1 | erstes Byte des SHA256 des gemeinsamen Schlüssels des Kanals |
| cipher MAC (Verschlüsselungs-MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext (Chiffretext) | Rest der Nutzlast | verschlüsselte Daten, siehe unten für Details |
Die im Chiffretext enthaltenen Daten verwenden das folgende Format:
| Feld | Größe (Bytes) | Beschreibung |
|---|
| data type (Datentyp) | 2 | Identifikator für den Datentyp. (Siehe number_allocations.md) |
| data len (Datenlänge) | 1 | Bytelänge der Daten |
| data (Daten) | Rest der Nutzlast | (abhängig vom Datentyp) |
Kontrolldaten (Control data)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags (Flags) | 1 | obere 4 Bits sind sub_type (Untertyp) |
| data (Daten) | Rest der Nutzlast | typischerweise unverschlüsselte Daten |
DISCOVER_REQ (sub_type)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags (Flags) | 1 | 0x8 (obere 4 Bits), prefix_only (niedrigstes Bit) |
| type_filter (Typfilter) | 1 | Bit für jeden ADV_TYPE_* |
| tag | 4 | zufällig vom Absender generiert |
| since (seit) | 4 | (optional) Epochen-Zeitstempel (standardmäßig 0) |
DISCOVER_RESP (sub_type)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags (Flags) | 1 | 0x9 (obere 4 Bits), node_type (untere 4) |
| snr | 1 | signiert, SNR*4 |
| tag | 4 | reflektiert von DISCOVER_REQ |
| pubkey (öffentlicher Schlüssel) | 8 oder 32 | ID des Knotens (oder Präfix) |
Benutzerdefiniertes Paket (Custom packet)
Benutzerdefinierte Pakete haben kein definiertes Format.