TrashNotes

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()
← Previous Next →
Back to list