EN

KISS-Modem-Protokoll

KISS-Modem-Protokoll

MeshCore KISS-Modem-Protokoll

Standard-KISS-TNC-Firmware (Terminal Node Controller) für MeshCore-LoRa-Funkgeräte. Das Modem ist mit jedem KISS-Client (z. B. Direwolf, APRSdroid, YAAC usw.) kompatibel und ermöglicht das Senden und Empfangen von Roh-Paketen. MeshCore-spezifische Erweiterungen für Kryptografie, Funkparameter-Konfiguration und Telemetrie stehen über den standardmäßigen SetHardware-Befehl (0x06) zur Verfügung.

Serielle Konfiguration

115200 Baud, 8N1, keine Flusskontrolle.

Frame-Format

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

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

Type-Byte

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

BitsFeldBeschreibung
7–4PortPortnummer (0 bei Single-Port-TNC)
3–0CommandBefehlsnummer

Maximale Frame-Größe (unescaped): 512 Bytes.

Standard-KISS-Befehle

Host an TNC

BefehlWertDatenBeschreibung
Data0x00Roh-PaketPaket zur Übertragung in die Warteschlange stellen
TXDELAY0x01Verzögerung (1 Byte)Sender-Hochlaufverzögerung in 10-ms-Einheiten (Standard: 50 = 500 ms)
Persistence0x02P (1 Byte)CSMA-Persistenz-Parameter 0–255 (Standard: 63)
SlotTime0x03Intervall (1 Byte)CSMA-Slot-Intervall in 10-ms-Einheiten (Standard: 10 = 100 ms)
TXtail0x04Verzögerung (1 Byte)Haltezeit nach dem Senden in 10-ms-Einheiten (Standard: 0)
FullDuplex0x05Modus (1 Byte)0 = Halbduplex, ungleich 0 = Vollduplex (Standard: 0)
SetHardware0x06Sub-Command + DatenMeshCore-Erweiterungen (siehe unten)
Return0xFFKISS-Modus verlassen (keine Funktion)

TNC an Host

TypWertDatenBeschreibung
Data0x00Roh-PaketVom Funk empfangenes Paket

Data-Frames enthalten ausschließlich die rohen Paketdaten – es werden keine Metadaten vorangestellt. Die Nutzlast des Data-Befehls ist auf 255 Bytes begrenzt, was der maximalen Übertragungseinheit von MeshCore (MAX_TRANS_UNIT) entspricht. Frames, die größer als 255 Bytes sind, werden stillschweigend verworfen. Die KISS-Spezifikation empfiehlt mindestens 1024 Bytes für Allzweck-TNCs; dieses Modem ist jedoch ausschließlich für MeshCore-Pakete gedacht, deren Protokoll-MTU bei 255 Bytes liegt.

CSMA-Verhalten

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

  1. Sobald ein Paket in die Warteschlange kommt, wird die Trägererkennung (Carrier Detect) überwacht.
  2. Wenn der Kanal frei ist, wird ein Zufallswert zwischen 0 und 255 erzeugt.
  3. Ist der Wert kleiner oder gleich P (Persistence), wird nach Ablauf von TXDELAY gesendet.
  4. Andernfalls wird die SlotTime abgewartet und ab Schritt 1 wiederholt.
Im Vollduplex-Modus wird CSMA umgangen und Pakete werden direkt nach TXDELAY gesendet.

SetHardware-Erweiterungen (0x06)

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

Frame-Format

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

Anfrage-Sub-Commands (Host an TNC)

Sub-CommandWertDaten
GetIdentity0x01
GetRandom0x02Länge (1 Byte, 1–64)
VerifySignature0x03PubKey (32) + Signatur (64) + Daten
SignData0x04Zu signierende Daten
EncryptData0x05Key (32) + Klartext
DecryptData0x06Key (32) + MAC (2) + Chiffretext
KeyExchange0x07Remote PubKey (32)
Hash0x08Zu hashende Daten
SetRadio0x09Freq (4) + BW (4) + SF (1) + CR (1)
SetTxPower0x0ASendeleistung in dBm (1)
GetRadio0x0B
GetTxPower0x0C
GetCurrentRssi0x0D
IsChannelBusy0x0E
GetAirtime0x0FPaketlänge (1)
GetNoiseFloor0x10
GetVersion0x11
GetStats0x12
GetBattery0x13
GetMCUTemp0x14
GetSensors0x15Berechtigungen (1)
GetDeviceName0x16
Ping0x17
Reboot0x18
SetSignalReport0x19Enable (1): 0x00=deaktiviert, ungleich 0=aktiviert
GetSignalReport0x1A

Antwort-Sub-Commands (TNC an Host)

Antwort-Codes verwenden die High-Bit-Konvention: response = command | 0x80. Generische und unaufgeforderte Antworten nutzen den Bereich ab 0xF0.

