C++ C语言 qt连接管理wifi界面 代码加wpa_supplicant工具连接,当然代码肯定会报错,我相信你们可以解决。不能解决联系我

其实wpa_supplicant工具不太好用,按顺序执行

1、wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf

2、wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan

3、wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan_results (搜索WiFi列表)

4、vi /data/cfg/wpa_supplicant.conf
输入:a  
输入:WiFi名称、密码
退出保存:Esc —— Shift:—— wq  —— 回车

配置文件最好是下面的格式否则可能不生效,如果你还有还有其他的配置项根据自己的wifi来配置

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1

network={
        ssid="WiFi名称"
        psk="WiFi密码"
        key_mgmt=WPA-PSK
}

5、reboot

6、wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf (连接)

7、ifconfig (查看wlan0网卡信息IP)
killall wpa_supplicant(结束程序)

头文件wifimanage.h

#ifndef FORMWIFIMANAGE_H
#define FORMWIFIMANAGE_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QTableWidgetItem>

class CDialogBox;

namespace Ui {
class FormWifiManage;
}

//bssid / frequency / signal level / flags / ssid
//94:d9:b3:a8:4d:c0       2412    -39     [WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]    clefine

typedef struct wifi_info_s{
    QString bssid;
    int frequency;
    int signal_level;
    QString flags;
    QString ssid;
}wifi_info_t;

class FormWifiManage : public QWidget
{
    Q_OBJECT

public:
    explicit FormWifiManage(QWidget *parent = nullptr);
    ~FormWifiManage();

private:
    void setLabelText(const QString &);
    QString getPassword() const;

    void initTabWidget();
    void showWifiInfo();

private slots:
    void slotScanWifi();
    void slotConnectWifi(QTableWidgetItem*);
    void slotConnectToWifi();
    void wifiPassword(const QString&);

    void reconnectWifi();
    void slotTimeout();
    void disconnectWifi();

private:
    Ui::FormWifiManage *ui;

    QString m_name;
    QString m_password;
    CDialogBox *dialog;
    QTimer *timer;

    bool isscaning;
    bool selectIndex;
    QModelIndex curindex;
    QLabel *label;
    QString wpa_state;
    QString ssid;

    QLineEdit *password;
    QList<wifi_info_t> wifi_list;

    QTableWidgetItem* m_current_item;
};

#endif // FORMWIFIMANAGE_H

头文件wifimanage.cpp 

#include "formwifimanage.h"
#include "ui_formwifimanage.h"
#include <QDebug>
#include <QDialog>
#include <QLineEdit>
#include "CDialogBox.h"
#include "Logger.h"
#include <QFile>
#include <unistd.h>
#include <QTimer>
#include "CMessageBox.h"
#include <QStandardItem>

#define CMD_RESULT_BUF_SIZE 10240

QString characterConversion(const QString& ss)
{
    QString string1;
    QString string2;
    QString string3;
    bool ok;
    char ch[512] = { 0 };

    QString result = "";
    int icount = 0;
    for (int i = 0; i < ss.length(); )
    {
        if ((i + 4) <= ss.length()) {
            if (ss.at(i) == '\\' && ss.at(i + 1) == 'x') {
                QString tmpstring = QString(ss.at(i + 2)) + ss.at(i + 3);
                tmpstring = "0x" + tmpstring;
                ch[icount] = static_cast<char>(tmpstring.toInt(&ok, 16));
                icount++;
                i += 4;
                if (string2.size() > 0) {
                    result += string2;
                    string2.clear();
                }

                if (string3.size() > 0) {
                    result += string3;
                    string3.clear();
                }
            } else {
                string1 = ch;
                if (string1.size() > 0) {
                    result += string1;

                    icount = 0;
                    string1.clear();
                    memset(ch, 0, sizeof(ch));
                }

                if (string3.size() > 0) {
                    result += string3;
                    string3.clear();
                }

                string2 = string2 + ss.at(i);
                i++;
            }
        } else {
            string1 = ch;
            if (string1.size() > 0) {
                result += string1;

                icount = 0;
                string1.clear();
                memset(ch, 0, sizeof(ch));
            }

            if (string2.size() > 0) {
                result += string2;
                string2.clear();
            }
            string3 = string3 + ss.at(i);
            i++;
        }
    }
    string1 = ch;
    if (string1.size() > 0) {
        result += string1;
    }
    if (string2.size() > 0) {
        result += string2;
    }
    if (string3.size() > 0) {
        result += string3;
    }

    return result;
}

