Bisher zeigte die App nur eine Liste sichtbarer Netze ohne Kanalgraph, ohne
Empfehlung und ohne Möglichkeit, einen Kanalwechsel vorher/nachher zu
vergleichen. Fester 800-ms-Sleep statt auf den echten Scan zu warten, keine
Reaktion auf ausgeschaltete Ortung, Standortberechtigung auch dort nötig, wo
Android 13+ das gar nicht mehr verlangt.
Nativ (NetDiagScannerPlugin.kt):
- wifiScan liefert jetzt frequency, widthMhz, centerFreq0/1, standard
(Wi-Fi 4/5/6/7), security (offen/WEP/WPA/WPA2/WPA3), ageMs, band
(inkl. 6 GHz) je Netz. freqToChannel() um das 6-GHz-Band erweitert
(inkl. Sonderfall Kanal 2/PSC).
- wifiScan({trigger:true}) löst einen frischen Scan aus und wartet auf
SCAN_RESULTS_AVAILABLE_ACTION (5s Zeitgrenze) statt blind zu schlafen.
- isLocationEnabled()-Prüfung + openLocationSettings(): ausgeschaltete
Ortung (< Android 13) ergibt jetzt einen Klartextfehler mit direktem
Weg zu den Einstellungen statt einer stillen leeren Liste.
- NEARBY_WIFI_DEVICES (API 33+, neverForLocation) statt Standortrecht —
eigenes Berechtigungs-Alias, wifiScanPermissionAlias() wählt je nach
SDK-Version; gilt für wifiScan/startWifiScan/startWifiTrack gemeinsam.
App:
- WifiChannelChart.svelte: Kanalgraph 2,4/5/6 GHz als Inline-SVG — Bögen
mit Kanalbreite als Bogenbreite, Signalstärke als Bogenhöhe, Überlapp
(Co-/Adjacent-Channel) direkt als sichtbare Farbverdichtung.
- wifi/recommend.ts: beste der drei nicht überlappenden 2,4-GHz-Kanäle
nach Störlast + zwei feste Warnregeln (40 MHz im 2,4-GHz-Band,
160 MHz/DFS im 5-GHz-Band).
- wifi/rating.ts: rssiRating() vereinheitlicht — ersetzt drei Kopien mit
unterschiedlichen Schwellen (iptest/+page.svelte, wifi/+page.svelte
zweimal).
- Neue Route /protokoll/{id}/wifikanal/ + Werkzeug-Kachel "WLAN-Kanäle":
Netzliste nach SSID gruppiert (Mesh), Momentaufnahmen speichern
(protocol.wifiSurveys, nur lokal), automatischer Kanaländerungs-Hinweis
seit der letzten Aufnahme, Zeitverlauf mehrerer Netze aus den
gespeicherten Momentaufnahmen (echte Zeitstempel, feste Y-Skala
-100..-20 dBm, Messlücken reißen die Linie statt sie zu überbrücken).
Im Emulator getestet (API 33+): NEARBY_WIFI_DEVICES-Berechtigungsdialog
erscheint und wird korrekt verarbeitet — echte Bestätigung, kein
Codereview-only. Leerer Netz-Zustand rendert sauber. Der AVD hat keine
echte WLAN-Hardware (liefert grundsätzlich 0 Scan-Ergebnisse) — Kanalgraph
mit echten Netzen und der Ortung-aus-Zweig (<Android 13, auf diesem API-33-
AVD unerreichbar) konnten deshalb nicht live geprüft werden, nur die
Chart-Mathematik gegen die Mock-Werte durchgerechnet (keine NaN/Werte
außerhalb des Zeichenbereichs). Sollte auf einem echten Handy mit echtem
WLAN-Empfang gegengeprüft werden.
Details: ROADMAP_UMSETZUNG.md Phase 4
31 lines
1.4 KiB
TypeScript
31 lines
1.4 KiB
TypeScript
/**
|
|
* Gemeinsame WLAN-Empfangsbewertung (RSSI in dBm).
|
|
*
|
|
* Vorher gab es drei Kopien mit unterschiedlichen Schwellen: `iptest/+page.svelte`
|
|
* und `wifi/+page.svelte` hatten je eine eigene `rssiColor()` (beide -55/-70,
|
|
* zufällig gleich), UND `wifi/+page.svelte` hatte zusätzlich eine `rssiLabel()`
|
|
* mit eigenen, davon abweichenden Schwellen (-55/-65/-75) — derselbe Messwert
|
|
* konnte je nach Stelle unterschiedlich benannt werden. Diese Funktion ist jetzt
|
|
* die einzige Stelle, die entscheidet.
|
|
*
|
|
* Schwellen orientieren sich an gängigen WLAN-Planungswerten: ab -55 dBm
|
|
* exzellent, ab -67 dBm noch zuverlässig für Video/Voice, ab -75 dBm gerade
|
|
* noch brauchbar (Web/E-Mail), darunter unzuverlässig.
|
|
*/
|
|
|
|
import type { MeasureStatus } from '../types';
|
|
|
|
export interface RssiRating {
|
|
label: string;
|
|
colorClass: string;
|
|
/** Ampel-Bewertung — 0 ok, 1 warn, 2 fail */
|
|
status: MeasureStatus;
|
|
}
|
|
|
|
export function rssiRating(rssi: number | undefined | null): RssiRating {
|
|
if (rssi == null) return { label: '—', colorClass: 'text-zinc-500', status: 1 };
|
|
if (rssi >= -55) return { label: 'sehr gut', colorClass: 'text-emerald-400', status: 0 };
|
|
if (rssi >= -67) return { label: 'gut', colorClass: 'text-emerald-400', status: 0 };
|
|
if (rssi >= -75) return { label: 'mäßig', colorClass: 'text-amber-400', status: 1 };
|
|
return { label: 'schwach', colorClass: 'text-red-400', status: 2 };
|
|
}
|