YIO-Remote / remote-software

💎 YIO Remote Software repository
GNU General Public License v3.0
164 stars 21 forks source link

Improve logic for WiFi setup connection check: fails too fast #322

Closed zehnm closed 4 years ago

zehnm commented 4 years ago

Expected behavior

The WiFi setup process checks for successful WiFi connection after entering the credentials and clicking connect. If after a certain time the connection cannot be established, display an error message to retry again. Invalid credentials should lead to a specific error message. The user is informed about the connection progress "connecting, waiting, connection rejected, connection established".

Current behavior

Possible implementation

The WiFi setup needs a major rework. Everything is in wifiSetup.qml, no separation from UI and controller. Shell scripts are directly called from the UI event handler. Connection check is hard coded to 6000 ms.

TODO:

We should also look into how to directly communicate with the _wpasupplicant API instead of calling shell scripts and parsing console output. Advantages:

wpa_supplicant developer documentation:

Example implementations:

Further examples:

See related issue: https://github.com/YIO-Remote/remote-os/issues/13

zehnm commented 4 years ago

Started with rewriting the WiFi integration and designing a general WiFi control API for using different implementations. Starting with:

  1. Mock implementation for testing
  2. Wrapping current shell scripts
  3. wpa_supplicant control API
zehnm commented 4 years ago

Successful proof of concept: wpa_supplicant control API integration works!

DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::connectWpaControlSocket() "/var/run/wpa_supplicant/wlan0" (../sources/hardware/wifi_wpasupplicant.cpp/152)
DEBUG: WifiWpaSupplicant virtual void WifiWpaSupplicant::startNetworkScan() (../sources/hardware/wifi_wpasupplicant.cpp/128)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::requestWrapper(const QString&) "SCAN" (../sources/hardware/wifi_wpasupplicant.cpp/212)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::controlEvent(int) (../sources/hardware/wifi_wpasupplicant.cpp/199)
DEBUG: WifiWpaSupplicant [monitor] CTRL: "<3>CTRL-EVENT-SCAN-STARTED " : 27 (../sources/hardware/wifi_wpasupplicant.cpp/205)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::parseEvent(const QString&) (../sources/hardware/wifi_wpasupplicant.cpp/165)
DEBUG: WifiWpaSupplicant scan started! (../sources/hardware/wifi_wpasupplicant.cpp/176)
DEBUG: WifiControl void WifiControl::setScanStatus(WifiControl::ScanStatus) (../sources/hardware/wifi_control.cpp/91)
DEBUG: WifiWpaSupplicant [monitor] CTRL: "<3>CTRL-EVENT-BSS-ADDED 4 xx:xx:xx:xx:xx:xx" : 43 (../sources/hardware/wifi_wpasupplicant.cpp/205)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::parseEvent(const QString&) (../sources/hardware/wifi_wpasupplicant.cpp/165)
DEBUG: WifiWpaSupplicant [monitor] CTRL: "<3>CTRL-EVENT-BSS-ADDED 5 xx:xx:xx:xx:xx:xx" : 43 (../sources/hardware/wifi_wpasupplicant.cpp/205)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::parseEvent(const QString&) (../sources/hardware/wifi_wpasupplicant.cpp/165)
DEBUG: WifiWpaSupplicant [monitor] CTRL: "<3>CTRL-EVENT-BSS-ADDED 6 xx:xx:xx:xx:xx:xx" : 43 (../sources/hardware/wifi_wpasupplicant.cpp/205)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::parseEvent(const QString&) (../sources/hardware/wifi_wpasupplicant.cpp/165)
DEBUG: WifiWpaSupplicant [monitor] CTRL: "<3>CTRL-EVENT-SCAN-RESULTS " : 27 (../sources/hardware/wifi_wpasupplicant.cpp/205)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::parseEvent(const QString&) (../sources/hardware/wifi_wpasupplicant.cpp/165)
DEBUG: WifiWpaSupplicant  scan_results available! (../sources/hardware/wifi_wpasupplicant.cpp/170)
DEBUG: WifiControl void WifiControl::setScanStatus(WifiControl::ScanStatus) (../sources/hardware/wifi_control.cpp/91)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::readScanResults() (../sources/hardware/wifi_wpasupplicant.cpp/224)
DEBUG: WifiWpaSupplicant void WifiWpaSupplicant::requestWrapper(const QString&) "SCAN_RESULTS" (../sources/hardware/wifi_wpasupplicant.cpp/212)
DEBUG: WifiWpaSupplicant WifiNetwork WifiWpaSupplicant::lineToNetwork(const QStringRef&) (../sources/hardware/wifi_wpasupplicant.cpp/237)
DEBUG: WifiWpaSupplicant network: "A Net" "xx:xx:xx:xx:xx:xx" -60 (../sources/hardware/wifi_wpasupplicant.cpp/244)
DEBUG: WifiWpaSupplicant WifiNetwork WifiWpaSupplicant::lineToNetwork(const QStringRef&) (../sources/hardware/wifi_wpasupplicant.cpp/237)
DEBUG: WifiWpaSupplicant network: "B Net" "xx:xx:xx:xx:xx:xx" -63 (../sources/hardware/wifi_wpasupplicant.cpp/244)
DEBUG: WifiWpaSupplicant WifiNetwork WifiWpaSupplicant::lineToNetwork(const QStringRef&) (../sources/hardware/wifi_wpasupplicant.cpp/237)
DEBUG: WifiWpaSupplicant network: "DVJMNET" "xx:xx:xx:xx:xx:xx" -86 (../sources/hardware/wifi_wpasupplicant.cpp/244)
DEBUG: WifiWpaSupplicant WifiNetwork WifiWpaSupplicant::lineToNetwork(const QStringRef&) (../sources/hardware/wifi_wpasupplicant.cpp/237)
DEBUG: WifiWpaSupplicant network: "Guest Network" "xx:xx:xx:xx:xx:xx" -61 (../sources/hardware/wifi_wpasupplicant.cpp/244)
zehnm commented 4 years ago

Important: the /etc/wpa_supplicant/wpa_supplicant-wlan0.conf configuration file needs the update_config=1 option set to be able to overwrite the configuration with cli_ctrl. See: https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf

# Whether to allow wpa_supplicant to update (overwrite) configuration
#
# This option can be used to allow wpa_supplicant to overwrite configuration
# file whenever configuration is changed (e.g., new network block is added with
# wpa_cli or wpa_gui, or a password is changed). This is required for
# wpa_cli/wpa_gui to be able to store the configuration changes permanently.
# Please note that overwriting configuration file will remove the comments from
# it.
#update_config=1
zehnm commented 4 years ago

Information about the hostap control interface: