Inhaltsverzeichnis

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:

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