hanzhengyi 4 роки тому
батько
коміт
8280dfc6bb
5 змінених файлів з 490 додано та 0 видалено
  1. 70 0
      cpp/core.cpp
  2. 163 0
      cpp/databasethread.cpp
  3. 77 0
      cpp/interfaceserver.cpp
  4. 110 0
      cpp/interfacethread.cpp
  5. 70 0
      cpp/logthread.cpp

+ 70 - 0
cpp/core.cpp

@@ -0,0 +1,70 @@
+#include "core.h"
+#include "smartlightshm.h"
+
+Core::Core(QObject *parent) : QObject(parent)
+{
+    logThread = new LogThread(this);
+    logThread->start();
+    dbThread = new DatabaseThread(this);
+    connect(dbThread,&DatabaseThread::sql_log,this,&Core::sql_log);
+    server = new SmartLightServer(this);
+    connect(server,&SmartLightServer::CommData,this,&Core::CommData);
+    connect(server,&SmartLightServer::getEAlarm,this,&Core::getEAlarm);
+    intServer = new InterfaceServer(this);
+    connect(intServer,&InterfaceServer::SetResetRequest,this,&Core::resetRequest);
+    connect(intServer,&InterfaceServer::SetRequestRealTimeData,this,&Core::requestRealTimeData);
+    connect(intServer,&InterfaceServer::SetRequestSetParameters,this,&Core::requestSetParameters);
+    connect(intServer,&InterfaceServer::SetCommData,this,&Core::CommData);
+    //平台接口数据信号
+    wssServer = new WssServer(this);
+    connect(wssServer,&WssServer::resetRequest,this,&Core::resetRequest);
+    connect(wssServer,&WssServer::requestRealTimeData,this,&Core::requestRealTimeData);
+    connect(wssServer,&WssServer::requestSetParameters,this,&Core::requestSetParameters);
+    connect(wssServer,&WssServer::CommData,this,&Core::CommData);
+    wssServer->start();
+    dbThread->start();
+}
+
+void Core::start()
+{
+    server->start();
+    intServer->start();
+}
+
+void Core::CommData(QString deviceID, int dir, QString data)
+{
+    logThread->appendData(data);
+    wssServer->subReport(deviceID,dir,false,false,data);
+    if(dir==11){
+      sql_log("++++++setEchoString++++++");
+      intServer->setEchoString(deviceID,data);
+    }
+}
+
+void Core::resetRequest(QString deviceID, int commandType, int parameterType, int pseq)
+{
+    CommData(deviceID, 2, "======================tcp====================");
+    server->mk_ResetList_qry(deviceID,commandType,parameterType,pseq);
+}
+
+void Core::requestRealTimeData(QString deviceID, int commandType, int parameterType, int pn, int queryNumber, int startPoint)
+{
+    server->mk_realtime_qry(deviceID,commandType,parameterType,pn,queryNumber,startPoint);
+}
+
+void Core::requestSetParameters(QString deviceID, int commandType, int parameterType, QString tmp)
+{
+    CommData(deviceID, 2, "======================ceshi====================");
+    server->mk_set_parameters_qry(deviceID,commandType,parameterType,tmp);
+}
+
+void Core::getEAlarm(QString DeviceCode, int erc, int sta, int arg1, int arg2, int arg3, float value, float v2, QString others, QDateTime t)
+{
+    dbThread->appendSql(DatabaseThread::RecSql,QString("insert into err_rec (id , device_id, erc, sta, arg1, arg2, arg3, value, value2, others, time1, time2) values (NULL, '%1', %2, %3, %4, %5, %6, %7, %8, '%9', %10, '%11')")
+                        .arg(DeviceCode).arg(erc).arg(sta).arg(arg1).arg(arg2).arg(arg3).arg(QString::number(value,'g',3)).arg(QString::number(v2,'g',3)).arg(others).arg(t.toTime_t()).arg(t.toString("yyyy-MM-dd HH:mm:ss")));
+}
+
+void Core::sql_log(QString log)
+{
+    logThread->appendData(log);
+}

