QT linux arm(NXP开发板)wifi配置加载连接

12 篇文章 0 订阅
1 篇文章 0 订阅

此代码只能在开发板上使用
pro文件
加入网络环境

头文件
需要用到的头文件
#include
#include
#include
#include
#include

头文件里的成员函数和变量
class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget parent = nullptr);
~Widget();
int System_Check(int result);
void initWifi();
void refrushWifi();
QString executeLinuxCmd(QString strCmd);
void openWifi();
void writeConfFile();
void writeShellFile();
void wifiPasswordInterface();
void destroyMainLayoutWidget(QLayout
layout);
private slots:
void selectCurrentWifi();

private:
Ui::Widget *ui;

QString transfer;
QString temp[10];//信号强度
QString wifiName[10];//wifi名称
QString flagWN[10];
QString flagT[10];
QRadioButton *radioBtn[10];


QString strShellPath;
bool isOpenWifi=false;
QWidget *WidgetWifiNameAndPassword;
QPushButton btnAddOk;
QPushButton btnAddCancel;
QLabel labelWifiPassword;
QLineEdit lineEditWifiPassword;
QString strWifiName;

};

CPP文件
#include “widget.h”
#include “ui_widget.h”
#include
#include
#include
#include
#include
#include
#include
#include <QtNetwork/QNetworkInterface>
#include <QtNetwork/QNetworkConfigurationManager>

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
initWifi();
wifiPasswordInterface();