extern "C" QStringList exec_cmd(const char *_cmd)
{
    QStringList list;
    FILE *file;
    char line[CMD_RESULT_BUF_SIZE];
    file = popen(_cmd, "r");
    if (NULL != file)
    {
        while (fgets(line, CMD_RESULT_BUF_SIZE, file) != NULL)
        {
            printf("line: %s\n", line);
        }
    }else {
        printf("popen %s error\n", _cmd);
    }
    pclose(file);

    return list;
}

extern "C" void scanwifi(QList<wifi_info_t> &list)
{
    usleep(200000);

    system("wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan");

    FILE *file;
    char line[CMD_RESULT_BUF_SIZE];
    char tmp[4][500];
    file = popen("wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan_results", "r");
    if (NULL != file)
    {
        while (fgets(line, CMD_RESULT_BUF_SIZE, file) != NULL)
        {
            int frequency=0,signal_level=0;
            sscanf(line, "%s %d %d %s %[^\x01\n]", tmp[0], &frequency, &signal_level, tmp[1], tmp[2]);
            if (strcmp("bssid", tmp[0])==0){
                continue;
            }
            wifi_info_t wifi;
            wifi.bssid=tmp[0];
            wifi.frequency=frequency;
            wifi.signal_level=signal_level;
            wifi.flags=tmp[1];
            wifi.ssid=characterConversion(tmp[2]);

            list << wifi;
        }
    }else {
        printf("popen %s error\n", "wpa_cli -i wlan0 -p /var/run/wpa_supplicant scan_results");
    }
    pclose(file);
}

FormWifiManage::FormWifiManage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormWifiManage)
{
    ui->setupUi(this);
    isscaning=false;
    label=nullptr;
    password=nullptr;
    m_current_item=nullptr;
    selectIndex=false;
    wpa_state = "";
    ssid= "";
    connect(ui->toolButton_Scan, SIGNAL(clicked()), this, SLOT(slotScanWifi()));
    connect(ui->toolButton_Connect, SIGNAL(clicked()), this, SLOT(reconnectWifi()));
    connect(ui->toolButton_Disconnect, SIGNAL(clicked()), this, SLOT(disconnectWifi()));
    connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)),
            this, SLOT(slotConnectWifi(QTableWidgetItem*)));

    slotTimeout();
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
    timer->start(2000);

    initTabWidget();
}

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

void FormWifiManage::initTabWidget()
{
    QString qssTV = "QTableWidget::item:hover{background-color:rgb(92,188,227,200)}"
                    "QTableWidget::item:selected{background-color:#1B89A1}"
                    "QHeaderView::section,QTableCornerButton:section{ \
                     padding:3px; margin:0px; color:#DCDCDC;  border:1px solid #242424; \
                     border-left-width:0px; border-right-width:1px; border-top-width:0px; border-bottom-width:1px; \
                     background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252); }"
                    "QTableWidget{background-color:white;border:none;}";

    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑
    ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //行头自适应表格
    ui->tableWidget->horizontalHeader()->setFont(QFont("song", 12));

    //点击表时不对表头行光亮(获取焦点)
    ui->tableWidget->horizontalHeader()->setHighlightSections(false);
    //设置表头字体加粗

    QFont font =  ui->tableWidget->horizontalHeader()->font();
    font.setBold(true);
    ui->tableWidget->horizontalHeader()->setFont(font);
    //ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightblue;}"); //skyblue设置表头背景色
    //ui->tableWidget->setStyleSheet("selection-background-color:lightblue;"); //设置选中背景色

    ui->tableWidget->setStyleSheet(qssTV);

    ui->tableWidget->horizontalHeader()->setHighlightSections(false);         //点击表头时不对表头光亮
    ui->tableWidget->setSelectionMode(QAbstractItemView::ContiguousSelection);//选中模式为多行选中
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);

    //所有单元格的字体  设置成一样
    ui->tableWidget->setFont(QFont("song", 12));

    ui->tableWidget->setRowCount(1); //设置行数
    ui->tableWidget->setColumnCount(2); //设置列数
    ui->tableWidget->setWindowTitle("SQL数据");
    QStringList header;
    header<<"ssid"<<"signal";
    ui->tableWidget->setHorizontalHeaderLabels(header);

    //去掉默认行号 可以用horizontalHeader()->setVisible(false)隐藏横向表头
    QHeaderView *header1 =   ui->tableWidget->verticalHeader();
    header1->setHidden(true);
    //设置单元格大小
    ui->tableWidget->horizontalHeader()->setDefaultSectionSize(50);  //设置默认宽度
    ui->tableWidget->verticalHeader()->setDefaultSectionSize(30);   //设置一行默认高度
    ui->tableWidget->setColumnWidth(0,450);
    ui->tableWidget->setColumnWidth(1,30);
}

