ARM上搜索WIFI并解析字符串

6 篇文章 0 订阅

ARM上搜索WIFI并解析字符串

背景:项目部署在ARM上,现要实现软件层面的WIFI模块,需要在Qt上通过system指令搜索wifi并解析字符串。

方案1:
Qt可以使用system命令,使用iwlist指令并配合grep和sed指令将搜索结果过滤为我们想要的格式,即下面这样的格式:

wifi名
wifi信号强度
wifi加密模式...

最后Qt通过readLine()的方式逐行读取文件中的内容。

代码如下:

system("sudo iwlist wlan0 scan >./temp ");                     //获取wifi列表
system("grep -E 'SSID|Quality|IE: IEEE' temp >./grepTemp");    //提取三列信息
system("sed -i 's/\"\(.*\)\"/\1/g' grepTemp");                 //删除文件中所有的双引号(转义字符\消除歧义)
system("sed -i 's/^.*ESSID://g' grepTemp");                    //删除ESSID:开头
system("sed -i 's/^.*Signal level://g' grepTemp");             //删除信号强度开头
system("sed -i 's/ dBm.*$//g' grepTemp");                      //删除信号强度结尾
system("sed -i 's/^.*    //g' grepTemp");                      //删除加密信息开头
//system("sudo rm -r *emp");                                   //删除wifi信息临时文件

这种方案可以提取WIFI名称、信号强度和加密模式。如果WIFI加密了,则提取到3行内容,否则就是2行。

使用中需要注意你的开发板是否支持转义字符,我在RK上成功解析出所要的内容,但在自研板上解析转义字符存在问题,导致其中一些代码不生效。

方案2:
如果方案1不起作用,则可以尝试使用nmcli命令。 (*务必先测试你的开发板是否支持,如果不支持就不用看下去了)

这套方案利用nmcli读取搜索到的WIFI信息,然后在Qt中解析字符串。与方案1的区别在于解析字符串实现的位置。

代码如下:

const QString wifiStrList = QString("./wifi.ini");	//定义在类外
//开启wifi(耗时)
system("nmcli r wifi on");
//把扫描到的wifi信息输出到指定文件
system("nmcli dev wifi > ./wifi.ini");
//system("nmcli dev wifi connect "SSID" password "PASSWORD" ifname wlan0");   //连接到指定wifi热点
//system("sudo nmcli con > ./wifi.ini");     //显示当前连接的wifi网络

QFile file(wifiStrList);
    if(!file.open(QIODevice::ReadOnly)){
        qDebug()<<"No such file!";
        return;
    }
    int curLine = 0;
    QString line;

if(file.size()!=0){
    QTextStream in(&file);
    QString signalFlag = "SIGNAL";      //表示wifi信号字符
    QString wifiFlag = "SSID";          //wifi名字符
    QString modeFlag = "MODE";          //wifi连接模式
    QString securityFlag = "SECURITY";  //wifi加密模式
    line =  in.readLine();
    if(!line.isEmpty()){
        int signalIndex = line.indexOf(signalFlag);     //文件对应的wifi信号强度索引值
        int wifiIndex = line.indexOf(wifiFlag);         //文件对应的wifi名索引值
        int modeIndex = line.indexOf(modeFlag);
        int securityIndex = line.indexOf(securityFlag);
        while(curLine < WIFINUM)
        {
            //wifi字符串解析
            line =  in.readLine();
            QString tmpStr = line;
            QString curConnection = line.left(1);       //已连接wifi判断(*为当前连接)
            QString wifiName = line.mid(wifiIndex,(modeIndex-wifiIndex)).simplified();  //获取wifi名称
            int signalValue = tmpStr.mid(signalIndex,3).simplified().toInt();           //获取wifi的信号强度
            QString security = tmpStr.mid(securityIndex,4).simplified();                //获取wifi加密模式

            curLine++;
        }
        file.close();
    }
}

这里解析出了WIFI名、信号强度、加密方式和当前连接WIFI,可根据个人需要修改。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值