ESP32/test_devices.sh

136 lines
3.5 KiB
Bash
Executable File

#!/bin/bash
# ESP32 Device Testing Script
# Tests all deployed ESP32 devices with iperf
# Configuration
START_IP="${START_IP:-192.168.1.51}"
NUM_DEVICES="${NUM_DEVICES:-10}"
IPERF_TIME="${IPERF_TIME:-5}"
PROTOCOL="${PROTOCOL:-tcp}" # tcp or udp
# Parse starting IP
IFS='.' read -r -a IP_PARTS <<< "$START_IP"
IP_BASE="${IP_PARTS[0]}.${IP_PARTS[1]}.${IP_PARTS[2]}"
IP_START=${IP_PARTS[3]}
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}=========================================="
echo "ESP32 Device Testing"
echo -e "==========================================${NC}"
echo "IP Range: ${IP_BASE}.${IP_START} - ${IP_BASE}.$((IP_START + NUM_DEVICES - 1))"
echo "Protocol: $PROTOCOL"
echo "Duration: ${IPERF_TIME}s per device"
echo -e "${BLUE}==========================================${NC}"
echo ""
test_device() {
local INDEX=$1
local IP_ADDR="${IP_BASE}.$((IP_START + INDEX))"
local RESULT_FILE="/tmp/iperf_result_${INDEX}.txt"
# Test ping
if ! ping -c 1 -W 2 "$IP_ADDR" > /dev/null 2>&1; then
echo -e "${RED}✗ Device $INDEX ($IP_ADDR): No ping response${NC}"
echo "FAIL" > "$RESULT_FILE"
return 1
fi
# Test iperf
if [ "$PROTOCOL" = "udp" ]; then
IPERF_CMD="iperf -c $IP_ADDR -u -b 100M -t $IPERF_TIME"
else
IPERF_CMD="iperf -c $IP_ADDR -t $IPERF_TIME"
fi
if OUTPUT=$($IPERF_CMD 2>&1); then
# Extract bandwidth
BANDWIDTH=$(echo "$OUTPUT" | grep -oP '\d+(\.\d+)?\s+(K|M|G)bits/sec' | tail -1)
echo -e "${GREEN}✓ Device $INDEX ($IP_ADDR): $BANDWIDTH${NC}"
echo "SUCCESS:$BANDWIDTH" > "$RESULT_FILE"
else
echo -e "${RED}✗ Device $INDEX ($IP_ADDR): iperf failed${NC}"
echo "FAIL" > "$RESULT_FILE"
return 1
fi
}
export -f test_device
export IP_BASE IP_START IPERF_TIME PROTOCOL GREEN RED YELLOW BLUE NC
# Clean old results
rm -f /tmp/iperf_result_*.txt
# Quick ping test first
echo -e "${YELLOW}Quick connectivity check...${NC}"
for i in $(seq 0 $((NUM_DEVICES - 1))); do
IP_ADDR="${IP_BASE}.$((IP_START + i))"
if ping -c 1 -W 1 "$IP_ADDR" > /dev/null 2>&1; then
echo -n "."
else
echo -n "x"
fi
done
echo ""
echo ""
# Run iperf tests in parallel (batches of 4 to avoid overwhelming network)
echo -e "${YELLOW}Running iperf tests...${NC}"
BATCH_SIZE=4
for BATCH_START in $(seq 0 $BATCH_SIZE $((NUM_DEVICES - 1))); do
for i in $(seq $BATCH_START $(( BATCH_START + BATCH_SIZE - 1 ))); do
if [ $i -lt $NUM_DEVICES ]; then
test_device "$i" &
fi
done
wait
done
# Summary
echo ""
echo -e "${BLUE}=========================================="
echo "Test Summary"
echo -e "==========================================${NC}"
SUCCESS=0
FAILED=0
TOTAL_BANDWIDTH=0
for i in $(seq 0 $((NUM_DEVICES - 1))); do
RESULT_FILE="/tmp/iperf_result_${i}.txt"
if [ -f "$RESULT_FILE" ]; then
RESULT=$(cat "$RESULT_FILE")
if [[ "$RESULT" == SUCCESS:* ]]; then
((SUCCESS++))
else
((FAILED++))
fi
else
((FAILED++))
fi
done
echo "Tested: $NUM_DEVICES devices"
echo -e "${GREEN}Success: $SUCCESS${NC}"
if [ $FAILED -gt 0 ]; then
echo -e "${RED}Failed: $FAILED${NC}"
fi
SUCCESS_RATE=$(awk "BEGIN {printf \"%.1f\", ($SUCCESS / $NUM_DEVICES) * 100}")
echo "Rate: ${SUCCESS_RATE}%"
echo -e "${BLUE}==========================================${NC}"
# Cleanup
rm -f /tmp/iperf_result_*.txt
if [ $FAILED -gt 0 ]; then
exit 1
fi