zoukankan      html  css  js  c++  java
  • WiFi QC 自动测试:Qt控制无线路由器


    在测试wifi的时候,测试人员一般要使用很多不同型号的AP,并且需要不断地切换Chariot的配置。

    这里的思路是致力于提供一个友好的GUI界面来自动控制AP,并且自动控制Chariot进行Throughput的测试。

    这里Chariot的部分就不提了,可以自行参照Chariot的c API或者tcl的API进行程序设计。


    这里先给出一个实例,那就是Tplink的AP,待完善之后可以将每一个AP做成一个配置文件,方便扩展。


    先祭出Qt代码吧:

    #include "dialog.h"
    #include "ui_dialog.h"
    #include <QDebug>
    
    
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    
    
        manager = new QNetworkAccessManager(this);
        connect(manager,SIGNAL(finished(QNetworkReply*)), this,SLOT(replyFinished(QNetworkReply*)));
    }
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    
    
    void Dialog::replyFinished(QNetworkReply *reply)  //当回复结束后
    {
    
        QByteArray  reply_str;
    
        switch (reply->error()) {
    
        case QNetworkReply::AuthenticationRequiredError:
            qDebug()<<"AUTH REQUIRED";
            qDebug()<< reply->rawHeaderList();
            qDebug()<< reply->rawHeaderPairs();
    
            /* no break */
        case QNetworkReply::NoError:
            reply_str = reply->readAll();
            ui->text->setPlainText(QString::fromUtf8(reply_str));
            reply->deleteLater();
            break;
        default:
            qDebug()<<"ERROR WHEN REPLY:" << reply->error();
    
        }
    
    }
    
    
    
    void Dialog::on_init_clicked()
    {
        manager->get(QNetworkRequest(QUrl("http://192.168.2.1")));
    }
    
    
    /*
    Authorization: Basic YWRtaW46YWRtaW4=
    Accept: text/html
    User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
    Accept-Encoding: gzip,deflate,sdch
    Accept-Language: zh-CN,zh;q=0.8
    */
    
    void Dialog::on_start_clicked()
    {
        QString get_str = "http://192.168.2.1/userRpm/WlanNetworkRpm.htm?ssid1=haha&wlMode=2&channel=3&mode=5 
            &chanWidth=2&ap=1&broadcast=2&brlssid=&brlbssid= 
            &keytype=1&wepindex=1&authtype=1&keytext=&Save=%B1%A3+%B4%E6 HTTP/1.1";
        QUrl url(get_str);
        QNetworkRequest req;
        req.setUrl(url);
        req.setRawHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
        manager->get(req);
    
    }
    


    这里在界面上放置了一个PlaintextEdit和两个按钮,上述的两个函数分别对应每一个按钮的点击事件。


    Qt提供了访问HTTP很简单的方式,使用它的API能够轻松地实现HTTP数据的交互。

    可以看到一开始初始化了一个QNetworkAccessManager,当数据到达客户端的时候replyFinished函数就会被呼叫。

    在这个函数里面,我判断了三种情况,其中比较特殊的就是AuthenticationRequiredError的事件。

    当打开Tplink路由器的时候,路由器就会弹出一个需要认证的界面从而触发这个事件。实际上从HTTP交互的header可以看出来。


    TPLINK740N使用的是HTTP摘要认证,可以看看此博客了解详情:

    点击打开链接


    当点击按钮触发on_init_clicked的时候,就会最终触发AuthenticationRequiredError的事件,因为

    没有给AP提供密码。接下来的每次交互中都需要给AP提供密码来保证访问的成功:


        req.setRawHeader("Authorization", "Basic YWRtaW46YWRtaW4=");
    

    其中YWRtaW46YWRtaW4=是从admin:admin产生的,欲知详情可以打开上面提供的链接。


    实际上,HTTP头部有很多字段,这里只使用了最重要的一个,其他的Qt会自动帮我们加的(好方便!)



    当点击按钮触发on_start_clicked的时候,就可以成功设置AP了,上面设置的效果如下:





    聪明的你很容易修改这个字符串来达到你想要的效果:

        QString get_str = "http://192.168.2.1/userRpm/WlanNetworkRpm.htm?ssid1=haha&wlMode=2&channel=3&mode=5 
            &chanWidth=2&ap=1&broadcast=2&brlssid=&brlbssid= 
            &keytype=1&wepindex=1&authtype=1&keytext=&Save=%B1%A3+%B4%E6 HTTP/1.1";
    

    最终可以给每一个AP提供一个配置文件,因为上层可以做到一致(SSID、channel等设置),所以很容易实现自动化


    另外,从AuthenticationRequiredError给出的信息里面(rawHeaderPairs)可以判断AP的型号






  • 相关阅读:
    Nginx 反向代理接收用户包体方式
    Nginx http反向代理流程Proxy_pass模块
    Nginx 负载均衡一致性算法
    Nginx 负载均衡哈希算法:ip_hash与hash模块
    Nginx upstream模块
    Nginx upstream变量
    Nginx 反向代理与负载均衡基本原则
    19 浏览器缓存
    6 Cookie和Session
    5 Post和Get
  • 原文地址:https://www.cnblogs.com/tanhangbo/p/4282594.html
Copyright © 2011-2022 走看看