void FormWifiManage::showWifiInfo()
{
    // 清空表格并重新设置行列数
    ui->tableWidget->clearContents();
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setColumnCount(2);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList{"ssid","signal"});

    int size = wifi_list.size();
    ui->tableWidget->setRowCount(size);

    ui->tableWidget->insertRow(size);
    QTableWidgetItem *item=nullptr;
    for(int i = 0; i < size; i++){
        //插入数据
        item=new QTableWidgetItem(wifi_list.at(i).ssid);
        ui->tableWidget->setItem(i,0,item);
        item=new QTableWidgetItem(QString::number(wifi_list.at(i).signal_level));
        ui->tableWidget->setItem(i,1,item);
    }
    ui->tableWidget->setSortingEnabled(true);  //排序
    ui->tableWidget->sortItems(1, Qt::DescendingOrder);
}

void FormWifiManage::disconnectWifi()
{
    system("wpa_cli disconnect");
}

void FormWifiManage::slotTimeout()
{
    QString list;
    QString ipaddress;
    const char *_cmd = "wpa_cli -i wlan0 status";
    FILE *file;
    char line[CMD_RESULT_BUF_SIZE];
    file = popen(_cmd, "r");
    if (NULL != file)
    {
        while (fgets(line, CMD_RESULT_BUF_SIZE, file) != NULL)
        {
            //printf("line: %s\n", line);
            QString linedata = line;
            if (linedata.contains("wpa_state")){
                list += linedata;
                wpa_state = linedata.mid(QString("wpa_state=").size(),
                                         linedata.size()- QString("wpa_state=").size()-1);
            }
            if (linedata.contains("ip_address")){
                list += linedata;
                ipaddress=linedata.mid(QString("ip_address=").size(),
                                       linedata.size()- QString("ip_address=").size()-1);
            }
            if (linedata.contains("ssid=")){
                ssid = linedata.mid(QString("ssid=").size(), linedata.size()- QString("ssid=").size()-1);
            }
        }
    }else {
        printf("popen %s error\n", _cmd);
    }
    pclose(file);

    //qDebugInfo() << ssid << ", " << wpa_state << ", " << ipaddress;
    ssid=characterConversion(ssid);
    ui->label_ssid_name->setText(ssid);
    QString connectstate = wpa_state=="COMPLETED" ? QString("已连接(%1)").arg(wpa_state):
                                                    QString("已断开(%1)").arg(wpa_state);
    ui->label_status_2->setText(connectstate);
    ui->label_ip_address->setText(ipaddress);
}

