Innerhalb jedes MeshCore-Pakets befindet sich eine Nutzlast (Payload), die durch ihren Nutzlasttyp im Paket-Header identifiziert wird. Die Arten von Nutzlasten sind:
- Knoten-Ankündigung (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 (unbestätigt) (Group text message (unverified)).
- Gruppen-Datagramm (unbestätigt) (Group datagram (unverified)).
- Mehrteiliges Paket (Multi-part packet).
- Kontrolldatenpaket (Control data packet).
- Benutzerdefiniertes Paket (Rohe Bytes, benutzerdefinierte Verschlüsselung) (Custom packet (raw bytes, custom encryption)).
Dieses Dokument definiert die Struktur jedes dieser Nutzlasttypen.
HINWEIS: Alle 16- und 32-Bit-Ganzzahlfelder sind Little Endian (die am wenigsten signifikanten Bytes stehen an erster Stelle).
Wichtige Konzepte:
- Knoten-Hash (Node hash): Das erste Byte des öffentlichen Schlüssels (Public Key) des Knotens.
Knoten-Ankündigung (Node advertisement)
Diese Art von Nutzlast (Payload) benachrichtigt Empfänger über die Existenz eines Knotens und liefert Informationen über diesen.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Public Key | 32 | Ed25519 Public Key des Knotens |
| Zeitstempel (Timestamp) | 4 | Unix-Zeitstempel der Ankündigung |
| Signatur | 64 | Ed25519-Signatur von Public Key, Zeitstempel und Anwendungsdaten (Appdata) |
| Anwendungsdaten (Appdata) | Rest der Nutzlast | Optional, siehe unten |
Anwendungsdaten (Appdata)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Flags | 1 | Gibt an, welche der Felder vorhanden sind, siehe unten |
| Breitengrad (Latitude) | 4 (optional) | Dezimaler Breitengrad multipliziert mit 1000000, Ganzzahl |
| Längengrad (Longitude) | 4 (optional) | Dezimaler Längengrad multipliziert mit 1000000, Ganzzahl |
| Funktion 1 (Feature 1) | 2 (optional) | Reserviert für zukünftige Verwendung |
| Funktion 2 (Feature 2) | 2 (optional) | Reserviert für zukünftige Verwendung |
| Name | Rest der Appdata | Name des Knotens |
Appdata-Flags
| Wert | Name | Beschreibung |
|---|
0x01 | ist Chat-Knoten (is chat node) | Ankündigung ist für einen Chat-Knoten |
0x02 | ist Repeater (is repeater) | Ankündigung ist für einen Repeater |
0x03 | ist Raumserver (is room server) | Ankündigung ist für einen Raumserver |
0x04 | ist Sensor (is sensor) | Ankündigung ist für einen Sensor-Server |
0x10 | hat Standort (has location) | Appdata enthält Breiten-/Längengrad-Informationen |
0x20 | hat Funktion 1 (has feature 1) | Reserviert für zukünftige Verwendung. |
0x40 | hat Funktion 2 (has feature 2) | Reserviert für zukünftige Verwendung. |
0x80 | hat Namen (has name) | Appdata enthält einen Knotennamen |
Bestätigung (Acknowledgement)
Eine Bestätigung, dass eine Nachricht empfangen wurde. Beachten Sie, dass für „zurückgelegte Pfad-Nachrichten“ (returned path messages) eine Bestätigung in der "extra"-Nutzlast (siehe Returned Path) anstelle eines separaten Bestätigungspakets gesendet werden kann. CLI-Befehle (Kommandozeilenbefehle) lösen keine Bestätigungsantworten aus, weder diskrete noch zusätzliche.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Prüfsumme (Checksum) | 4 | CRC-Prüfsumme des Nachrichten-Zeitstempels, Textes und des Public Key des Absenders |
Zurückgelegter Pfad, Anfrage, Antwort und Klartextnachricht
Zurückgelegte Pfad-Nachrichten, Anfragen (Requests), Antworten (Responses) und Klartextnachrichten (Plain text messages) sind alle auf die gleiche Weise formatiert. Weitere Details zur zugehörigen Klartextdarstellung des Chiffretextes finden Sie im Unterabschnitt.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Ziel-Hash (Destination hash) | 1 | Erstes Byte des Public Key des Zielknotens |
| Quell-Hash (Source hash) | 1 | Erstes Byte des Public Key des Quellknotens |
| Chiffre-MAC (Cipher MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| Chiffretext (Ciphertext) | Rest der Nutzlast | Verschlüsselte Nachricht, Details siehe Unterabschnitte unten |
Zurückgelegter Pfad (Returned path)
Nachrichten über den zurückgelegten Pfad (Returned path messages) beschreiben den Weg, den ein Paket vom ursprünglichen Absender genommen hat. Empfänger senden „zurückgelegte Pfad-Nachrichten“ an den Autor der ursprünglichen Nachricht.
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Pfadlänge (Path length) | 1 | Länge des nächsten Feldes |
| Pfad (Path) | siehe oben | Eine Liste von Knoten-Hashes (jeweils ein Byte) |
| Extra-Typ (Extra type) | 1 | Extra, gebündelter Nutzlasttyp, z. B. Bestätigung oder Antwort. Dieselben Werte wie in Paket-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 |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Anfragedaten (Request data) | Rest der Nutzlast | Anwendungsdefinierter Anfragen-Nutzlastkörper |
Für die gängigen Chat-/Server-Helfer in BaseChatMesh sind die aktuellen Anfragetypwerte:
| Wert | Name | Beschreibung |
|---|
0x01 | Statistiken abrufen (get stats) | Statistiken eines Repeaters oder Raumservers abrufen |
0x02 | Keep-Alive (keepalive) | 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:
- Akkustand (Millivolt)
- Aktuelle Länge der Übertragungswarteschlange
- Aktuelle Länge der freien Warteschlange
- Letzter RSSI-Wert
- 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
- Anzahl der Duplikate über Direktroute
- Anzahl der Duplikate über Flood-Route
- Anzahl der geposteten (?)
- Anzahl der Push-Posts (?)
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-Knoten) (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 |
|---|
| Inhalt (Content) | Rest der Nutzlast | Anwendungsdefinierter Antwortkörper |
Antwortinhalte sind opake Anwendungsdaten. Es gibt keinen einzelnen generischen Antwort-Umschlag über den oben gezeigten verschlüsselten Nutzlast-Wrapper hinaus.
Klartextnachricht (Plain text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| txt_type + Versuch (attempt) | 1 | Die oberen sechs Bits sind txt_type (siehe unten), die unteren zwei Bits sind die Versuchsnummer (0..3) |
| Nachricht (Message) | Rest der Nutzlast | Der Nachrichteninhalt, siehe nächste Tabelle |
txt_type
| Wert | Beschreibung | Nachrichteninhalt |
|---|
0x00 | Klartextnachricht (plain text message) | Der Klartext der Nachricht |
0x01 | CLI-Befehl (CLI command) | Der Befehlstext der Nachricht |
0x02 | Signierte Klartextnachricht (signed plain text message) | Die ersten vier Bytes sind das Präfix des Absender-Public Keys, gefolgt von der Klartextnachricht |
Anonyme Anfrage (Anonymous request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Ziel-Hash (Destination hash) | 1 | Erstes Byte des Public Key des Zielknotens |
| Public Key | 32 | Ed25519 Public Key des Absenders |
| Chiffre-MAC (Cipher MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| Chiffretext (Ciphertext) | Rest der Nutzlast | Verschlüsselte Nachricht, Details siehe unten |
Raumserver-Login (Room server login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Synchronisations-Zeitstempel (Sync timestamp) | 4 | "Synchronisiere Nachrichten SEIT x" Zeitstempel des Absenders |
| Passwort (Password) | Rest der Nachricht | Passwort für den Raum |
Repeater-/Sensor-Login (Repeater/Sensor login)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Passwort (Password) | Rest der Nachricht | Passwort für Repeater/Sensor |
Repeater – Regionen-Anfrage (Repeater - Regions request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Anfragetyp (Req type) | 1 | 0x01 (Anfrage-Subtyp) |
| Antwort-Pfadlänge (Reply path len) | 1 | Pfadlänge für die Antwort |
| Antwort-Pfad (Reply path) | (variabel) | Antwort-Pfad |
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Anfragetyp (Req type) | 1 | 0x02 (Anfrage-Subtyp) |
| Antwort-Pfadlänge (Reply path len) | 1 | Pfadlänge für die Antwort |
| Antwort-Pfad (Reply path) | (variabel) | Antwort-Pfad |
Repeater – Uhrzeit- und Statusanfrage (Repeater - Clock and status request)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Zeitstempel (Timestamp) | 4 | Sendezeit (Unix-Zeitstempel) |
| Anfragetyp (Req type) | 1 | 0x03 (Anfrage-Subtyp) |
| Antwort-Pfadlänge (Reply path len) | 1 | Pfadlänge für die Antwort |
| Antwort-Pfad (Reply path) | (variabel) | Antwort-Pfad |
Gruppen-Textnachricht (Group text message)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Kanal-Hash (Channel hash) | 1 | Erstes Byte des SHA256 des geteilten Schlüssels des Kanals |
| Chiffre-MAC (Cipher MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| Chiffretext (Ciphertext) | Rest der Nutzlast | Verschlüsselte Nachricht, Details siehe unten |
Der im Chiffretext enthaltene Klartext entspricht dem in Klartextnachricht beschriebenen Format. Speziell 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 das Format : (z. B. user123: Ich bin auf dem Weg).
Der Absendername ist unbestätigter Nachrichtentext. Gruppen-Nachrichten enthalten keine Absender-Signatur, sodass jeder, der den Kanalschlüssel besitzt, einen beliebigen Absendernamen wählen kann.
Gruppen-Datagramm (Group datagram)
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Kanal-Hash (Channel hash) | 1 | Erstes Byte des SHA256 des geteilten Schlüssels des Kanals |
| Chiffre-MAC (Cipher MAC) | 2 | MAC für verschlüsselte Daten im nächsten Feld |
| Chiffretext (Ciphertext) | Rest der Nutzlast | Verschlüsselte Daten, Details siehe unten |
Die im Chiffretext enthaltenen Daten verwenden das unten stehende Format:
| Feld | Größe (Bytes) | Beschreibung |
|---|
| Datentyp (Data type) | 2 | Identifikator für den Datentyp. (Siehe number_allocations.md) |
| Datenlänge (Data len) | 1 | Bytelänge der Daten |
| 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 |
| Daten (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 (niedrigstes Bit) |
| Typ-Filter (type_filter) | 1 | Bit für jeden ADV_TYPE_* |
| Tag | 4 | Zufällig vom Absender generiert |
| Seit (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 | Von DISCOVER_REQ zurückgespiegelt |
| Public Key (pubkey) | 8 oder 32 | ID (oder Präfix) des Knotens |
Benutzerdefiniertes Paket (Custom packet)
Benutzerdefinierte Pakete haben kein definiertes Format.