EN

MeshCore KISS-Modem-Protokoll

MeshCore KISS-Modem-Protokoll

MeshCore KISS-Modem-Protokoll

Standard-KISS (Keep It Simple, Stupid)-TNC (Terminal Node Controller)-Firmware für MeshCore LoRa-Funkgeräte. Kompatibel mit jedem KISS-Client (wie Direwolf, APRSdroid, YAAC usw.) zum Senden und Empfangen von Rohdatenpaketen. MeshCore-spezifische Erweiterungen (Kryptographie, Funkkonfiguration, Telemetrie) sind über den Standard-SetHardware-Befehl (0x06) verfügbar.

Serielle Konfiguration

115200 Baud, 8N1 (8 Datenbits, keine Parität, 1 Stoppbit), keine Flusskontrolle.

Rahmenformat

Standard-KISS-Rahmenformat gemäß der KA9Q/K3MC-Spezifikation.

ByteNameBeschreibung
0xC0FENDRahmenbegrenzer (Frame Delimiter)
0xDBFESCEscape-Zeichen
0xDCTFENDEscapiertes FEND (FESC + TFEND = 0xC0)
0xDDTFESCEscapiertes FESC (FESC + TFESC = 0xDB)
CLI
┌──────┬───────────┬────────────────┬──────┐
│ FEND │ Type Byte │ Data (escaped) │ FEND │
│ 0xC0 │  1 byte   │ 0-510 bytes    │ 0xC0 │
└──────┴───────────┴────────────────┴──────┘

Typ-Byte

Das Typ-Byte ist in zwei Nibbles (Halbbytes) aufgeteilt:

BitsFeldBeschreibung
7-4PortPortnummer (0 für Einkanal-TNC)
3-0CommandBefehlsnummer

Maximale nicht-escapierte Rahmengröße: 512 Bytes.

Standard-KISS-Befehle

Host zum TNC

BefehlWertDatenBeschreibung
Data0x00RohpaketPaket zur Übertragung in die Warteschlange stellen (jeweils eines ausstehend)
TXDELAY0x01Verzögerung (1 Byte)Sende-Einschaltverzögerung in 10ms-Einheiten (Standard: 50 = 500ms)
Persistence0x02P (1 Byte)CSMA (Carrier Sense Multiple Access)-Persistenzparameter 0-255 (Standard: 63)
SlotTime0x03Intervall (1 Byte)CSMA-Slot-Intervall in 10ms-Einheiten (Standard: 10 = 100ms)
TXtail0x04Verzögerung (1 Byte)Nach-Sende-Haltezeit in 10ms-Einheiten (Standard: 0)
FullDuplex0x05Modus (1 Byte)0 = Halbduplex, ungleich Null = Vollduplex (Standard: 0)
SetHardware0x06Unterbefehl + DatenMeshCore-Erweiterungen (siehe unten)
Return0xFF-KISS-Modus verlassen (Keine Operation)

TNC zum Host

TypWertDatenBeschreibung
Data0x00RohpaketEmpfangenes Paket vom Funkgerät

Datenrahmen enthalten ausschließlich Rohpaketdaten, ohne vorangestellte Metadaten. Die Nutzlast des Data-Befehls ist auf 255 Bytes begrenzt, um der maximalen Übertragungseinheit (MAX_TRANS_UNIT) von MeshCore zu entsprechen; Rahmen, die größer als 255 Bytes sind, werden stillschweigend verworfen. Die KISS-Spezifikation empfiehlt mindestens 1024 Bytes für universelle TNCs; dieses Modem ist jedoch ausschließlich für MeshCore-Pakete vorgesehen, deren Protokoll-MTU (Maximum Transmission Unit) 255 Bytes beträgt.

Es darf jeweils nur ein Paket zur Funkübertragung ausstehend sein. Wenn der Host einen zweiten Data-Rahmen sendet, bevor der erste abgeschlossen ist, antwortet das Modem mit Error (0xF1) und TxBusy (0x07).

Host-Ausgabe-Gegendruck (Backpressure)

Ausgehende Rahmen werden in eine Warteschlange mit zwei Plätzen kodiert und geleert, sobald serieller Ausgaberaum verfügbar ist; loop() blockiert niemals bei Schreibvorgängen. Der Funk-TX-Zustand schreitet unabhängig von der Host-Lesegeschwindigkeit voran. TxDone wird beibehalten, bis es in die Warteschlange gestellt werden kann. Wenn die ausgehende Warteschlange voll ist, antwortet das Modem mit Error (0xF1) und TxBusy (0x07). Hosts sollten die serielle Schnittstelle zeitnah lesen, um verzögerte Antworten zu vermeiden.

CSMA-Verhalten

