73 lines
2.6 KiB
Python
73 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import sys
|
|
import argparse
|
|
import serial
|
|
import time
|
|
from pathlib import Path
|
|
|
|
def send_cfg(port, ssid, password, dhcp, start_ip, mask, gw):
|
|
print(f"Connecting to {port}...")
|
|
with serial.Serial(port, baudrate=115200, timeout=2) as ser:
|
|
time.sleep(0.5)
|
|
ser.reset_input_buffer()
|
|
ser.write(b"CFG\n")
|
|
ser.write(f"SSID:{ssid}\n".encode())
|
|
ser.write(f"PASS:{password}\n".encode())
|
|
if dhcp == 0:
|
|
ser.write(f"IP:{start_ip}\n".encode())
|
|
ser.write(f"MASK:{mask}\n".encode())
|
|
ser.write(f"GW:{gw}\n".encode())
|
|
ser.write(f"DHCP:{dhcp}\n".encode())
|
|
ser.write(b"END\n")
|
|
time.sleep(0.3)
|
|
|
|
print("\nDevice response:")
|
|
while ser.in_waiting:
|
|
sys.stdout.write(ser.read(ser.in_waiting).decode(errors='ignore'))
|
|
sys.stdout.flush()
|
|
time.sleep(0.1)
|
|
print("\n✅ Configuration sent successfully.")
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Configure ESP32 Wi-Fi settings over serial")
|
|
parser.add_argument("--project", help="ESP-IDF project path (defaults to current working directory)")
|
|
parser.add_argument("--ssid", required=True)
|
|
parser.add_argument("--password", required=True)
|
|
parser.add_argument("--start-ip", help="Static IP address")
|
|
parser.add_argument("--mask", default="255.255.255.0")
|
|
parser.add_argument("--gw", help="Gateway address")
|
|
parser.add_argument("--dhcp", type=int, choices=[0,1], default=1)
|
|
parser.add_argument("--baud", type=int, default=460800)
|
|
parser.add_argument("--cfg-baud", type=int, default=115200)
|
|
parser.add_argument("--ports", nargs='+', help="Serial port(s), e.g., /dev/ttyUSB0 /dev/ttyUSB1")
|
|
parser.add_argument("--port", help="Single serial port (shorthand for --ports PORT)")
|
|
parser.add_argument("--dry-run", action="store_true")
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Default to current working directory
|
|
project_path = args.project or os.getcwd()
|
|
print(f"Using project directory: {project_path}")
|
|
|
|
# Resolve ports
|
|
ports = []
|
|
if args.port:
|
|
ports.append(args.port)
|
|
elif args.ports:
|
|
ports = args.ports
|
|
else:
|
|
print("❌ No serial port specified. Use --port or --ports.")
|
|
sys.exit(1)
|
|
|
|
# Apply configuration
|
|
for port in ports:
|
|
if args.dry_run:
|
|
print(f"[DRY RUN] Would send Wi-Fi config to {port}")
|
|
else:
|
|
send_cfg(port, args.ssid, args.password, args.dhcp, args.start_ip, args.mask, args.gw)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|