QNetworkReply::UnknownNetworkError问题的解决方案

一、问题描述及解决方案:

       客户端使用QT的network模块通过https协议获取服务端数据时在个别电脑上报错:“QNetworkReply::UnknownNetworkError”。经排查发现,该问题同"libcrypto-1_1-x64.dll"、"libssl-1_1-x64.dll"两个openssl库文件相关,使用VS2013重新编译openssl-1.1.1v后,对这两个库文件进行了替换,问题得到了解决。

二、相关代码:

QString common_interface::httpPost(QString jsonContent, QString qUrlS)
{
    QString req_data;
    QByteArray queryErrorResult;
    queryErrorResult.clear();

    //设置超时处理定时器
    QTimer timer;
    timer.setInterval(3000);         //设置超时时间 3 秒
    timer.setSingleShot(true);       //单次触发

    QUrl qUrl(qUrlS);
    QByteArray postData;             //上传的json内容
    postData.append(QJsonDocument(QStringToJson(jsonContent)).toJson());

    //设置发送
    QNetworkAccessManager* manager = new QNetworkAccessManager();
    QNetworkRequest request;
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setUrl(qUrl);

    //开启一个局部的事件循环,等待响应结束,退出
    QNetworkReply* reply = manager->post(request, postData);
    QEventLoop eventLoop;
    connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
    connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
    timer.start();                  //启动定时器
    eventLoop.exec();               //启动事件循环

    if(timer.isActive())
    {
        //处理响应,定时器激活状态
        timer.stop();               //停止定时器
        if(reply->error() != QNetworkReply::NoError)
        {
            //http请求出错,进行错误处理
            reply->deleteLater();
            req_data = QByteArrayToQString(queryErrorResult);
            RecordLog(QString("reply error:%1!!!").arg(reply->error()));
            return req_data;
        }
        else
        {
            //http响应状态码
            int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
            if(statusCode == 200)
            {
                //http请求响应正常
                //write_filecontent("./DebugData.txt",reply->readAll());
                QByteArray replyContent = reply->readAll();
                req_data = QByteArrayToQString(replyContent);
                RecordLog("http请求响应正常");
                return req_data;
            }
            else
            {
                reply->deleteLater();
                req_data = QByteArrayToQString(queryErrorResult);
                RecordLog(QString("reply error:%1!!!").arg(statusCode));
                return req_data;
            }
        }
    }
    else
    {
        //超时处理
        disconnect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit);
        reply->abort();
        req_data = QByteArrayToQString(queryErrorResult);
        RecordLog("http请求响应超时!!!");
        return req_data;
    }
}

