2025-04-04 12:26:32
gemini - circuitpython и esp32-s3-zero wifi connect
import supervisor
import wifi
import socketpool
import time
import os
SERVER_IP = "172.104.137.172"
NETWORKS = [
{"ssid": 'mi5', "password": '123321321'},
{"ssid": 'prg', "password": '123321321'},
{"ssid": 'F_2', "password": '123321321'},
]
PING_TIMEOUT = 3 # секунды
RETRY_COUNT = 3
RETRY_DELAY = 2
def scan_available_networks():
"""Сканирует доступные сети."""
try:
available_networks = []
for network in wifi.radio.start_scanning_networks():
available_networks.append(network)
wifi.radio.stop_scanning_networks()
return available_networks
except Exception as e:
print(f"Error scanning networks: {e}")
return []
def connect_to_wifi(ssid, password):
"""Подключается к Wi-Fi."""
for attempt in range(RETRY_COUNT):
try:
wifi.radio.connect(ssid, password)
if wifi.radio.connected:
print(f"Connected to {ssid}!")
return True
else:
print(f"Connection to {ssid} failed. Attempt {attempt + 1} of {RETRY_COUNT}")
time.sleep(RETRY_DELAY)
except Exception as e:
print(f"Error connecting to {ssid}: {e}")
time.sleep(RETRY_DELAY)
return False
def ping_server(pool, server_ip):
"""Пингует сервер и возвращает время пинга в миллисекундах."""
try:
start_time = time.monotonic()
socket = pool.socket()
socket.settimeout(PING_TIMEOUT)
socket.connect((server_ip, 53)) # DNS порт для проверки подключения
socket.close()
end_time = time.monotonic()
ping_time_ms = (end_time - start_time) * 1000
return True, ping_time_ms
except Exception as e:
print(f"Error pinging {server_ip}: {e}")
return False, None
def user_function():
"""Пользовательская функция."""
print("User function")
def main():
while True:
available_networks = scan_available_networks()
connected = False
for network in NETWORKS:
if any(net.ssid == network["ssid"] for net in available_networks):
if connect_to_wifi(network["ssid"], network["password"]):
pool = socketpool.SocketPool(wifi.radio)
print(f"Connected to {network['ssid']}.")
while True:
reachable, ping_time = ping_server(pool, SERVER_IP)
if reachable:
print(f"Server {SERVER_IP} is reachable. Ping time: {ping_time} ms")
user_function()
else:
print(f"Server {SERVER_IP} is not reachable. Switching to next network.")
wifi.radio.disconnect()
break
time.sleep(5)
connected = True
break
else:
continue
else:
print(f"{network['ssid']} not available.")
if not connected:
print("No available networks. Trying again in 5 seconds.")
time.sleep(5)
while True:
main()
Back to list