当前位置: 首页 > news >正文

实现用esp32自动配网功能。

有一天,突然想让esp32实现自动配网,但是我又不想通过IP地址去实现,可以通过域名实现对esp32的访问,登录成功后,实现去自动保存wifi密码,并实现联网。

1.新建WiFiManager.py类

import machine import network import time import json import _thread import socket class WiFiManager: def __init__(self, ap_ssid="ESP32-WiFi", ap_password="12345678", ap_ip="192.168.4.1", domain="esp32.io", config_file="wifi_config.json"): self.AP_SSID = ap_ssid self.AP_PASSWORD = ap_password self.AP_IP = ap_ip self.DOMAIN = domain self.CONFIG_FILE = config_file self.server_socket = None self.wlan = network.WLAN(network.STA_IF) self.ap = None def dns_server(self): udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) udp.bind(("0.0.0.0", 53)) while True: try: data, addr = udp.recvfrom(512) if len(data) < 12: continue resp = ( data[:2] + b"\x81\x80\x00\x01\x00\x01\x00\x00\x00\x00" + data[12:] + b"\xC0\x0C\x00\x01\x00\x01\x00\x00\x00\x3C\x00\x04" + b"\xC0\xA8\x04\x01" ) udp.sendto(resp, addr) except: time.sleep_ms(10) def web_page(self): return """ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ESP32 配网</title> </head> <body style="font-size:22px; margin:30px;"> <h2>ESP32 WiFi 配置</h2> <form action="/" method="get"> WiFi 名称:<br> <input name="ssid" style="font-size:20px; width:280px;"><br><br> WiFi 密码:<br> <input name="pwd" type="password" style="font-size:20px; width:280px;"><br><br> <button type="submit" style="font-size:22px; padding:10px 30px;">保存并重启</button> </form> </body> </html> """ def web_server(self): addr = socket.getaddrinfo("0.0.0.0", 80)[0][-1] self.server_socket = socket.socket() self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_socket.bind(addr) self.server_socket.listen(3) while True: try: conn, addr = self.server_socket.accept() conn.settimeout(2) req = conn.recv(1024).decode() if "GET /?ssid=" in req: ssid = req.split("ssid=")[1].split("&")[0] pwd = req.split("pwd=")[1].split(" ")[0] with open(self.CONFIG_FILE, "w") as f: json.dump({"ssid": ssid, "pwd": pwd}, f) conn.send("HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n<h1>保存成功,重启中...</h1>") conn.close() machine.reset() return conn.send("HTTP/1.1 200 OK\r\nContent-Type:text/html\r\n\r\n" + self.web_page()) conn.close() except: try: conn.close() except: pass def start_ap(self): self.ap = network.WLAN(network.AP_IF) self.ap.active(True) self.ap.config(essid=self.AP_SSID, password=self.AP_PASSWORD, authmode=network.AUTH_WPA2_PSK) self.ap.ifconfig((self.AP_IP, "255.255.255.0", self.AP_IP, self.AP_IP)) print("✅ 热点已开启") print("📶 名称:", self.AP_SSID) print("🔑 密码:", self.AP_PASSWORD) print("🌐 访问域名:http://" + self.DOMAIN) def auto_connect(self, timeout=5): try: with open(self.CONFIG_FILE, "r") as f: config = json.load(f) except: return False self.wlan.active(True) self.wlan.connect(config["ssid"], config["pwd"]) time.sleep(timeout) if self.wlan.isconnected(): print("✅ WiFi 自动连接成功:", config["ssid"]) print("🌐 IP:", self.wlan.ifconfig()[0]) return True return False def start_config_mode(self): self.start_ap() _thread.start_new_thread(self.dns_server, ()) self.web_server() def start(self): if self.auto_connect(): return self.start_config_mode() def reset_wifi_config(self): try: import os os.remove(self.CONFIG_FILE) print("✅ WiFi 配置已清除,下次重启进入配网模式") except: pass

2.新建main.py类,去调用这个类

