/*! * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * \file WifiInterface.h * \author (last) Peter Lucia * \date (last) 16-Apr-2021 * \author (original) Peter Lucia * \date (original) 16-Apr-2021 * */ #pragma once // Qt #include #include #include // Project #include "main.h" #include "StorageGlobals.h" #include "MWifiNetwork.h" // define #define _WifiInterface WifiInterface::I() using namespace Model; class tst_utilities; /*! * \brief The WifiInterface class * Communicates with Access Points * \details * - Scans for Access Points * - Authenticates with Access Points * - Disconnects from Access Points * - Requires that both antennas are attached * to the HD board to properly scan and find Wi-Fi networks */ class WifiInterface : public QObject { Q_OBJECT friend class ::tst_utilities; QThread *_thread = nullptr; bool _init = false; bool _scanRunning = false; bool _useStaticIP = false; bool _useStaticGateway = false; bool _useStaticSubnetMask = false; bool _useStaticDNS = false; 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; QProcess _processTestInternet; WifiNetworkData _network; const QString _scriptsFolder = Storage::Scripts_Path_Name; const QString _iface = "wlan0"; const QString _wpaSupplicantConfPath = "/etc/wpa_supplicant.conf"; static const int _internetCheckTimerInterval = 10000; // ms // Singleton SINGLETON(WifiInterface) private: bool checkScript(QString &vScript, const QString &vShellScript); 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 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 ( bool vBusy); void didStatusChanged (const QString &vNewStatus ); void didRequestAutoAssignedIP (); void didInternetConnectionChange(const bool &vConnected); // static IP address settings void didSetStaticIPAddress (const QString &); void didSetGateway (const QString &); void didSetSubnetMask (const QString &); void didSetDNS (const QString &); // emitted from separate threads void didScanStatusChanged ( bool ); void didConnectToNetwork (const WifiNetworkData &); void didError (const QString &); private slots: void quit(); void onStart(); void onStatusChanged(const QString &vMessage); void timerEvent(QTimerEvent *); void onRequestAutoAssignedIP(); void onProcessFinishedScan (int, QProcess::ExitStatus); void onProcessFinishedReadIP (int, QProcess::ExitStatus); void onProcessFinishedReadGateway (int, QProcess::ExitStatus); void onProcessFinishedReadDNS (int, QProcess::ExitStatus); void onProcessFinishedGenerateWPASupplicant (int vExitCode, QProcess::ExitStatus); void onProcessFinishedStartWPASupplicant (int vExitCode, QProcess::ExitStatus); void onProcessFinishedRequestAutoAssignedIP (int vExitCode, QProcess::ExitStatus); void onProcessFinishedDisconnectNetwork (int vExitCode, QProcess::ExitStatus); void onProcessFinishedTestInternet (int vExitCode, QProcess::ExitStatus); void onProcessFinishedSetIPAddress (int vExitCode, QProcess::ExitStatus); void onProcessFinishedSetGateway (int vExitCode, QProcess::ExitStatus); void onProcessFinishedSetSubnetMask (int vExitCode, QProcess::ExitStatus); void onProcessFinishedSetDNS (int vExitCode, QProcess::ExitStatus); };