feat: Allow configuring WiFi security
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m44s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 9s
Run pytests / Check-Pytest (push) Successful in 11s
All checks were successful
Build RPi Pico firmware image / Build-Firmware (push) Successful in 4m44s
Check code formatting / Check-C-Format (push) Successful in 7s
Check code formatting / Check-Python-Flake8 (push) Successful in 10s
Check code formatting / Check-Bash-Shellcheck (push) Successful in 4s
Run unit tests on host / Run-Unit-Tests (push) Successful in 9s
Run pytests / Check-Pytest (push) Successful in 11s
Allow choosing between the three security modes exposed by the micropython cyw43 wifi driver. Also allow setting up security in AP mode. Improve the WiFi section of the configuration UI. Signed-off-by: Matthias Blankertz <matthias@blankertz.org>
This commit is contained in:
@@ -359,7 +359,10 @@
|
|||||||
'root.LED_COUNT': 'Length of WS2182 (Neopixel) LED chain',
|
'root.LED_COUNT': 'Length of WS2182 (Neopixel) LED chain',
|
||||||
'root.VOLUME_MAX': 'Maximum volume (0-255)',
|
'root.VOLUME_MAX': 'Maximum volume (0-255)',
|
||||||
'root.VOLUME_BOOT': 'Volume at startup (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 = {
|
const config_input_override = {
|
||||||
'root.TAGMODE': {
|
'root.TAGMODE': {
|
||||||
@@ -393,12 +396,21 @@
|
|||||||
'root.LED_COUNT': {
|
'root.LED_COUNT': {
|
||||||
'input-type': 'number'
|
'input-type': 'number'
|
||||||
},
|
},
|
||||||
'root.WLAN.SSID': {
|
'root.WIFI.SSID': {
|
||||||
'input-type': 'text'
|
'input-type': 'text'
|
||||||
},
|
},
|
||||||
'root.WLAN.PASSPHRASE': {
|
'root.WIFI.PASSPHRASE': {
|
||||||
'input-type': 'text'
|
'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': {
|
'root.VOLUME_MAX': {
|
||||||
'input-type': 'number'
|
'input-type': 'number'
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -36,19 +36,19 @@ hwconfig.board_init()
|
|||||||
machine.mem32[0x40030000 + 0x00] = 0x10
|
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")
|
network.hostname("TonberryPico")
|
||||||
if ssid is None or ssid == '':
|
if ssid is None or ssid == '':
|
||||||
apname = f"TonberryPicoAP_{machine.unique_id().hex()}"
|
apname = f"TonberryPicoAP_{machine.unique_id().hex()}"
|
||||||
print(f"Create AP {apname}")
|
print(f"Create AP {apname}")
|
||||||
wlan = network.WLAN(network.WLAN.IF_AP)
|
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)
|
wlan.active(True)
|
||||||
else:
|
else:
|
||||||
print(f"Connect to SSID {ssid} with passphrase {passphrase}...")
|
print(f"Connect to SSID {ssid} with passphrase {passphrase}...")
|
||||||
wlan = network.WLAN()
|
wlan = network.WLAN()
|
||||||
wlan.active(True)
|
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
|
# configure power management
|
||||||
wlan.config(pm=network.WLAN.PM_PERFORMANCE)
|
wlan.config(pm=network.WLAN.PM_PERFORMANCE)
|
||||||
@@ -86,9 +86,19 @@ def run():
|
|||||||
np.fill((0, 0, led_max))
|
np.fill((0, 0, led_max))
|
||||||
np.write()
|
np.write()
|
||||||
# Force default access point
|
# Force default access point
|
||||||
setup_wifi('', '')
|
setup_wifi('', '', network.WLAN.SEC_OPEN)
|
||||||
else:
|
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
|
# Setup MP3 player
|
||||||
with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS,
|
with SDContext(mosi=hwconfig.SD_DI, miso=hwconfig.SD_DO, sck=hwconfig.SD_SCK, ss=hwconfig.SD_CS,
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class Configuration:
|
|||||||
'WIFI': {
|
'WIFI': {
|
||||||
'SSID': '',
|
'SSID': '',
|
||||||
'PASSPHRASE': '',
|
'PASSPHRASE': '',
|
||||||
|
'SECURITY': 'wpa_wpa2',
|
||||||
},
|
},
|
||||||
'VOLUME_MAX': 255,
|
'VOLUME_MAX': 255,
|
||||||
'VOLUME_BOOT': 16,
|
'VOLUME_BOOT': 16,
|
||||||
@@ -100,6 +101,9 @@ class Configuration:
|
|||||||
def get_wifi_passphrase(self) -> str:
|
def get_wifi_passphrase(self) -> str:
|
||||||
return self._get('WIFI')['PASSPHRASE']
|
return self._get('WIFI')['PASSPHRASE']
|
||||||
|
|
||||||
|
def get_wifi_security(self) -> str:
|
||||||
|
return self._get('WIFI')['SECURITY']
|
||||||
|
|
||||||
def get_volume_max(self) -> int:
|
def get_volume_max(self) -> int:
|
||||||
return self._get('VOLUME_MAX')
|
return self._get('VOLUME_MAX')
|
||||||
|
|
||||||
@@ -126,6 +130,9 @@ class Configuration:
|
|||||||
self._validate(self.DEFAULT_CONFIG, config)
|
self._validate(self.DEFAULT_CONFIG, config)
|
||||||
if 'TAGMODE' in config and config['TAGMODE'] not in ['tagremains', 'tagstartstop']:
|
if 'TAGMODE' in config and config['TAGMODE'] not in ['tagremains', 'tagstartstop']:
|
||||||
raise ValueError("Invalid TAGMODE: Must be 'tagremains' or '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._merge_configs(self.config, config)
|
||||||
self.config = config
|
self.config = config
|
||||||
self._save()
|
self._save()
|
||||||
|
|||||||
Reference in New Issue
Block a user