Попробуйте несколько точек доступа и паролей, пока не подключитесь к ESP32 с помощью micropython

#wifi #esp32 #micropython

#wifi #esp32 #micropython

Вопрос:

Я бы хотел, чтобы мой ESP32, работающий под управлением micropython, продолжал пробовать четыре разных точки доступа, пока одна из них не подключится. Следующее выдает no AP found ошибку.

 import esp32
from machine import Pin, ADC, reset

SSID1 = "firstAP"
PASSWORD1 = "letmein"
SSID2 = "secondAp"
PASSWORD2 = "letmein"
SSID3 = "thirdAP"
PASSWORD3 = "letmein"
SSID4 = "fourthAP"
PASSWORD4 = "letmein"

def do_connect():
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)        
        sta_if.connect(SSID1, PASSWORD1)
        while not sta_if.isconnected():
            pass  
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)        
        sta_if.connect(SSID2, PASSWORD2)
        while not sta_if.isconnected():
            pass  
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)        
        sta_if.connect(SSID3, PASSWORD3)
        while not sta_if.isconnected():
            pass  
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)        
        sta_if.connect(SSID4, PASSWORD4)
        while not sta_if.isconnected():
            pass  
    print('network config:', sta_if.ifconfig())

do_connect()
  

Ответ №1:

Рассматривали ли вы возможность добавления каждой попытки подключения в try: инструкцию? Из того, что мне кажется, ваш код пытается подключиться к первому SSID, он не может его найти и выдает ошибку.

попробуйте что-то вроде этого:

 if not sta_if.isconnected():
    print('connecting to network...')
    try:
        sta_if.active(True)        
        sta_if.connect(SSID1, PASSWORD1)
    except:
        print("SSID not found.") 
  

Ответ №2:

Я не разбираюсь в ESP32-порту Micropython, но в порту pyboard вы можете использовать команду WLAN.scan () для сканирования доступных беспроводных сетей из экземпляра WLAN STA.

Сканирование возвращает список кортежей с информацией о найденных точках доступа WiFi: (ssid, bssid, channel, RSSI, authmode, hidden).

bssid — это аппаратный адрес точки доступа в двоичной форме, возвращаемый как объект bytes. Вы можете использовать ubinascii.hexlify(), чтобы преобразовать его в форму ASCII.

Затем вы сможете использовать этот список кортежей для поиска нужной сети.

Я попытаюсь откопать какой-нибудь код, чтобы продемонстрировать это.

Добавлены примеры:

 nets = wlan.scan()
for net in nets:
    if net.ssid == 'mywifi':
        print('Network found!')
        wlan.connect(net.ssid, auth=(net.sec, 'mywifikey'), timeout=5000)
        while not wlan.isconnected():
            machine.idle() # save power while waiting
        print('WLAN connection succeeded!')
        break
  

или

 import os
import machine

uart = machine.UART(0, 115200)
os.dupterm(uart)

known_nets = {
    '<net>': {'pwd': '<password>'},
    '<net>': {'pwd': '<password>', 'wlan_config':  ('10.0.0.114', '255.255.0.0', '10.0.0.1', '10.0.0.1')}, # (ip, subnet_mask, gateway, DNS_server)
}

if machine.reset_cause() != machine.SOFT_RESET:
    from network import WLAN
    wl = WLAN()
    wl.mode(WLAN.STA)
    original_ssid = wl.ssid()
    original_auth = wl.auth()

    print("Scanning for known wifi nets")
    available_nets = wl.scan()
    nets = frozenset([e.ssid for e in available_nets])

    known_nets_names = frozenset([key for key in known_nets])
    net_to_use = list(nets amp; known_nets_names)
    try:
        net_to_use = net_to_use[0]
        net_properties = known_nets[net_to_use]
        pwd = net_properties['pwd']
        sec = [e.sec for e in available_nets if e.ssid == net_to_use][0]
        if 'wlan_config' in net_properties:
            wl.ifconfig(config=net_properties['wlan_config'])
        wl.connect(net_to_use, (sec, pwd), timeout=10000)
        while not wl.isconnected():
            machine.idle() # save power while waiting
        print("Connected to " net_to_use " with IP address:"   wl.ifconfig()[0])

    except Exception as e:
        print("Failed to connect to any known network, going into AP mode")
        wl.init(mode=WLAN.AP, ssid=original_ssid, auth=original_auth, channel=6, antenna=WLAN.INT_ANT)
  

Надеюсь, это вам поможет, возможно, вам потребуется внести небольшие изменения в код, конечно.

Ответ №3:

Вот вам и ответ:

 import network

# Set up the Wi-Fi networks you want to try to connect to
networks = [("SSID1", "PSK1"), ("SSID2", "PSK2")]

# Attempt to connect to each network in order
for ssid, psk in networks:
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, psk)

    # Wait for the connection to succeed or fail
    for _ in range(20):
        if wlan.isconnected():
            print("Connected to", ssid)
            break
        else:
            time.sleep(0.5)

    # If we successfully connected to a network, stop trying
    if wlan.isconnected():
        break