xref: /OK3568_Linux_fs/app/forlinx/flapp/src/plugins/wifi/wifiwidget.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "wifiwidget.h"
2 #include "ui_wifiwidget.h"
3 #include <QDebug>
4 #include "terminal.h"
5 #include <QProcess>
6 #include <QFile>
7 #include  <QDialog>
8 #include <QDomDocument>
9 #include <QTimer>
10 #include "hostapdcli.h"
11 #include "messagebox.h"
12 #include<QMainWindow>
13 #include <QUrl>
14 #include "messagebox.h"
15 #include "wpaclicmd.h"
16 
WIFIWidget(QWidget * parent)17 WIFIWidget::WIFIWidget(QWidget *parent) :
18     IWidget(parent),
19     ui(new Ui::WIFIWidget),
20     m_wpaCli(Q_NULLPTR),
21     m_hostapdcil(Q_NULLPTR),
22     m_loadLbl(Q_NULLPTR),
23     m_loadTimer(Q_NULLPTR)
24 {
25     ui->setupUi(this);
26     setListenLoad(false);
27 }
28 
~WIFIWidget()29 WIFIWidget::~WIFIWidget()
30 {
31     delete ui;
32 }
33 
initUi()34 void WIFIWidget::initUi()
35 {
36 
37     if(m_apConfig.driverName.isEmpty())
38     {
39         ui->commandLinkButton_ap->setVisible(false);
40     }else{
41         createAP();
42     }
43     createSTA();
44 }
45 
createAP()46 void WIFIWidget::createAP()
47 {
48     m_hostModel =new WifiModel;
49     WifiItemDelegate *delegate = new WifiItemDelegate;
50     ui->listViewHost->setModel(m_hostModel);
51     ui->listViewHost->setItemDelegate(delegate);
52     ui->listViewHost->setSelectionMode(QAbstractItemView::SingleSelection);
53 
54     m_hostapdcil = new Hostapdcli(this);
55     connect(m_hostapdcil, &Hostapdcli::hospapdStartFinish, this, [=](){
56         m_hostapdcil->setStart(true);
57         ui->wifiAPNameEdt->setText("wifi: wifi_test");
58         ui->wifiAPPasswordEdt->setText("passowrd : 12345678");
59     });
60     connect(m_hostapdcil, &Hostapdcli::newStaInfo, this, [=](const QList<ScanInfoAp> &infos){
61         m_hostModel->setDataHostap(infos);
62     });
63     connect(m_hostapdcil, &Hostapdcli::lostConnected, this, [=](const QString &ssid){
64         m_hostModel->lostConnectHoseap(ssid);
65     });
66 
67     ui->apBtn->setText(m_apConfig.cardName.toUpper());
68     ui->wifiAPNameEdt->setReadOnly(true);
69     ui->wifiAPPasswordEdt->setReadOnly(true);
70     connect(ui->apBtn, &SwitchWidget::click, this, [=](bool bOpen){
71         if(bOpen)
72         {
73             m_loadTimer->start();
74             m_hostapdcil->start_hostapd(m_apConfig.ko,
75                                         m_apConfig.moduleName,
76                                         m_apConfig.driverName,
77                                         m_apConfig.cardName,
78                                         m_apConfig.ip);
79         }else{
80             m_loadTimer->stop();
81             m_hostapdcil->stop_hostapd();
82             ui->wifiAPNameEdt->clear();
83             ui->wifiAPPasswordEdt->clear();
84         }
85     });
86 
87     connect(ui->commandLinkButton_sta, &QCommandLinkButton::clicked, this, [=](){
88 
89         if(ui->apBtn->isOpen())
90         {
91             int ret = MessageBox::showMessage(this, QString("%1 will close, is continue?").arg(m_staConfig.cardName), MessageBox::yes_no);
92             if(ret == MessageBox::no)
93             {
94                 return;
95             }
96             ui->apBtn->setOpen(false);
97         }
98         ui->stackedWidget->setCurrentIndex(0);
99 
100     });
101 
102     //更改系统随机数,不使用硬件随机数,WIFI热点导致分配不上.
103     Terminal::execCmd("mv /dev/random /dev/random_copy");
104     Terminal::execCmd("ln -s /dev/urandom /dev/random");
105 }
106 
createSTA()107 void WIFIWidget::createSTA()
108 {
109     m_wpaCli = new Wpaclicmd(this);
110     m_wpaModel =new WifiModel;
111     ui->listViewWpa->setModel(m_wpaModel);
112     ui->listViewWpa->setItemDelegate(new WifiItemDelegate);
113     ui->listViewWpa->setSelectionMode(QAbstractItemView::SingleSelection);
114 
115     connect(m_wpaCli, &Wpaclicmd::wpa_supplicantStartFinish, [=](){
116         m_wpaCli->setStart(true);
117     });
118 
119     connect(m_wpaCli , &Wpaclicmd::wifiScanResult, this, [=](const QList<ScanInfo> & info){
120         m_wpaModel->setData(info);
121     }, Qt::QueuedConnection);
122 
123 
124     ui->statusLbl->setTextFormat(Qt::AutoText);
125     ui->statusLbl->setWordWrap(true);
126     connect(m_wpaCli, &Wpaclicmd::wifiStatus, this,  [=](const QMap<QString, QString > &infos){
127 
128         QString bssid = infos.value("bssid");
129         if(bssid.isEmpty())
130         {
131             ui->statusLbl->clear();
132             return;
133         }
134 
135         QString showInfo("ssid :  %1\nencryption :  %2\nfreq :  %3\nmac :  %4 \n ");
136         showInfo = showInfo.arg(infos.value("ssid"))
137                 .arg(infos.value("key_mgmt"))
138                 .arg(infos.value("freq"))
139                 .arg(infos.value("bssid"));
140         ui->statusLbl->setText(showInfo);
141     }, Qt::QueuedConnection);
142 
143     connect(ui->listViewWpa ,&QListView::clicked, this, [=](const QModelIndex &index){
144         QList<QVariant> list = index.data(Qt::DisplayRole).toList();
145         QString wifiName = list[4].toString();
146         ui->wifiNameEdt->setText(wifiName);
147     });
148 
149     ui->staBtn->setText(m_staConfig.cardName.toUpper());
150     connect(ui->staBtn, &SwitchWidget::click, this, [=](bool bOpen){
151         this->setListenLoad(bOpen);
152 
153         qDebug()<< bOpen << m_staConfig.moduleName << m_staConfig.cardName;
154         if(bOpen){
155             m_wpaCli->startWpa_supplicant(m_staConfig.ko,
156                                           m_staConfig.moduleName,
157                                           m_staConfig.driverName,
158                                           m_staConfig.cardName);
159         }else{
160            m_wpaCli->setStart(false);
161         }
162     });
163 
164     connect(ui->commandLinkButton_ap, &QCommandLinkButton::clicked, this, [=](){
165 
166         if(ui->staBtn->isOpen())
167         {
168             int ret = MessageBox::showMessage(this, QString("%1 will close, is continue?").arg(m_staConfig.cardName), MessageBox::yes_no);
169             if(ret == MessageBox::no)
170             {
171                 return;
172             }
173 
174             ui->staBtn->setOpen(false);
175         }
176         ui->stackedWidget->setCurrentIndex(1);
177 
178     });
179 
180 }
181 
setListenLoad(bool bListen)182 void WIFIWidget::setListenLoad(bool bListen)
183 {
184     if(m_loadTimer== Q_NULLPTR)
185     {
186         m_loadLbl = new QLabel(this);
187         m_loadLbl->setStyleSheet("color: blue;");
188         m_loadTimer = new QTimer(this);
189         m_loadTimer->setInterval(500);
190         connect(m_loadTimer, &QTimer::timeout, [=](){
191             if(ui->stackedWidget->currentIndex() == 0)
192             {
193                 if(!m_wpaModel->hasIndex(0, 0))
194                 {
195                     m_loadLbl->setText("search ...");
196                 }else{
197                     m_loadLbl->clear();
198                 }
199             }
200         });
201     }
202 
203     if(bListen)
204     {
205         m_loadLbl->clear();
206         m_loadTimer->start();
207         QRect  rect = ui->listViewWpa->rect();
208         m_loadLbl->setFixedSize(100, 50);
209         m_loadLbl->move(rect.x() + rect.width()/2, rect.y() + rect.height()/2);
210         m_loadLbl->show();
211     }else{
212         m_loadTimer->stop();
213         m_loadLbl->clear();
214     }
215 }
216 
loadData(const QDomElement & head,const QDomElement & body)217 void WIFIWidget::loadData(const QDomElement &head, const QDomElement &body)
218 {
219     Q_UNUSED(body)
220     //    <WIFI  driverName="nl80211" cardName="wlan0" moduleName="8821cs" ko="/lib/modules/4.9.170/8821cs.ko"
221     //                           driverNameAP="nl80211" cardNameAP="wlan0" moduleNameAP="8821cs" koAP="/lib/modules/4.9.170/8821cs.ko"
222     //                     />
223     m_staConfig.cardName = head.attribute("cardName");
224     m_staConfig.driverName =head.attribute("driverName");
225     m_staConfig.moduleName=head.attribute("moduleName");
226     m_staConfig.ko = head.attribute("ko");
227 
228     m_apConfig.cardName= head.attribute("cardNameAP");;
229     m_apConfig.driverName =head.attribute("driverNameAP");;
230     m_apConfig.moduleName=head.attribute("moduleNameAP");;
231     m_apConfig.ko =head.attribute("koAP");
232 }
233 
id()234 QString WIFIWidget::id()
235 {
236     return "wifi";
237 }
238 
239 #include "iwidgetbridge.h"
on_connect_clicked()240 void WIFIWidget::on_connect_clicked()
241 {
242     if(!ui->staBtn->isOpen())
243     {
244         MessageBox::showMessage(this, "wifi no open!");
245         return ;
246     }
247 
248     QString wifiName= ui->wifiNameEdt->text().trimmed();
249     QString wifiPassword= ui->WifiPasswordEdt->text().trimmed();
250     if(wifiName.isEmpty() && wifiPassword.isEmpty())
251     {
252         MessageBox::showMessage(this, "wifi name or password is empty!");
253         return ;
254     }
255 
256     m_wpaCli->connectWifi(wifiName, wifiPassword);
257 }
258 
on_pingBtn_clicked()259 void WIFIWidget::on_pingBtn_clicked()
260 {
261     QString cmd;
262     if(ui->addressEdt->text().trimmed().isEmpty())
263     {
264         cmd = QString("ping www.forlinx.com  -c 5 -I %2").arg(m_staConfig.cardName);
265     }else{
266         cmd = QString("ping %1 -c 5 -I %2").arg(ui->addressEdt->text()).arg(m_staConfig.cardName);
267     }
268     ui->textBrowser->clear();
269     ui->textBrowser->append(cmd);
270     this->start(cmd);
271 }
272 
on_returnBtn_clicked()273 void WIFIWidget::on_returnBtn_clicked()
274 {
275     ui->stackedWidget->setCurrentIndex(0);
276 }
277 
on_openTestBtn_clicked()278 void WIFIWidget::on_openTestBtn_clicked()
279 {
280     ui->textBrowser->clear();
281     ui->stackedWidget->setCurrentIndex(2);
282 }
283 
processMessage(const QString & info)284 void WIFIWidget::processMessage(const QString &info)
285 {
286     ui->textBrowser->append(info);
287 }
288