使用QSocketNotifier监听并解析wpa库返回的消息

前言

调用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值