kassensichv.file
→ 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:
TseProcessBeleggibtsuccess=0zurück miterrorMsg„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
