前言
调用wpa库时,解析wpa库反馈的消息
一、调用wpa静态库执行指令后,无法获取指令的执行情况
示例:调用wpa静态库执行连接wifi一系列指令,执行过程返回的都是OK,但是无法知道是否已经密码验证通过。
二、解决方案
方案1:使用QSocketNotifier绑定得到的文件描述符,持续监听获得的消息,收到消息后访问recv接口。(推荐)
方案2:开启线程,频繁访问recv接口。
方案1代码如下:
#ifndef CSCANER_H
#define CSCANER_H
#include <QObject>
struct wpa_ctrl;
typedef struct wpa_ctrl* p_wpa_ctrl;
class CScanerPrivate;
class CScaner : public QObject
{
Q_OBJECT
public:
explicit CScaner(QObject *parent = nullptr);
~CScaner();
void StartScan(p_wpa_ctrl pCtrl);
void StopScan();
signals:
private slots:
void SlotEvent();
private:
Q_DISABLE_COPY(CScaner)
Q_DECLARE_PRIVATE(CScaner)
const QScopedPointer<CScanerPrivate> d_ptr;
};
#endif // CSCANER_H
class CScanerPrivate
{
Q_DISABLE_COPY(CScanerPrivate)
Q_DECLARE_PUBLIC(CScaner)
public:
explicit CScanerPrivate(CScaner *pCScaner);
~CScanerPrivate();
private:
CScaner *const q_ptr;
int m_iFd = -1;
p_wpa_ctrl m_pCtrl = nullptr;//wpa控制端
QSocketNotifier* m_pNotifier = nullptr;
};
CScanerPrivate::CScanerPrivate(CScaner *pCScaner)
: q_ptr(pCScaner)
{
}
CScanerPrivate::~CScanerPrivate()
{
}
CScaner::CScaner(QObject *parent)
: QObject(parent)
, d_ptr(new CScanerPrivate(this))
{
}
CScaner::~CScaner()
{
}
void CScaner::StartScan(p_wpa_ctrl pCtrl)
{
if(nullptr == pCtrl || -1 != d_ptr->m_iFd)
{
return;
}
d_ptr->m_pCtrl = pCtrl;
wpa_ctrl_attach(d_ptr->m_pCtrl);
if(nullptr == d_ptr->m_pNotifier)
{
//获取一个文件描述符
d_ptr->m_iFd = wpa_ctrl_get_fd(d_ptr->m_pCtrl);
// 将文件描述符添加到Qt的事件循环中
d_ptr->m_pNotifier = new QSocketNotifier(d_ptr->m_iFd, QSocketNotifier::Read, this);
connect(d_ptr->m_pNotifier, &QSocketNotifier::activated, this, &CScaner::SlotEvent);
}
}
void CScaner::StopScan()
{
if(nullptr == d_ptr->m_pCtrl || -1 == d_ptr->m_iFd)
{
return;
}
if(d_ptr->m_pNotifier)
{
disconnect(d_ptr->m_pNotifier, &QSocketNotifier::activated, this, &CScaner::SlotEvent);
d_ptr->m_pNotifier = nullptr;
}
wpa_ctrl_detach(d_ptr->m_pCtrl);
d_ptr->m_pCtrl = nullptr;
d_ptr->m_iFd = -1;
}
void CScaner::SlotEvent()
{
char buf[256]={0};
size_t len = sizeof(buf) - 1;
int res = wpa_ctrl_recv(d_ptr->m_pCtrl, buf, &len);
qDebug() << "wpa_ctrl_recv res:" << res;
qDebug() << "buf:" << buf;
}