3131
3232# pylint: disable=no-name-in-module
3333
34- import adafruit_esp32spi .adafruit_esp32spi_requests as requests
34+ from time import sleep
35+ from micropython import const
3536from adafruit_esp32spi import adafruit_esp32spi
37+ import adafruit_esp32spi .adafruit_esp32spi_requests as requests
3638
3739
3840class ESPSPI_WiFiManager :
3941 """
4042 A class to help manage the Wifi connection
4143 """
42- # pylint: disable=too-many-arguments
43- def __init__ (self , esp , secrets , status_pixel = None , attempts = 2 , debug = False ):
44+ NORMAL = const (1 )
45+ ENTERPRISE = const (2 )
46+
47+ # pylint: disable=too-many-arguments, line-too-long
48+ def __init__ (self , esp , secrets , status_pixel = None , attempts = 2 , connection_type = NORMAL , debug = False ):
4449 """
4550 :param ESP_SPIcontrol esp: The ESP object we are using
4651 :param dict secrets: The WiFi and Adafruit IO secrets dict (See examples)
4752 :param status_pixel: (Optional) The pixel device - A NeoPixel, DotStar,
4853 or RGB LED (default=None)
4954 :type status_pixel: NeoPixel, DotStar, or RGB LED
5055 :param int attempts: (Optional) Failed attempts before resetting the ESP32 (default=2)
56+ :param const connection_type: (Optional) Type of WiFi connection: NORMAL or ENTERPRISE
5157 """
5258 # Read the settings
5359 self .esp = esp
5460 self .debug = debug
5561 self .ssid = secrets ['ssid' ]
5662 self .password = secrets .get ('password' , None )
5763 self .attempts = attempts
64+ self ._connection_type = connection_type
5865 requests .set_interface (self .esp )
5966 self .statuspix = status_pixel
6067 self .pixel_status (0 )
61- # pylint: enable=too-many-arguments
68+
69+ # Check for WPA2 Enterprise keys in the secrets dictionary and load them if they exist
70+ if secrets .get ('ent_ssid' ):
71+ self .ent_ssid = secrets ['ent_ssid' ]
72+ else :
73+ self .ent_ssid = secrets ['ssid' ]
74+ if secrets .get ('ent_ident' ):
75+ self .ent_ident = secrets ['ent_ident' ]
76+ else :
77+ self .ent_ident = ''
78+ if secrets .get ('ent_user' ):
79+ self .ent_user = secrets ['ent_user' ]
80+ if secrets .get ('ent_password' ):
81+ self .ent_password = secrets ['ent_password' ]
82+ # pylint: enable=too-many-arguments, line-too-long
6283
6384 def reset (self ):
6485 """
@@ -79,6 +100,17 @@ def connect(self):
79100 print ("MAC addr:" , [hex (i ) for i in self .esp .MAC_address ])
80101 for access_pt in self .esp .scan_networks ():
81102 print ("\t %s\t \t RSSI: %d" % (str (access_pt ['ssid' ], 'utf-8' ), access_pt ['rssi' ]))
103+ if self ._connection_type == ESPSPI_WiFiManager .NORMAL :
104+ self .connect_normal ()
105+ elif self ._connection_type == ESPSPI_WiFiManager .ENTERPRISE :
106+ self .connect_enterprise ()
107+ else :
108+ raise TypeError ("Invalid WiFi connection type specified" )
109+
110+ def connect_normal (self ):
111+ """
112+ Attempt a regular style WiFi connection
113+ """
82114 failure_count = 0
83115 while not self .esp .is_connected :
84116 try :
@@ -123,6 +155,33 @@ def create_ap(self):
123155 continue
124156 print ("Access Point created! Connect to ssid: {}" .format (self .ssid ))
125157
158+ def connect_enterprise (self ):
159+ """
160+ Attempt an enterprise style WiFi connection
161+ """
162+ failure_count = 0
163+ self .esp .wifi_set_network (bytes (self .ent_ssid , 'utf-8' ))
164+ self .esp .wifi_set_entidentity (bytes (self .ent_ident , 'utf-8' ))
165+ self .esp .wifi_set_entusername (bytes (self .ent_user , 'utf-8' ))
166+ self .esp .wifi_set_entpassword (bytes (self .ent_password , 'utf-8' ))
167+ self .esp .wifi_set_entenable ()
168+ while not self .esp .is_connected :
169+ try :
170+ if self .debug :
171+ print ("Waiting for the ESP32 to connect to the WPA2 Enterprise AP..." )
172+ self .pixel_status ((100 , 0 , 0 ))
173+ sleep (1 )
174+ failure_count = 0
175+ self .pixel_status ((0 , 100 , 0 ))
176+ sleep (1 )
177+ except (ValueError , RuntimeError ) as error :
178+ print ("Failed to connect, retrying\n " , error )
179+ failure_count += 1
180+ if failure_count >= self .attempts :
181+ failure_count = 0
182+ self .reset ()
183+ continue
184+
126185 def get (self , url , ** kw ):
127186 """
128187 Pass the Get request to requests and update status LED
0 commit comments