Merge pull request #3 from ThomasWaldmann/cleanups

WIP: Cleanups and Refactorings
pull/7/head
Tayfun ULU 2017-12-17 14:54:57 +03:00 zatwierdzone przez GitHub
commit 3166b10678
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
4 zmienionych plików z 294 dodań i 255 usunięć

1
.gitignore vendored 100644
Wyświetl plik

@ -0,0 +1 @@
.idea/

Wyświetl plik

@ -5,7 +5,7 @@ Tested : 1.8 and 1.9.2 (updated)
<b>Description</b> : WiFi manager for ESP8266 - ESP12 for micropython <b>Description</b> : WiFi manager for ESP8266 - ESP12 for micropython
<b>Main Features:  </b> <b>Main Features:</b>
- Web based connection manager - Web based connection manager
- Save wifi password in passwd.dat (csv format) - Save wifi password in passwd.dat (csv format)
@ -13,14 +13,14 @@ Tested : 1.8 and 1.9.2 (updated)
<b>Usage:</b> <b>Usage:</b>
Upload main.py and networkconfig.py on esp Upload main.py and networkconfig.py to ESP.
Write your code on main.py or import from main.py Write your code into main.py or import it from main.py.
<b>Logic:</b> <b>Logic:</b>
1. step : Check passwd.dat file and try saved passwords 1. step: Check passwd.dat file and try saved networks/passwords.
2. step : To publish web page to config new wifi 2. step: Publish web page to configure new wifi.
3. step : Saving password on passwd.dat file. 3. step: Save network/password to passwd.dat file.
4. step : Run user code 4. step: Run user code.
![alt text](https://github.com/tayfunulu/WiFiManager/blob/master/WiFi_Manager.png) ![alt text](https://github.com/tayfunulu/WiFiManager/blob/master/WiFi_Manager.png)

77
main.py
Wyświetl plik

@ -1,77 +1,12 @@
import network
import networkconfig import networkconfig
import time
wlan_sta = network.WLAN(network.STA_IF)
def do_connect(ntwrk_ssid, netwrk_pass):
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
if not sta_if.isconnected():
print('try to connect : '+ntwrk_ssid+' network...')
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('\nProblem. Not Connected to :'+ntwrk_ssid)
return (False)
def check_connection (): wlan = networkconfig.get_connection()
global wlan_sta if wlan is None:
# Firstly check is there any connection print("Could not initialize the network connection.")
if wlan_sta.isconnected(): while True:
return (True) pass # you shall not pass :D
try:
# connection of ESP to WiFi takes time
# wait 3 sec. and try again.
time.sleep(3)
if not wlan_sta.isconnected():
# inside passwd file. there are list of WiFi network CSV file
f = open("passwd.dat")
data = f.readlines()
f.close()
# Search WiFi's in range
ssids_found = wlan_sta.scan()
# matching...
for ipass in data:
ssid_list= ipass.strip("\n").split(";")
for i in ssids_found: # Main Code goes here, wlan is a working network.WLAN(STA_IF) instance.
if ssid_list[0] in i[0]:
print ("OK. WiFi is Founded")
if do_connect(ssid_list[0],ssid_list[1]):
return (True)
if not wlan_sta.isconnected():
if networkconfig.start():
return (True)
else:
return (True)
except OSError:
# Web server for connection manager
if networkconfig.start():
return (True)
return (False)
if check_connection ():
# Main Code is here
print("ESP OK") print("ESP OK")
# to import your code;
# import sample_mqtt.py
else:
print ("There is something wrong")

Wyświetl plik

@ -3,33 +3,101 @@ import socket
import ure import ure
import time import time
ap_ssid = "WifiManager"
ap_password = "tayfunulu"
ap_authmode = 3 # WPA2
NETWORK_PROFILES = 'wifi.dat'
wlan_ap = network.WLAN(network.AP_IF) wlan_ap = network.WLAN(network.AP_IF)
wlan_sta = network.WLAN(network.STA_IF) wlan_sta = network.WLAN(network.STA_IF)
# setup for ssid
ssid_name= "WifiManager"
ssid_password = "tayfunulu"
server_socket = None server_socket = None
def do_connect(ntwrk_ssid, netwrk_pass):
sta_if = network.WLAN(network.STA_IF) def get_connection():
sta_if.active(True) """return a working WLAN(STA_IF) instance or None"""
if not sta_if.isconnected():
print('try to connect : '+ntwrk_ssid+' network...') # First check if there already is any connection:
sta_if.active(True) if wlan_sta.isconnected():
sta_if.connect(ntwrk_ssid, netwrk_pass) return wlan_sta
a=0
while not sta_if.isconnected() | (a > 99) : connected = False
time.sleep(0.1) try:
a+=1 # ESP connecting to WiFi takes time, wait a bit and try again:
print('.', end='') time.sleep(3)
if sta_if.isconnected(): if wlan_sta.isconnected():
print('\nConnected. Network config:', sta_if.ifconfig()) return wlan_sta
return (True)
# Read known network profiles from file
profiles = read_profiles()
# Search WiFis in range
wlan_sta.active(True)
networks = wlan_sta.scan()
AUTHMODE = {0: "open", 1: "WEP", 2: "WPA-PSK", 3: "WPA2-PSK", 4: "WPA/WPA2-PSK"}
for ssid, bssid, channel, rssi, authmode, hidden in sorted(networks, key=lambda x: x[3], reverse=True):
ssid = ssid.decode('utf-8')
encrypted = authmode > 0
print("ssid: %s chan: %d rssi: %d authmode: %s" % (ssid, channel, rssi, AUTHMODE.get(authmode, '?')))
if encrypted:
if ssid in profiles:
password = profiles[ssid]
connected = do_connect(ssid, password)
else: else:
print('\nProblem. Not Connected to :'+ntwrk_ssid) print("skipping unknown encrypted network")
return (False) else: # open
connected = do_connect(ssid, None)
if connected:
break
except OSError as e:
print("exception", str(e))
# start web server for connection manager:
if not connected:
connected = start()
return wlan_sta if connected else None
def read_profiles():
with open(NETWORK_PROFILES) as f:
lines = f.readlines()
profiles = {}
for line in lines:
ssid, password = line.strip("\n").split(";")
profiles[ssid] = password
return profiles
def write_profiles(profiles):
lines = []
for ssid, password in profiles.items():
lines.append("%s;%s\n" % (ssid, password))
with open(NETWORK_PROFILES, "w") as f:
f.write(''.join(lines))
def do_connect(ssid, password):
wlan_sta.active(True)
if wlan_sta.isconnected():
return None
print('Trying to connect to %s...' % ssid)
wlan_sta.connect(ssid, password)
for retry in range(100):
connected = wlan_sta.isconnected()
if connected:
break
time.sleep(0.1)
print('.', end='')
if connected:
print('\nConnected. Network config: ', wlan_sta.ifconfig())
else:
print('\nFailed. Not Connected to: ' + ssid)
return connected
def send_response(client, payload, status_code=200): def send_response(client, payload, status_code=200):
client.sendall("HTTP/1.0 {} OK\r\n".format(status_code)) client.sendall("HTTP/1.0 {} OK\r\n".format(status_code))
@ -40,48 +108,78 @@ def send_response(client, payload, status_code=200):
if len(payload) > 0: if len(payload) > 0:
client.sendall(payload) client.sendall(payload)
def handle_root(client): def handle_root(client):
global wlan_sta wlan_sta.active(True)
response_header = """ ssids = sorted(ssid.decode('utf-8') for ssid, *_ in wlan_sta.scan())
<html><h1 style="color: #5e9ca0; text-align: center;"><span style="color: #ff0000;">Wi-Fi Client Setup</span></h1>
response = []
response.append("""\
<html>
<h1 style="color: #5e9ca0; text-align: center;">
<span style="color: #ff0000;">
Wi-Fi Client Setup
</span>
</h1>
<form action="configure" method="post"> <form action="configure" method="post">
<table style="margin-left: auto; margin-right: auto;"> <table style="margin-left: auto; margin-right: auto;">
<tbody><tr><td>Wifi Name</td> <tbody>
<td style="text-align: center;"><select id="ssid" name="ssid"> """)
"""
wlan_sta.active(True)
response_variable = "" for ssid in ssids:
for ssid, *_ in wlan_sta.scan(): response.append("""\
response_variable += '<option value="{0}">{0}</option>'.format(ssid.decode("utf-8")) <tr>
<td colspan="2">
<input type="radio" name="ssid" value="{0}" />{0}
</td>
</tr>
""".format(ssid))
response_footer = """ response.append("""\
</select></td></tr> <tr>
<tr><td>Password</td> <td>Password:</td>
<td><input name="password" type="password" /></td> <td><input name="password" type="password" /></td>
</tr></tbody> </tr>
</tbody>
</table> </table>
<p style="text-align: center;"><input type="submit" value="Submit" /></p> <p style="text-align: center;">
<input type="submit" value="Submit" />
</p>
</form> </form>
<p>&nbsp;</p> <p>&nbsp;</p>
<hr /> <hr />
<h5><span style="color: #ff0000;">!!! your ssid and password information will save "passwd.dat" file inside of your esp module to use next time... be careful for security !!!</span></h5> <h5>
<span style="color: #ff0000;">
Your ssid and password information will be saved into the
"%(filename)s" file in your ESP module for future usage.
Be careful about security!
</span>
</h5>
<hr /> <hr />
<h2 style="color: #2e6c80;">Some useful infos:</h2> <h2 style="color: #2e6c80;">
Some useful infos:
</h2>
<ul> <ul>
<li>Wi-Fi Client for Micropython GitHub from&nbsp;<a href="https://github.com/cpopp/MicroPythonSamples" target="_blank" rel="noopener">cpopp</a></li> <li>
<li>My github adress <a href="https://github.com/tayfunulu" target="_blank" rel="noopener">tayfunulu</a></li> Original code from <a href="https://github.com/cpopp/MicroPythonSamples"
target="_blank" rel="noopener">cpopp/MicroPythonSamples</a>.
</li>
<li>
This code available at <a href="https://github.com/tayfunulu/WiFiManager"
target="_blank" rel="noopener">tayfunulu/WiFiManager</a>.
</li>
</ul> </ul>
</html> </html>
""" """ % dict(filename=NETWORK_PROFILES))
send_response(client, response_header + response_variable + response_footer) send_response(client, "\n".join(response))
def handle_configure(client, request): def handle_configure(client, request):
match = ure.search("ssid=([^&]*)&password=(.*)", request) match = ure.search("ssid=([^&]*)&password=(.*)", request)
if match is None: if match is None:
send_response(client, "Parameters not found", status_code=400) send_response(client, "Parameters not found", status_code=400)
return (False) return False
# version 1.9 compatibility # version 1.9 compatibility
try: try:
ssid = match.group(1).decode("utf-8").replace("%3F", "?").replace("%21", "!") ssid = match.group(1).decode("utf-8").replace("%3F", "?").replace("%21", "!")
@ -90,92 +188,97 @@ def handle_configure(client, request):
ssid = match.group(1).replace("%3F", "?").replace("%21", "!") ssid = match.group(1).replace("%3F", "?").replace("%21", "!")
password = match.group(2).replace("%3F", "?").replace("%21", "!") password = match.group(2).replace("%3F", "?").replace("%21", "!")
if len(ssid) == 0: if len(ssid) == 0:
send_response(client, "SSID must be provided", status_code=400) send_response(client, "SSID must be provided", status_code=400)
return (False) return False
if do_connect(ssid, password): if do_connect(ssid, password):
response_footer = """ response = """\
<html>
<center><br><br>
<h1 style="color: #5e9ca0; text-align: center;"><span style="color: #ff0000;">:) YES, Wi-Fi Configured to """+ssid+"""</span></h1>
<br><br>"""
send_response(client, response_footer)
try:
fo = open("passwd.dat","r")
ex_data = fo.read()
fo.close()
fo = open("passwd.dat","w")
ex_data = ssid+";"+password+"\n"+ex_data
fo.write(ex_data)
fo.close()
except:
fo = open("passwd.dat","w")
fo.write(ssid+";"+password+"\n")
fo.close()
return (True)
else:
response_footer = """
<html> <html>
<center> <center>
<h1 style="color: #5e9ca0; text-align: center;"><span style="color: #ff0000;">Wi-Fi Not Configured to """+ssid+"""</span></h1> <br><br>
<h1 style="color: #5e9ca0; text-align: center;">
<span style="color: #ff0000;">
ESP successfully connected to WiFi network %(ssid)s.
</span>
</h1>
<br><br>
</center>
</html>
""" % dict(ssid=ssid)
send_response(client, response)
try:
profiles = read_profiles()
except OSError:
profiles = {}
profiles[ssid] = password
write_profiles(profiles)
return True
else:
response = """\
<html>
<center>
<h1 style="color: #5e9ca0; text-align: center;">
<span style="color: #ff0000;">
ESP could not connect to WiFi network %(ssid)s.
</span>
</h1>
<br><br> <br><br>
<form> <form>
<input type="button" value="Go back!" onclick="history.back()"></input> <input type="button" value="Go back!" onclick="history.back()"></input>
</form></center></html> </form>
""" </center>
send_response(client, response_footer ) </html>
return (False) """ % dict(ssid=ssid)
send_response(client, response)
return False
def handle_not_found(client, url): def handle_not_found(client, url):
send_response(client, "Path not found: {}".format(url), status_code=404) send_response(client, "Path not found: {}".format(url), status_code=404)
def stop(): def stop():
global server_socket global server_socket
if server_socket: if server_socket:
server_socket.close() server_socket.close()
server_socket = None
def start(port=80): def start(port=80):
global server_socket
addr = socket.getaddrinfo('0.0.0.0', port)[0][-1] 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() stop()
wlan_sta.active(True) wlan_sta.active(True)
wlan_ap.active(True) wlan_ap.active(True)
wlan_ap.config(essid=ssid_name,password=ssid_password) wlan_ap.config(essid=ap_ssid, password=ap_password, authmode=ap_authmode)
server_socket = socket.socket() server_socket = socket.socket()
server_socket.bind(addr) server_socket.bind(addr)
server_socket.listen(1) server_socket.listen(1)
print('Connect to Wifi ssid :'+ssid_name+' , Default pass: '+ssid_password) print('Connect to WiFi ssid ' + ap_ssid + ', default password: ' + ap_password)
print('And connect to esp via your favorite web browser (like 192.168.4.1)') print('and access the ESP via your favorite web browser at 192.168.4.1.')
print('listening on', addr) print('Listening on:', addr)
while True: while True:
if wlan_sta.isconnected(): if wlan_sta.isconnected():
client.close return True
return (True)
client, addr = server_socket.accept() client, addr = server_socket.accept()
client.settimeout(5.0)
print('client connected from', addr) print('client connected from', addr)
try:
client.settimeout(5.0)
request = b"" request = b""
try: try:
while not "\r\n\r\n" in request: while "\r\n\r\n" not in request:
request += client.recv(512) request += client.recv(512)
except OSError: except OSError:
pass pass
@ -183,7 +286,6 @@ def start(port=80):
print("Request is: {}".format(request)) print("Request is: {}".format(request))
if "HTTP" not in request: if "HTTP" not in request:
# skip invalid requests # skip invalid requests
client.close()
continue continue
# version 1.9 compatibility # version 1.9 compatibility
@ -200,4 +302,5 @@ def start(port=80):
else: else:
handle_not_found(client, url) handle_not_found(client, url)
finally:
client.close() client.close()