Der TNC implementiert p-persistentes CSMA (Carrier Sense Multiple Access) für den Halbduplex-Betrieb:

  1. Wenn ein Paket in die Warteschlange gestellt wird, wird die Trägererkennung überwacht.
  2. Wenn der Kanal frei ist, wird ein Zufallswert zwischen 0 und 255 generiert.
  3. Wenn der Wert kleiner oder gleich P (Persistence) ist, wird TXDELAY gewartet und dann gesendet.
  4. Andernfalls wird SlotTime gewartet und ab Schritt 1 wiederholt.
Im Vollduplex-Modus wird CSMA umgangen und Pakete werden nach TXDELAY gesendet.

SetHardware-Erweiterungen (0x06)

MeshCore-spezifische Funktionalität nutzt den Standard-KISS-SetHardware-Befehl. Das erste Byte der SetHardware-Daten ist ein Unterbefehl. Standard-KISS-Clients ignorieren diese Rahmen.

Rahmenformat

CLI
┌──────┬──────┬─────────────┬────────────────┬──────┐
│ FEND │ 0x06 │ Sub-command │ Data (escaped) │ FEND │
│ 0xC0 │      │   1 byte    │   variable     │ 0xC0 │
└──────┬──────┴─────────────┴────────────────┴──────┘

Anforderungs-Unterbefehle (Host zum TNC)

UnterbefehlWertDaten
GetIdentity0x01-
GetRandom0x02Länge (1 Byte, 1-64)
VerifySignature0x03PubKey (32) + Signatur (64) + Daten
SignData0x04Zu signierende Daten
EncryptData0x05Schlüssel (32) + Klartext
DecryptData0x06Schlüssel (32) + MAC (2) + Chiffretext
KeyExchange0x07Remote-PubKey (32)
Hash0x08Zu hashierende Daten
SetRadio0x09Frequenz (4) + Bandbreite (4) + SF (1) + CR (1)
SetTxPower0x0ASendeleistung dBm (1)
GetRadio0x0B-
GetTxPower0x0C-
GetCurrentRssi0x0D-
IsChannelBusy0x0E-
GetAirtime0x0FPaketlänge (1)
GetNoiseFloor0x10-
GetVersion0x11-
GetStats0x12-
GetBattery0x13-
GetMCUTemp0x14-
GetSensors0x15Berechtigungen (1)
GetDeviceName0x16-
Ping0x17-
Reboot0x18-
SetSignalReport0x19Aktivieren (1): 0x00=deaktivieren, ungleich Null=aktivieren
GetSignalReport0x1A-

Antwort-Unterbefehle (TNC zum Host)

Antwortcodes verwenden die High-Bit-Konvention: Antwort = Befehl | 0x80. Generische und unaufgeforderte Antworten verwenden den Bereich 0xF0+.

UnterbefehlWertDaten
Identity0x81PubKey (32)
Random0x82Zufällige Bytes (1-64)
Verify0x83Ergebnis (1): 0x00=ungültig, 0x01=gültig
Signature0x84Signatur (64)
Encrypted0x85MAC (2) + Chiffretext
Decrypted0x86Klartext
SharedSecret0x87Gemeinsamer Schlüssel (32)
Hash0x88SHA-256 Hash (32)
Radio0x8BFrequenz (4) + Bandbreite (4) + SF (1) + CR (1)
TxPower0x8CSendeleistung dBm (1)
CurrentRssi0x8DRSSI dBm (1, vorzeichenbehaftet)
ChannelBusy0x8EErgebnis (1): 0x00=frei, 0x01=belegt
Airtime0x8FMillisekunden (4)
NoiseFloor0x90dBm (2, vorzeichenbehaftet)
Version0x91Version (1) + Reserviert (1)
Stats0x92RX (4) + TX (4) + Fehler (4)
Battery0x93Millivolt (2)
MCUTemp0x94Temperatur (2, vorzeichenbehaftet)
Sensors0x95CayenneLPP-Nutzlast
DeviceName0x96Name (variabel, UTF-8)
Pong0x97-
SignalReport0x9AStatus (1): 0x00=deaktiviert, 0x01=aktiviert
OK0xF0-
Error0xF1Fehlercode (1)
TxDone0xF8Ergebnis (1): 0x00=fehlgeschlagen, 0x01=erfolgreich
RxMeta0xF9SNR (1) + RSSI (1)

Fehlercodes

CodeWertBeschreibung
InvalidLength0x01Anforderungsdaten zu kurz
InvalidParam0x02Ungültiger Parameterwert
NoCallback0x03Funktion nicht verfügbar
MacFailed0x04MAC-Verifizierung fehlgeschlagen
UnknownCmd0x05Unbekannter Unterbefehl
EncryptFailed0x06Verschlüsselung fehlgeschlagen
TxBusy0x07Funk-TX belegt, oder Host-Ausgangswarteschlange voll

Unaufgeforderte Ereignisse

Der TNC sendet diese SetHardware-Rahmen ohne vorherige Anforderung:

