Jedes MeshCore-Paket enthält eine Nutzlast (Payload), deren Typ im Paket-Header angegeben ist. Die Nutzlasttypen sind:
- Knotenwerbung (Node advertisement).
- Bestätigung (Acknowledgment).
- Zurückgelegter 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) (Rohdaten, benutzerdefinierte Verschlüsselung).
Dieses Dokument definiert die Struktur jedes dieser Nutzlasttypen.
HINWEIS: Alle 16- und 32-Bit-Ganzzahlfelder sind Little Endian.
Wichtige Konzepte:
- Knoten-Hash: Das erste Byte des öffentlichen Schlüssels (Public Key) des Knotens.
Knotenwerbung (Node advertisement)
Diese Nutzlast informiert Empfänger über die Existenz eines Knotens und liefert Informationen über ihn.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| public key | 32 | Ed25519 Public Key des Knotens |
| timestamp | 4 | Unix-Zeitstempel der Werbung |
| signature | 64 | Ed25519-Signatur des Public Keys, Zeitstempels und der App-Daten |
| appdata | Rest der Nutzlast | Optional, siehe unten |
App-Daten (Appdata)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags | 1 | Gibt an, welche Felder vorhanden sind, siehe unten |
| latitude | 4 (optional) | Dezimal-Breitengrad, multipliziert mit 1000000, Integer |
| longitude | 4 (optional) | Dezimal-Längengrad, multipliziert mit 1000000, Integer |
| feature 1 | 2 (optional) | Reserviert für zukünftige Verwendung |
| feature 2 | 2 (optional) | Reserviert für zukünftige Verwendung |
| name | Rest der App-Daten | Name des Knotens |
App-Daten-Flags (Appdata Flags)
| Wert | Name | Beschreibung |
|---|
0x01 | is chat node | Werbung ist für einen Chat-Knoten |
0x02 | is repeater | Werbung ist für einen Repeater |
0x03 | is room server | Werbung ist für einen Raumserver |
0x04 | is sensor | Werbung ist für einen Sensor-Server |
0x10 | has location | App-Daten enthalten Breiten-/Längengrad-Informationen |
0x20 | has feature 1 | Reserviert für zukünftige Verwendung. |
0x40 | has feature 2 | Reserviert für zukünftige Verwendung. |
0x80 | has name | App-Daten enthalten einen Knotennamen |
Bestätigung (Acknowledgement)
Eine Bestätigung, dass eine Nachricht empfangen wurde. Bei Nachrichten mit zurückgelegtem Pfad kann eine Bestätigung auch in der "Extra"-Nutzlast (siehe Returned Path) gesendet werden, anstatt als separates Bestätigungspaket. CLI-Befehle (Kommandozeilenbefehle) lösen keine Bestätigungsantworten aus, weder diskrete noch zusätzliche.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| checksum | 4 | CRC-Prüfsumme des Nachrichten-Zeitstempels, Textes und des Public Keys des Senders |
Zurückgelegter Pfad (Returned path), Anfrage (request), Antwort (response) und Klartextnachricht (plain text message)
Nachrichten des Typs "Zurückgelegter Pfad", "Anfrage", "Antwort" und "Klartextnachricht" sind alle gleich formatiert. Weitere Details zur zugehörigen Klartextdarstellung des Chiffretextes finden Sie im Unterabschnitt.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| destination hash | 1 | Erstes Byte des Public Keys des Zielknotens |
| source hash | 1 | Erstes Byte des Public Keys des Quellknotens |
| cipher MAC | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext | Rest der Nutzlast | Verschlüsselte Nachricht, siehe Unterabschnitte unten für Details |
Zurückgelegter Pfad (Returned path)
Nachrichten des Typs "Returned path" beschreiben den Weg, den ein Paket vom ursprünglichen Absender genommen hat. Empfänger senden "Returned path"-Nachrichten an den Autor der ursprünglichen Nachricht.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| path length | 1 | Länge des nächsten Feldes |
| path | siehe oben | Eine Liste von Knoten-Hashes (jeweils ein Byte) |
| extra type | 1 | Extra, gebündelter Nutzlasttyp, z.B. Bestätigung oder Antwort. Dieselben Werte wie im Packet Format |
| extra | Rest der Daten | Extra, gebündelter Nutzlastinhalt, folgt demselben Format wie der in diesem Dokument definierte Hauptinhalt |
Anfrage (Request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | Anfrage-Untertyp |
| request data | Rest der Nutzlast | Anwendungsdefinierter Nutzlastkörper der Anfrage |
Für die gängigen Chat-/Server-Helfer in BaseChatMesh sind die aktuellen Anfrage-Typenwerte:
| Wert | Name | Beschreibung |
|---|
0x01 | get stats | Statistiken von Repeater oder Raumserver abrufen |
0x02 | keepalive | (veraltet) |
0x03 | get telemetry | Knotentelemetrie anfordern |
0x04 | get min/max/avg | Sensor-Knotenstatistiken für Zeitreihendaten abrufen |
0x05 | get acl | Knoten-ACL-Abfrage |
0x06 | get neighbors | Knoten-Nachbarn-Abfrage |
0x08 | subscribe | Telemetrie-Push abonnieren |
0x09 | unsubscribe | Telemetrie-Push deabonnieren |
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 Sendezeit (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 direkter Routen-Duplikate
- Anzahl Flood-Routen-Duplikate
- Anzahl der geposteten (?)
- Anzahl der Post-Pushes (?)
Telemetrie abrufen (Get Telemetry)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x03 (Anfrage-Untertyp) |
| permission mask | 1 | Bitweise inverse Maske zum UND der Berechtigungen (0 = ALLE Telemetriewerte abrufen) |
Min/Max/Ave abrufen (Sensor-Knoten) (Get Min/Max/Ave (Sensor nodes))
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x04 (Anfrage-Untertyp) |
| start | 4 | Startzeit, Sekunden vor jetzt |
| end | 4 | Endzeit, Sekunden vor jetzt |
| reserved | 2 | Sollte Nullen sein |
Telemetrie-Push abonnieren (Sensor-Knoten) (Subscribe to Telemetry push - (Sensor nodes))
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x08 (Anfrage-Untertyp) |
| push tag | 4 | 32-Bit-Tag, der in Telemetrie-Push- _REPLY_-Nutzlasten verwendet werden soll |
| timeout secs | 2 | Abonnement-Timeout (Sekunden) |
| reserved | 1 | Sollte Null sein |
| min deltas len | 1 | Bytelänge der LPP-kodierten min_deltas |
| min deltas | (variabel) | LPP-kodierte min_deltas |
Telemetrie-Push deabonnieren (Sensor-Knoten) (Unsubscribe from Telemetry push - (Sensor nodes))
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x09 (Anfrage-Untertyp) |
Zugriffsliste abrufen (Get Access List)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x05 (Anfrage-Untertyp) |
| reserved | 2 | Sollte Nullen sein |
Nachbarn abrufen (Get Neighbors)
Nicht in BaseChatMesh definiert.
Nicht in BaseChatMesh definiert.
Antwort (Response)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| content | Rest der Nutzlast | Anwendungsdefinierter Antwortkörper |
Antwortinhalte sind opake Anwendungsdaten. Es gibt keinen einzigen generischen Antwortumschlag, der über den oben gezeigten verschlüsselten Nutzlast-Wrapper hinausgeht.
Klartextnachricht (Plain text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| txt_type + attempt | 1 | Die oberen sechs Bits sind txt_type (siehe unten), die unteren zwei Bits sind die Versuchsanummer (0..3) |
| message | Rest der Nutzlast | Der Nachrichteninhalt, siehe nächste Tabelle |
txt_type
| Wert | Beschreibung | Nachrichteninhalt |
|---|
0x00 | Klartextnachricht | Der Klartext der Nachricht |
0x01 | CLI-Daten | CLI-Befehl ODER Antworttext |
0x02 | Signierte Klartextnachricht | Die ersten vier Bytes sind das Sender-Public-Key-Präfix, gefolgt von der Klartextnachricht |
0x03 | CLI-Befehl | (seit v1.18+) CLI-Befehlstext (explizit) |
Anonyme Anfrage (Anonymous request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| destination hash | 1 | Erstes Byte des Public Keys des Zielknotens |
| public key | 32 | Ed25519 Public Key des Senders |
| cipher MAC | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext | Rest der Nutzlast | Verschlüsselte Nachricht, siehe unten für Details |
Raumserver-Login (Room server login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| sync timestamp | 4 | "Sync messages SINCE x"-Zeitstempel des Senders |
| password | Rest der Nachricht | Passwort für den Raum |
Repeater-/Sensor-Login (Repeater/Sensor login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| password | Rest der Nachricht | Passwort für Repeater/Sensor |
Repeater - Regionen-Anfrage (Repeater - Regions request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x01 (Anfrage-Untertyp) |
| reply path len | 1 | Pfadlänge für die Antwort |
| reply path | (variabel) | Antwortpfad |
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x02 (Anfrage-Untertyp) |
| reply path len | 1 | Pfadlänge für die Antwort |
| reply path | (variabel) | Antwortpfad |
Repeater - Uhrzeit- und Statusanfrage (Repeater - Clock and status request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| timestamp | 4 | Sendezeit (Unix-Zeitstempel) |
| req type | 1 | 0x03 (Anfrage-Untertyp) |
| reply path len | 1 | Pfadlänge für die Antwort |
| reply path | (variabel) | Antwortpfad |
Gruppen-Textnachricht (Group text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| channel hash | 1 | Erstes Byte des SHA256 des gemeinsamen Schlüssels des Kanals |
| cipher MAC | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext | Rest der Nutzlast | Verschlüsselte Nachricht, siehe unten für Details |
Der Klartext im Chiffretext entspricht dem Format, das in Klartextnachricht beschrieben ist. Insbesondere besteht er aus einem vier Byte langen Zeitstempel, einem Flags-Byte und der Nachricht. Das Flags-Byte ist im Allgemeinen 0x00, da es sich um eine "Klartextnachricht" handelt. Die Nachricht hat die Form : (z.B. Benutzer123: Ich bin unterwegs).
Der Sendername ist unverifizierter Nachrichtentext. Gruppennachrichten enthalten keine Sendersignatur, daher kann jeder Inhaber eines Kanalschlüssels einen beliebigen Sendernamen wählen.
Gruppen-Datagramm (Group datagram)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| channel hash | 1 | Erstes Byte des SHA256 des gemeinsamen Schlüssels des Kanals |
| cipher MAC | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| ciphertext | Rest der Nutzlast | Verschlüsselte Daten, siehe unten für Details |
Die im Chiffretext enthaltenen Daten verwenden das unten stehende Format:
| Feld | Größe (Bytes) | Beschreibung |
|---|
| data type | 2 | Identifier für den Datentyp. (Siehe number_allocations.md) |
| data len | 1 | Bytelänge der Daten |
| data | Rest der Nutzlast | (abhängig vom Datentyp) |
Kontrolldaten (Control data)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags | 1 | Die oberen 4 Bits sind sub_type |
| data | Rest der Nutzlast | Typischerweise unverschlüsselte Daten |
DISCOVER_REQ (sub_type)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags | 1 | 0x8 (obere 4 Bits), prefix_only (unterstes Bit) |
| type_filter | 1 | Bit für jeden ADV_TYPE_* |
| tag | 4 | Zufällig vom Sender generiert |
| since | 4 | (Optional) Epochen-Zeitstempel (standardmäßig 0) |
DISCOVER_RESP (sub_type)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| flags | 1 | 0x9 (obere 4 Bits), node_type (untere 4) |
| snr | 1 | Signiert, SNR*4 |
| tag | 4 | Zurückgespiegelt von DISCOVER_REQ |
| pubkey | 8 oder 32 | ID des Knotens (oder Präfix) |
Benutzerdefiniertes Paket (Custom packet)
Benutzerdefinierte Pakete haben kein definiertes Format.