# main.py from WiFiManager import WiFiManager import machine import time import json # 已配置 WiFi → 正常运行 # 未配置 → 自动进配网 # 按住 GPIO0 按键 3 秒 → 清除配置并重启进入配网 # 不影响你主逻辑 # ====================== 按键引脚(默认 BOOT 按键 GPIO0) ====================== reset_pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP) # ====================== 判断是否已配置 WiFi ====================== def is_wifi_configured(): try: with open("wifi_config.json", "r") as f: cfg = json.load(f) return "ssid" in cfg and "pwd" in cfg except: return False # ====================== 检测长按按键进入配网 ====================== def check_reset_config(): if reset_pin.value() == 0: # 按键按下 time.sleep(0.05) if reset_pin.value() == 0: print("⏳ 长按 3 秒进入重新配网模式...") start = time.time() while reset_pin.value() == 0: if time.time() - start >= 3: wifi = WiFiManager() wifi.reset_wifi_config() machine.reset() # ====================== 主程序 ====================== def main(): # 先检查是否需要强制重新配网 check_reset_config() # 未配置 WiFi → 启动配网 if not is_wifi_configured(): print("⚠️ 未配置 WiFi,进入配网模式") wifi = WiFiManager( ap_ssid="ESP32_SETUP", ap_password="12345678", domain="esp32.io" ) wifi.start() return # ============================================== # ✅ 已配置 WiFi → 正常运行你的主程序 # ============================================== print("✅ 已配置WiFi,启动主程序\n") while True: # 主循环里依然可以检测按键 check_reset_config() # ========= 你的逻辑 ========= print("主程序运行中...") time.sleep(1) if __name__ == "__main__": main()
http://www.jsqmd.com/news/681386/

相关文章:

  • 如何快速实现Rhino到Blender的无缝数据转换:5大实战技巧
  • LinkSwift:一站式网盘文件直链解析解决方案
  • 从AnyNet到ACVNet:用PyTorch复现4个经典立体匹配网络(附完整代码)
  • Elasticsearch 高性能优化:索引阶段性能优化全攻略
  • 从Pikachu靶场实战出发:用Python脚本自动化搞定SQL盲注(布尔/时间)
  • 从沉闷到灵动:用TranslucentTB重新定义Windows任务栏的视觉体验
  • 告别网盘限速烦恼:8大平台直链下载助手完整指南
  • N_m3u8DL-CLI-SimpleG:三步搞定M3U8视频下载的终极图形界面工具
  • 别再死记硬背DenseNet结构了!用PyTorch从零搭建,带你搞懂Growth Rate和Transition Layer
  • 从‘直纹面’到‘圆柱性面’:一个经典二元极限不存在函数的几何物理解读
  • Elasticsearch 核心:分词功能实现原理全解析
  • 如何选择速冻青豆生产厂家,全国范围内靠谱的盘点 - 工业设备
  • 百度网盘直连解析工具:三步实现文件高速下载突破
  • Linux RS485串口驱动移植实战--以Rockchip与Amlogic平台为例
  • 3步完成图像矢量化:用vectorizer将PNG/JPG转换为高质量SVG的完整指南
  • EasyExcel读取性能优化实战:除了空行过滤,你的批处理监听器还能这样玩
  • 网盘直链获取工具:跨平台文件下载效率提升方案
  • 如何快速部署英雄联盟云顶之弈自动化工具:面向初学者的完整实战指南
  • 2026年OPC办公空间家具源头厂家价格比较,北京地区哪家实惠 - myqiye
  • GLPI安装总报错?这份CentOS 7下的“保姆级”排错指南请收好(附PHP模块、文件权限详解)
  • Vectorizer实战指南:如何用JavaScript将PNG/JPG智能转换为可编辑SVG矢量图
  • 我的MobileViT训练翻车实录:从数据集坑到学习率调参,这些PyTorch细节新手一定要注意
  • 别再只画散点图了!用Python的sklearn和matplotlib,5分钟搞定PCA双标图(含置信椭圆绘制)
  • TTS-Backup终极指南:一键保护你的Tabletop Simulator游戏数据
  • Windows任务栏美化终极指南:用TranslucentTB实现透明、模糊与亚克力效果
  • Elasticsearch 查询性能优化终极指南:从原理到实战,彻底降低查询延迟
  • 告别云端:5步在本地用Orthanc搭建轻量级DICOM影像服务器,管理你的CT/MRI数据集
  • 终极网盘下载加速指南:八大平台直链解析工具完全教程
  • 共话电镀电源生产厂哪家售后好,跃阳电源服务周到获认可 - mypinpai
  • Windows热键侦探:终极快捷键冲突检测与解决指南