Beim Wiederholungsbesuch die erste Frage des Kunden ("da ist doch nichts
dazugekommen, oder?") und die einzige, die ein einzelnes Protokoll nicht
beantworten kann. Das Werkzeug holt das juengste fruehere Protokoll desselben
Kunden vom Server und vergleicht die Geraetelisten.
KEINE Wiedererkennung ueber MAC: /proc/net/arp ist ab Android 10 gesperrt, im
ausgelieferten Protokoll ND2026-0015 hatten ALLE 68 Geraete keine MAC. Ein
MAC-Diff haette dort bei jedem Besuch "alles neu, alles verschwunden"
gemeldet - schlimmer als gar keine Aussage, weil es im Kundendokument nach
einem umgebauten Netz aussieht. Stattdessen eine Kaskade: MAC (falls
ausnahmsweise da), mDNS-Name, NetBIOS-Name, Hostname, IP+Portmuster. Jede
Zeile nennt, worueber sie zugeordnet wurde - "erkannt ueber IP und Portmuster"
ist eine schwaechere Aussage als "ueber Netzwerkname".
Im Emulator gegen echte Serverdaten geprueft. Dabei ein Fehler gefunden und
behoben: dieselbe Adresse stand gleichzeitig unter "neu" und "nicht mehr
erreichbar", weil sich nur das Portmuster geaendert hatte. Formal richtig, im
Kundendokument aber Unsinn - liest sich wie ein kaputtes Werkzeug. Solche
Faelle haben jetzt eine eigene Kategorie "Gleiche Adresse, andere offene
Ports", die sogar der interessantere Befund ist.
Bewertung bewusst ohne Rot: ein neues Geraet ist erst einmal eine Tatsache,
womoeglich hat der Techniker es selbst angeschlossen. Gelb nur, wenn etwas
fehlt oder die Zuordnung wackelt (ab 50 % schwache Zuordnung).
tools/pruefe-geraetediff.mjs: 20 Faelle, alle mit Geraeten OHNE MAC - so wie
sie beim Kunden ankommen. Der Browser-Mock gibt jedem Geraet eine MAC, dort
saehe auch ein naiver MAC-Diff perfekt aus.
Ausserdem: Server-Adresse wird jetzt geprueft. Eine http://-Adresse wird
abgewiesen, solange die App selbst ueber https laeuft - sie wuerde sonst stumm
scheitern ("Keine Verbindung zum Server", wahrer Grund nur im logcat). Ein
Debug-Build auf http://localhost darf HTTP dagegen, sonst waere der Testbau
unbenutzbar. tools/pruefe-serveradresse.mjs: 11 Faelle.
Neu in api.ts: getProtocol() laedt ein Protokoll samt Geraeten vom Server -
nur lesend, das fruehere Protokoll wird nie ueberschrieben.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .forgejo/workflows | ||
| android | ||
| native-plugin | ||
| src | ||
| tools | ||
| .gitignore | ||
| capacitor.config.ts | ||
| package.json | ||
| README.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
NetDiag — Diagnose-App (Android)
Mobile Netzwerk-Diagnose-App. Erfasst vor Ort beim Kunden (Handy am WLAN oder
USB-C→RJ45-Adapter) Geräte, Ports und Messungen und hängt die Protokolle ans
Dolibarr-Modul netdiag an Kunde und Auftrag.
Stack
SvelteKit 2 · Svelte 5 · Tailwind 4 · Vite 7 · Capacitor 6 · SQLite-Offline
Entwicklung (Browser)
npm install
npm run dev # http://localhost:5175
Im Browser liefert ein Mock (src/lib/scanner.ts) Beispiel-Scandaten — die
Oberfläche lässt sich ohne Gerät entwickeln. API-Aufrufe gehen über den
Vite-Proxy an den Dolibarr-Testserver (192.168.155.11, siehe vite.config.ts).
Android-Build
npm run build
npx cap add android # einmalig
# android/ liegt komplett im Repo — cap sync kopiert nur die Web-Assets
npx cap sync android
npx cap open android
Release-APK über CI: Commit mit [apk] in der Message → Forgejo baut und lädt
die APK in die Package Registry (netdiag-apk). Siehe .forgejo/workflows/build.yml.
Architektur
src/lib/
api.ts JSON-API-Client (JWT, 401-Refresh, Timeout)
auth.svelte.ts Anmelde-Status
db.ts Offline-Speicher (SQLite nativ / localStorage Browser)
sync.svelte.ts Sync-Queue -> Dolibarr (idempotent über clientUuid)
scanner.ts Brücke zum nativen Plugin (+ Browser-Mock)
protocols.ts Protokoll-Operationen (addMeasurement, upsertDevice, …)
messfelder.ts Beschriftung der Ergebnisfelder — Gegenstück zur
Whitelist im Dolibarr-Modul (siehe „Neues Tool")
toolparams.ts Gedächtnis der zuletzt benutzten Werkzeug-Parameter
stresstest.ts Auswertung des Dauertests (überlebt App-Wechsel)
monitor.ts Auswertung der Geräte-Überwachung -> Verfügbarkeit
wifi/ Kanalgraph-Geometrie, Kanalempfehlung, Bewertung, Demodaten
overlay.svelte.ts Overlay-Stapel für den Hardware-Zurück-Knopf
toast.svelte.ts kurze Rückmeldungen
backButton.svelte.ts Hardware-Back (Single-Instance, KB #480/#549)
updater.ts APK-Auto-Update-Prüfung (KB #363)
tools/ erweiterbare Tool-Plattform
index.ts Registry — neues Tool hier eintragen
netzwerk/ IP-Scan, Port, Ping, IP-Konflikt, SNMP, Traceroute, Stress
internet/ Durchsatz-Test
telefonie/ leer — geplant: SIP-Erreichbarkeit über OPTIONS.
RTP-Sprachqualität bewusst NICHT (ohne aufgebautes
Gespräch nicht ehrlich messbar, siehe ROADMAP_UMSETZUNG.md)
src/routes/
login/ auftraege/ kunden/ einstellungen/
protokoll/[id]/ Hauptseite mit Werkzeugen, Geräten, Messungen
protokoll/[id]/stresstest/ monitor/ iptest/ wifi/ wifikanal/
Werkzeuge mit Live-Anzeige — eigene Seite statt
Dialog, weil sie über Minuten/Stunden laufen
android/ natives Android-Projekt inkl. Kotlin-Plugin (einzige Quelle)
native-plugin/ nur noch Anleitung/Hinweise zum Plugin
tools/ Prüfwerkzeuge ohne Gerät (siehe unten)
Prüfwerkzeuge (tools/, laufen ohne Handy)
node tools/render-chart.mjs # rendert die echten Diagramm-Komponenten
# nach .render/*.svg — ansehen, nicht annehmen
node tools/pruefe-monitor.mjs # rechnet die Verfügbarkeits-Auswertung gegen
# konstruierte Fälle mit Handwerten durch
node tools/test-recommend.mjs # Kanalempfehlung
render-chart.mjs gibt es, weil die erste Fassung der WLAN-Diagramme unbemerkt
unlesbar in den Einsatz ging: der Emulator hat keine WLAN-Hardware, also war
nie ein gefülltes Diagramm zu sehen. SVGs mit rsvg-convert x.svg -o x.png
in ein ansehbares Bild wandeln.
Neues Tool hinzufügen
- Datei unter
src/lib/tools/<kategorie>/<id>.tsanlegen,Toolimplementieren. - In
src/lib/tools/index.tsimportieren und inTOOLSeintragen. quickRun: truesetzen, wenn das Werkzeug ohne Eingabe sinnvoll startet (kurzer Tap startet dann sofort, langes Halten öffnet die Optionen). Ausdrücklich je Werkzeug entscheiden — es gibt keinrequiredan den Parametern, die Pflicht steht allein imrun()-Rumpf.portscan.portshat keinen Vorgabewert und ist trotzdem optional,iperf.hosthat ebenfalls keinen und ist Pflicht.- Jeden neuen Ergebnis-Schlüssel in BEIDE Feldtabellen eintragen:
src/lib/messfelder.ts(App-Anzeige)netdiagKundenfelder()indolibarr-modul/netdiag/lib/netdiag.lib.php— das ist eine harte Whitelist: was dort fehlt, verschwindet im Kunden-PDF spurlos, übrig bleibt die nackte Ampel. Ebenso den Klarnamen des Werkzeugs innetdiagToolName(), sonst steht beim Kunden „[netzwerk] meintool".
Punkt 4 ist der Schritt, der hier schon zweimal vergessen bzw. geraten wurde. Beim ersten Mal wurde die Whitelist gegen selbst erfundene Testdaten gebaut, beim zweiten Mal stand
'typ'darin statt des real gelieferten'type'— im Abnahmebeleg für eine Netzwerkdose fehlte dadurch die Angabe, ob per LAN oder WLAN gemessen wurde. Feldnamen immer aus dem erzeugenden Code ablesen, nie aus dem Kopf. (KB #1084)
Sync und Datenbank brauchen keinen Eingriff — das Ergebnis ist generisches JSON.
Braucht das Tool eine neue native Messroutine: Methode im Kotlin-Plugin,
Eintrag im Interface NetDiagScannerPlugin und ein Zweig im Browser-Mock
(beides in src/lib/scanner.ts) — ohne Mock lässt sich nichts ohne Gerät
prüfen, und ein Mock, der nur den Gutfall zeigt, bestätigt genau die Annahme,
die im Feld nicht gilt (KB #1086).
Bedienung
- Anmelden (Dolibarr-Zugang; auf dem Gerät zusätzlich Server-URL).
- Aufträge — aktive direkt sichtbar, abgeschlossene per Checkbox, Suche. Alternativ über Kunden suchen.
- Auftrag/Kunde antippen → Diagnose-Protokoll öffnet sich.
- Werkzeuge ausführen (IP-Scan füllt die Geräteliste, je Gerät weitere Tools). Bei den meisten Karten steht „Tippen startet · Halten für Optionen": kurzer Tap startet sofort mit den zuletzt benutzten Werten, langes Halten öffnet den Parameterdialog. Nach der Messung springt die Ansicht zum frischen Ergebnis.
- Abschließen & synchronisieren — Protokoll geht ans Dolibarr, PDF landet im ECM. Offline bleibt es lokal und synct automatisch bei Verbindung.
Selten gebrauchte Aktionen (Protokoll löschen) liegen hinter den drei Punkten in der Kopfzeile — bewusst nicht neben dem grünen Abschließen-Knopf.
Ohne Gerät prüfen
- Browser (
npm run dev): Mock-Scanner liefert Beispieldaten. - WLAN-Demomodus (Einstellungen → WLAN-Demodaten): 18 erfundene Netze mit allen Grenzfällen — Mesh, Co-Channel, 40 MHz im 2,4-GHz-Band, DFS, 160 MHz, Bandrand. Nötig, weil der Emulator keine WLAN-Hardware hat und jeder Scan null Netze liefert. Gespeicherte Momentaufnahmen werden als Demo gekennzeichnet.
- Diagramme:
tools/render-chart.mjs(siehe oben).