netdiag-app/src/lib/types.ts
Eduard Wisch 3c95ff6b07
All checks were successful
Build APK / build-apk (push) Successful in 1m49s
Phase 6: IP-Test (Dose prüfen) und WLAN-Empfangstracker [apk]
IP-Test: USB-RJ45-Adapter in Netzwerkdose stecken und sofort IP-Adresse,
DHCP-Server, Gateway und Link-Geschwindigkeit (10/100/1000 Mbit) ablesen.
Auto-Refresh alle 2 s, Speichern mit optionalem Raum/Dose-Name ins Protokoll.

WLAN-Empfangstracker: Netz auswählen und beim Durchgehen live RSSI verfolgen.
Hybrid-Modus: 500 ms Polling bei verbundenem Netz (kein Scan-Throttling),
~30 s Scan-Sweep bei Fremd-BSSID. Sessions mit Samples, Min/Max/Avg und
Sparkline-Verlauf werden im Protokoll gespeichert.

Ersetzt DHCP-Info-Tool und WLAN-Scan-Tool (eigene Routen /iptest/ + /wifi/).
Kotlin-Plugin: linkInfo(), startWifiScan(), startWifiTrack/stop/status().

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 10:03:25 +02:00

210 lines
5.8 KiB
TypeScript

/**
* Gemeinsame Typen der NetDiag-App.
*/
/** Angemeldeter Benutzer (aus Dolibarr) */
export interface NetUser {
id: number;
login: string;
name: string;
email: string;
canWrite: boolean;
}
/** Kunde (Dolibarr thirdparty) */
export interface Customer {
id: number;
name: string;
code?: string;
address?: string;
zip?: string;
town?: string;
phone?: string;
email?: string;
protocolCount?: number;
}
/** Auftrag (Dolibarr commande) */
export interface Order {
id: number;
ref: string;
refClient?: string;
date?: number;
/** Unix-Zeit der letzten Änderung (Dolibarr commande.tms) — Sortierschlüssel der Liste */
tms?: number;
/** Dolibarr-Status: -1 storniert, 0 Entwurf, 1 validiert, 2 in Bearbeitung, 3 abgeschlossen */
status: number;
/** true wenn Status 0/1/2 (aktiver Auftrag) */
open: boolean;
/** Öffentliche Auftragsnotiz — oft die eigentliche Beschreibung */
note?: string;
protocolCount?: number;
customer?: Partial<Customer>;
}
/** Ein im Netzwerk gefundenes Gerät */
export interface Device {
/** lokale ID innerhalb des Protokolls (für Offline-Verknüpfung) */
clientId: string;
/** Server-Rowid nach Sync, sonst null */
serverId?: number | null;
ip: string;
mac?: string;
hostname?: string;
vendor?: string;
deviceType?: string;
note?: string;
/** vom Benutzer als Favorit markiert (bleibt auch ohne gespeicherten Scan erhalten) */
isFavorite?: boolean;
/** benutzervergebener Name, überschreibt hostname in der Anzeige */
customName?: string;
/** Unix-Zeit der letzten Sichtung im Netz */
lastSeen?: number;
/** zuletzt beim Port-Scan gefundene offene Ports */
openPorts?: number[];
/** NetBIOS-Name (UDP-137-Abfrage) */
netbiosName?: string;
/** mDNS/Bonjour-Name */
mdnsName?: string;
/** angebotene mDNS-Dienste, z.B. ['_printer._tcp', '_googlecast._tcp'] */
mdnsServices?: string[];
}
/** Eingefrorener Snapshot eines IP-Scans (wieder aufrufbar) */
export interface SavedScan {
id: string;
name: string;
/** Unix-Zeit der Speicherung */
createdAt: number;
subnet: string;
devices: Device[];
}
/** Ein Ereignis der Geräte-Überwachung */
export interface MonitorEvent {
/** Unix-Zeit des Ereignisses */
ts: number;
ip: string;
type: 'down' | 'up';
/** Dauer des vorangegangenen Ausfalls in Sekunden (nur bei 'up') */
durationSec?: number;
}
/** Überwachungs-Sitzung des Geräte-Monitors (Kamera-Problem) */
export interface DeviceMonitorSession {
id: string;
name: string;
startedAt: number;
endedAt?: number;
/** Prüfintervall in Sekunden */
intervalSec: number;
/** überwachte Geräte */
targets: { ip: string; label: string }[];
events: MonitorEvent[];
status: 'running' | 'stopped';
/** laufende Plugin-Lauf-ID (für Wiederaufnahme nach Seitenwechsel) */
runId?: string;
}
/** Aktives Netzwerk-Interface des Geräts (WLAN/Ethernet/Mobilfunk) */
export interface LinkInfo {
/** Name des Interfaces, z.B. "wlan0", "eth0", "rndis0" */
iface: string;
type: 'wifi' | 'ethernet' | 'cellular' | 'other';
/** USB-RJ45-Adapter erkannt (heuristisch über iface-Name) */
isUsbEthernet?: boolean;
/** ist dies das primäre Interface (Standardroute)? */
isDefault?: boolean;
ipv4?: string;
prefixLength?: number;
gateway?: string;
dns?: string[];
/** DHCP-Server (nur für WLAN ermittelbar) */
dhcpServer?: string;
leaseSec?: number;
/** Verbindungsgeschwindigkeit in Mbit/s — WLAN: linkSpeed; Ethernet: /sys/class/net/<iface>/speed */
linkSpeedMbps?: number;
/** Empfangs-Linkspeed (nur WLAN, API 29+) */
rxLinkSpeedMbps?: number;
/** WLAN-SSID (nur wenn type='wifi') */
ssid?: string;
/** WLAN-BSSID (nur wenn type='wifi') */
bssid?: string;
/** Empfangsstärke in dBm (nur wenn type='wifi') */
rssi?: number;
}
/** Einzelne RSSI-Probe des WLAN-Empfangstrackers */
export interface WifiSignalSample {
ts: number;
rssi: number;
/** woher der Wert kam: 'connected' = Live-RSSI vom verbundenen AP, 'scan' = aus Scan-Ergebnis */
source: 'connected' | 'scan';
}
/** Tracker-Session für die WLAN-Empfangsprüfung beim Durchlaufen */
export interface WifiTrackSession {
id: string;
name: string;
startedAt: number;
endedAt?: number;
bssid: string;
ssid: string;
band: string;
channel: number;
samples: WifiSignalSample[];
min?: number;
max?: number;
avg?: number;
status: 'running' | 'stopped';
runId?: string;
/** Mess-Modus: live (verbundenes Netz) oder periodischer Scan */
mode?: 'connected' | 'scan';
}
/** Ampel-Bewertung einer Messung */
export type MeasureStatus = 0 | 1 | 2; // 0=ok, 1=warn, 2=fail
/** Ergebnis eines Tool-Laufs */
export interface Measurement {
clientId: string;
/** lokale ID des zugehörigen Geräts, falls geräte-bezogen */
deviceClientId?: string | null;
tool: string;
category: string;
label: string;
params: Record<string, unknown>;
result: Record<string, unknown>;
measureStatus: MeasureStatus;
dateMeasure: number;
}
/** Diagnose-Protokoll (Offline-Datensatz der App) */
export interface Protocol {
clientUuid: string;
/** Server-Rowid nach Sync */
serverId?: number | null;
ref?: string;
label: string;
socId?: number | null;
socName?: string;
orderId?: number | null;
orderRef?: string;
dateDiag: number;
location: string;
subnet: string;
/** 0 = Entwurf, 1 = abgeschlossen */
status: number;
note: string;
devices: Device[];
measurements: Measurement[];
/** gespeicherte IP-Scan-Snapshots (nur lokal, wird nicht synchronisiert) */
savedScans?: SavedScan[];
/** Geräte-Überwachungs-Sitzungen (nur lokal, wird nicht synchronisiert) */
monitorSessions?: DeviceMonitorSession[];
/** WLAN-Empfangstracker-Sessions (nur lokal, wird nicht synchronisiert) */
wifiTrackSessions?: WifiTrackSession[];
/** true solange noch nicht zum Server synchronisiert */
dirty: boolean;
updatedAt: number;
}