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