#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