+ 163 - 0
cpp/databasethread.cpp

@@ -0,0 +1,163 @@
+#include "databasethread.h"
+#include "smartlightshm.h"
+
+DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent)
+{
+    QDir dir(QString(DbPath));
+    ConfSqlList.clear();
+    RecSqlList.clear();
+    StaSqlList.clear();
+    if(!dir.exists())
+        dir.mkdir(QString(DbPath));
+    conf_db = QSqlDatabase::addDatabase("QSQLITE","conf_db");
+    conf_db.setDatabaseName(QString(DbPath)+"/conf.db");
+    rec_db = QSqlDatabase::addDatabase("QSQLITE","rec.db");
+    rec_db.setDatabaseName(QString(DbPath)+"/rec.db");
+    sta_db = QSqlDatabase::addDatabase("QSQLITE","sta_db");
+    sta_db.setDatabaseName(QString(DbPath)+"/sta.db");
+    if(db_init()){
+        db_load();
+    }
+}
+
+DatabaseThread::~DatabaseThread()
+{
+    stop();
+    deleteLater();
+}
+
+void DatabaseThread::stop()
+{
+    keep = false;
+}
+
+void DatabaseThread::appendSql(int type, QString sql)
+{
+    if(type==ConfSql)
+        ConfSqlList.append(sql);
+    else if(type==RecSql)
+        RecSqlList.append(sql);
+    else if(type==StaSql)
+        StaSqlList.append(sql);
+}
+
+bool DatabaseThread::had_table(QStringList tblist, QString tbname)
+{
+    for(int i=0;i<tblist.length();i++){
+        if(tblist.at(i).compare(tbname)==0)
+            return true;
+    }
+    return false;
+}
+
+bool DatabaseThread::db_init()
+{
+    if(!conf_db.open())
+        return false;
+    if(!had_table(conf_db.tables(),"sys_conf")){
+        conf_db.exec("create table sys_conf (name text(40), value text(200))");
+        conf_db.exec("insert into sys_conf (name, value) values ('ServerAddr','88888888888888')");
+    }
+    conf_db.close();
+    if(!rec_db.open())
+        return false;
+    if(!had_table(rec_db.tables(),"err_rec")){
+        rec_db.exec("create table err_rec (id integer primary key autoincrement, device_id text(20), erc integer, sta integer, arg1 integer, arg2 integer, arg3 integer, value float, value2 float, others text(200), time1 integer, time2 text(20))");
+    }
+    rec_db.close();
+    if(!sta_db.open())
+        return false;
+    if(!had_table(sta_db.tables(),"err_count")){
+        sta_db.exec("create table err_count (id integer primary key autoincrement, device_id text(20), err_count1 integer, err_count2 integer)");
+    }
+    sta_db.close();
+    return true;
+}
+
+void DatabaseThread::db_load()
+{
+    if(conf_db.open()){
+        QSqlQuery qry = conf_db.exec("select name, value from sys_conf");
+        while (qry.next()) {
+            if(qry.value(0).toString().compare("ServerAddr")==0){
+//                ServerAddr0 = 0x00000000;
+//                ServerAddr1 = 0x00000000;
+//                quint64 sAddr = qry.value(1).toULongLong()&0xffffffffffffffff;
+//                ServerAddr0 |= ((sAddr/10000000000000)<<20)&0x00f00000;
+//                ServerAddr0 |= (((sAddr/1000000000000)%10)<<16)&0x000f0000;
+//                ServerAddr0 |= (((sAddr/100000000000)%10)<<12)&0x0000f000;
+//                ServerAddr0 |= (((sAddr/10000000000)%10)<<8)&0x00000f00;
+//                ServerAddr0 |= (((sAddr/1000000000)%10)<<4)&0x000000f0;
+//                ServerAddr0 |= ((sAddr/100000000)%10)&0x0000000f;
+//                ServerAddr1 |= (((sAddr/10000000)%10)<<28)&0xf0000000;
+//                ServerAddr1 |= (((sAddr/1000000)%10)<<24)&0x0f000000;
+//                ServerAddr1 |= (((sAddr/100000)%10)<<20)&0x00f00000;
+//                ServerAddr1 |= (((sAddr/10000)%10)<<16)&0x000f0000;
+//                ServerAddr1 |= (((sAddr/1000)%10)<<12)&0x0000f000;
+//                ServerAddr1 |= (((sAddr/100)%10)<<8)&0x00000f00;
+//                ServerAddr1 |= (((sAddr/10)%10)<<4)&0x000000f0;
+//                ServerAddr1 |= (sAddr%10)&0x0000000f;
+            }
+        }
+        conf_db.close();
+    }
+}
+
+void DatabaseThread::run()
+{
+    keep = true;
+    while(true){
+        if(ConfSqlList.length()>0){
+            if(conf_db.open()){
+                if(conf_db.transaction()){
+                    while(ConfSqlList.length()>0){
+                        conf_db.exec(ConfSqlList.first());
+                        QString Data = QString("[ %1 sql ] %2")
+                                .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"))
+                                .arg(ConfSqlList.first());
+                        emit sql_log(Data);
+                        ConfSqlList.removeFirst();
+                        usleep(1000);
+                    }
+                    conf_db.commit();
+                }
+                conf_db.close();
+            }
+        }
+        if(RecSqlList.length()>0){
+            if(rec_db.open()){
+                if(rec_db.transaction()){
+                    while(RecSqlList.length()>0){
+                        rec_db.exec(RecSqlList.first());
+                        QString Data = QString("[ %1 sql ] %2")
+                                .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"))
+                                .arg(RecSqlList.first());
+                        emit sql_log(Data);
+                        RecSqlList.removeFirst();
+                        usleep(1000);
+                    }
+                    rec_db.commit();
+                }
+                rec_db.close();
+            }
+        }
+        if(StaSqlList.length()>0){
+            if(sta_db.open()){
+                if(sta_db.transaction()){
+                    while (StaSqlList.length()>0) {
+                        sta_db.exec(StaSqlList.first());
+                        QString Data = QString("[ %1 sql ] %2")
+                                .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"))
+                                .arg(StaSqlList.first());
+                        emit sql_log(Data);
+                        StaSqlList.removeFirst();
+                        usleep(1000);
+                    }
+                    sta_db.commit();
+                }
+                sta_db.close();
+            }
+        }
+        usleep(100000);
+    }
+}

