Files
bf-infra/docs/tp25-walk-messung.sh
Christoph Emsenhuber 5231f7b69b AP-Pin fuer den Rundgang -- und drei Dinge, die dabei still falsch waren
TP25: das S22 laesst sich jetzt per access-list am Manager auf EINEN AP
festnageln (docs/tp25-pin-s22.sh, Umschalter in der Klick-Konsole). Damit
werden Einzel-AP-Abdeckungskarten messbar, statt dass der Client mitten im
Weg wechselt. Gepinnt wird der Standort, nicht das Band -- Band-Ping-Pong
(Fund C) bleibt damit ein echter Befund und wird nicht wegkonfiguriert.

Beim Bauen fielen drei Fehler auf, die alle dieselbe Form haben: eine
Konstante, die einmal richtig war.

1. Die AP-Zuordnung war VERTAUSCHT. server.py und tp25-gehweg-auswertung.py
   fuehren cap-wifi1/2 als ap1 -- live ist es ap2 (belegt ueber cap=,
   configuration= und Kanal). Baender stimmten, Identitaet nicht. Die
   cap-wifiN-Nummern vergibt der Manager dynamisch in der Anmeldereihenfolge
   der CAPs, jede feste Tabelle dazu wartet auf den naechsten AP-Reboot.
   server.py liest sie jetzt vom Geraet; die Auswertung ist NOCH NICHT
   angefasst -- offen ist, ob die Funde vom 08-21 mit vertauschten AP-Namen
   notiert sind.

2. Das Laufverzeichnis war beim Serverstart eingefroren. Die Konsole laeuft
   als Dauer-Preview, der Messlauf legt spaeter ein neues Verzeichnis an --
   Marker waeren in den Lauf von gestern gewandert, waehrend der Sampler ins
   neue schreibt. tp25-walk-messung.sh hinterlaesst jetzt einen Zeiger.

3. Das Startbanner nannte eine hartkodierte IP (10.40.10.183 = MacBook Air).
   Auf dem Mac mini ist es 10.40.10.82, und genau die falsche Adresse ging
   ans Telefon: "geht nicht" bei einem Server, der sauber auf 0.0.0.0 lauschte.
   Es werden jetzt die real gefundenen Interface-Adressen gedruckt.

Ausserdem, aus dem Test heraus:
- Ein vom Pin ABGEWIESENER Verbindungsversuch ist in den Ping-Daten nicht von
  einem Funkloch zu unterscheiden, und der Manager protokolliert ihn auf
  info-Ebene nicht. Android quittiert ihn mit "Verbindung fehlgeschlagen" und
  waehlt das Netz ab -- danach misst der Rest des Rundgangs Stille. Die Konsole
  schlaegt deshalb mit Vollbanner, Ton und Vibration Alarm, sobald das gepinnte
  Geraet nirgends haengt.
- Die Konsole laeuft diesmal auf dem S22 selbst, also auf genau dem Geraet, das
  der Pin gleich vom WLAN wirft. Die Anweisung zum Wiederverbinden erscheint
  deshalb clientseitig VOR dem Abbruch.
- ThreadingHTTPServer: der Pin braucht ~8 s ueber SSH und haette sonst die
  ganze Seite blockiert, Not-Aus inklusive.

Governance: /interface wifi access-list steht unter KEINER ComplianceRule --
der Change erzeugt keinen Drift und laesst sich nicht als Transaktion fuehren.
Fuer eine Messung vertretbar; relevant wird es, wenn Fund E (signal-range)
dauerhaft dort landet.

teilprojekte.md: die beiden Hinweise auf die offene Transaktion
TEST-ether3-trunk-ap1-sideboard nachgezogen -- sie ist seit 08-22
zurueckgerollt, crs326-core ist transaktionsfrei.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 20:21:55 +02:00