//显示当前IP
QNetworkConfigurationManager m;
if (!m.isOnline()){
    ui->labelCurrentIP->setText("当前IP:未联网");
}else {
    ui->labelCurrentIP->setText("当前IP:"+QNetworkInterface::allAddresses().at(2).toString());
}
//刷新wifi列表
connect(ui->btnRefrush,&QPushButton::clicked,[=](){
    if(!isOpenWifi){
        refrushWifi();
    }else {
        QMessageBox::warning(this,"warning","请先断开当前wifi");
            }
});
connect(&btnAddCancel,&QPushButton::clicked,[=](){
    WidgetWifiNameAndPassword->hide();
});
connect(&btnAddOk,&QPushButton::clicked,[=](){
    if(!isOpenWifi){
        btnAddOk.setText("连接中...");
        openWifi();
    }else {
        QMessageBox::warning(this,"warning","请先断开当前wifi");
    }
    isOpenWifi = true;
    WidgetWifiNameAndPassword->hide();
});
connect(ui->btnConnectWifi,&QPushButton::clicked,[=](){
    selectCurrentWifi();
});
connect(ui->btnDisconnectWifi,&QPushButton::clicked,[=](){
    if(isOpenWifi){
        int result =0;
        result = system("ifconfig wlan0 down");
        if(!System_Check(result)){
            QMessageBox::warning(this,"提示","WIFI关闭成功");
            QNetworkConfigurationManager m;
                if (!m.isOnline())
                {
                    ui->labelCurrentIP->setText("当前IP:未联网");
                }else {
                    ui->labelCurrentIP->setText("当前IP:"+QNetworkInterface::allAddresses().at(2).toString());
                }
            isOpenWifi = false;
        }
        else
            QMessageBox::warning(this,"提示","WIFI关闭失败");
    }else {
        QMessageBox::warning(this,"warning","wifi还未开启");
    }

});

}
/**

  • @brief Widget::destroyMainLayoutWidget
  • 销毁布局内的所有控件
  • @param layout
    /
    void Widget::destroyMainLayoutWidget(QLayout
    layout){
    QLayoutItem *child;
    int num = layout->count();
    if(num != 0){
    while (!layout->isEmpty())
    {
    child = layout->takeAt(0);
    if(child->widget())
    {
    child->widget()->setParent(nullptr);
    }else if(child->layout()){
    destroyMainLayoutWidget(child->layout());
    }
    delete child;
    }
    }

}
void Widget::initWifi()
{
int i =0;
int j =0;
int t =0;
system(“rm -r /temp”);
system(“rm -r /grepTemp”);
system(“ifconfig wlan0 up”);
int result =0;
result = system(“iwlist wlan0 scan >/temp”);
if(!System_Check(result)){
int result_1 =0;
result_1 = system(“grep -E ‘ESSID|Quality’ /temp >/grepTemp”);
if(!System_Check(result_1))
system(“grep -v “x00” /grepTemp >/temp”);
else{
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
}else {
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
QString fileName;
fileName = “/temp”;
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<“open failed”;
return;
}
QTextStream in(&file);
QString line = in.readLine();
while (i<10)
{
line = in.readLine();
qDebug() << “wifi_line:” << line;
for(t=27;t<line.size()-1;t++) //take off other words
{
wifiName[i] +=line[t];
}
line = in.readLine();
qDebug() << “temp_line:” << line;
for(t=28;t<30;t++) //take off other words
{
temp[i] +=line[t];
}
i++;
}
file.close();
for(i=0;i<9;i++){
for(j=1;j<10;j++){
if(temp[i]>temp[j]){
transfer = temp[i];
temp[i] = temp[j];
temp[j] = transfer;

            transfer =wifiName[i];
            wifiName[i] = wifiName[j];
            wifiName[j] = transfer;
        }
    }
}

int m=0;
for(i=0;i<10;i++){
    if(wifiName[i].isEmpty()){
        wifiName[i].remove(i);
    }else {
        flagWN[m] = wifiName[i];
        flagT[m] = temp[i];
        m++;
    }
}
i =0;
j =0;
int k=0;
//有多少个有名称的信号就添加几个按钮
while(i<m){
    if(flagWN[j] == '\0')//wifiName[j]
    {
       // break;
        k++;
        if(k ==10)
        {
            qDebug()<<"false";
            QMessageBox messageBox;
            messageBox.setText(tr("无法搜索WLAN信号"));
            messageBox.setIcon(QMessageBox::Warning);
            messageBox.exec();
        }
    }
    else if(!(flagWN[j] =='\0'))//wifiName[j]
    {
        radioBtn[i] = new QRadioButton;
        radioBtn[i]->text().clear();
        radioBtn[i]->setText(flagWN[j]);//wifiName[j]
        radioBtn[i]->setStyleSheet("QRadioButton::indicator {"
                                   "width:30px;"
                                   "height:30px;}");
        ui->gridLayout_3->addWidget(radioBtn[i]);
        i++;
    }
    j++;
}
//给剩下的按钮分配空间,不然就会崩溃
for(int i=m;i<10;i++){
    radioBtn[i] = new QRadioButton(this);
}

}

void Widget::refrushWifi()
{
int i =0;
int j =0;
int t =0;
for(int i=0;i<10;i++){
delete radioBtn[i];
wifiName[i].clear();
temp[i].clear();
transfer.clear();
flagWN[i].clear();
flagT[i].clear();
}
system(“rm -r /temp”);
system(“rm -r /grepTemp”);
system(“ifconfig wlan0 up”);
int result =0;
result = system(“iwlist wlan0 scan >/temp”);
if(!System_Check(result)){
int result_1 =0;
result_1 = system(“grep -E ‘ESSID|Quality’ /temp >/grepTemp”);
if(!System_Check(result_1))
system(“grep -v “x00” /grepTemp >/temp”);
else{
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
}else {
QMessageBox::warning(this,“warning”,“无法读取wifi”);
system(“ifconfig wlan0 up”);
}
QString fileName;
fileName = “/temp”;
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug()<<“open failed”;
return;
}
QTextStream in(&file);
QString line=in.readLine();
while (i<10)
{
line = in.readLine();
qDebug() << “wifi_line:” << line;
for(t=27;t<line.size()-1;t++) //take off other words
{
wifiName[i] +=line[t];
}
line = in.readLine();
qDebug() << “temp_line:” << line;
for(t=28;t<30;t++) //take off other words
{
temp[i] +=line[t];
}
i++;
}
line.clear();
file.close();
//按信号强弱排序wifi
for(i=0;i<9;i++)
{
for(j=1;j<10;j++)
{
if(temp[i]>temp[j])
{
transfer = temp[i];
temp[i] = temp[j];
temp[j] = transfer;

            transfer =wifiName[i];
            wifiName[i] = wifiName[j];
            wifiName[j] = transfer;
        }
    }
}
int m=0;
//提取其中名称不为空的wifi
for(i=0;i<10;i++){
    if(wifiName[i].isEmpty()){
        wifiName[i].remove(i);
    }else {
        flagWN[m]=wifiName[i];
        flagT[m] = temp[i];
        m++;
    }
}
i =0;
j =0;
int k=0;
while(i<m)
{
    if(flagWN[j] == '\0') //wifiName[j]
    {
       // break;
        k++;
        if(k ==10)
        {
            qDebug()<<"false";
            QMessageBox messageBox;
            messageBox.setText(tr("无法搜索WLAN信号"));
            messageBox.setIcon(QMessageBox::Warning);
            messageBox.exec();
        }
    }
    else if(!(flagWN[j] =='\0')) //wifiName[j]
    {
        radioBtn[i] = new QRadioButton(this);
        radioBtn[i]->text().clear();
        radioBtn[i]->setText(flagWN[j]);//wifiName[j]
        radioBtn[i]->setStyleSheet("QRadioButton::indicator {"
                                   "width:30px;"
                                   "height:30px;}");
        ui->gridLayout_3->addWidget(radioBtn[i],j,0);
        i++;
    }
    j++;
}
for(int i=m;i<10;i++){
    radioBtn[i] = new QRadioButton(this);
}

}

Widget::~Widget()
{
delete ui;
}

void Widget::selectCurrentWifi()
{
lineEditWifiPassword.clear();
btnAddOk.setText(“确定”);
if(radioBtn[0]->isChecked()){
QString wifiName = radioBtn[0]->text();
//QString wifiConnect = tr("iwconfig wlan0 essid “%1” ").arg(wifiName);
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
//qDebug() << “strWifiName” << strWifiName;
}
if(radioBtn[1]->isChecked()){
QString wifiName = radioBtn[1]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[2]->isChecked()){
QString wifiName = radioBtn[2]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[3]->isChecked()){
QString wifiName = radioBtn[3]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[4]->isChecked()){
QString wifiName = radioBtn[4]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[5]->isChecked()){
QString wifiName = radioBtn[5]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[6]->isChecked()){
QString wifiName = radioBtn[6]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[7]->isChecked()){
QString wifiName = radioBtn[7]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[8]->isChecked()){
QString wifiName = radioBtn[8]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
if(radioBtn[9]->isChecked()){
QString wifiName = radioBtn[9]->text();
WidgetWifiNameAndPassword->show();
strWifiName = wifiName;
}
}

//执行shell指令或者shell脚本的方法
QString Widget::executeLinuxCmd(QString strCmd)
{
QProcess p;
p.start(“bash”, QStringList() <<"-c" << strCmd);
p.waitForFinished();
QString strResult = p.readAllStandardOutput();
return strResult;
}

/**

  • @brief Widget::System_Check
  • @param result 返回标志值
  • @return
    */
    int Widget::System_Check(int result)
    {
    if((-1 != result) && (WIFEXITED(result)) && (!(WEXITSTATUS(result))))
    return 0;
    else
    return -1;
    }

