second commit
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
## -*- coding: utf-8 -*-
|
||||
# wifi_manager.py
|
||||
# GNU GENERAL PUBLIC LICENSE: (c) DD miraceti.net
|
||||
|
||||
import utime as time # @UnresolvedImport
|
||||
import ubinascii # @UnresolvedImport
|
||||
import network # @UnresolvedImport
|
||||
'''
|
||||
Management de la WiFi pour ESP32 (MicroPython).
|
||||
Usage:
|
||||
|
||||
SSID = "ssid_8chars"
|
||||
PASSWORD = "ChangeMeSoon"
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
WiFi = WifiManager(mode='AP')
|
||||
|
||||
wifi = WiFi(SSID, PASSWORD)
|
||||
wifi.start()
|
||||
n=0
|
||||
while True:
|
||||
time.sleep(5.0)
|
||||
print(n, wifi.status())
|
||||
n += 1
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
wifi.stop()
|
||||
print("Arrêt")
|
||||
'''
|
||||
|
||||
class WifiBase:
|
||||
ssid = None
|
||||
password = None
|
||||
channel = 1
|
||||
hidden = False
|
||||
max_clients = 4
|
||||
authmode = 3
|
||||
_iface= None
|
||||
_mode='AP'
|
||||
wifi_delay = 1.5
|
||||
|
||||
def start(self):
|
||||
pass
|
||||
|
||||
def stop(self):
|
||||
pass
|
||||
|
||||
def status(self):
|
||||
pass
|
||||
|
||||
def restart(self):
|
||||
if_was = self._iface.active()
|
||||
self._iface.active(False)
|
||||
time.sleep(self.wifi_delay)
|
||||
if if_was:
|
||||
self._iface.active(True)
|
||||
return self.status()
|
||||
|
||||
def get_ip(self):
|
||||
return self._iface.ifconfig()[0] if self._iface.active() else None
|
||||
|
||||
def get_ssid(self):
|
||||
return self._iface.config('essid') if self._iface.active() else None
|
||||
|
||||
def get_rssi(self):
|
||||
return self._iface.status('rssi') if self._iface.isconnected() else None
|
||||
|
||||
def get_iface(self):
|
||||
return self._mode
|
||||
|
||||
|
||||
class APManager(WifiBase):
|
||||
"""
|
||||
Gestion WiFi pour ESP32 (MicroPython).
|
||||
Arguments (tous optionnels selon le mode) :
|
||||
ssid (str) : nom du réseau AP ou SSID à rejoindre
|
||||
password (str) : mot de passe AP ou STA (min 8 chars si authmode != 0)
|
||||
channel (int) : canal pour AP (1-13)
|
||||
hidden (bool) : AP caché ou non
|
||||
max_clients (int) : nombre max de clients en AP
|
||||
authmode (int) : 0=OPEN,1=WEP,2=WPAPSK,3=WPAPSK/SAE,4=SAEs
|
||||
timeout_connect: délai pour connecter
|
||||
"""
|
||||
def __init__(self, ssid=None, password=None, channel=1, hidden=False,
|
||||
max_clients=4, authmode=3, timeout_connect=15):
|
||||
self.ssid = ssid or b"ESP32-" + ubinascii.hexlify(self._iface.config('mac')[-3:]).decode()
|
||||
self.password = password or ''
|
||||
self.channel = channel if 1 <= channel <= 13 else 1
|
||||
self.hidden = bool(hidden)
|
||||
self.max_clients = max_clients if max_clients > 0 else 4
|
||||
self.authmode = authmode
|
||||
self.timeout_connect = timeout_connect
|
||||
self._iface= network.WLAN(network.AP_IF)
|
||||
self._mode = 'AP'
|
||||
|
||||
|
||||
def start(self):
|
||||
if not self._iface.active():
|
||||
self._iface.active(True)
|
||||
cfg_auth = 0 if not self.password else self.authmode
|
||||
try:
|
||||
self._iface.config(essid=self.ssid, password=self.password, authmode=cfg_auth,
|
||||
channel=self.channel, hidden=self.hidden, max_clients=self.max_clients)
|
||||
except Exception as e:
|
||||
print("start error", e)
|
||||
return False
|
||||
time.sleep(self.wifi_delay)
|
||||
print("Démarrage de la wifi:", self.status())
|
||||
return True
|
||||
|
||||
|
||||
def stop(self):
|
||||
if self._iface.active():
|
||||
self._iface.active(False)
|
||||
print("Déconnexion de la wifi:", self.status())
|
||||
|
||||
|
||||
def status(self):
|
||||
return {
|
||||
'iface': self.get_iface(),
|
||||
'active': self._iface.active(),
|
||||
'ssid': self.get_ssid(),
|
||||
'ip': self.get_ip(),
|
||||
}
|
||||
|
||||
|
||||
class STAManager(WifiBase):
|
||||
"""
|
||||
Gestion WiFi pour ESP32 (MicroPython).
|
||||
Arguments (tous optionnels selon le mode) :
|
||||
ssid (str) : nom du réseau AP ou SSID à rejoindre
|
||||
password (str) : mot de passe AP ou STA (min 8 chars si authmode != 0)
|
||||
authmode (int) : 0=OPEN,1=WEP,2=WPAPSK,3=WPAPSK/SAE,4=SAEs
|
||||
timeout_connect: délai pour connecter
|
||||
"""
|
||||
def __init__(self, ssid=None, password=None, authmode=3, timeout_connect=10):
|
||||
self.ssid = ssid
|
||||
self.password = password
|
||||
self.authmode = authmode
|
||||
self.timeout_connect = timeout_connect
|
||||
self._iface= network.WLAN(network.STA_IF)
|
||||
self._mode = 'STA'
|
||||
|
||||
def start(self):
|
||||
try:
|
||||
if not self.ssid:
|
||||
raise ValueError("SSID requis pour le mode STA")
|
||||
if self.password and len(self.password) < 8:
|
||||
raise ValueError("Mot de passe WPA/WPA2 doit faire >=8 caractères")
|
||||
|
||||
#self._iface.disconnect()
|
||||
self._iface.active(False)
|
||||
time.sleep(self.wifi_delay)
|
||||
|
||||
self._iface.active(True)
|
||||
self._iface.connect(self.ssid, self.password)
|
||||
|
||||
t0 = time.time()
|
||||
wait, n = 0.1, 0
|
||||
|
||||
print('Tentative de connexion au réseau...')
|
||||
while not self._iface.isconnected():
|
||||
time.sleep(wait)
|
||||
wait = min(0.5, wait + 0.05)
|
||||
n+=1
|
||||
print(n, '> Essai de connexion...', 'status>', self._iface.status())
|
||||
if (time.time() - t0) > self.timeout_connect:
|
||||
raise Exception('Timeout connexion atteint') # @UndefinedVariable
|
||||
|
||||
time.sleep(self.wifi_delay)
|
||||
print("Démarrage de la wifi:", self.status())
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"STA connect() raised: {e}")
|
||||
return False
|
||||
|
||||
|
||||
def stop(self):
|
||||
if self._iface.isconnected():
|
||||
try:
|
||||
self._iface.disconnect()
|
||||
except Exception:
|
||||
pass
|
||||
print("Déconnexion de la wifi", self.status())
|
||||
|
||||
|
||||
def status(self):
|
||||
return {
|
||||
'iface': self.get_iface(),
|
||||
'active': self._iface.active(),
|
||||
'connected': self._iface.isconnected(),
|
||||
'ip': self.get_ip(),
|
||||
'rssi': self.get_rssi()
|
||||
}
|
||||
|
||||
|
||||
def WifiManager(mode='AP'):
|
||||
return APManager if mode == 'AP' else STAManager
|
||||
|
||||
Reference in New Issue
Block a user