ESP32/mass_deploy.sh

127 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
# ESP32 Mass Deployment Script
# Builds firmware once, then flashes and configures multiple devices in parallel
set -e
# Configuration
PROJECT_DIR="${1:-$PWD}"
SSID="${SSID:-ClubHouse2G}"
PASSWORD="${PASSWORD:-your_password_here}"
START_IP="${START_IP:-192.168.1.51}"
NETMASK="${NETMASK:-255.255.255.0}"
GATEWAY="${GATEWAY:-192.168.1.1}"
BAUD_RATE="${BAUD_RATE:-460800}"
# 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]}
echo "=========================================="
echo "ESP32 Mass Deployment"
echo "=========================================="
echo "Project: $PROJECT_DIR"
echo "SSID: $SSID"
echo "IP Range: ${IP_BASE}.${IP_START}+"
echo "Gateway: $GATEWAY"
echo "Netmask: $NETMASK"
echo "=========================================="
# Step 1: Build firmware once
echo ""
echo "[1/3] Building firmware..."
cd "$PROJECT_DIR"
idf.py build
echo "✓ Build complete"
# Step 2: Find all connected ESP32 devices
echo ""
echo "[2/3] Detecting ESP32 devices..."
DEVICES=($(ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null || true))
if [ ${#DEVICES[@]} -eq 0 ]; then
echo "ERROR: No devices found!"
exit 1
fi
echo "Found ${#DEVICES[@]} device(s):"
for i in "${!DEVICES[@]}"; do
echo " [$i] ${DEVICES[$i]}"
done
# Step 3: Flash and configure in parallel
echo ""
echo "[3/3] Flashing and configuring devices..."
echo ""
flash_and_configure() {
local INDEX=$1
local DEVICE=$2
local IP_ADDR="${IP_BASE}.$((IP_START + INDEX))"
local LOG_FILE="/tmp/esp32_deploy_${INDEX}.log"
{
echo "=== Device $INDEX: $DEVICE ==="
echo "Target IP: $IP_ADDR"
# Flash
echo "Flashing..."
idf.py -p "$DEVICE" -b "$BAUD_RATE" flash 2>&1 | grep -E "(Connecting|Wrote|Hash|Hard resetting|ERROR)" || true
# Wait for boot
sleep 3
# Configure WiFi
echo "Configuring WiFi..."
{
echo "CFG"
echo "SSID:$SSID"
echo "PASS:$PASSWORD"
echo "IP:$IP_ADDR"
echo "MASK:$NETMASK"
echo "GW:$GATEWAY"
echo "DHCP:0"
echo "END"
} > "$DEVICE"
# Wait for OK response
sleep 2
echo "✓ Device $INDEX complete: $IP_ADDR"
} > "$LOG_FILE" 2>&1
# Show summary
echo "[Device $INDEX] ${DEVICES[$INDEX]}$IP_ADDR [DONE]"
}
# Export function and variables for parallel execution
export -f flash_and_configure
export PROJECT_DIR SSID PASSWORD IP_BASE IP_START NETMASK GATEWAY BAUD_RATE
# Launch parallel jobs
for i in "${!DEVICES[@]}"; do
flash_and_configure "$i" "${DEVICES[$i]}" &
done
# Wait for all background jobs
wait
echo ""
echo "=========================================="
echo "Deployment Complete!"
echo "=========================================="
echo ""
echo "Configured devices:"
for i in "${!DEVICES[@]}"; do
IP_ADDR="${IP_BASE}.$((IP_START + i))"
echo " ${DEVICES[$i]}$IP_ADDR"
done
echo ""
echo "Logs saved to: /tmp/esp32_deploy_*.log"
echo ""
echo "Test with: iperf -c ${IP_BASE}.${IP_START}"
echo ""