#include "interfacethread.h" InterfaceThread::InterfaceThread(qintptr socketDescriptor, QObject *parent) : QThread(parent) { waitEcho = false; getEcho = false; EchoString = ""; CmdId = QUuid::createUuid().toString().replace(QRegExp("{|}"),""); this->SocketDescriptor = socketDescriptor; } InterfaceThread::~InterfaceThread() { deleteLater(); } bool InterfaceThread::chkCmdID(QString id)//server程序对队列中的thread核对cmdid { if(QString::compare(id,CmdId)==0) return true; return false; } void InterfaceThread::setEchoString(QString string) { //这里将返回的数据字符串(json格式)发回前端 EchoString = QString("HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-type: json/plain\r\n\r\n%1").arg(string.replace("\r","").replace("\n","").replace("\\","")); getEcho = true; emit CommData(CmdId, 1, EchoString); } void InterfaceThread::run() { QTcpSocket *so = new QTcpSocket; int waitCount=0; if(!so->setSocketDescriptor(this->SocketDescriptor)) { so->abort(); return; } waitEcho = true; while(waitEcho){ if(getEcho){//得到回应数据 so->write(EchoString.toUtf8()); so->flush(); waitEcho = false; emit CommData(CmdId, 1, "jiesustring"); }else if(waitCount>60){//等待回应数据超时 QJsonObject o_Data; o_Data.insert("code", 408); o_Data.insert("msg", "硬件响应超时"); o_Data.insert("data", ""); QString string = QString(QJsonDocument(o_Data).toJson()).replace("\"","\\\""); QString EchoTimeoutString = QString("HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\nContent-type: json/plain\r\n\r\n%1").arg(string.replace("\r","").replace("\n","").replace("\\",""));; so->write(EchoTimeoutString.toUtf8()); so->flush(); waitEcho = false; }else if(so->waitForReadyRead(1000)){ getEcho = false; waitCount = 0; QByteArray data = so->readAll();//这里要先打印出来,一般在数据结构中找到"{"符号,以往我的做法是找到“queryJson={}”字符串作为特征的,从这一行到全部后续字符串连接成一个字符串后处理 QStringList Dat = QString(data).split("\r\n"); QByteArray cmd; bool found = false; for(int i=0;i=0) found = true; if(found) cmd.append(Dat.at(i).trimmed().toUtf8()); } QJsonParseError json_error; QJsonDocument jsonDoc(QJsonDocument::fromJson(cmd,&json_error)); if(json_error.error==QJsonParseError::NoError){ QJsonObject root = jsonDoc.object(); int commandType = 0; if((!root.value("command_type").isUndefined())&&(!root.value("command_type").isNull())){ commandType=root.value("command_type").toString().toInt(); } if((!root.value("RESET").isUndefined())&&(!root.value("RESET").isNull())){ emit resetRequest(root.value("DEVICEID").toString().trimmed(),2,0,0); }else if(commandType==10){ emit CommData(root.value("terminal_code").toString().trimmed(), 2, root.value("terminal_code").toString().trimmed()); emit resetRequest(root.value("terminal_code").toString().trimmed(),11,root.value("operation_type").toString().toInt(),0); }else if((!root.value("start_point").isUndefined())&&(!root.value("start_point").isNull())){ // emit resetRequest(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().trimmed()); emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),12,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("query_number").toString().toInt(),root.value("start_point").toString().toInt()); }else if((!root.value("economize_gear").isUndefined())&&(!root.value("economize_gear").isNull())){ QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt()) .arg(root.value("operation_type").toString().toInt()); emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data); emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),5,root.value("operation_type").toString().toInt(),root.value("pn").toString().toInt(),root.value("control_type").toString().toInt(),root.value("economize_gear").toString().toInt()); }else if((!root.value("time_data").isUndefined())&&(!root.value("time_data").isNull())){ QString Data = QString("[ %1 %2 =============== %3 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(root.value("application_key").toString().toInt()) .arg(root.value("time_data").toString().trimmed()); emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data); QString tmp = root.value("time_data").toString(); emit requestSetParameters(root.value("terminal_code").toString().trimmed(),4,root.value("operation_type").toString().toInt(),tmp); }else if(commandType==14){ QString Data = QString("[ %1 =============== %2 ------------------- ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(14); emit CommData(root.value("terminal_code").toString().trimmed(), 2, Data); emit requestRealTimeData(root.value("terminal_code").toString().trimmed(),14,root.value("operation_type").toString().toInt(),root.value("pm").toString().toInt(),root.value("pn").toString().toInt(),0); } } } waitCount++; usleep(100000); } if(so->isOpen()) so->abort(); }