esp32之micropython 配网代码
最近学习esp32的时候想着能不能给设备自动配网,查了下网上有smartconfig配网但是我无法配置成功所以自己写了AP配网。
AP配网代码
import network
import socket,json
from machine import Pin, Timer
import time
led_pin = Pin(4, Pin.OUT)
# 配置热点模式
AP_SSID = 'myqiu_Setup'
AP_PASSWORD = 'setup123'
# Captive portal的HTML页面
HTML = """
<!DOCTYPE html>
<html>
<head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'/><title>ESP32 WiFi Setup</title><style>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;font-family: Arial, sans-serif;}form {display: flex;flex-direction: column;align-items: center;background-color: #f0f0f0;padding: 20px;border-radius: 5px;}label, input {margin-bottom: 10px;}</style>
</head>
<body><form action="/connect" method="post"><label for="ssid">SSID:</label><input type="text" id="ssid" name="ssid"><label for="password">Password:</label><input type="password" id="password" name="password"><input type="submit" value="Connect"></form>
</body>
</html>"""
wifi_conn = False
wifi_config = None
def start_ap():ap = network.WLAN(network.AP_IF)ap.active(True)ap.config(essid=AP_SSID, password=AP_PASSWORD)
# print("AP模式已启用: SSID '{}' 密码 '{}'".format(AP_SSID, AP_PASSWORD))return ap
# 从 JSON 文件中读取 WiFi 信息
def read_wifi_config():try:with open("wifi_config.json", 'r') as file:data = json.load(file)if data['ssid'] == "" and data['password'] == "":return Falsereturn data['ssid'], data['password']except Exception as e:return None
def connect_wifi(ssid, password):global wifi_conn,wifi_configwlan = network.WLAN(network.STA_IF)wlan.active(True)try:if not wlan.isconnected():wlan.connect(ssid, password)while not wlan.isconnected():pass
# print('Network config:', wlan.ifconfig())wifi_conn = Truewifi_config=wlan.ifconfig()server_socket.close()return Trueexcept Exception as e:return "wifi not find"
def handle_connection(client, addr, ap):global wifi_config
# print('客户端连接来自', addr)request = client.recv(1024).decode()
# print('请求内容:', request)if 'POST /connect' in request:# 从请求中提取SSID和密码ssid_start = request.find('ssid=') + 5ssid_end = request.find('&', ssid_start)password_start = request.find('password=') + 9ssid = request[ssid_start:ssid_end]password = request[password_start:]
# print('尝试连接WiFi SSID:', ssid)wifi_data = {'ssid': ssid,'password': password}# 重置并连接到新WiFi网络if connect_wifi(ssid, password):response = "HTTP/1.1 200 OK\n\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'</>h1>已连接到WiFi。正在关闭AP模式...</h1>"client.send(response)client.close()# 关闭AP模式
# print('关闭AP模式...')ap.active(False)with open("wifi_config.json", 'w') as file:json.dump(wifi_data, file)return True # 表示连接成功else:response = "HTTP/1.1 200 OK\n\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8'/><h1>连接失败。请重试。</h1>"client.send(response)else:response = 'HTTP/1.1 200 OK\nContent-Type: text/html\n\n' + HTMLclient.send(response)client.close()return False # 表示连接失败
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connected = False
def conn_wifi():global connected ap = start_ap()server_socket.bind(('0.0.0.0', 80))server_socket.listen(1)print('Web服务器已启动,等待客户端连接...')try:# 主程序部分while not connected:client_socket, addr = server_socket.accept()connected = handle_connection(client_socket, addr, ap)except KeyboardInterrupt:print("Exiting program...")finally:# 确保关闭服务器套接字server_socket.close()led_pin.value(0)
def main():global wifi_conn,wifi_configwhile True:if read_wifi_config() ==False:conn_wifi()else:ssid,password = read_wifi_config()if wifi_conn != True:connect_wifi(ssid,password)if wifi_conn == True:return True
# if __name__ == "__main__":
# print(main())
重命名为AP.py 在你项目需要联网前引入代码即可