void Widget::openWifi()
{
writeConfFile();
writeShellFile();
ui->labelCurrentIP->clear();
int result =0;
result = system(“sh /startWifi.sh”);
if(!System_Check(result)){
QMessageBox::warning(this,“提示”,“WIFI打开成功”);
btnAddOk.setText(“连接成功”);
}
else
QMessageBox::warning(this,“提示”,“WIFI打开失败”);
//获取本地IP片地址,
QList addList = QNetworkInterface::allAddresses();
foreach(QHostAddress address,addList)
{
//排除IPV6,排除回环地址
if(address.protocol() == QAbstractSocket::IPv4Protocol
&& address != QHostAddress(QHostAddress::LocalHost))
{
//输出,转换为字符串格式
ui->labelCurrentIP->setText(“当前IP:”+address.toString());
}
}
}

void Widget::writeConfFile()
{
QString strCONFPath;
strCONFPath = “/etc/wifi-conf/WIFI.CONF”;
QFileInfo file(strCONFPath);
if(file.exists()==true)
{
system(“rm -r /etc/wifi-conf/WIFI.CONF”);
}
QFile f(strCONFPath);
if(!f.open(QIODevice::WriteOnly))
{
qDebug() << “Open failed.”;
return;
}

QTextStream txtOutput(&f);
txtOutput << "#  reading passphrase from stdin" << endl
          << "network={" << endl
          << "          ssid=\"" << strWifiName << "\"" << endl
          << "          psk=\"" << lineEditWifiPassword.text() << "\"" << endl
          << "}";
f.close();

}

void Widget::writeShellFile()
{
system(“rm -r /startWifi.sh”);
strShellPath = “/startWifi.sh”;
QFile f(strShellPath);
if(!f.open(QIODevice::WriteOnly))
{
qDebug() << “Open failed.”;
return;
}
QTextStream txtOutput(&f);
txtOutput << “#!/bin/bash” << endl
<< “cd /etc/wifi-conf” << endl
<< “./ifup_wifi_sta”;
f.close();
system(“chmod 777 /startWifi.sh”);
}

void Widget::wifiPasswordInterface()
{
WidgetWifiNameAndPassword = new QWidget;
WidgetWifiNameAndPassword->setWindowFlags(WidgetWifiNameAndPassword->windowFlags() |Qt::Dialog);
WidgetWifiNameAndPassword->setWindowModality(Qt::ApplicationModal); //阻塞除当前窗体之外的所有的窗体
WidgetWifiNameAndPassword->setFixedSize(300,150);
WidgetWifiNameAndPassword->setGeometry(350,350,300,150);
WidgetWifiNameAndPassword->setWindowTitle(QObject::tr(“wifi密码”));
QFont ft;
ft.setPointSize(15);
labelWifiPassword.setFont(ft);
lineEditWifiPassword.setFont(ft);
btnAddOk.setFont(ft);
btnAddCancel.setFont(ft);
btnAddOk.setText(“确定”);
btnAddCancel.setText(“退出”);
btnAddOk.setFixedSize(QSize(140,45));
btnAddCancel.setFixedSize(QSize(140,45));
lineEditWifiPassword.setFixedSize(QSize(280,45));
labelWifiPassword.setText(“请输入WIFI密码”);
QGridLayout* layout = new QGridLayout(WidgetWifiNameAndPassword);
layout->addWidget(&labelWifiPassword,0,0,1,2);
layout->addWidget(&lineEditWifiPassword,1,0,1,2);
layout->addWidget(&btnAddOk,2,0,1,1);
layout->addWidget(&btnAddCancel,2,1,1,1);
}

ui文件
textLabel是用来显示当前IP,groupBox是用来显示wifi列表的labelCurrentIP

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值