Files
bf-infra/docs/tp25-walk-messung.sh
Christoph Emsenhuber 66035c3166 Gehweg-Messung: gepingt wird vom Core, nicht vom Laptop
Pingt der messende Laptop das Telefon an, laeuft der Weg ueber zwei
Funkstrecken -- Laptop -> AP -> Core -> AP -> Telefon. Fehlt dann ein Paket, ist
nicht entscheidbar, welches der beiden Geraete weg war, und genau diese
Trennschaerfe ist der ganze Zweck der Messung. Vom Core aus ist die Strecke bis
zum AP durchgehend Kabel.

Ausloeser war unfreiwillig: das MacBook ist mitten in einem Lauf vom Dock ans
WLAN gewechselt und hat dabei die IP gewechselt -- die Konsole war ploetzlich
nicht mehr erreichbar, und der Ping haette ab da zwei Funkstrecken gemessen.

Das Ping-Protokoll ist jetzt eine CSV (ts_local,seq,ms; leeres ms = Verlust), die
Auswertung liest beide Formate, damit die Laeufe von gestern lesbar bleiben.
RouterOS-Dauern kommen als "3ms441us" oder "529us" und werden entsprechend
geparst.

Eine Falle steckt im Skript-Kommentar: tr puffert blockweise, sobald die Ausgabe
in eine Pipe geht -- die ersten ~130 Zeilen haengen im Puffer und die Datei
bleibt scheinbar leer. Das \r kommt deshalb im Shell-Loop weg, nicht per tr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 15:31:36 +02:00

99 lines
4.5 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"
# 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