diff --git a/software/frontend/index.html b/software/frontend/index.html
index e05bc11..43de408 100644
--- a/software/frontend/index.html
+++ b/software/frontend/index.html
@@ -359,7 +359,10 @@
'root.LED_COUNT': 'Length of WS2182 (Neopixel) LED chain',
'root.VOLUME_MAX': 'Maximum volume (0-255)',
'root.VOLUME_BOOT': 'Volume at startup (0-255)',
- 'root.LED_MAX': 'Maximum LED brightness (0-255)'
+ 'root.LED_MAX': 'Maximum LED brightness (0-255)',
+ 'root.WIFI.SSID': 'Network name (SSID) (leave empty for AP mode)',
+ 'root.WIFI.PASSPHRASE': 'Password',
+ 'root.WIFI.SECURITY': 'Security mode'
};
const config_input_override = {
'root.TAGMODE': {
@@ -393,12 +396,21 @@
'root.LED_COUNT': {
'input-type': 'number'
},
- 'root.WLAN.SSID': {
+ 'root.WIFI.SSID': {
'input-type': 'text'
},
- 'root.WLAN.PASSPHRASE': {
+ 'root.WIFI.PASSPHRASE': {
'input-type': 'text'
},
+ 'root.WIFI.SECURITY': {
+ 'element': 'select',
+ 'values': {
+ 'open': 'Open',
+ 'wpa_wpa2': 'WPA/WPA2 (PSK Mixed)',
+ 'wpa3': 'WPA3 (SAE AES)',
+ 'wpa2_wpa3': 'WPA2/WPA3 (PSK AES)'
+ }
+ },
'root.VOLUME_MAX': {
'input-type': 'number'
},
diff --git a/software/src/main.py b/software/src/main.py
index 8ed430e..cae2b1f 100644
--- a/software/src/main.py
+++ b/software/src/main.py
@@ -36,19 +36,19 @@ hwconfig.board_init()
machine.mem32[0x40030000 + 0x00] = 0x10
-def setup_wifi(ssid='', passphrase='', sec=network.WLAN.SEC_WPA2_WPA3):
+def setup_wifi(ssid='', passphrase='', security=network.WLAN.SEC_WPA_WPA2):
network.hostname("TonberryPico")
if ssid is None or ssid == '':
apname = f"TonberryPicoAP_{machine.unique_id().hex()}"
print(f"Create AP {apname}")
wlan = network.WLAN(network.WLAN.IF_AP)
- wlan.config(ssid=apname, security=wlan.SEC_OPEN)
+ wlan.config(ssid=apname, password=passphrase if passphrase is not None else '', security=security)
wlan.active(True)
else:
print(f"Connect to SSID {ssid} with passphrase {passphrase}...")
wlan = network.WLAN()
wlan.active(True)
- wlan.connect(ssid, passphrase if passphrase is not None else '', security=sec)
+ wlan.connect(ssid, passphrase if passphrase is not None else '', security=security)
# configure power management
wlan.config(pm=network.WLAN.PM_PERFORMANCE)
@@ -86,9 +86,19 @@ def run():
np.fill((0, 0, led_max))
np.write()
# Force default access point
- setup_wifi('', '')
+ setup_wifi('', '', network.WLAN.SEC_OPEN)
else:
- setup_wifi(config.get_wifi_ssid(), config.get_wifi_passphrase())
+ secstring = config.get_wifi_security()
+ security = network.WLAN.SEC_WPA_WPA2
+ if secstring == 'open':
+ security = network.WLAN.SEC_OPEN
+ elif secstring == 'wpa_wpa2':
+ security = network.WLAN.SEC_WPA_WPA2
+ elif secstring == 'wpa3':
+ security = network.WLAN.SEC_WPA3
+ elif secstring == 'wpa2_wpa3':
+ security = network.WLAN.SEC_WPA2_WPA3
+ setup_wifi(config.get_wifi_ssid(), config.get_wifi_passphrase(), security)
# Setup MP3 player
with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS,
diff --git a/software/src/utils/config.py b/software/src/utils/config.py
index 6584cba..629a0fd 100644
--- a/software/src/utils/config.py
+++ b/software/src/utils/config.py
@@ -26,6 +26,7 @@ class Configuration:
'WIFI': {
'SSID': '',
'PASSPHRASE': '',
+ 'SECURITY': 'wpa_wpa2',
},
'VOLUME_MAX': 255,
'VOLUME_BOOT': 16,
@@ -100,6 +101,9 @@ class Configuration:
def get_wifi_passphrase(self) -> str:
return self._get('WIFI')['PASSPHRASE']
+ def get_wifi_security(self) -> str:
+ return self._get('WIFI')['SECURITY']
+
def get_volume_max(self) -> int:
return self._get('VOLUME_MAX')
@@ -126,6 +130,9 @@ class Configuration:
self._validate(self.DEFAULT_CONFIG, config)
if 'TAGMODE' in config and config['TAGMODE'] not in ['tagremains', 'tagstartstop']:
raise ValueError("Invalid TAGMODE: Must be 'tagremains' or 'tagstartstop'")
+ if 'WLAN' in config and 'SECURITY' in config['WLAN'] and \
+ config['WLAN']['SECURITY'] not in ['open', 'wpa_wpa2', 'wpa3', 'wpa2_wpa3']:
+ raise ValueError("Invalid WLAN SECURITY: Must be 'open', 'wpa_wpa2', 'wpa3' or 'wpa2_wpa3'")
self._merge_configs(self.config, config)
self.config = config
self._save()