+ 77 - 0
cpp/interfaceserver.cpp

@@ -0,0 +1,77 @@
+#include "interfaceserver.h"
+#include "smartlightshm.h"
+
+InterfaceServer::InterfaceServer(QObject *parent) : QTcpServer(parent)
+{
+    threadList.clear();
+}
+
+void InterfaceServer::start()
+{
+    if(!this->listen(QHostAddress::Any,55010)){
+        exit(-1);
+    }
+}
+
+void InterfaceServer::closeThread()
+{
+    InterfaceThread *pThread = static_cast<InterfaceThread *>(sender());
+    if(pThread){
+        QList<InterfaceThread *>::iterator i;
+        for(i=threadList.begin();i!=threadList.end();i++){
+            InterfaceThread *thread = *i;
+            emit SetCommData("0008",1,QString("close thread:%1").arg(thread->cmdID()));
+            if(thread==pThread){
+                threadList.removeAll(thread);
+                pThread->deleteLater();
+                break;
+            }
+        }
+    }
+}
+
+void InterfaceServer::incomingConnection(qintptr socketDescriptor)
+{
+    InterfaceThread *thread = new InterfaceThread(socketDescriptor,this);
+    connect(thread,&InterfaceThread::finished,this,&InterfaceServer::closeThread);
+    connect(thread,&InterfaceThread::resetRequest,this,&InterfaceServer::resetRequest);
+    connect(thread,&InterfaceThread::requestRealTimeData,this,&InterfaceServer::requestRealTimeData);
+    connect(thread,&InterfaceThread::requestSetParameters,this,&InterfaceServer::requestSetParameters);
+    connect(thread,&InterfaceThread::CommData,this,&InterfaceServer::CommData);
+    threadList.append(thread);
+    //来自平台的数据信号
+    thread->start();
+}
+
+void InterfaceServer::setEchoString(QString CommId, QString EchoString)
+{
+    emit SetCommData(CommId, 1, "EchoString");
+    QList<InterfaceThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        InterfaceThread *thread = *i;
+        emit SetCommData(CommId,1,QString("check thread:%1").arg(thread->cmdID()));
+//        if(thread->chkCmdID(CommId)){
+            thread->setEchoString(EchoString);
+            break;
+//        }
+    }
+}
+
+void InterfaceServer::resetRequest(QString deviceID, int commandType, int parameterType, int pseq){
+    emit SetResetRequest(deviceID,commandType,parameterType,pseq);
+}
+
+void InterfaceServer::requestRealTimeData(QString deviceID, int commandType, int parameterType, int pn, int queryNumber, int startPoint)
+{
+    emit SetRequestRealTimeData(deviceID, commandType, parameterType, pn, queryNumber, startPoint);
+}
+
+void InterfaceServer::requestSetParameters(QString deviceID, int commandType, int parameterType, QString tmp)
+{
+    emit SetRequestSetParameters(deviceID, commandType, parameterType, tmp);
+}
+
+void InterfaceServer::CommData(QString deviceID, int dir, QString data)
+{
+    emit SetCommData(deviceID, dir, data);
+}