Sub-CommandWertDaten
Identity0x81PubKey (32)
Random0x82Zufallsbytes (1–64)
Verify0x83Ergebnis (1): 0x00=ungültig, 0x01=gültig
Signature0x84Signatur (64)
Encrypted0x85MAC (2) + Chiffretext
Decrypted0x86Klartext
SharedSecret0x87Gemeinsames Geheimnis (32)
Hash0x88SHA-256-Hash (32)
Radio0x8BFreq (4) + BW (4) + SF (1) + CR (1)
TxPower0x8CSendeleistung in dBm (1)
CurrentRssi0x8DRSSI in dBm (1, vorzeichenbehaftet)
ChannelBusy0x8EErgebnis (1): 0x00=frei, 0x01=belegt
Airtime0x8FMillisekunden (4)
NoiseFloor0x90dBm (2, vorzeichenbehaftet)
Version0x91Version (1) + Reserviert (1)
Stats0x92RX (4) + TX (4) + Errors (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
InvalidLength0x01Anfragedaten zu kurz
InvalidParam0x02Ungültiger Parameterwert
NoCallback0x03Funktion nicht verfügbar
MacFailed0x04MAC-Verifizierung fehlgeschlagen
UnknownCmd0x05Unbekannter Sub-Command
EncryptFailed0x06Verschlüsselung fehlgeschlagen
TxBusy0x07Sender beschäftigt

Unaufgeforderte Ereignisse

Der TNC sendet diese SetHardware-Frames ohne vorangegangene Anfrage:

TxDone (0xF8): Wird nach dem Senden eines Pakets gesendet. Enthält ein einzelnes Byte: 0x01 bei Erfolg, 0x00 bei Fehler. RxMeta (0xF9): Wird unmittelbar nach jedem Standard-Data-Frame (Typ 0x00) gesendet und enthält Metadaten zum empfangenen Paket. Aufbau: SNR (1 Byte, vorzeichenbehaftet, Wert ×4 für 0,25-dB-Auflösung), gefolgt von RSSI (1 Byte, vorzeichenbehaftet, in dBm). Standardmäßig aktiviert; kann mit SetSignalReport ein- und ausgeschaltet werden. Standard-KISS-Clients ignorieren diesen Frame.

Datenformate

Funkparameter (SetRadio / Radio-Antwort)

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

FeldGrößeBeschreibung
Frequency4 BytesFrequenz in Hz (z. B. 869618000)
Bandwidth4 BytesBandbreite in Hz (z. B. 62500)
SF1 ByteSpreizfaktor (Spreading Factor, 5–12)
CR1 ByteCodierungsrate (Coding Rate, 5–8)

Version (Version-Antwort)

FeldGrößeBeschreibung
Version1 ByteFirmware-Version
Reserved1 ByteImmer 0

Verschlüsselt (Encrypted-Antwort)

FeldGrößeBeschreibung
MAC2 BytesHMAC-SHA256, auf 2 Bytes gekürzt
CiphertextvariabelAES-128-Block-verschlüsselte Daten mit Zero-Padding

Sendezeit (Airtime-Antwort)

Alle Werte sind Little-Endian.

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

Grundrauschen (NoiseFloor-Antwort)

Alle Werte sind Little-Endian.

FeldGrößeBeschreibung
Noise Floor2 Bytesint16_t, dBm (vorzeichenbehaftet)

Das Modem kalibriert den Noise Floor (Grundrauschpegel) alle 2 Sekunden neu und führt alle 30 Sekunden einen AGC-Reset (Automatic Gain Control) durch.

Statistik (Stats-Antwort)

Alle Werte sind Little-Endian.

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

Batterie (Battery-Antwort)

Alle Werte sind Little-Endian.

FeldGrößeBeschreibung
Millivolts2 Bytesuint16_t, Batteriespannung in mV

MCU-Temperatur (MCUTemp-Antwort)

Alle Werte sind Little-Endian.

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

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

Gerätename (DeviceName-Antwort)

FeldGrößeBeschreibung
NamevariabelUTF-8-String, ohne Null-Terminierung

Reboot (Neustart)

Sendet eine OK-Antwort, leert den seriellen Puffer und startet das Gerät anschließend neu. Der Host sollte damit rechnen, dass die Verbindung unterbrochen wird.

Sensor-Berechtigungen (GetSensors)

BitWertBeschreibung
00x01Basis (Batterie)
10x02Standort (GPS)
20x04Umgebung (Temperatur, Luftfeuchtigkeit, Luftdruck)
0x07 verwenden, um alle Berechtigungen anzufordern.

Sensordaten (Sensors-Antwort)

Die Daten werden im CayenneLPP-Format zurückgegeben. Informationen zum Parsen finden sich in der CayenneLPP-Dokumentation.

Kryptografische Algorithmen

VorgangAlgorithmus
Identität / Signieren / VerifizierungEd25519
Schlüsselaustausch (Key Exchange)X25519 (ECDH)
VerschlüsselungAES-128-Blockverschlüsselung mit Zero-Padding + HMAC-SHA256 (MAC auf 2 Bytes gekürzt)
HashingSHA-256

Hinweise

  • Die Nutzlast-Beschränkung auf 255 Bytes entspricht der MeshCore-Konstante MAX_TRANS_UNIT. Die KISS-Empfehlung von „mindestens 1024 Bytes" gilt für Allzweck-TNCs und ist für MeshCore nicht relevant.
  • Das Modem erzeugt beim ersten Start automatisch eine Identität, die im Flash-Speicher abgelegt wird.
  • Alle Mehrbyte-Werte sind Little-Endian, sofern nicht anders angegeben.
  • SNR-Werte in RxMeta sind mit 4 multipliziert, um eine Auflösung von 0,25 dB zu erreichen.
  • TxDone wird nach jeder Übertragung als SetHardware-Ereignis gesendet.
  • Standard-KISS-Clients empfangen ausschließlich Data-Frames vom Typ 0x00 und können alle SetHardware-Frames (0x06) gefahrlos ignorieren.
  • Siehe Paket-Format für die Paketstruktur.

Quelle: docs.meshcore.io