#!/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 ""