114 lines
3.6 KiB
Python
114 lines
3.6 KiB
Python
import network
|
|
import ujson
|
|
import ure as re
|
|
import usocket as socket
|
|
import time
|
|
|
|
class Setup:
|
|
def __init__(self):
|
|
self.ap_ssid = "Growsystem"
|
|
self.ap_password = "12345678"
|
|
self.wlans = []
|
|
self.selected_ssid = ""
|
|
self.wlan_password = ""
|
|
self.pin = ""
|
|
self.html = """
|
|
<html>
|
|
<head><title>Pico Setup</title></head>
|
|
<body>
|
|
<h1>Setup Pico</h1>
|
|
<form method="post">
|
|
SSID: <select name="ssid">{}</select><br>
|
|
Password: <input type="password" name="password"><br>
|
|
PIN: <input type="text" name="pin" maxlength="4"><br>
|
|
<input type="submit" value="Submit">
|
|
</form>
|
|
</body>
|
|
</html>
|
|
"""
|
|
|
|
def scan_wlans(self):
|
|
print("Scan WLANs")
|
|
wlan = network.WLAN(network.STA_IF)
|
|
wlan.active(True)
|
|
self.wlans = [w[0].decode() for w in wlan.scan()]
|
|
print("Found:", self.wlans)
|
|
wlan.active(False)
|
|
|
|
def start_ap_mode(self):
|
|
self.ap = network.WLAN(network.AP_IF)
|
|
self.ap.active(True)
|
|
while self.ap.active() == False:
|
|
pass
|
|
self.ap.config(essid=self.ap_ssid, password=self.ap_password)
|
|
print("AP SSID:", self.ap.config("essid"))
|
|
# print("AP Password:", self.ap.config("password"))
|
|
|
|
def stop_ap_mode(self):
|
|
ap = network.WLAN(network.AP_IF)
|
|
ap.active(False)
|
|
|
|
def start_webserver(self):
|
|
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
|
|
s = socket.socket()
|
|
s.bind(addr)
|
|
s.listen(1)
|
|
print("Listening on", addr)
|
|
while True:
|
|
conn, addr = s.accept()
|
|
print("Got a connection from", addr)
|
|
request = conn.recv(1024)
|
|
print("Content =", request)
|
|
conn.send("HTTP/1.1 200 OK\n")
|
|
conn.send("Content-Type: text/html\n")
|
|
conn.send("Connection: close\n\n")
|
|
conn.sendall(self.html.format(''.join(['<option value="{}">{}</option>'.format(w, w) for w in self.wlans])))
|
|
conn.close()
|
|
|
|
def parse_request(self, request):
|
|
request = request.decode()
|
|
ssid_match = re.search("ssid=([^&]+)", request)
|
|
if ssid_match:
|
|
self.selected_ssid = ssid_match.group(1)
|
|
password_match = re.search("password=([^&]+)", request)
|
|
if password_match:
|
|
self.wlan_password = password_match.group(1)
|
|
pin_match = re.search("pin=([^&]+)", request)
|
|
if pin_match:
|
|
self.pin = pin_match.group(1)
|
|
|
|
def save_config(self):
|
|
config = {
|
|
"ssid": self.selected_ssid,
|
|
"password": self.wlan_password,
|
|
"pin": self.pin
|
|
}
|
|
with open("initial_config.py", "w") as f:
|
|
f.write("config = " + ujson.dumps(config))
|
|
|
|
def switch_to_client_mode(self):
|
|
ap = network.WLAN(network.AP_IF)
|
|
ap.active(False)
|
|
wlan = network.WLAN(network.STA_IF)
|
|
wlan.active(True)
|
|
wlan.connect(self.selected_ssid, self.wlan_password)
|
|
while not wlan.isconnected():
|
|
time.sleep(1)
|
|
print("Connected to", self.selected_ssid)
|
|
|
|
def setup_pico(self):
|
|
print("Start PICO setup")
|
|
self.scan_wlans()
|
|
self.start_ap_mode()
|
|
self.start_webserver()
|
|
while True:
|
|
conn, addr = self.s.accept()
|
|
request = conn.recv(1024)
|
|
self.parse_request(request)
|
|
self.save_config()
|
|
conn.close()
|
|
break # Assuming only one request is handled
|
|
self.stop_ap_mode()
|
|
self.switch_to_client_mode()
|
|
|