import network import socket import ure import time wlan_ap = network.WLAN(network.AP_IF) wlan_sta = network.WLAN(network.STA_IF) # SSID/Password for setup ssid_name = "WifiManager" ssid_password = "tayfunulu" server_socket = None def do_connect(ntwrk_ssid, netwrk_pass): sta_if = network.WLAN(network.STA_IF) sta_if.active(True) if not sta_if.isconnected(): print('Trying to connect to %s...' % ntwrk_ssid) sta_if.active(True) sta_if.connect(ntwrk_ssid, netwrk_pass) a = 0 while not sta_if.isconnected() | (a > 99): time.sleep(0.1) a += 1 print('.', end='') if sta_if.isconnected(): print('\nConnected. Network config: ', sta_if.ifconfig()) return True else: print('\nFailed. Not Connected to: ' + ntwrk_ssid) return False def send_response(client, payload, status_code=200): client.sendall("HTTP/1.0 {} OK\r\n".format(status_code)) client.sendall("Content-Type: text/html\r\n") client.sendall("Content-Length: {}\r\n".format(len(payload))) client.sendall("\r\n") if len(payload) > 0: client.sendall(payload) def handle_root(client): global wlan_sta wlan_sta.active(True) ssids = sorted(ssid.decode('utf-8') for ssid, *_ in wlan_sta.scan()) response_header = """\

Wi-Fi Client Setup

""" response_variable = [] for ssid in ssids: response_variable.append("""\ """.format(ssid)) response_variable = "\n".join(response_variable) response_footer = """\
{0}
Password:

 


Your ssid and password information will be saved into the "passwd.dat" file in your ESP module for future usage. Be careful about security!

Some useful infos:

""" send_response(client, response_header + response_variable + response_footer) def handle_configure(client, request): match = ure.search("ssid=([^&]*)&password=(.*)", request) if match is None: send_response(client, "Parameters not found", status_code=400) return False # version 1.9 compatibility try: ssid = match.group(1).decode("utf-8").replace("%3F", "?").replace("%21", "!") password = match.group(2).decode("utf-8").replace("%3F", "?").replace("%21", "!") except: ssid = match.group(1).replace("%3F", "?").replace("%21", "!") password = match.group(2).replace("%3F", "?").replace("%21", "!") if len(ssid) == 0: send_response(client, "SSID must be provided", status_code=400) return False if do_connect(ssid, password): response_footer = """\


ESP successfully connected to WiFi network %(ssid)s.



""" % dict(ssid=ssid) send_response(client, response_footer) try: with open("passwd.dat", "r") as f: ex_data = f.read() except: ex_data = "" ex_data = "%s;%s\n" % (ssid, password) + ex_data with open("passwd.dat", "w") as f: f.write(ex_data) return True else: response_footer = """\

ESP could not connect to WiFi network %(ssid)s.



""" % dict(ssid=ssid) send_response(client, response_footer) return False def handle_not_found(client, url): send_response(client, "Path not found: {}".format(url), status_code=404) def stop(): global server_socket if server_socket: server_socket.close() def start(port=80): addr = socket.getaddrinfo('0.0.0.0', port)[0][-1] global server_socket global wlan_sta global wlan_ap global ssid_name global ssid_password stop() wlan_sta.active(True) wlan_ap.active(True) wlan_ap.config(essid=ssid_name, password=ssid_password) server_socket = socket.socket() server_socket.bind(addr) server_socket.listen(1) print('Connect to WiFi ssid ' + ssid_name + ', default password: ' + ssid_password) print('and access the ESP via your favorite web browser at 192.168.4.1.') print('Listening on:', addr) while True: if wlan_sta.isconnected(): client.close return True client, addr = server_socket.accept() client.settimeout(5.0) print('client connected from', addr) request = b"" try: while "\r\n\r\n" not in request: request += client.recv(512) except OSError: pass print("Request is: {}".format(request)) if "HTTP" not in request: # skip invalid requests client.close() continue # version 1.9 compatibility try: url = ure.search("(?:GET|POST) /(.*?)(?:\\?.*?)? HTTP", request).group(1).decode("utf-8").rstrip("/") except: url = ure.search("(?:GET|POST) /(.*?)(?:\\?.*?)? HTTP", request).group(1).rstrip("/") print("URL is {}".format(url)) if url == "": handle_root(client) elif url == "configure": handle_configure(client, request) else: handle_not_found(client, url) client.close()