ESP32(MicroPython)复位后重连树莓派AP失败,返回STAT_WRONG_PASSWORD错误
ESP32(MicroPython)复位后重连树莓派AP失败,返回STAT_WRONG_PASSWORD错误
我之前也碰到过类似的设备重连AP异常的情况,结合你描述的场景——ESP32正常连接树莓派AP没问题,但复位后立刻重连就报密码错误,等树莓派那边显示ESP断开关联后又能正常连接——大概率是两端的WiFi连接状态不同步导致的:
问题根源分析
ESP32复位时属于硬重启,可能没来得及给树莓派AP发送正常的断开关联报文,树莓派的AP还会认为ESP32处于已连接状态。这时候ESP32重启后发起新的连接请求,树莓派可能因为旧连接未释放,对新请求的验证逻辑出现异常,误返回密码错误的状态码。
可行的解决办法
1. 树莓派AP端:缩短 stale 连接的超时时间
通过配置让树莓派更快清理未正常断开的设备连接,避免旧连接残留干扰新连接:
- 可以设置WiFi station的超时时间,执行以下命令:
这里的sudo iw dev wlan0 set station_timeout 30003000是毫秒,也就是3秒后树莓派会自动清理无响应的设备连接,你可以根据需求调整时长。 - 也可以优化nmcli的Hotspot安全配置,让AP的连接验证逻辑更严谨:
sudo nmcli connection modify Hotspot 802-11-wireless-security.proto rsn sudo nmcli connection modify Hotspot 802-11-wireless-security.group ccmp sudo nmcli connection modify Hotspot 802-11-wireless-security.pairwise ccmp
2. ESP32(MicroPython)端:重连前主动重置WiFi状态
在复位后的连接流程中,先主动清理WiFi模块的旧状态,再发起新连接:
import network import utime wlan = network.WLAN(network.STA_IF) # 先断开旧连接(如果存在) if wlan.isconnected(): wlan.disconnect() # 关闭再开启WiFi接口,彻底重置状态 wlan.active(False) utime.sleep(0.5) wlan.active(True) # 执行连接逻辑 wlan.connect("raspi_ap", "raspi_ap_pwd")
这样可以确保ESP32用全新的状态发起连接,避免旧连接信息的干扰。
3. 优化ESP32的连接重试逻辑
可以在连接失败时增加重试机制,同时每次重试前都重置WiFi状态:
import network import utime def connect_wifi(ssid, pwd): wlan = network.WLAN(network.STA_IF) wlan.active(True) max_retries = 3 retry_count = 0 while not wlan.isconnected() and retry_count < max_retries: print(f"尝试连接WiFi,第{retry_count+1}次") wlan.disconnect() # 每次重试前先断开旧连接 wlan.connect(ssid, pwd) utime.sleep(2) # 等待连接结果 retry_count += 1 if wlan.isconnected(): print(f"连接成功,IP地址:{wlan.ifconfig()[0]}") else: print("连接失败") # 调用连接函数 connect_wifi("raspi_ap", "raspi_ap_pwd")
额外排查点
- 查看树莓派的NetworkManager日志(
sudo journalctl -u NetworkManager),看看ESP32复位后重连时AP侧的报错信息,能帮你更精准定位问题; - 尝试更换WiFi加密模式(比如从纯WPA2改为WPA/WPA2混合模式),部分设备在特定加密配置下会出现重连异常。
备注:内容来源于stack exchange,提问作者Loïc G.
相关产品推荐
相关产品推荐