void FormWifiManage::reconnectWifi()
{
    if (!selectIndex){
        return ;
    }
    m_name = m_current_item->text();
    if (m_name.isEmpty()) return;

    dialog = new CDialogBox(this);
    dialog->setWindowTitle("WIFI");
    dialog->setFixedSize(400, 250);
    dialog->setWindowModality(Qt::WindowModal);
    password = new QLineEdit(dialog);
    label = new QLabel(dialog);
    setLabelText(m_name);
    label->setGeometry(5, 60, 380, 40);

    QLabel *lblpassword = new QLabel(dialog);
    lblpassword->setText("密码:");
    lblpassword->setGeometry(5, 130, 60, 40);

    connect(password, SIGNAL(textChanged(const QString &)),
            this, SLOT(wifiPassword(const QString&)));
    password->setGeometry(70, 130, 280, 40);
    QToolButton *confirm = new QToolButton(dialog);
    confirm->setText("确定");
    confirm->setGeometry(220, 190, 100, 50);
    QToolButton *cancel = new QToolButton(dialog);
    cancel->setText("取消");
    cancel->setGeometry(100, 190, 100, 50);
    connect(confirm, SIGNAL(clicked()), this, SLOT(slotConnectToWifi()));
    connect(cancel, SIGNAL(clicked()), dialog, SLOT(close()));
    dialog->exec();
}

void FormWifiManage::setLabelText(const QString &text)
{
    if(label!=nullptr){
        label->setText("SSID: " + text);
    }
}

QString FormWifiManage::getPassword() const
{
    if (password!=nullptr){
        return password->text();
    }
    return "";
}

void FormWifiManage::slotConnectToWifi()
{
    if (getPassword().size()<8){
        CMessageBox::critical(dialog, "ERR", "密码不能为空或小于八位");
        return;
    }
    dialog->done(0);
    qDebug() << wpa_state << ", " << ssid << ", " << m_name;
    if (wpa_state.contains("COMPLETED")&&ssid==m_name){
        qDebug() << "************************";
        return;
    }

    system("wpa_cli disconnect");
    usleep(100000);

    QString wificonf = QString(
    "ctrl_interface=/var/run/wpa_supplicant\n"
    "ap_scan=1\n"
    "update_config=1\n"
    "\n"
    "network={\n"
    "        ssid=\"%1\"\n"
    "        psk=\"%2\"\n"
    "        key_mgmt=WPA-PSK\n"
    "}\n").arg(m_name.simplified()).arg(m_password);

    qDebugInfo() << wificonf;
    //wpa_passphrase wifi_name wifi_password12345678 >/data/cfg/wpa_supplicant.conf

    QFile file("/data/cfg/wpa_supplicant.conf");
    if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
        file.write(wificonf.toUtf8());
    }else{
        qDebug() << file.errorString();
    }
    fsync(file.handle());
    file.close();

    system("wpa_cli reconfigure");
    usleep(100000);
    system("wpa_cli reconnect");
}

void FormWifiManage::wifiPassword(const QString& password)
{
    m_password = password;
}

void FormWifiManage::slotConnectWifi(QTableWidgetItem* item)
{
    selectIndex=true;
    m_current_item=item;
}

void FormWifiManage::slotScanWifi()
{
    isscaning=true;
    wifi_list.clear();
    scanwifi(wifi_list);

//    foreach(wifi_info_t wifi, wifi_list){
//        qDebug() << wifi.bssid << ", " << wifi.frequency << ", "
//                 << wifi.signal_level << ", " << wifi.flags << ", "
//                 << wifi.ssid;
//    }
    showWifiInfo();
}

