#pragma once // Qt #include #include #include // Project #include "main.h" #include "MWifiNetwork.h" // define #define _WifiInterface WifiInterface::I() class tst_utilities; /*! * \brief The WifiInterface class * Communicates with Access Points * \details * - Scans for Access Points * - Authenticates with Access Points * - Disconnects from Access Points */ class WifiInterface : public QObject { Q_OBJECT friend class ::tst_utilities; QThread *_thread = nullptr; bool _init = false; bool _scanRunning = false; bool _useDHCP = true; int _defaultTimeout = 5000; int _dhcpTimeout = 10000; int _scanTimeout = 30000; int _processCounter = 0; int _dhcpAttemptsLeft = 5; QProcess _processScan; QProcess _processDisconnectNetwork; QProcess _processReadIPSettings; QProcess _processReadGateway; QProcess _processReadDNS; QProcess _processGenerateWPASupplicant; QProcess _processStartWPASupplicant; QProcess _processRequestAutoAssignedIP; QProcess _processSetStaticIPAddress; QProcess _processSetStaticGateway; QProcess _processSetStaticSubnetMask; QProcess _processSetDNS; WifiNetworkData _network; const QString _iface = "wlan0"; const QString _wpaSupplicantConfPath = "/etc/wpa_supplicant.conf"; // Singleton SINGLETON(WifiInterface) private: QString getTextBetweenDelimiters(const QString &vText, const QString &vLeftDelim, const QString &vRightDelim); QList parseWifiScan(const QString &vOutput); QString parseIP(const QString &vOutput); QString parseBroadcast(const QString &vOutput); QString parseSubnetMask(const QString &vOutput); QString parseGateway(const QString &vOutput); QString parseDNS(const QString &vOutput); void initConnections(); void timerEvent(QTimerEvent* event); void initThread(QThread &vThread); void quitThread(); bool hasConnectedToWifi(); WifiNetworkData getLastWifiNetworkConnectedTo(); void rejoinLastWifiNetwork(); QStringList securityTypesToStringList(const QList &securityTypes); QList variantListToSecurityTypes(const QList &securityTypesVar); public: void start(); public slots: bool init(QThread &vThread); bool init(); void doScan(); void doJoinNetwork(const WifiNetworkData &vNetwork, const QString &vPassword); void doDisconnectNetwork(const WifiNetworkData &vNetwork); void doRequestIPSettings(); // static IP address assignment void doRequestSetIPAddress(const QString &vIPAddress); void doRequestSetGateway(const QString &vGateway); void doRequestSetSubnetMask(const QString &vSubnetMask); void doRequestSetDNS(const QString &vDNS); signals: void didStart(QPrivateSignal); void didAddNetwork(const WifiNetworkData); void didDisconnectNetwork(const WifiNetworkData); void didRejectRequest(const QString &vFunction, const QString &vReason); void didBusyChanged(const bool &vBusy); void didStatusChanged(const QString &vNewStatus); void didRequestAutoAssignedIP(); // static IP address settings void didSetStaticIPAddress(); void didSetGateway(); void didSetSubnetMask(); void didSetDNS(); // emitted from separate threads void didScanStatusChanged(const bool); void didConnectToNetwork(const WifiNetworkData); void didError(const QString); private slots: void quit(); void onQuit(); void onStart(); void onStatusChanged(const QString &vMessage); void onRequestAutoAssignedIP(); void onProcessFinishedScan(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedReadIP(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedReadGateway(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedReadDNS(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedGenerateWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedStartWPASupplicant(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedRequestAutoAssignedIP(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedDisconnectNetwork(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedSetIPAddress(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedSetGateway(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedSetSubnetMask(int vExitCode, QProcess::ExitStatus vExitStatus); void onProcessFinishedSetDNS(int vExitCode, QProcess::ExitStatus vExitStatus); };