TxDone (0xF8): Wird nach Abschluss der Funkübertragung gesendet. Enthält ein einzelnes Byte: 0x01 für Erfolg, 0x00 für Misserfolg. Die Zustellung an den Host kann unter seriellem Gegendruck verzögert werden, wird aber nicht verworfen. RxMeta (0xF9): Wird nach jedem Standarddatenrahmen (Typ 0x00) mit SNR (1 Byte, vorzeichenbehaftet, Wert x4) und RSSI (1 Byte, vorzeichenbehaftet, dBm) gesendet. Wird mit dem Datenrahmen in die Warteschlange gestellt; wird weggelassen, wenn der Datenrahmen nicht in die Warteschlange gestellt werden kann. Standardmäßig aktiviert; mit SetSignalReport umschaltbar. Standard-KISS-Clients ignorieren diesen Rahmen.

Datenformate

Funkparameter (SetRadio / Radio-Antwort)

Alle Werte sind Little-Endian (niedrigstwertiges Byte zuerst).

FeldGrößeBeschreibung
Frequenz4 BytesHz (z. B. 869618000)
Bandbreite4 BytesHz (z. B. 62500)
SF1 ByteSpreading Factor (Spreizfaktor) (5-12)
CR1 ByteCoding Rate (Kodierrate) (5-8)

Version (Version-Antwort)

FeldGrößeBeschreibung
Version1 ByteFirmware-Version
Reserviert1 ByteImmer 0

Verschlüsselt (Encrypted-Antwort)

FeldGrößeBeschreibung
MAC2 BytesHMAC-SHA256 auf 2 Bytes gekürzt
ChiffretextvariabelAES-128 Blockverschlüsselte Daten mit Null-Padding

Sendezeit (Airtime-Antwort)

Alle Werte Little-Endian.

FeldGrößeBeschreibung
Sendezeit4 Bytesuint32_t, geschätzte Sendezeit in Millisekunden

Rauschpegel (NoiseFloor-Antwort)

Alle Werte Little-Endian.

FeldGrößeBeschreibung
Rauschpegel2 Bytesint16_t, dBm (vorzeichenbehaftet)

Das Modem rekalibriert den Rauschpegel alle 2 Sekunden mit einem AGC (Automatic Gain Control)-Reset alle 30 Sekunden.

Statistiken (Stats-Antwort)

Alle Werte Little-Endian.

FeldGrößeBeschreibung
RX4 BytesEmpfangene Pakete
TX4 BytesGesendete Pakete
Fehler4 BytesEmpfangsfehler

Batterie (Battery-Antwort)

Alle Werte Little-Endian.

FeldGrößeBeschreibung
Millivolt2 Bytesuint16_t, Batteriespannung in mV

MCU-Temperatur (MCUTemp-Antwort)

Alle Werte Little-Endian.

FeldGrößeBeschreibung
Temperatur2 Bytesint16_t, Zehntel von °C (z. B. 253 = 25,3°C)

Gibt den NoCallback-Fehler zurück, wenn das Board keine Temperaturmessungen unterstützt.

Gerätename (DeviceName-Antwort)

FeldGrößeBeschreibung
NamevariabelUTF-8-String, kein Null-Terminator

Neustart (Reboot)

Sendet eine OK-Antwort, leert die serielle Schnittstelle und startet dann das Gerät neu. Der Host sollte damit rechnen, dass die Verbindung unterbrochen wird.

Sensorberechtigungen (GetSensors)

BitWertBeschreibung
00x01Basis (Batterie)
10x02Position (GPS)
20x04Umgebung (Temperatur, Luftfeuchtigkeit, Druck)

Verwenden Sie 0x07 für alle Berechtigungen.

Sensordaten (Sensors-Antwort)

Die Daten werden im CayenneLPP-Format zurückgegeben. Siehe CayenneLPP-Dokumentation zum Parsen.

Kryptographische Algorithmen

OperationAlgorithmus
Identität / Signieren / VerifizierenEd25519
SchlüsselaustauschX25519 (ECDH)
VerschlüsselungAES-128 Blockverschlüsselung mit Null-Padding + HMAC-SHA256 (MAC auf 2 Bytes gekürzt)
HashingSHA-256

Hinweise

  • Die Nutzlastbegrenzung für Daten (255 Bytes) entspricht der MeshCore MAX_TRANS_UNIT (maximalen Übertragungseinheit); keine Änderung für KISS "1024+ empfohlen" erforderlich (dies gilt für allgemeine TNCs, nicht für MeshCore).
  • Das Modem generiert beim ersten Booten eine Identität (wird im Flash-Speicher abgelegt).
  • Alle Mehrbyte-Werte sind Little-Endian, sofern nicht anders angegeben.
  • SNR-Werte in RxMeta werden mit 4 multipliziert für eine 0,25 dB-Genauigkeit.
  • TxDone wird nach jeder Übertragung als SetHardware-Ereignis gesendet.
  • Standard-KISS-Clients empfangen nur Datenrahmen vom Typ 0x00 und können alle SetHardware-Rahmen (0x06) sicher ignorieren.
  • Siehe packet_format.md für das Paketformat.

Quelle: docs.meshcore.io