三、抛砖引玉

        至今尚不清楚个别电脑上为什么会出现这个问题,替换openssl的库文件后为什么问题可以得到解决。希望大家可以指点迷津,静候高人指点。

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【RT-Thread作品秀】基于物联网云平台的智能环境监测设计作者:赵帅 概述智能环境监测系统基于 STM32H7系列芯片开发,通过光照传感器与温湿度传感器采集环境中的光照与温湿度数据,通过WIFI将系统采集到的环境数据实时的上传至物联网云平台,也可以通过PC端软件实时的监控环境数据。该系统适用于家庭、办公室、教室等场所的进行环境监控,该系统具有实时性高、功耗低,丢包率低,随时随地监控数据等特点,是一个实用的设计。 开发环境下位机:硬件:stm32f407-atk-explorer 扩展板:DHT11温湿度传感器,BH1750光照传感器,板载AP6212 WIFI模块 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Sudio 上位机: Qt版本:Qt5 开发工具:Qt Creator4.11.0 RT-Thread使用情况概述内核部分:调度器,信号量,事件集 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 事件集:通知数据采集完成 组件部分:IIC框架, Sensor框架,SAL 套接字抽象层 IIC框架:驱动光照传感器,获取光照强度数据 Sensor框架:将温湿度传感器注册到sensor上。使用该框架提高了代码的复用性。 SAL套接字抽象层:该组件实现了对不同网络协议栈或网络实现接口的抽象,并对上层提供一组标准的API接口,方便网络应用的开发与稳定性。 软件包部分: cJSON:C语言实现的极简的解析 JSON 格式的软件包。 Onenet:RT-Thread 针对 OneNET 平台连接做的的适配,通过这个软件包,可以让设备在 RT-Thread 上非常方便的连接 OneNet 平台,完成数据的发送、接收、设备的注册和控制等功能。 pahomqtt,:本软件包是在 Eclipse paho-mqtt 源码包的基础上设计的一套 MQTT 客户端程序。 Webclient:提供设备与 HTTP Server 的通讯的基本功能。 硬件框架使用stm32h7做为系统主控,通过外接dht11传感器、bh1750传感器来采集外界的温湿度数据与光照强度。 使用AP6211wifi模块,实现设备的联网,以及连接云平台的功能。 软件框架说明下位机流程图: 上位机流程图: 上位机数据的获取是通过调用OneNet云平台的API接口来获取数据,因此需要使用HTTP协议。在QT中,QNetworkAccessManager类可以完成基于HTTP协议的数据传输。既可以向网络发送请求,也可以接收网络的应答。但是,具体的网络请求需要通过QNetworkRequest类实现,网络的应答通过QNetworkReply类来实现。在数据获取成功之后,通过调用QT中JSON相关的API函数,根据数据格式匹配出相应的环境数据。之后发送dataSignal()信号,执行setVallue槽函数将数据显示在用户界面上。通过定时器来定时发送get请求,实现数据实时更新的目的。流程图如下图所示。 软件模块说明art_mqtt_init_entry:初始化 mqtt,初始化成功后,释放信号量,通知ArtOneNetUploadThread线程可以向OneNet发送数据。 art_onenet_upload_entry:线程接收到事件后,将数据发送至OneNet云平台 art_dht11_read_entry:温湿度数据采集线程,采集到数据后发送事件 art_bh1750_read_entry:光照采集线程,采集到数据后发送事件 演示效果演示视频 代码地址(附件为代码地址,下载后打开可见)比赛感悟通过这次RT-Thread x STM32 全连接创意创客大赛,增加了我的实际动手能力。 在这次比赛中,通过 RT-Thread官网上的文档中心,让我学到了多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等知识点,也了解了多线程的编程技术。通过这次比赛,让我对这些知识点有了进一步的理解。 由于rt-thread提供了各种传感器相关的软件包支持,这是使我能够快速完成一个项目的重要原因。如果没有这些软件包,项目到开发将不会如此之快。感谢rt-thread社区提供的开源软件包。
QNetworkReplyQt网络模块中的一个类,用于处理网络请求的响应。下面是QNetworkReply的基本用法: 1. 发送网络请求: 使用QNetworkAccessManager发送网络请求,并获得QNetworkReply对象作为响应。 ```cpp QNetworkAccessManager *manager = new QNetworkAccessManager(this); QNetworkReply *reply = manager->get(QNetworkRequest(QUrl("https://example.com"))); ``` 2. 获取响应数据: 使用QNetworkReply的readAll()函数可以获取到完整的响应数据。 ```cpp QByteArray responseData = reply->readAll(); ``` 3. 处理错误: 可以使用QNetworkReplyerror()函数来检查是否发生了错误,并使用errorString()获取错误信息。 ```cpp if (reply->error() != QNetworkReply::NoError) { qDebug() << "Error: " << reply->errorString(); } ``` 4. 异步请求: 可以使用QNetworkReply的信号和槽机制来实现异步请求和处理。 ```cpp connect(reply, &QNetworkReply::finished, this, [=]() { if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); // 处理响应数据 } else { qDebug() << "Error: " << reply->errorString(); } }); ``` 5. 取消请求: 可以使用QNetworkReply的abort()函数来取消当前的网络请求。 ```cpp reply->abort(); ``` 需要注意的是,为了使QNetworkReply正常工作,需要在使用完毕后释放它的内存,可以使用deleteLater()函数来延迟删除。 ```cpp reply->deleteLater(); ``` 以上是QNetworkReply的基本用法,更多高级用法和功能可以参考Qt官方文档或其他相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值