105 lines
4.9 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# TP25 — Gehweg-Messung: was kostet eine WLAN-Uebergabe wirklich?
#
# Beantwortet die Frage, die die Sampler-Daten offen lassen: bei jedem AP-/Bandwechsel steht in
# der Registration-Table ~4 s lang kein Durchsatz — aber die Zaehler starten nach einer
# Neuanmeldung ohnehin bei null. Ein Ping AUF das Telefon trennt beides:
# Paketverlust = echte Funkstille · kein Verlust = die 4 s waren Buchhaltung.
#
# Gepingt wird VOM CORE aus (Kabel bis zum AP), damit der Verlust eindeutig dem Telefon
# gehoert und nicht der Funkstrecke des messenden Laptops.
#
# Braucht KEINEN Call. Misst nur, aendert nichts.
#
# bash docs/tp25-walk-messung.sh # laeuft bis Ctrl-C bzw. bis "Stoppen" geklickt wird
#
# Waehrend des Gehens auf der Konsole: 🚶 beim Losgehen, 📍 beim Stehenbleiben.
set -uo pipefail
RUN_DIR="${TP6_RUN_DIR:-/private/tmp/claude-501/-Users-christophemsenhuber-dev-bf-network-r6/0d86ebd1-035f-4513-a231-5cca8111ecfd/scratchpad/tp6-run2}"
PHONE="${TP25_PHONE_IP:-10.40.10.196}"
PHONE_MAC="${TP25_PHONE_MAC:-F2:62:4C:E1:AF:09}"
STATE="$RUN_DIR/phase.json"
MARKERS="$RUN_DIR/markers.csv"
HERE="$(cd "$(dirname "$0")/.." && pwd)"
mkdir -p "$RUN_DIR"
[[ -f "$MARKERS" ]] || echo "ts_epoch,ts_local,marker" > "$MARKERS"
# Zeiger fuer die Klick-Konsole (docs/tp6-marker/server.py). Die laeuft als Dauer-Preview
# auf Port 3031 und kennt dieses Verzeichnis sonst nicht -- ihre Marker landeten dann im
# Lauf von gestern, waehrend der Sampler hierher schreibt. Beides fiel erst bei der
# Auswertung auf, wenn die Raummarken fehlten.
printf '%s\n' "$RUN_DIR" > "$HERE/docs/tp6-marker/.current-run"
# Frueheren Lauf beiseitelegen, statt ihn zu ueberschreiben.
if [[ -f "$RUN_DIR/sampler.csv" ]]; then
ARCHIV="$RUN_DIR/archiv-$(date +%H%M%S)"; mkdir -p "$ARCHIV"
for f in sampler.csv markers.csv walk-ping.csv walk-ping.log ping-dauerlauf.log; do
[[ -f "$RUN_DIR/$f" ]] && mv "$RUN_DIR/$f" "$ARCHIV/"
done
echo "ts_epoch,ts_local,marker" > "$MARKERS"
echo "Vorheriger Lauf -> $ARCHIV"
fi
state() {
python3 - "$STATE" "$1" <<'PY'
import json, os, sys
p, inst = sys.argv[1], sys.argv[2]
tmp = p + ".tmp"
with open(tmp, "w") as fh:
json.dump({"mode": "langzeit", "phase": "GEHWEG", "title": "Roaming-Messung läuft",
"instruction": inst, "step": 0, "steps": 0, "ends": 0}, fh)
os.replace(tmp, p)
PY
}
state "Kein Call nötig. <b>🚶</b> drücken, wenn du losgehst, <b>📍</b> wenn du stehen bleibst — und bitte den Weg gehen, den du beim Telefonieren wirklich gehst.<br><br>Ich pinge dein Telefon fünfmal pro Sekunde. Jeder AP- oder Bandwechsel zeigt sich dann als echter Paketverlust: <b>so lange ist der Call wirklich tot.</b><br><br>Am Ende: <b>⏹ Aufzeichnung stoppen</b>."
# Sampler am Manager (1-s-Takt, feiner als bei der TP6-Messung)
bash "$HERE/docs/tp6-monitor-core.sh" --out "$RUN_DIR/sampler.csv" --mac "$PHONE_MAC" --interval 1 \
> "$RUN_DIR/sampler.out" 2>&1 & SAMPLER=$!
# 5 Pings/s auf das Telefon — GEPINGT WIRD VOM CORE, nicht von diesem Rechner.
# 🔴 Der Grund: pingt der Laptop, laeuft der Weg ueber ZWEI Funkstrecken (Laptop -> AP ->
# Core -> AP -> Telefon). Fehlt dann ein Paket, ist nicht entscheidbar, welches der
# beiden Geraete weg war. Vom Core aus ist die Strecke bis zum AP durchgehend Kabel,
# also misst der Verlust genau das, was er messen soll: den Funk zum Telefon.
# (Aufgefallen am 2026-08-21, als das MacBook waehrend einer Messung vom Dock ans
# WLAN wechselte und dabei auch noch die IP wechselte.)
PW="$(grep -m1 '^CRS326_CORE_PASS=' ~/.secrets/credentials.env | cut -d= -f2- | sed 's/^["'"'"'"'"'"']//; s/["'"'"'"'"'"']$//')"
echo "ts_local,seq,ms" > "$RUN_DIR/walk-ping.csv"
(
while true; do
sshpass -p "$PW" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=8 \
-o ServerAliveInterval=15 admin@10.40.99.1 \
"/ping $PHONE interval=200ms count=100000" 2>/dev/null \
| while IFS= read -r l; do
l="${l%$'\r'}"
case "$l" in
*SEQ*HOST*) continue ;;
esac
seq="$(printf '%s' "$l" | awk '{print $1}')"
case "$seq" in
''|*[!0-9]*) continue ;;
esac
case "$l" in
*timeout*) printf '%s,%s,\n' "$(date +%H:%M:%S)" "$seq" ;;
*) printf '%s,%s,%s\n' "$(date +%H:%M:%S)" "$seq" \
"$(printf '%s' "$l" | awk '{print $NF}')" ;;
esac
done >> "$RUN_DIR/walk-ping.csv"
printf '%s,,RECONNECT\n' "$(date +%H:%M:%S)" >> "$RUN_DIR/walk-ping.csv"
sleep 2
done
) & PINGER=$!
trap 'kill $SAMPLER $PINGER 2>/dev/null; pkill -f "ping $PHONE interval=200ms" 2>/dev/null; state "Aufzeichnung gestoppt."; echo; echo "Gestoppt."' EXIT
echo "Gehweg-Messung laeuft."
echo " Funk -> $RUN_DIR/sampler.csv"
echo " Ping -> $RUN_DIR/walk-ping.csv (Quelle: crs326-core)"
while true; do touch "$STATE" 2>/dev/null; sleep 5; done