127 lines
3.1 KiB
Bash
Executable File
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 ""
|