效果就是下面这样了

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: wpa_supplicant是一个用于连接WiFi的开源软件,它支持WPA和WPA2密协议,可以在Linux、Unix、Windows等操作系统上运行。使用wpa_supplicant连接WiFi需要先配置wpa_supplicant.conf文件,然后启动wpa_supplicant服务,最后使用命令行工具或者图形界面工具连接WiFi。具体步骤如下: 1. 配置wpa_supplicant.conf文件 在Linux系统中,wpa_supplicant.conf文件通常位于/etc/wpa_supplicant/目录下。可以使用文本编辑器打开该文件,添以下内容: network={ ssid="WiFi名称" psk="WiFi密码" } 其中,ssid是WiFi的名称,psk是WiFi的密码。如果WiFi使用的是其他密方式,可以根据需要修改配置文件。 2. 启动wpa_supplicant服务 在Linux系统中,可以使用以下命令启动wpa_supplicant服务: sudo wpa_supplicant -i wlan -c /etc/wpa_supplicant/wpa_supplicant.conf 其中,wlan是无线网卡的接口名称,可以根据需要修改。启动服务后,wpa_supplicant自动搜索附近的WiFi网络。 3. 连接WiFi 使用命令行工具连接WiFi,可以使用以下命令: sudo dhclient wlan 其中,wlan是无线网卡的接口名称,可以根据需要修改。该命令自动获取IP地址,并连接WiFi。 使用图形界面工具连接WiFi,可以在系统设置中找到网络设置,选择WiFi网络并输入密码即可。 ### 回答2: wpa_supplicant是一个用于连接无线网络的软件,它支持多种不同的身份验证方式,比如WPA、WPA2、PEAP等。除了无线连接外,它还可以用于其他网络协议的管理,比如Ethernet、PPP等。在Linux系统中,wpa_supplicant通常在命令行下使用。 要连接wifi,首先需要运行wpa_supplicant,并指定使用哪个无线网卡。命令的格式为: sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf 其中,-B表示在后台运行,-i后面跟着无线网卡的名称(这里是wlan0),-c后面指定wpa_supplicant的配置文件位置。如果要在命令行中输入wifi密码,则在配置文件中设置密码明文更方便。 wpa_supplicant的配置文件是一个文本文件,其中包含了要连接wifi网络的信息,比如SSID、密码、身份验证方式等。配置文件的格式如下: network={ ssid="wifi_ssid" key_mgmt=WPA-PSK psk="wifi_password" } 其中,ssid表示wifi的名称,key_mgmt表示身份验证方式,psk表示wifi密码。如果需要使用其他身份验证方式,比如EAP-PEAP或者wpa_supplicant内置的其他方法,则需要在配置文件中设置其他参数。 一旦启动wpa_supplicant成功,并且连接wifi成功,就可以使用ifconfig命令查看无线网卡的IP地址,或者使用ping命令测试网络是否正常。需要注意的是,wpa_supplicant的日志输出到/var/log/wpa_supplicant.log文件中,可用于排查故障。 ### 回答3: wpa_supplicant是一个常用的Wi-Fi连接工具,它可以让设备与Wi-Fi网络建立稳定的连接。下面来介绍一下如何使用wpa_supplicant连接Wi-Fi。 首先,使用wpa_supplicant连接Wi-Fi需要用到两个文件:wpa_supplicant.conf和ifconfig.sh。wpa_supplicant.conf是配置文件,里面存放着连接Wi-Fi的相关信息,如Wi-Fi的名称、密码等。ifconfig.sh是一个脚本文件,用于设置IP地址和网络掩码。 接下来,先来介绍一下如何配置wpa_supplicant.conf。以连接“Test_WiFi”为例,打开wpa_supplicant.conf文件,输入以下内容: network={ ssid="Test_WiFi" key_mgmt=WPA-PSK psk="123456" } 其中,ssid表示Wi-Fi的名称,key_mgmt表示Wi-Fi的密方式,这里用的是WPA-PSK,psk表示Wi-Fi的密码。可以根据实际情况更换参数。 接下来,保存wpa_supplicant.conf文件,将文件上传到设备上,并给予文件可执行权限。 然后,打开ifconfig.sh文件,输入以下代码: ifconfig wlan0 up wpa_supplicant -B -i wlan0 -c /path/to/wpa_supplicant.conf udhcpc -i wlan0 其中,第二行代码连接Wi-Fi的命令。将path/to/wpa_supplicant.conf替换为实际的wpa_supplicant.conf文件路径,保存ifconfig.sh文件,并给予文件可执行权限。 最后,运行ifconfig.sh文件,设备便可以自动连接到Wi-Fi网络了。如果需要修改Wi-Fi名称和密码等信息,只需要修改wpa_supplicant.conf文件即可。 综上所述,使用wpa_supplicant连接Wi-Fi需要进行一系列操作,包括配置wpa_supplicant.conf文件、ifconfig.sh文件的编写和执行。但是,一旦配置成功,设备就可以轻松地自动连接到Wi-Fi网络,方便实用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值