上一篇介绍了如何改写WPAS库原C函数,让我们直接拿到每个命令的执行结果。这一篇就正式开始实现各个功能,首先是最基本的扫描功能。
在wpa_cli命令解析一节我们知道,要想得到附近AP,需要使用scan和scan_results命令,scan是让硬件执行扫描操作,它会扫描附近所有的AP并把扫描结果存入内存。如果我们要查看扫描结果,需要用scan_results。
wifi整个连接过程中可分为下面几种状态:
enum STATUS
{
INACTIVE, //所有配置项未激活
SCANNING, //扫描
COMPLETED, //连接完成
ASSOCIATING, //尝试连接中
DISCONNECTED, //断开
WAY_HANDSHAKE, //认证状态
UNKNOW //未知状态
};
分清状态是很有必要的,因为笔者在调试过程中发现,除了INACTIVE和COMPLETED,其它状态下wpas库会自动执行扫描,不断更新状态。而如果程序中和wpas库后台同时执行scan命令,会导致驱动程序bug。而后边我们很多地方也需要获知wifi当前的状态,所以首先我们先来完成状态获取的函数。
WifiService::STATUS WifiService::getWpsStatus()
{
// qDebug()<<"getWpsStatus";
int ret;
char buf[2048];
memset(buf, 0, 2048);
//1. 运行status得到状态返回串
ret = handleCmd->hanleCmd(ctrl_conn, buf, "status");
if(ret)
{
qDebug()<<"getStatus err!";
return UNKNOW;
}
//2. 从buf中查找是否含有"COMPLETED"串
int pos = QString(buf).indexOf(QString("COMPLETED"));
if(pos != -1){ //未连接
return COMPLETED;
}
pos = QString(buf).indexOf(QString("SCANNING"));
if(pos != -1){ //未连接
return SCANNING;
}
pos = QString(buf).indexOf(QString("INACTIVE"));
if(pos != -1){ //未连接
return INACTIVE;
}
pos = QString(buf).indexOf(QString("ASSOCIATING"));
if(pos != -1){ //未连接
return ASSOCIATING;
}
pos = QString(buf).indexOf(QString("DISCONNECTED"));
if(pos != -1){ //未连接
return DISCONNECTED;
}
return UNKNOW;
}