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,可根据个人需要修改。