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