#include "print_net.h" #include "QDebug" #include #include #include "LogInfo.h" #define QT_NO_SSL PrintNet::PrintNet() { m_bShortNet = false; // 创建网络管理器用于GET method this->getManager = new QNetworkAccessManager(this); connect(getManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); // 创建网络管理器用于POST method this->postManager = new QNetworkAccessManager(this); connect(postManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(postPrintFinished(QNetworkReply *))); m_postmanager = new QNetworkAccessManager(this); connect(m_postmanager, SIGNAL(finished(QNetworkReply *)), this, SLOT(postGetShortUrlFinished(QNetworkReply *))); } PrintNet::~PrintNet() { delete this->getManager; delete this->postManager; } // 初步实现 喷码机向服务器获取打印数据 以及 上报状态 接口 // 未处理 网络条件不具备 / 访问超时 等异常 // 递归列出JSON所有层内容 void PrintNet::traversJson(QJsonObject json_obj) { foreach (const QString& key, json_obj.keys()) { QJsonValue value = json_obj.value(key); if (!value.isObject()) { // qDebug()<<"[traversJson]key="<',">").replace('"',""").replace('\'',"'");//edit@02-07 // .replace('¥',"¥").replace('®',"®").replace('°',"°").replace('±',"±").replace('×',"x") // .replace('*',"*").replace('÷',"÷").replace('²',"²").replace('³',"³").replace('Ω',"Ω") // .replace('Φ',"Φ").replace('¥',"¥").replace('φ',"φ").replace('©',"©").replace('@',"@") // .replace('㎡',"㎡").replace('℃',"℃").replace('℉',"℉").replace('\r',' ').replace('\n',' ') ; // const char *std_str = t_str.toStdString().data(); // strcpy(Json_get_data.PrintingContent,std_str); strncpy(Json_get_data.PrintingContent,t_str.toStdString().c_str(),sizeof(Json_get_data.PrintingContent)); Json_get_data.PrintingContent[sizeof(Json_get_data.PrintingContent) -1] = '\0'; }else if(key == "ProductPlanQty"){ Json_get_data.ProductPlanQty = value.toDouble(); }else if(key == "ProductUniqueCode"){ QString t_str; t_str = value.toString(); // const char *std_str = t_str.toStdString().data(); // strcpy(Json_get_data.ProductUniqueCode,std_str); strncpy(Json_get_data.ProductUniqueCode,t_str.toStdString().c_str(),sizeof(Json_get_data.ProductUniqueCode)); Json_get_data.ProductUniqueCode[sizeof(Json_get_data.ProductUniqueCode) -1] = '\0'; }else if(key == "ProductionTask"){ Json_get_data.ProductionTask = value.toDouble(); }else if(key == "StartMetre"){ Json_get_data.StartMetre = value.toDouble(); }else if(key == "TasdNeedConfirm"){ Json_get_data.TasdNeedConfirm = value.toBool(); }else if(key == "TaskSwitchingMode"){ Json_get_data.TaskSwitchingMode = value.toDouble(); } } else { traversJson(value.toObject()); } } } void PrintNet::postPrintFinished(QNetworkReply *reply) { QNetworkReply::NetworkError error; error = reply->error(); // 应答无错误时为QNetworkReply::NoError(0) if (error) { // 非0值表示有错误发生 switch(error) { case QNetworkReply::ConnectionRefusedError: save_messege = "远程主机拒绝连接"; break; case QNetworkReply::RemoteHostClosedError: save_messege = "远程主机关闭连接"; break; case QNetworkReply::HostNotFoundError: save_messege = "远程主机未找到"; break; case QNetworkReply::TimeoutError: save_messege = "连接到远程主机超时"; break; case QNetworkReply::ContentAccessDenied: save_messege = "远程主机拒绝访问"; break; case QNetworkReply::ContentNotFoundError: save_messege = "内容未找到"; break; default: save_messege = "通信失败"; } emit json_server_error(); return; } //未出错时获取响应信息 QByteArray rsp_data = reply->readAll(); //以下对获取的JSON数据进行解析 QJsonDocument json = QJsonDocument::fromJson(rsp_data); QJsonObject obj = json.object(); traversJson(obj); // 递归列出JSON所有层内容 // qDebug() << "[postPrintFinished]ResultCode: " << obj["ResultCode"]; // qDebug() << "[postPrintFinished]ResultMessage: " << obj["ResultMessage"]; // qDebug() << "[postPrintFinished]ResultData: " << obj["ResultData"]; save_messege = obj["ResultMessage"].toString(); reply->deleteLater(); } QString PrintNet::getMessege() { return save_messege; } // 处理HTTP请求的应答 void PrintNet::replyFinished(QNetworkReply *reply) { QNetworkReply::NetworkError error; error = reply->error(); // 应答无错误时为QNetworkReply::NoError(0) if (error) { // 非0值表示有错误发生 switch(error) { case QNetworkReply::ConnectionRefusedError: save_messege = "远程主机拒绝连接"; break; case QNetworkReply::RemoteHostClosedError: save_messege = "远程主机关闭连接"; break; case QNetworkReply::HostNotFoundError: save_messege = "远程主机未找到"; break; case QNetworkReply::TimeoutError: save_messege = "连接到远程主机超时"; break; case QNetworkReply::ContentAccessDenied: save_messege = "远程主机拒绝访问"; break; case QNetworkReply::ContentNotFoundError: save_messege = "内容未找到"; break; default: save_messege = "通信失败"; } emit json_server_error(); return; } //未出错时获取响应信息 QByteArray rsp_data = reply->readAll(); //以下对获取的JSON数据进行解析 QJsonDocument json = QJsonDocument::fromJson(rsp_data); QJsonObject obj = json.object(); traversJson(obj); // 递归列出JSON所有层内容 // qDebug() << "[replyFinished] ResultCode: " << obj["ResultCode"]; // qDebug() << "[replyFinished] ResultMessage: " << obj["ResultMessage"]; // qDebug() << "[replyFinished] ResultData: " << obj["ResultData"]; save_messege = obj["ResultMessage"].toString(); reply->deleteLater(); save_messege = "JSON获取成功!"; emit showMessege(); if(m_bShortNet) { FromBaiDuGetShortUrl(Json_get_data.QRCodeContent); } else { emit receiveJSONDatafinish(); } } // 从服务器获取打印数据 // url - 提供打印数据的服务器链接 // equip_code - 喷码机编号 void PrintNet::PrintNetGetData(QString url, const QString& equip_code) { EquipmentCode = equip_code; //设计本接口实现时,考虑输入的url为问号(?)之前那部分,不同的喷码机equip_code不同 //QUrl qrl("http://47.111.170.144:8754/KLAPS/APSServer/ECode/GetProductUniqueCodeTest?EquipmentCode=1"); QUrl qrl(url); #ifndef QT_MAJOR_VERSION5 // 在访问服务器API的链接中添加喷码机编号 //qrl.addQueryItem("EquipmentCode", QString::number(equip_code)); qrl.addQueryItem("EquipmentCode", equip_code); #else QUrlQuery query; query.addQueryItem("EquipmentCode", equip_code); qrl.setQuery(query); #endif // 构造请求 QNetworkRequest request; request.setUrl(qrl); getManager->get(request); // HTTP GET } // 向服务器上报打印完成状态 // url - 上报打印完成状态的服务器链接 void PrintNet::PrintNetPostFinish(QString url) { QUrl qrl(url); // 构造JSON对象数据 QJsonObject json; json.insert("ProductUniqueCode", QString(Json_get_data.ProductUniqueCode)); json.insert("ProductionTask", QString::number(Json_get_data.ProductionTask)); json.insert("PrintingContent", QString(Json_get_data.PrintingContent)); //json.insert("EquipmentUniqueCode", QString::number(EquipmentCode) ); json.insert("EquipmentUniqueCode", EquipmentCode ); json.insert("StartingMeters", QString::number(Json_get_data.StartMetre)); json.insert("ProductNumber", QString::number(Json_get_data.ProductPlanQty)); json.insert("Coordinates", QString("北纬N31°51′15.36 东经E117°12′8.77")); // qDebug() << json; QJsonDocument jsonDoc(json); // qDebug() << jsonDoc; QByteArray jsonData = jsonDoc.toJson(); // qDebug() << jsonData; QNetworkRequest request; request.setUrl(qrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); postManager->post(request, jsonData); // HTTP POST } // 向服务器上报设备运行状态 // url - 上报设备运行状态的服务器链接 void PrintNet::PrintNetPostState(QString url) { QUrl qrl(url); // 构造JSON对象数据 QJsonObject json; //json.insert("EquipmentUniqueCode", QString::number(EquipmentCode)); json.insert("EquipmentUniqueCode", EquipmentCode ); json.insert("CurrentMeter", QString("13.3")); json.insert("CurrentEcode", QString(Json_get_data.ProductUniqueCode)); json.insert("CurrentPrintingContent", QString(Json_get_data.PrintingContent)); // qDebug() << json; QJsonDocument jsonDoc(json); // qDebug() << jsonDoc; QByteArray jsonData = jsonDoc.toJson(); // qDebug() << jsonData; QNetworkRequest request; request.setUrl(qrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); postManager->post(request, jsonData); // HTTP POST } // 向百度云获取转换的短网址 //longUrl要转换的长url void PrintNet::FromBaiDuGetShortUrl(QString longUrl) { QUrl qrl(QString("https://dwz.cn/api/v3/short-urls")); // 构造JSON对象数据 QJsonObject json; json.insert("LongUrl", longUrl); json.insert("TermOfValidity", QString("long-term")); //json.insert("CurrentEcode", QString(Json_get_data.ProductUniqueCode)); //json.insert("CurrentPrintingContent", QString(Json_get_data.PrintingContent)); //qDebug() << json; QJsonArray Arrjson; Arrjson.append(json); QJsonDocument jsonDoc(Arrjson); //qDebug() << jsonDoc; QByteArray jsonData = jsonDoc.toJson(); //qDebug() << jsonData; //LogInfo::setRunStatusText(tr("FromBaiDuGetShortUrl(): setSsl before")); QNetworkRequest request; request.setUrl(qrl); #ifndef QT_NO_SSL //LogInfo::setRunStatusText(tr("defaultConfiguration new before")); QSslConfiguration config = QSslConfiguration::defaultConfiguration(); //LogInfo::setRunStatusText(tr("defaultConfiguration 1")); #ifndef QT_MAJOR_VERSION5 config.setProtocol(QSsl::TlsV1); #else config.setProtocol(QSsl::SslProtocol::TlsV1_0);//edit@02-07 #endif //LogInfo::setRunStatusText(tr("defaultConfiguration 2")); config.setPeerVerifyMode(QSslSocket::VerifyNone); //LogInfo::setRunStatusText(tr("defaultConfiguration 3")); request.setSslConfiguration(config); //LogInfo::setRunStatusText(tr("FromBaiDuGetShortUrl(): setSsl after")); #endif request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8"); request.setRawHeader("Dwz-Token" ,"708e8736a533df553a8898699280bcf9"); //LogInfo::setRunStatusText(tr("FromBaiDuGetShortUrl(): <1>")); //QNetworkAccessManager *post_manager = new QNetworkAccessManager(this); //connect(post_manager, SIGNAL(finished(QNetworkReply *)), this, SLOT(postGetShortUrlFinished(QNetworkReply *))); m_postmanager->post(request, jsonData); // HTTP POST //LogInfo::setRunStatusText(tr("FromBaiDuGetShortUrl(): <2>")); //connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onNetReplyError(QNetworkReply::NetworkError))); //connect(reply, SIGNAL(sslErrors(QList&)), this, SLOT(onNetReplySshErrors(QList&))); #ifndef QT_NO_SSL connect(post_manager, SIGNAL(sslErrors(QNetworkReply*,QList)), this, SLOT(sslErrors(QNetworkReply*,QList))); #endif } #ifndef QT_NO_SSL void PrintNet::sslErrors(QNetworkReply *reply,const QList &) { reply->ignoreSslErrors(); } #endif void PrintNet::postGetShortUrlFinished(QNetworkReply *reply) { //LogInfo::setRunStatusText(tr("postGetShortUrlFinished(): <3>")); QNetworkReply::NetworkError error; error = reply->error(); // 应答无错误时为QNetworkReply::NoError(0) if (error) { // 非0值表示有错误发生 switch(error) { case QNetworkReply::ConnectionRefusedError: save_messege = "远程主机拒绝连接"; break; case QNetworkReply::RemoteHostClosedError: save_messege = "远程主机关闭连接"; break; case QNetworkReply::HostNotFoundError: save_messege = "远程主机未找到"; break; case QNetworkReply::TimeoutError: save_messege = "连接到远程主机超时"; break; case QNetworkReply::ContentAccessDenied: save_messege = "远程主机拒绝访问"; break; case QNetworkReply::ContentNotFoundError: save_messege = "内容未找到"; break; default: save_messege = "通信失败"; } //LogInfo::setRunStatusText(tr("postGetShortUrlFinished(): <4>")); emit json_server_error(); //emit receiveJSONDatafinish(); return; } //未出错时获取响应信息 QByteArray rsp_data = reply->readAll(); //以下对获取的JSON数据进行解析 QJsonDocument json = QJsonDocument::fromJson(rsp_data); //qDebug() << json; QJsonObject obj = json.object(); // qDebug() << obj; QString strResultCode; save_messege = strResultCode.number(obj["Code"].toDouble()); if(save_messege != "0") { //LogInfo::setRunStatusText(tr("postGetShortUrlFinished(): <5>")); //emit receiveJSONDatafinish(); save_messege = "获取短网址出错,错误码:"+ save_messege; return; } QJsonArray JsonArr = obj["ShortUrls"].toArray(); QJsonValue value = JsonArr.at(0); QJsonObject jsonObj = value.toObject(); foreach (const QString& key, jsonObj.keys()) { QJsonValue value = jsonObj.value(key); if (!value.isObject()) { if(key == "ShortUrl") { QString t_str; t_str = value.toString(); const char *std_str = t_str.toStdString().data(); strcpy(Json_get_data.QRCodeContent,std_str); } } } save_messege = "获取短网址成功"; //LogInfo::setRunStatusText(tr("postGetShortUrlFinished(): <6>")); reply->deleteLater(); emit receiveJSONDatafinish(); } void PrintNet::getJson_data(JSON_DATA *json_data) { memcpy(json_data, &Json_get_data, sizeof(JSON_DATA)); }