TP25/TP28: Walk-Harness auf N Geräte, Analyzer generalisiert, AP-Map-Fix
- tp25-walk-messung.sh: halber Refactor geschlossen — Rumpf schleift ueber die PH_*-Arrays (pro Geraet ein Sampler + ein Core-Ping, sampler-<name>.csv / walk-ping-<name>.csv), PID-Arrays im Cleanup, Archiv-/Echo-Block generisch. Lief vorher unter set -u gar nicht (unbound $PHONE_MAC). - tp25-gehweg-auswertung.py: liest N benannte Geraete per glob; altes 2-Rollen- Schema (sampler.csv/walk-ping.csv/walk-ping-iphone.csv/beide-telefone.csv) bleibt als Legacy-Fallback erhalten. Beide Pfade getestet. - tp25-pin-s22.sh: karte() repariert — channel.frequency ist seit dem DFS-Kanalplan (2026-09-03, Frequenz-Listen) ein Array; der alte Skalar-Vergleich blankte map, wodurch ap-map.txt leer blieb. Fix nimmt bei :typeof=array das erste Element. Live-Smoke (4 Geraete) gruen: alle erreichbar, sauberes Cleanup, korrekte AP-Map. Naechster Schritt: In-situ-Walk (nur Zahlen, Commit/Rollback des Kanalplans separat). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -19,14 +19,24 @@
|
||||
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.178}" # S22 -- wird gepingt und gesampelt
|
||||
PHONE_MAC="${TP25_PHONE_MAC:-2A:0D:B0:5D:AD:A7}"
|
||||
# 🔴 Seit dem Lauf vom 2026-08-22 wird das ZWEITE Telefon mitgepingt. Vorher lief der Ping
|
||||
# nur auf das gepinnte Geraet -- und weil das per Automatik immer auf dem GEGEN-AP sitzt,
|
||||
# fehlte ausgerechnet die Strecke, die die Alltagsabdeckung zeigt. Der Terrassen-Vergleich
|
||||
# liess sich deshalb nicht fuehren, obwohl beide Telefone dabei waren.
|
||||
PHONE2="${TP25_PHONE2_IP:-10.40.10.196}" # iPhone -- roamt frei
|
||||
PHONE2_NAME="${TP25_PHONE2_NAME:-iphone}"
|
||||
|
||||
# 🔴 Handy-Liste generalisiert (2026-09-03, TP25-4-Handy-Messung): statt zwei hartkodierter
|
||||
# Telefone eine Liste. Format: "name|ip|mac;name|ip|mac;..." -- '|' als Feldtrenner (die MAC
|
||||
# enthaelt selbst ':'), ';' als Listentrenner. Pro Handy laeuft EIN eigener Sampler
|
||||
# (sampler-<name>.csv) UND ein eigener Core-Ping (walk-ping-<name>.csv). Default = die
|
||||
# bisherigen zwei, damit alte Aufrufe unveraendert weiterlaufen.
|
||||
# Der Core-Ping (5/s) erzeugt zugleich den Dauer-Downlink, der die Taschen-Handys wach haelt.
|
||||
TP25_PHONES="${TP25_PHONES:-iphone|10.40.10.196|F2:62:4C:E1:AF:09;s22|10.40.10.178|2A:0D:B0:5D:AD:A7}"
|
||||
declare -a PH_NAME PH_IP PH_MAC
|
||||
IFS=';' read -ra _ENTRIES <<< "$TP25_PHONES"
|
||||
for _e in "${_ENTRIES[@]}"; do
|
||||
[[ -z "${_e//[[:space:]]/}" ]] && continue
|
||||
IFS='|' read -r _n _ip _mac <<< "$_e"
|
||||
[[ -n "$_n" && -n "$_ip" && -n "$_mac" ]] || { echo "TP25_PHONES-Eintrag unvollstaendig: '$_e' (erwartet name|ip|mac)" >&2; exit 2; }
|
||||
PH_NAME+=("$_n"); PH_IP+=("$_ip"); PH_MAC+=("$_mac")
|
||||
done
|
||||
[[ ${#PH_NAME[@]} -gt 0 ]] || { echo "TP25_PHONES leer/ungueltig: '$TP25_PHONES'" >&2; exit 2; }
|
||||
|
||||
STATE="$RUN_DIR/phase.json"
|
||||
MARKERS="$RUN_DIR/markers.csv"
|
||||
HERE="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
@@ -51,10 +61,17 @@ bash "$HERE/docs/tp25-pin-s22.sh" map > "$RUN_DIR/ap-map.txt" 2>/dev/null \
|
||||
|| echo "⚠️ AP-Zuordnung konnte nicht gelesen werden -- Auswertung bleibt bei cap-wifiN"
|
||||
|
||||
# Frueheren Lauf beiseitelegen, statt ihn zu ueberschreiben.
|
||||
if [[ -f "$RUN_DIR/sampler.csv" ]]; then
|
||||
# 🔴 Seit dem N-Geraete-Umbau (2026-09-04) schreiben neue Laeufe pro Geraet
|
||||
# sampler-<name>.csv / walk-ping-<name>.csv -- der alte Trigger auf die nackte sampler.csv
|
||||
# haette einen Re-Run nicht mehr erkannt und den Vorlauf ueberschrieben. Legacy-Namen
|
||||
# (sampler.csv/walk-ping.csv/beide-telefone.csv aus 2-Rollen-Laeufen) bleiben in der Liste.
|
||||
if compgen -G "$RUN_DIR/sampler-*.csv" >/dev/null || compgen -G "$RUN_DIR/walk-ping-*.csv" >/dev/null \
|
||||
|| [[ -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/"
|
||||
for f in "$RUN_DIR"/sampler.csv "$RUN_DIR"/sampler-*.csv "$RUN_DIR"/sampler-*.out \
|
||||
"$RUN_DIR"/markers.csv "$RUN_DIR"/walk-ping.csv "$RUN_DIR"/walk-ping-*.csv \
|
||||
"$RUN_DIR"/walk-ping.log "$RUN_DIR"/ping-dauerlauf.log "$RUN_DIR"/beide-telefone.csv; do
|
||||
[[ -f "$f" ]] && mv "$f" "$ARCHIV/"
|
||||
done
|
||||
echo "ts_epoch,ts_local,marker" > "$MARKERS"
|
||||
echo "Vorheriger Lauf -> $ARCHIV"
|
||||
@@ -74,9 +91,16 @@ 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=$!
|
||||
# Sampler am Manager -- pro Geraet einer. 2-s-Takt: bei 4 Geraeten laufen sonst 8 SSH-Sessions
|
||||
# gegen den Core-SPOF, und Signal alle 2 s reicht fuer einen Gehweg (der Ping bleibt fein bei
|
||||
# 200 ms). Jeder Sampler holt sich den Core-PW selbst (docs/tp6-monitor-core.sh, SSHPASS -e).
|
||||
declare -a SAMPLERS
|
||||
for i in "${!PH_NAME[@]}"; do
|
||||
bash "$HERE/docs/tp6-monitor-core.sh" --out "$RUN_DIR/sampler-${PH_NAME[$i]}.csv" \
|
||||
--mac "${PH_MAC[$i]}" --interval 2 \
|
||||
> "$RUN_DIR/sampler-${PH_NAME[$i]}.out" 2>&1 &
|
||||
SAMPLERS+=("$!")
|
||||
done
|
||||
|
||||
# 5 Pings/s auf JEDES Telefon — GEPINGT WIRD VOM CORE, nicht von diesem Rechner.
|
||||
# 🔴 Der Grund: pingt der Laptop, laeuft der Weg ueber ZWEI Funkstrecken (Laptop -> AP ->
|
||||
@@ -124,8 +148,11 @@ ping_lauf() {
|
||||
# stdout-Pipe schliesst, und der Hintergrundjob darin haelt sie offen -- das Skript blieb
|
||||
# dort stehen, der zweite Ping wurde nie gestartet (2026-08-22). Die Funktion laeuft in
|
||||
# der aktuellen Shell, also liefert $! danach die richtige PID.
|
||||
ping_lauf "$PHONE" "$RUN_DIR/walk-ping.csv"; PINGER=$!
|
||||
ping_lauf "$PHONE2" "$RUN_DIR/walk-ping-$PHONE2_NAME.csv"; PINGER2=$!
|
||||
declare -a PINGERS
|
||||
for i in "${!PH_NAME[@]}"; do
|
||||
ping_lauf "${PH_IP[$i]}" "$RUN_DIR/walk-ping-${PH_NAME[$i]}.csv"
|
||||
PINGERS+=("$!")
|
||||
done
|
||||
|
||||
# 🔴 Kinder ZUERST. `kill $SAMPLER` traf nur den Wrapper; dessen Subshell samt SSH-Sitzung
|
||||
# wurde dabei verwaist und lief weiter -- nach dem Stopp hielt der Core stumm eine
|
||||
@@ -138,9 +165,8 @@ killbaum() {
|
||||
}
|
||||
|
||||
beenden() {
|
||||
for pid in $SAMPLER $PINGER $PINGER2; do killbaum "$pid"; done
|
||||
pkill -f "ping $PHONE interval=200ms" 2>/dev/null
|
||||
pkill -f "ping $PHONE2 interval=200ms" 2>/dev/null
|
||||
for pid in "${SAMPLERS[@]}" "${PINGERS[@]}"; do killbaum "$pid"; done
|
||||
for ip in "${PH_IP[@]}"; do pkill -f "ping $ip interval=200ms" 2>/dev/null; done
|
||||
# Der /ping am Router endet mit der SSH-Sitzung (am 2026-08-22 nachgeprueft: nach dem
|
||||
# Kill der Sitzungen lief am Core nichts weiter). Bewusst KEIN "job remove" am Geraet --
|
||||
# ein pauschales Aufraeumen fremder Jobs waere ein zu grobes Werkzeug fuer ein Messskript.
|
||||
@@ -150,10 +176,12 @@ beenden() {
|
||||
}
|
||||
trap beenden EXIT
|
||||
|
||||
echo "Gehweg-Messung laeuft."
|
||||
echo " Funk -> $RUN_DIR/sampler.csv"
|
||||
echo " Ping -> $RUN_DIR/walk-ping.csv ($PHONE, gepinnt)"
|
||||
echo " Ping -> $RUN_DIR/walk-ping-$PHONE2_NAME.csv ($PHONE2, frei roamend)"
|
||||
echo "Gehweg-Messung laeuft (${#PH_NAME[@]} Geraete, alle frei roamend)."
|
||||
for i in "${!PH_NAME[@]}"; do
|
||||
printf ' %-9s Funk -> sampler-%s.csv Ping -> walk-ping-%s.csv (%s)\n' \
|
||||
"${PH_NAME[$i]}" "${PH_NAME[$i]}" "${PH_NAME[$i]}" "${PH_IP[$i]}"
|
||||
done
|
||||
echo " Verzeichnis: $RUN_DIR"
|
||||
echo " Stoppen: '⏹ Aufzeichnung stoppen' auf der Konsole -- oder Ctrl-C hier."
|
||||
|
||||
# 🔴 Bis 2026-08-22 lief hier nur `while true; do touch; sleep 5; done`, und das Skript war
|
||||
|
||||
Reference in New Issue
Block a user