docs/scripts/rangetest.sh

73 lines
2.4 KiB
Bash

#!/bin/sh
# If this doesnt work, gps might be using the wrong device.
killall gpsd 2>/dev/null
# dmesg | grep tty
# this should should a device name like below.
gpsd /dev/ttyACM0 -F /var/run/gpsd.sock
# === Config ===
IFNAME="wlan0"
PING_IP="192.168.1.1"
OUTDIR="/root/distance"
TS_FILE=$(date +%Y%m%d-%H%M%S)
CSV="$OUTDIR/$TS_FILE.csv"
# === Ensure output dir exists ===
mkdir -p "$OUTDIR"
# === Add CSV header ===
echo "timestamp,time,lat,lon,signal_dbm,noise_dbm,snr_db,tx_mcs,rx_mcs,connected" > "$CSV"
while true; do
# === Get timestamp and time ===
TS=$(date -Iseconds 2>/dev/null || date +"%Y-%m-%dT%H:%M:%S%z")
TIME=$(date +%H:%M:%S)
# === Get GPS ===
GPS=$(gpspipe -w -n 30 | grep TPV | grep -m1 lat)
LAT=$(echo "$GPS" | grep -o '"lat":[^,]*' | cut -d':' -f2 | tr -d ' ')
LON=$(echo "$GPS" | grep -o '"lon":[^,]*' | cut -d':' -f2 | tr -d ' ')
# Skip if no GPS fix
if [ -z "$LAT" ] || [ -z "$LON" ]; then
echo "[$TIME] No GPS fix. Skipping..."
sleep 10
continue
fi
# === Get Signal and Noise ===
STATS=$(morse_cli -i "$IFNAME" stats)
# case-insensitive, robust to spacing; extract the numeric value after the colon
RSSI=$(printf "%s\n" "$STATS" | awk -F':' 'tolower($0) ~ /received[[:space:]]+power[[:space:]]*\(dbm\)/ {gsub(/^[ \t]+|[ \t]+$/,"",$2); print $2; exit}')
NOISE=$(printf "%s\n" "$STATS" | awk -F':' 'tolower($0) ~ /^[[:space:]]*noise[[:space:]]*\(dbm\)/ {gsub(/^[ \t]+|[ \t]+$/,"",$2); print $2; exit}')
if [ -n "$RSSI" ] && [ -n "$NOISE" ]; then
SNR=$(( RSSI - NOISE ))
else
SNR=""
fi
# === Get TX/RX MCS ===
TX_MCS=$(iw dev "$IFNAME" station dump 2>/dev/null | grep "tx bitrate" | grep -oE 'MCS [0-9]+' | head -n1 | cut -d' ' -f2)
RX_MCS=$(iw dev "$IFNAME" station dump 2>/dev/null | grep "rx bitrate" | grep -oE 'MCS [0-9]+' | head -n1 | cut -d' ' -f2)
TX_MCS=${TX_MCS:-NA}
RX_MCS=${RX_MCS:-NA}
# === Ping test for connectivity ===
if ping -c 1 -W 1 "$PING_IP" >/dev/null 2>&1; then
STATUS="yes"
echo "✅ Ping $PING_IP OK"
else
STATUS="no"
echo "❌ Ping $PING_IP failed"
fi
# === Output to console and CSV ===
echo "Logged at $TIME ($LAT, $LON) RSSI=$RSSI dBm, SNR=$SNR dB, TX_MCS=$TX_MCS, RX_MCS=$RX_MCS, Connected=$STATUS"
echo "$TS,$TIME,$LAT,$LON,$RSSI,$NOISE,$SNR,$TX_MCS,$RX_MCS,$STATUS" >> "$CSV"
sleep 10
done