====== kassensichv.file ======
→ [[lyx_-_programmiersprache:units:kassensichv|Zurück zur KassenSichV-Übersicht]]
USB-TSE-Anbindung über das lokale Dateisystem. Unterstützt Swissbit, Epson und andere Hardware-TSEs, die über ein Dateiprotokoll kommunizieren. Kein Vendor-SDK erforderlich.
**Protokoll:** Der Provider schreibt Request-Dateien auf den TSE-Mount-Punkt, wartet auf Response-Dateien (Poll alle 100 ms), liest die Antwort und löscht beide Dateien.
===== Import =====
import kassensichv.types;
import kassensichv.file;
import kassensichv.manager;
===== Erzeugen =====
pub fn TseFileNew(configJson: int64): int64;
// configJson: pchar mit JSON-Konfiguration (Pflichtfeld: base_path)
// Gibt TseManager-Handle zurück (allokiert)
// Mit TseManagerFree() freigeben
===== Konfiguration =====
**Pflichtfeld:**
^ Feld ^ Typ ^ Beschreibung ^
| ''base_path'' | string | Pfad zum USB-TSE-Mount-Punkt (z.B. ''/mnt/tse'' oder ''E:\'') |
**Optionale Felder:**
^ Feld ^ Standard ^ Beschreibung ^
| ''timeout_ms'' | 5000 | Maximale Wartezeit auf TSE-Antwort in Millisekunden |
| ''poll_ms'' | 100 | Intervall zwischen Datei-Checks in Millisekunden |
===== Beispiel: Swissbit-USB-Stick =====
import kassensichv.types;
import kassensichv.file;
import kassensichv.manager;
fn main(): int64 {
var cfg: pchar := "{\"base_path\":\"/mnt/tse\",\"timeout_ms\":5000}"c;
var mgr: int64 := TseFileNew(cfg as int64);
var beleg: BelegDaten;
beleg.prozessTyp := PROZESSTYP_KASSENBELEG;
beleg.kassenNr := "KASSE-001"c;
beleg.prozessDaten := "Artikel;9.90_0.00_0.00_0.00_0.00"c;
beleg.umsatz := 990;
var sig: int64 := TseProcessBeleg(mgr, addr beleg);
var s: SigErgebnis := (sig as *SigErgebnis)^;
if s.success == 1 then {
PrintLn(s.qrCode as pchar);
} else {
Print("TSE-Fehler: "c); PrintLn(s.errorMsg as pchar);
}
SigErgebnisFree(sig);
TseManagerFree(mgr);
return 0;
}
===== Dateiprot okoll =====
Der Provider kommuniziert über JSON-Dateien auf dem TSE-Mount-Punkt:
**Request-Datei:** ''{base_path}/{TransId}_req.json''
{
"trans_id": "TX-20260612093045123",
"process_type": "Kassenbeleg-V1",
"process_data": "Kaffee;2.50_0.00_0.00_0.00_0.00",
"state": "FINISHED"
}
**Response-Datei:** ''{base_path}/{TransId}_res.json'' (von der TSE geschrieben)
{
"tse_serial": "SWB-0123456789ABCDEF",
"signature_counter": 42,
"transaction_counter": 42,
"signature_value": "MEQCIBaXyz..."
}
Nach erfolgreichem Lesen der Response werden **beide Dateien automatisch gelöscht** — keine manuelle Aufräumung nötig.
===== Timeout-Verhalten =====
Wenn die TSE die Response-Datei nicht innerhalb von ''timeout_ms'' schreibt:
* ''TseProcessBeleg'' gibt ''success=0'' zurück mit ''errorMsg'' "Timeout" und code=408
* Die Request-Datei bleibt auf dem TSE-Mount-Punkt liegen (TSE verarbeitet noch)
* **Compliance-Problem:** Die TSE-Transaktion kann noch offen sein — Kassensoftware muss dies erkennen und behandeln
Bei wiederhergestellter Verbindung den Status über ''TseGetStatus'' prüfen.
===== Mount-Punkt einrichten =====
Unter Linux muss der USB-TSE-Stick gemountet sein. Typisches Setup:
# USB-Stick als TSE-Mount einrichten
sudo mount /dev/sdb1 /mnt/tse
# Oder via /etc/fstab für dauerhaften Mount
UUID=xxx-yyy /mnt/tse vfat auto,user,rw 0 0
Seriennummer der TSE liegt in ''{base_path}/tse_serial.txt'' — wird beim ersten ''TseGetSerial'' gelesen.
===== Unterstützte Hardware =====
^ Hersteller ^ Modell ^ Anmerkung ^
| Swissbit | TSE-Stick (USB) | Weit verbreitet, FIFO-Dateiprotokoll |
| Epson | TSE-Stick (USB) | Ähnliches Dateiprotokoll |
| Generisch | beliebig | Jede Hardware, die das JSON-Request/Response-Protokoll implementiert |
**Wichtig:** Das konkrete Dateiformat kann je nach Hersteller leicht abweichen. ''kassensichv.file'' setzt die in der Bibliothek dokumentierte Format-Variante voraus. Bei abweichenden Formaten die Konfiguration des Herstellers prüfen.
-----
Letzte Aktualisierung: 2026-06-12