103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Wi-Fi connection smoke test for MicroPython on ESP32.
|
|
|
|
Runs on-device via mpremote and uses /settings.json credentials.
|
|
|
|
Usage:
|
|
mpremote connect /dev/ttyACM0 run tests/test_wifi.py
|
|
"""
|
|
|
|
import time
|
|
import utime
|
|
import network
|
|
from machine import WDT
|
|
|
|
from settings import Settings
|
|
|
|
CONNECT_TIMEOUT_S = 30
|
|
RETRY_DELAY_S = 2
|
|
WDT_TIMEOUT_MS = 10000
|
|
|
|
|
|
def _wifi_status_label(code):
|
|
names = {
|
|
getattr(network, "STAT_IDLE", 0): "idle",
|
|
getattr(network, "STAT_CONNECTING", 1): "connecting",
|
|
getattr(network, "STAT_WRONG_PASSWORD", -3): "wrong_password",
|
|
getattr(network, "STAT_NO_AP_FOUND", -2): "no_ap_found",
|
|
getattr(network, "STAT_CONNECT_FAIL", -1): "connect_fail",
|
|
getattr(network, "STAT_GOT_IP", 3): "got_ip",
|
|
}
|
|
return names.get(code, str(code))
|
|
|
|
|
|
def connect_wifi_with_wdt(sta, ssid, password, wdt):
|
|
attempt = 0
|
|
while not sta.isconnected():
|
|
attempt += 1
|
|
print("[wifi-test] attempt", attempt, "ssid=", repr(ssid))
|
|
try:
|
|
sta.disconnect()
|
|
except Exception:
|
|
pass
|
|
sta.connect(ssid, password)
|
|
|
|
start = utime.time()
|
|
last_status = None
|
|
while not sta.isconnected():
|
|
status = sta.status()
|
|
if status != last_status:
|
|
print("[wifi-test] status:", status, _wifi_status_label(status))
|
|
last_status = status
|
|
if status in (
|
|
getattr(network, "STAT_WRONG_PASSWORD", -3),
|
|
getattr(network, "STAT_NO_AP_FOUND", -2),
|
|
getattr(network, "STAT_CONNECT_FAIL", -1),
|
|
):
|
|
break
|
|
if utime.time() - start >= CONNECT_TIMEOUT_S:
|
|
print("[wifi-test] timeout after", CONNECT_TIMEOUT_S, "seconds")
|
|
break
|
|
time.sleep(1)
|
|
wdt.feed()
|
|
|
|
if sta.isconnected():
|
|
return True
|
|
|
|
print("[wifi-test] retry in", RETRY_DELAY_S, "seconds")
|
|
for _ in range(RETRY_DELAY_S):
|
|
time.sleep(1)
|
|
wdt.feed()
|
|
return True
|
|
|
|
|
|
def main():
|
|
settings = Settings()
|
|
ssid = settings.get("ssid") or ""
|
|
password = settings.get("password") or ""
|
|
|
|
if not ssid:
|
|
print("[wifi-test] skipped: settings.ssid is empty")
|
|
raise SystemExit(0)
|
|
|
|
wdt = WDT(timeout=WDT_TIMEOUT_MS)
|
|
wdt.feed()
|
|
|
|
sta = network.WLAN(network.STA_IF)
|
|
sta.active(True)
|
|
try:
|
|
sta.config(pm=network.WLAN.PM_NONE)
|
|
except (AttributeError, ValueError, TypeError):
|
|
pass
|
|
|
|
ok = connect_wifi_with_wdt(sta, ssid, password, wdt)
|
|
if not ok or not sta.isconnected():
|
|
print("[wifi-test] FAILED: not connected")
|
|
raise SystemExit(1)
|
|
|
|
print("[wifi-test] OK:", sta.ifconfig())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|