+ 110 - 0
cpp/interfacethread.cpp

@@ -0,0 +1,110 @@
+#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<Dat.length();i++){
+                if(Dat.at(i).indexOf("{")>=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();
+}

+ 70 - 0
cpp/logthread.cpp

@@ -0,0 +1,70 @@
+#include "logthread.h"
+#include "smartlightshm.h"
+
+LogThread::LogThread(QObject *parent)
+    : QThread (parent)
+{
+    keep = false;
+    dataList.clear();
+    wrongList.clear();
+    QDir dir(QString(LogPath));
+    if(!dir.exists())
+        dir.mkdir(QString(LogPath));
+    file = new QFile(QString(LogPath)+"/smartlight-"+QDate::currentDate().toString("yyyyMMdd")+".log");
+    wfile = new QFile(QString(LogPath)+"/error.log");
+    day = QDate::currentDate().day();
+}
+
+void LogThread::appendData(QString data)
+{
+    dataList.append(data);
+}
+
+void LogThread::appendWrongData(QString data)
+{
+    wrongList.append(data);
+}
+
+void LogThread::stop()
+{
+    keep = false;
+}
+
+void LogThread::run()
+{
+    printf("log thread start\n");
+    if(file->open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text)){
+        file->write(QString("ytSmartLight start at %1.\r\n").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).toUtf8());
+        file->close();
+    }
+    keep = true;
+    while(keep){
+        if(dataList.length()>0){
+            if(day!=QDate::currentDate().day()){
+                day = QDate::currentDate().day();
+                file = new QFile(QString(LogPath)+"/smartlight-"+QDate::currentDate().toString("yyyyMMdd")+".log");
+            }
+            if(file->open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text)){
+                while(dataList.length()>0){
+                    file->write(dataList.first().toUtf8());
+                    file->write("\r\n");
+                    dataList.removeFirst();
+                    usleep(1000);
+                }
+                file->close();
+            }
+        }
+        if(wrongList.length()>0){
+            if(wfile->open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text)){
+                while(wrongList.length()>0){
+                    wfile->write(wrongList.first().toUtf8());
+                    wfile->write("\r\n");
+                    wrongList.removeFirst();
+                    usleep(1000);
+                }
+                wfile->close();
+            }
+        }
+        usleep(50000);
+    }
+}