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