Ver Fonte

新项目,第一次提交

James há 3 anos atrás
pai
commit
0345c6c891

+ 30 - 0
ytWGZc/WGZcDog/WGZcDog.pro

@@ -0,0 +1,30 @@
+QT -= gui
+QT += network
+
+CONFIG += c++11 console
+CONFIG -= app_bundle
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+        main.cpp \
+    dogcore.cpp
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+HEADERS += \
+    dogcore.h \
+    dogprocessshm.h \
+    dogshm.h

+ 118 - 0
ytWGZc/WGZcDog/dogcore.cpp

@@ -0,0 +1,118 @@
+#include "dogcore.h"
+#include "dogshm.h"
+
+dogcore::dogcore(QObject *parent) : QObject(parent)
+{
+    timer = new QTimer(this);
+    connect(timer,&QTimer::timeout,this,&dogcore::time_out);
+
+    hour = 255;
+    isEqual = false;
+//    netAccessManager = new QNetworkAccessManager(this);
+//    connect(netAccessManager,&QNetworkAccessManager::finished,this,&dogcore::finishedSlot);
+}
+
+dogcore::~dogcore()
+{
+//    netAccessManager->deleteLater();
+}
+
+void dogcore::start()
+{
+    time_out();
+    timer->start(5000);
+}
+
+void dogcore::time_out()
+{
+//    if(hour != QDateTime::currentDateTime().time().hour()){
+//        hour = QDateTime::currentDateTime().time().hour();
+
+//        QByteArray post_data;
+//        uint t = QDateTime::currentDateTime().toTime_t();
+
+//        QString tmp="";
+//            QString number= QString("%1%2%3").arg("usky").arg(t).arg("056ac8fae059c9c9e700b734922edfc8");
+//            QByteArray str;
+//            str = QCryptographicHash::hash(number.toLatin1(),QCryptographicHash::Md5);
+//            tmp.append(str.toHex());
+
+
+//        post_data.append(QString("requestType=%1&").arg(3));
+//        post_data.append(QString("publicKey=%1&").arg(tmp));
+//        post_data.append(QString("timeStamp=%1").arg(t));
+
+//        QNetworkRequest *req = new QNetworkRequest();
+//        req->setUrl(QUrl("https://iot.usky.cn/ytapi/admin/Manage/wooGiApi"));
+//        req->setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
+//        req->setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());
+//        QNetworkReply* reply = netAccessManager->post(*req,post_data);
+//    }
+
+    uint chkTime = QDateTime::currentDateTime().toTime_t();
+//    if(((chkTime-dogshm->time) > 30) && isEqual){
+//        if(system("killall ytWGZcCore") != -1){
+//            if(system("/root/bin/ytWGZcCore &") != -1){
+
+//            }
+//        }
+//    }
+    if((chkTime-dogshm->time) > 30){
+        if(system("killall ytWGZcCore") != -1){
+            if(system("/root/bin/ytWGZcCore &") != -1){
+
+            }
+        }
+    }
+}
+
+//void dogcore::finishedSlot(QNetworkReply *reply)
+//{
+//    //printf("enter finishedSlot ++++++++++++++\n");
+//    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
+//    if(status_code == 200){
+//        if(reply->error() == QNetworkReply::NoError){
+//            QString message = QString::fromUtf8(reply->readAll());
+//            QByteArray data = message.toLatin1();
+//            QJsonParseError json_err;
+//            QJsonDocument jsondoc(QJsonDocument::fromJson(data,&json_err));
+//            //printf("json_err.error = %d\n ",json_err.error);
+//            if(json_err.error==QJsonParseError::NoError){
+//                QJsonObject root = jsondoc.object();
+//                QJsonObject obj = root.value("data").toObject();
+//                QString num = "";
+//                int t = 0;
+//                if((!obj.value("publicKey").isUndefined())&&(!obj.value("publicKey").isNull())){
+//                    num = obj.value("publicKey").toString();
+//                }
+//                if((!obj.value("timeStamp").isUndefined())&&(!obj.value("timeStamp").isNull())){
+//                    t = obj.value("timeStamp").toInt();
+//                }
+
+//                QString temp="";
+//                QString number = QString("%1%2%3").arg("usky").arg(t).arg("056ac8fae059c9c9e700b734922edfc8");
+//                QByteArray str = QCryptographicHash::hash(number.toLatin1(),QCryptographicHash::Md5);
+//                temp.append(str.toHex());
+//                if(QString::compare(num,temp)!=0){
+//                    isEqual = false;
+//                }
+//                else{
+//                    isEqual = true;
+//                }
+
+
+//            }
+
+
+//        }else{
+
+//        }
+
+//    }else{
+
+//    }
+
+//    reply->abort();
+//    reply->close();
+//    reply->deleteLater();
+//}

+ 36 - 0
ytWGZc/WGZcDog/dogcore.h

@@ -0,0 +1,36 @@
+#ifndef DOGCORE_H
+#define DOGCORE_H
+
+#include <QObject>
+#include <QTimer>
+#include <QDateTime>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonParseError>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+class dogcore : public QObject
+{
+    Q_OBJECT
+public:
+    explicit dogcore(QObject *parent = nullptr);
+    ~dogcore();
+    void start();
+
+signals:
+
+public slots:
+    void time_out();
+//    void finishedSlot(QNetworkReply *reply);
+
+private:
+    QTimer *timer;
+
+    int hour;
+    bool isEqual;
+//    QNetworkAccessManager *netAccessManager;
+};
+
+#endif // DOGCORE_H

+ 22 - 0
ytWGZc/WGZcDog/dogprocessshm.h

@@ -0,0 +1,22 @@
+#ifndef DOGPROCESSSHM_H
+#define DOGPROCESSSHM_H
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/shm.h>
+#include <sys/ipc.h>
+
+#define SHM_PATH "/"
+#define SHM_PORT 5913
+
+#pragma pack(1)
+
+typedef struct {
+    uint time;
+}DogProcessShm;
+
+#pragma pack()
+
+#endif // DOGPROCESSSHM_H

+ 9 - 0
ytWGZc/WGZcDog/dogshm.h

@@ -0,0 +1,9 @@
+#ifndef DOGSHM_H
+#define DOGSHM_H
+
+#include "dogprocessshm.h"
+
+extern DogProcessShm *dogshm;
+
+
+#endif // DOGSHM_H

+ 39 - 0
ytWGZc/WGZcDog/main.cpp

@@ -0,0 +1,39 @@
+#include <QCoreApplication>
+#include "dogcore.h"
+#include "dogshm.h"
+#include <QDir>
+#include <QFile>
+DogProcessShm *dogshm;
+
+
+bool shm_load()
+{
+    int shmid;
+    key_t key;
+    if((key=ftok(SHM_PATH,static_cast<int>(SHM_PORT))) == -1){
+        return false;
+    }
+    if((shmid=shmget(key,sizeof(DogProcessShm),IPC_CREAT|0666)) == -1){
+        return false;
+    }
+    printf("zcdog shmid = %d\n",shmid);
+    dogshm=static_cast<DogProcessShm *>(shmat(shmid,nullptr,0));
+
+    return true;
+}
+
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    if(shm_load()){
+        dogcore *core = new dogcore(nullptr);
+        core->start();
+    }else{
+        fprintf(stderr,"shm load failed\n");
+        exit(1);
+    }
+
+    return a.exec();
+}

+ 5 - 0
ytWGZc/ytWGZc.pro

@@ -0,0 +1,5 @@
+TEMPLATE = subdirs
+
+SUBDIRS += \
+    WGZcDog \
+    ytWGZcCore

+ 656 - 0
ytWGZc/ytWGZc.pro.user

@@ -0,0 +1,656 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE QtCreatorProject>
+<!-- Written by QtCreator 4.7.2, 2022-03-25T14:20:23. -->
+<qtcreator>
+ <data>
+  <variable>EnvironmentId</variable>
+  <value type="QByteArray">{3617412f-ba16-4fe4-83d8-8a9ba84ea18b}</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.ActiveTarget</variable>
+  <value type="int">0</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.EditorSettings</variable>
+  <valuemap type="QVariantMap">
+   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
+   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
+   <value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
+    <value type="QString" key="language">Cpp</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
+    </valuemap>
+   </valuemap>
+   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
+    <value type="QString" key="language">QmlJS</value>
+    <valuemap type="QVariantMap" key="value">
+     <value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
+    </valuemap>
+   </valuemap>
+   <value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
+   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
+   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
+   <value type="int" key="EditorConfiguration.IndentSize">4</value>
+   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
+   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
+   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
+   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
+   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
+   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
+   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
+   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
+   <value type="bool" key="EditorConfiguration.SmartSelectionChanging">true</value>
+   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
+   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
+   <value type="int" key="EditorConfiguration.TabSize">8</value>
+   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
+   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
+   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
+   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
+   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
+   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.PluginSettings</variable>
+  <valuemap type="QVariantMap">
+   <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey"/>
+   <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.0</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.9.7</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 5.9.7</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ba7ab7ec-e6d7-4239-8d06-20d6c39c5b99}</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/yt/Qt/build-ytWGZc-Qt_5_9_7-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/yt/Qt/build-ytWGZc-Qt_5_9_7-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/yt/Qt/build-ytWGZc-Qt_5_9_7-Profile</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">true</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">true</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">WGZcDog</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/yt/Qt/ytWGZc/WGZcDog/WGZcDog.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">WGZcDog/WGZcDog.pro</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/yt/Qt/build-ytWGZc-Qt_5_9_7-Release/WGZcDog</value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">ytWGZcCore</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/yt/Qt/ytWGZc/ytWGZcCore/ytWGZcCore.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">ytWGZcCore/ytWGZcCore.pro</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default">/home/yt/Qt/build-ytWGZc-Qt_5_9_7-Release/ytWGZcCore</value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Target.1</variable>
+  <valuemap type="QVariantMap">
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 4.8.7 (系统)</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Qt 4.8.7 (系统)</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{9b5f04a5-b7cf-4d5a-9d85-78e352ed9ebc}</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/yt/Qt/build-ytWGZc-Qt_4_8_7-Debug</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
+    <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/yt/Qt/build-ytWGZc-Qt_4_8_7-Release</value>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
+      <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
+      <value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
+     </valuemap>
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
+    </valuemap>
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
+     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
+      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+      <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
+      <valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
+       <value type="QString">-w</value>
+       <value type="QString">-r</value>
+      </valuelist>
+      <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
+      <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
+     </valuemap>
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
+    <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
+    <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
+    <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
+    <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+    <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+     <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+     <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
+    </valuemap>
+    <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy Configuration</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">WGZcDog</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/yt/Qt/ytWGZc/WGZcDog/WGZcDog.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">WGZcDog/WGZcDog.pro</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default"></value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
+    <value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
+    <value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
+    <value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
+    <value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
+    <value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">ytWGZcCore</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:/home/yt/Qt/ytWGZc/ytWGZcCore/ytWGZcCore.pro</value>
+    <value type="bool" key="QmakeProjectManager.QmakeRunConfiguration.UseLibrarySearchPath">true</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.CommandLineArguments"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.ProFile">ytWGZcCore/ytWGZcCore.pro</value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory"></value>
+    <value type="QString" key="Qt4ProjectManager.Qt4RunConfiguration.UserWorkingDirectory.default"></value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
+  </valuemap>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.TargetCount</variable>
+  <value type="int">2</value>
+ </data>
+ <data>
+  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
+  <value type="int">18</value>
+ </data>
+ <data>
+  <variable>Version</variable>
+  <value type="int">18</value>
+ </data>
+</qtcreator>

+ 59 - 0
ytWGZc/ytWGZcCore/coreprocessshm.h

@@ -0,0 +1,59 @@
+#ifndef COREPROCESSSHM_H
+#define COREPROCESSSHM_H
+
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/shm.h>
+#include <sys/ipc.h>
+#include <QDate>
+
+#define CORE_PATH "/"
+#define CORE_PORT 5914
+
+#pragma pack(1)
+
+typedef struct {
+    float value;
+}MAJ;
+
+
+typedef  struct {
+    MAJ maj[240]; //每次谐波每天统计产生的实时有效值
+} HARCOL;
+
+typedef struct {
+    HARCOL col[31]; //1-31次谐波
+    int ui_ct; //每天设备上传的每个通道谐波数量
+} HARTYPE;
+
+typedef struct {
+    char deviceCode[25];
+    char measName[50];
+    unsigned int digitalValue;
+    unsigned int soeTime0;
+    unsigned int soeTime1;
+} ALARM;
+
+
+typedef struct {
+    unsigned int siteId;
+    char deviceCode[25];
+    unsigned int deviceType;
+    unsigned int deviceStatus;
+    unsigned char enabled;
+    ALARM alarm[35];
+    HARTYPE har[6]; //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+    QDate harDateShm; //谐波所属日期
+    unsigned int lastCommTime;
+}ZCDev;
+
+typedef struct {
+    ZCDev devs[1024];
+}ZCDevList;
+
+#pragma pack()
+
+
+#endif // COREPROCESSSHM_H

+ 11 - 0
ytWGZc/ytWGZcCore/coreshm.h

@@ -0,0 +1,11 @@
+#ifndef CORESHM_H
+#define CORESHM_H
+
+#include "../WGZcDog/dogprocessshm.h"
+#include "coreprocessshm.h"
+
+extern DogProcessShm *dogshm;
+extern ZCDevList *zcdev;
+
+
+#endif // CORESHM_H

+ 272 - 0
ytWGZc/ytWGZcCore/dbthread.cpp

@@ -0,0 +1,272 @@
+#include "dbthread.h"
+#include "coreshm.h"
+
+//#define HostName "124.70.160.158"
+//#define HostPort 3306
+//#define UserName "root"
+//#define PassWord "Y48hD&Eg"
+//#define DatabaseName "smart_electricity"
+
+//#define HostName "192.168.0.206"
+//#define HostPort 3306
+//#define UserName "root"
+//#define PassWord "Y48hD&Eg"
+//#define DatabaseName "smart_electricity"
+
+#define HostName "101.133.214.75"
+#define HostPort 3306
+#define UserName "usky"
+#define PassWord "Yt#75Usky"
+#define DatabaseName "usky-electricity"
+
+
+static QString digital[33] = {
+    "DI1",
+    "FireAlarm",
+    "EleAlarm",
+    "PhaseLoss",
+    "LoadLive",
+    "LoadBrkState",
+    "OverV",
+    "UnderV",
+    "OverI",
+    "Trip",
+    "BusOutage",
+    "OverIr",
+    "OverT1",
+    "OverT2",
+    "OverT3",
+    "OverT4",
+    "OverEvT",
+    "ArcA",
+    "ArcB",
+    "ArcC",
+    "OverUH",
+    "OverIH",
+    "OverDemandP",
+    "OverDemandS",
+    "MeasFailure",
+    "DevAbnormal",
+    "Mute",
+    "DO1",
+    "DO2",
+    "ResDI1",
+    "ResDI2",
+    "ResDI3",
+    "ResDI4"
+};
+
+
+
+dbThread::dbThread(QObject *parent) : QThread(parent)
+{
+    keep = false;
+    firstTime = true;
+
+    hour = 255;
+    minute = 255;
+
+    sqlList.clear();
+
+    db = QSqlDatabase::addDatabase("QMYSQL","zc_db");
+    db.setHostName(QString(HostName));
+    db.setPort(HostPort);
+    db.setUserName(QString(UserName));
+    db.setPassword(QString(PassWord));
+    db.setDatabaseName(QString(DatabaseName));
+
+}
+
+void dbThread::appendSql(QString sql)
+{
+    sqlList.append(sql);
+}
+
+void dbThread::appendAlarm(AlarmRep rep)
+{
+    alarmRepList.append(rep);
+}
+
+void dbThread::run()
+{
+    keep = true;
+    int count = 0;
+
+    for(int i=0;i<1024;i++){
+        if(firstTime){
+            zcdev->devs[i].harDateShm = QDate::currentDate();
+            for(int j=0;j<6;j++){
+                zcdev->devs[i].har[j].ui_ct = 0;
+            }
+
+        }
+    }
+    firstTime = false;
+
+    while(keep){
+        dogshm->time = QDateTime::currentDateTime().toTime_t();
+        if(count > 9)
+            exit(1);
+
+        if(((QDateTime::currentDateTime().time().minute())%5 == 0) && QDateTime::currentDateTime().time().minute() != minute){
+            minute = QDateTime::currentDateTime().time().minute();
+            if(!db.open()){
+                db.open();
+            }
+            deviceStatus();
+            db.close();
+        }
+
+
+        if((sqlList.length() > 0) || (alarmRepList.length() > 0)){
+            if(!db.open()){
+                count++;
+                db.open();
+            }else{
+                count =0;
+                if(QDateTime::currentDateTime().time().hour() != hour){
+                    hour = QDateTime::currentDateTime().time().hour();
+                    initDb();
+                }
+
+                while(sqlList.length() > 0){
+                    db.exec(sqlList.first());
+                    sqlList.removeFirst();
+                    usleep(10000);
+                }
+
+                while(alarmRepList.length() > 0){
+                    AlarmRep rep = alarmRepList.first();
+                    QString sql = rep.Sql;
+                    QSqlQuery qry = db.exec(sql);
+                    quint64 lastId = qry.lastInsertId().toULongLong()&0xffffffffffffffff;
+                    if(lastId > 0){
+                        emit AlarmReport(rep.DeviceCode,QString("%1").arg(lastId),rep.SoeTime,rep.MeasDesc,rep.DigitalValue,rep.MeasName);
+                    }
+                    alarmRepList.removeFirst();
+                    usleep(10000);
+                }
+            }
+
+        }else{
+            db.close();
+        }
+
+        usleep(20000);
+    }
+}
+
+void dbThread::stop()
+{
+    keep = false;
+}
+
+
+void dbThread::deviceStatus()
+{
+    QDateTime t = QDateTime::currentDateTime();
+
+    for(int i=0;i<1024;i++){
+
+        if((zcdev->devs[i].enabled == 0x01)&&(zcdev->devs[i].deviceType == 6)){
+            QString sqldev = QString("select count(*) from device_status where device_code = '%1';").arg(zcdev->devs[i].deviceCode);
+            QSqlQuery qrydev = db.exec(sqldev);
+            while(qrydev.next()){
+                if(qrydev.value(0).toInt()==0){
+                    db.exec(QString("insert into device_status(id, device_code, device_status, site_id, status_time) values (NULL,'%1',0,'%2','%3');").arg(zcdev->devs[i].deviceCode).arg(zcdev->devs[i].siteId).arg(t.toString("yyyy-MM-dd HH:mm:ss")));
+                }else{
+                    //0 正常, 1 离线, 77 告警, 4 故障
+                    //printf("deviceCode: %s, t.toTime_t(): %d, wgdev->devs[i].LastCommtime: %d, datatime: %s",wgdev->devs[i].deviceCode,t.toTime_t(),wgdev->devs[i].LastCommtime,t.toString("yyyy-MM-dd HH:mm:ss").toUtf8().data());
+                    uint tm = abs(t.toTime_t() - zcdev->devs[i].lastCommTime);
+                    if(tm > 600){
+                        db.exec(QString("update device_status set device_status = 1, status_time = '%1' where device_code = '%2';").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(zcdev->devs[i].deviceCode));
+                    }else{
+                        int number = 0,devabvalue = 0;
+                        for(int j=0;j<33;j++){
+                            if((QString("PhaseLoss")).compare(zcdev->devs[i].alarm[j].measName)==0 || (QString("OverV")).compare(zcdev->devs[i].alarm[j].measName)==0 || (QString("UnderV")).compare(zcdev->devs[i].alarm[j].measName)==0 || (QString("BusOutage")).compare(zcdev->devs[i].alarm[j].measName)==0 || (QString("OverEvT")).compare(zcdev->devs[i].alarm[j].measName)==0 || (QString("DevAbnormal")).compare(zcdev->devs[i].alarm[j].measName)==0){
+
+                                if(zcdev->devs[i].alarm[j].digitalValue == 0){
+                                    number++;
+                                }
+
+                                if((QString("DevAbnormal")).compare(zcdev->devs[i].alarm[j].measName)==0 && zcdev->devs[i].alarm[j].digitalValue == 1){
+                                    devabvalue = 1;
+                                }
+                            }
+                        }
+
+                        if(number == 6){
+                            db.exec(QString("update device_status set device_status = 0, status_time = '%1' where device_code = '%2';").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(zcdev->devs[i].deviceCode));
+                        }else if(devabvalue == 1){
+                            db.exec(QString("update device_status set device_status = 4, status_time = '%1' where device_code = '%2';").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(zcdev->devs[i].deviceCode));
+                        }else{
+                            db.exec(QString("update device_status set device_status = 77, status_time = '%1' where device_code = '%2';").arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(zcdev->devs[i].deviceCode));
+                        }
+                    }
+
+                }
+            }
+            qrydev.clear();
+
+        }
+    }
+
+}
+
+void dbThread::initDb()
+{
+    QString sql = QString("select site_id,device_code,device_type from device where device_type = '6' and enable = 1;");
+    QSqlQuery qry = db.exec(sql);
+
+    int nrow = 0;
+    while(qry.next()){
+        if(nrow>1023){
+            break;
+        }
+
+        zcdev->devs[nrow].siteId = qry.value(0).toUInt();
+        sprintf(zcdev->devs[nrow].deviceCode,"%s",qry.value(1).toString().toUtf8().data());
+        zcdev->devs[nrow].deviceType = qry.value(2).toUInt();
+        zcdev->devs[nrow].enabled = 0x01;
+
+        for(int i=0;i<33;i++){
+            sprintf(zcdev->devs[nrow].alarm[i].deviceCode,"%s",qry.value(1).toString().toUtf8().data());
+            sprintf(zcdev->devs[nrow].alarm[i].measName,"%s",digital[i].toUtf8().data());
+        }
+
+        QString sql1 = QString("select count(*) from rt_switch_data where deviceName = '%1';").arg(qry.value(1).toString());
+        QSqlQuery qry1 = db.exec(sql1);
+        while (qry1.next()) {
+            if(qry1.value(0).toInt() == 0){
+                db.exec(QString("insert into rt_switch_data (id, deviceName, ArcA, ArcB, ArcC, BusOutage, DI1, DI2, DI3, DO1, DO2, DevAbnormal, EleAlarm, FireAlarm, LoadBrkState, LoadLive, MeasFailure, Mute, OverDemandP, OverDemandS, OverEvT, OverI, OverIH, OverIr, OverT1, OverT2, OverT3, OverT4, OverUH, OverV, PhaseLoss, ResDI1, ResDI2, ResDI3, ResDI4, Trip, UnderV, dataTime) values(null,'%1','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','%2');").arg(qry.value(1).toString()).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")));
+            }
+        }
+        qry1.clear();
+
+        QString sql2 = QString("select count(*) from rt_analog_data where deviceName = '%1';").arg(qry.value(1).toString());
+        QSqlQuery qry2 = db.exec(sql2);
+        while (qry2.next()) {
+            if(qry2.value(0).toInt() == 0){
+                printf("qry2.toInt: %d,sql: %s\n",qry2.value(0).toInt(),(QString("insert into rt_analog_data (id, deviceName, Busot, COS, COSa, COSb, COSc, Demand, DevResetTimes, DeviceTemp, Epn, Epn1, Epn2, Epn3, Epn4, Epp, Epp1, Epp2, Epp3, Epp4, Eqn, Eqp, F, I0, I2, IHa, IHb, IHc, Ia, Ib, Ic, Ir, LastDayMD, LastDayMDt, P, Pa, Pb, Pc, Q, Qa, Qb, Qc, SignalIntensity, T1, T2, T3, T4, THDUa, THDUb, THDUc, Ua, Uab, Ub, Ubc, UblU0, UblU2, Uc, Uca, Udt, Ul, Upt, Ust, freezingTime, dataTime) values(null,'%1','0','0.00','0.00','0.00','0.00','0.00','00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0','0.00','0','0','%2','%3');").arg(qry.value(1).toString()).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd")).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss"))).toUtf8().data());
+                db.exec(QString("insert into rt_analog_data (id, deviceName, Busot, COS, COSa, COSb, COSc, Demand, DevResetTimes, DeviceTemp, Epn, Epn1, Epn2, Epn3, Epn4, Epp, Epp1, Epp2, Epp3, Epp4, Eqn, Eqp, F, I0, I2, IHa, IHb, IHc, Ia, Ib, Ic, Ir, LastDayMD, LastDayMDt, P, Pa, Pb, Pc, Q, Qa, Qb, Qc, SignalIntensity, T1, T2, T3, T4, THDUa, THDUb, THDUc, Ua, Uab, Ub, Ubc, UblU0, UblU2, Uc, Uca, Udt, Ul, Upt, Ust, freezingTime, dataTime) values(null,'%1','0','0.00','0.00','0.00','0.00','0.00','00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0.00','0','0.00','0','0','%2','%3');").arg(qry.value(1).toString()).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd")).arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")));
+            }
+        }
+        qry2.clear();
+
+        nrow++;
+    }
+    qry.clear();
+
+    for(int i=nrow;i<1024;i++){
+        zcdev->devs[i].enabled = 0x00;
+    }
+
+}
+
+
+
+
+
+
+
+

+ 60 - 0
ytWGZc/ytWGZcCore/dbthread.h

@@ -0,0 +1,60 @@
+#ifndef DBTHREAD_H
+#define DBTHREAD_H
+
+#include <QThread>
+#include <QDateTime>
+#include <QSqlDatabase>
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QVariant>
+#include <QStringList>
+#include <QtCore>
+
+class AlarmRep{
+public:
+    AlarmRep(QString devicecode="",QString sql="",QString soetime="",QString measdesc="",QString digitalvalue="",QString measname=""){
+        DeviceCode = devicecode;
+        Sql = sql;
+        SoeTime = soetime;
+        MeasDesc = measdesc;
+        DigitalValue = digitalvalue;
+        MeasName = measname;
+    }
+    QString DeviceCode;
+    QString Sql;
+    QString SoeTime;
+    QString MeasDesc;
+    QString DigitalValue;
+    QString MeasName;
+};
+
+
+class dbThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit dbThread(QObject *parent = nullptr);
+    void appendSql(QString sql);
+    void stop();
+    void run();
+    void initDb();
+    void deviceStatus();
+    void appendAlarm(AlarmRep rep);
+
+
+signals:
+    void AlarmReport(QString DeviceCode,QString LastId,QString SoeTime,QString MeasDesc,QString DigitalValue,QString MeasName);
+
+public slots:
+
+private:
+    int hour,minute;
+    QStringList sqlList;
+    QSqlDatabase db;
+    bool keep;
+
+    bool firstTime;
+    QList<AlarmRep>alarmRepList;
+};
+
+#endif // DBTHREAD_H

+ 74 - 0
ytWGZc/ytWGZcCore/logthread.cpp

@@ -0,0 +1,74 @@
+#include "logthread.h"
+
+logThread::logThread(QObject *parent) :
+    QThread(parent)
+{
+    keep = false;
+    dataList.clear();
+    wrongList.clear();
+    printf("logthread init\n");
+
+    QDir dir;
+    if(!dir.exists("/usky/zcdev/log"))
+        system("mkdir -p /usky/zcdev/log");
+
+
+    file = new QFile("/usky/zcdev/log/wgZc-"+QDate::currentDate().toString("yyyyMMdd")+".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("ytWGZc 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("/usky/zcdev/log/wgZc-"+QDate::currentDate().toString("yyyyMMdd")+".log");
+
+                uint l_time = QDateTime::currentDateTime().toTime_t()-7*86400;
+                QDir dir("/usky/zcdev/log");
+                QFileInfoList file_list = dir.entryInfoList(QDir::Files);
+                for(int i=0;i<file_list.size();i++){
+                    QFileInfo f_info = file_list.at(i);
+                    if(f_info.lastModified().toTime_t()<l_time){
+                        QFile(f_info.canonicalFilePath()).remove();
+                    }
+                }
+
+            }
+            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();
+            }
+        }
+        usleep(50000);
+    }
+}

+ 30 - 0
ytWGZc/ytWGZcCore/logthread.h

@@ -0,0 +1,30 @@
+#ifndef LOGTHREAD_H
+#define LOGTHREAD_H
+
+#include <QThread>
+#include <QStringList>
+#include <QDate>
+#include <QDir>
+#include <QFile>
+
+class logThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit logThread(QObject *parent = nullptr);
+    void appendData(QString data);
+    void appendWrongData(QString data);
+    void run();
+    void stop();
+signals:
+
+public slots:
+private:
+    QFile *file,*wfile;
+    QStringList dataList;
+    QStringList wrongList;
+    int day;
+    bool keep;
+};
+
+#endif // LOGTHREAD_H

+ 43 - 0
ytWGZc/ytWGZcCore/main.cpp

@@ -0,0 +1,43 @@
+#include <QCoreApplication>
+#include "coreshm.h"
+#include "zccore.h"
+#include <QFile>
+#include <QDir>
+
+DogProcessShm *dogshm;
+ZCDevList *zcdev;
+
+bool shm_load()
+{
+    int shmid;
+    key_t key;
+    if((key=ftok(SHM_PATH,static_cast<int>(SHM_PORT)))==-1){
+        return false;
+    }
+    if((shmid=shmget(key,sizeof(DogProcessShm),IPC_CREAT|0666))==-1){
+        return false;
+    }
+    dogshm = static_cast<DogProcessShm *>(shmat(shmid,nullptr,0));
+    if((key=ftok(CORE_PATH,static_cast<int>(CORE_PORT)))==-1){
+        return false;
+    }
+    if((shmid=shmget(key,sizeof(ZCDevList),IPC_CREAT|0666))==-1){
+        return false;
+    }
+    printf("zccore shmid = %d\n",shmid);
+    zcdev=static_cast<ZCDevList *>(shmat(shmid,nullptr,0));
+    return true;
+}
+
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+
+    if(shm_load()){
+        ZCCore *core = new ZCCore(nullptr);
+        core->start();
+    }
+
+    return a.exec();
+}

+ 40 - 0
ytWGZc/ytWGZcCore/tcpcore.cpp

@@ -0,0 +1,40 @@
+#include "tcpcore.h"
+
+TcpCore::TcpCore(QObject *parent) : QTcpServer (parent)
+{
+
+}
+
+void TcpCore::start()
+{
+    if(!this->listen(QHostAddress::Any,21831)){
+        exit(1);
+    }
+    printf("listen at 21831\n");
+    emit comLog("TcpCore start listen at 21831");
+}
+
+void TcpCore::incomingConnection(qintptr socketDescriptor)
+{
+    zccomthread = new ZcComThread(socketDescriptor,this);
+    connect(zccomthread,&ZcComThread::comLog,this,&TcpCore::tComLog);
+    connect(zccomthread,&ZcComThread::appendsql,this,&TcpCore::tappendsql);
+    connect(zccomthread,&ZcComThread::appendAlarm,this,&TcpCore::tappendAlarm);
+
+    zccomthread->start();
+}
+
+void TcpCore::tComLog(QString comData)
+{
+    emit comLog(comData);
+}
+
+void TcpCore::tappendsql(QString sql)
+{
+    emit appendsql(sql);
+}
+
+void TcpCore::tappendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName)
+{
+    emit appendAlarm(deviceCode, sql, soetime, mDesc, digitalValue, measName);
+}

+ 33 - 0
ytWGZc/ytWGZcCore/tcpcore.h

@@ -0,0 +1,33 @@
+#ifndef TCPCORE_H
+#define TCPCORE_H
+
+#include <QTcpServer>
+#include <QHostAddress>
+
+#include "zccomthread.h"
+
+class TcpCore : public QTcpServer
+{
+    Q_OBJECT
+public:
+    explicit TcpCore(QObject *parent = nullptr);
+    void start();
+
+signals:
+    void comLog(QString comData);
+    void appendsql(QString sql);
+    void appendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName);
+
+
+public slots:
+    void incomingConnection(qintptr socketDescriptor) override;
+    void tComLog(QString comData);
+    void tappendsql(QString sql);
+    void tappendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName);
+
+
+private:
+    ZcComThread *zccomthread;
+};
+
+#endif // TCPCORE_H

+ 38 - 0
ytWGZc/ytWGZcCore/ytWGZcCore.pro

@@ -0,0 +1,38 @@
+QT -= gui
+QT += network sql
+
+CONFIG += c++11 console
+CONFIG -= app_bundle
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+        main.cpp \
+    zccore.cpp \
+    logthread.cpp \
+    dbthread.cpp \
+    tcpcore.cpp \
+    zccomthread.cpp
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+HEADERS += \
+    coreprocessshm.h \
+    coreshm.h \
+    zccore.h \
+    logthread.h \
+    dbthread.h \
+    tcpcore.h \
+    zccomthread.h

+ 2432 - 0
ytWGZc/ytWGZcCore/zccomthread.cpp

@@ -0,0 +1,2432 @@
+#include "zccomthread.h"
+#include "coreshm.h"
+
+//其中开入2、开入3传默认值0,不在这里展示
+static QString digital[33] = {
+    "DI1",
+    "FireAlarm",
+    "EleAlarm",
+    "PhaseLoss",
+    "LoadLive",
+    "LoadBrkState",
+    "OverV",
+    "UnderV",
+    "OverI",
+    "Trip",
+    "BusOutage",
+    "OverIr",
+    "OverT1",
+    "OverT2",
+    "OverT3",
+    "OverT4",
+    "OverEvT",
+    "ArcA",
+    "ArcB",
+    "ArcC",
+    "OverUH",
+    "OverIH",
+    "OverDemandP",
+    "OverDemandS",
+    "MeasFailure",
+    "DevAbnormal",
+    "Mute",
+    "DO1",
+    "DO2",
+    "ResDI1",
+    "ResDI2",
+    "ResDI3",
+    "ResDI4"
+};
+
+static QString digitalDescTable[33] = {
+    "开关量输入",
+    "火灾预警总",
+    "线路电气故障总",
+    "缺相",
+    "线路带电",
+    "线路开关状态",
+    "过压",
+    "低压",
+    "电流越限",
+    "过流跳闸",
+    "母线停电",
+    "剩余电流越限",
+    "测温点1超温",
+    "测温点2超温",
+    "测温点3超温",
+    "测温点4超温",
+    "环境温度越限",
+    "A相燃弧",
+    "B相燃弧",
+    "C相燃弧",
+    "电压谐波越限",
+    "电流谐波越限",
+    "有功需量超限",
+    "视在需量超限",
+    "测量通道故障",
+    "设备异常",
+    "消音",
+    "开出1",
+    "开出2",
+    "备用遥信1",
+    "备用遥信2",
+    "备用遥信3",
+    "备用遥信4"
+};
+
+static QString analogInfo[60] = {
+    "Ua",
+    "Ub",
+    "Uc",
+    "Ul",
+    "Ia",
+    "Ib",
+    "Ic",
+    "Ir",
+    "T1",
+    "T2",
+    "T3",
+    "T4",
+    "F",
+    "Uab",
+    "Ubc",
+    "Uca",
+    "Pa",
+    "Qa",
+    "COSa",
+    "Pb",
+    "Qb",
+    "COSb",
+    "Pc",
+    "Qc",
+    "COSc",
+    "P",
+    "Q",
+    "COS",
+    "Demand",
+    "LastDayMD",
+    "LastDayMDt",
+    "I2",
+    "",
+    "UblU2",
+    "UblU0",
+    "THDUa",
+    "THDUb",
+    "THDUc",
+    "IHa",
+    "IHb",
+    "IHc",
+    "DeviceTemp",
+    "SignalIntensity",
+    "Upt",
+    "Udt",
+    "Ust",
+    "Busot",
+    "DevResetTimes",
+    "Epp",
+    "Epn",
+    "Eqp",
+    "Eqn",
+    "Epp1",
+    "Epn1",
+    "Epp2",
+    "Epn2",
+    "Epp3",
+    "Epn3",
+    "Epp4",
+    "Epn4"
+};
+
+static QString average[31] = {
+    "avg1",
+    "avg2",
+    "avg3",
+    "avg4",
+    "avg5",
+    "avg6",
+    "avg7",
+    "avg8",
+    "avg9",
+    "avg10",
+    "avg11",
+    "avg12",
+    "avg13",
+    "avg14",
+    "avg15",
+    "avg16",
+    "avg17",
+    "avg18",
+    "avg19",
+    "avg20",
+    "avg21",
+    "avg22",
+    "avg23",
+    "avg24",
+    "avg25",
+    "avg26",
+    "avg27",
+    "avg28",
+    "avg29",
+    "avg30",
+    "avg31"
+};
+
+static QString maxinfo[31] = {
+    "max1",
+    "max2",
+    "max3",
+    "max4",
+    "max5",
+    "max6",
+    "max7",
+    "max8",
+    "max9",
+    "max10",
+    "max11",
+    "max12",
+    "max13",
+    "max14",
+    "max15",
+    "max16",
+    "max17",
+    "max18",
+    "max19",
+    "max20",
+    "max21",
+    "max22",
+    "max23",
+    "max24",
+    "max25",
+    "max26",
+    "max27",
+    "max28",
+    "max29",
+    "max30",
+    "max31"
+};
+
+static QString maxtimeinfo[31]={
+    "maxTime1",
+    "maxTime2",
+    "maxTime3",
+    "maxTime4",
+    "maxTime5",
+    "maxTime6",
+    "maxTime7",
+    "maxTime8",
+    "maxTime9",
+    "maxTime10",
+    "maxTime11",
+    "maxTime12",
+    "maxTime13",
+    "maxTime14",
+    "maxTime15",
+    "maxTime16",
+    "maxTime17",
+    "maxTime18",
+    "maxTime19",
+    "maxTime20",
+    "maxTime21",
+    "maxTime22",
+    "maxTime23",
+    "maxTime24",
+    "maxTime25",
+    "maxTime26",
+    "maxTime27",
+    "maxTime28",
+    "maxTime29",
+    "maxTime30",
+    "maxTime31"
+};
+
+
+
+static QString majinfo[31] ={
+    "maj1",
+    "maj2",
+    "maj3",
+    "maj4",
+    "maj5",
+    "maj6",
+    "maj7",
+    "maj8",
+    "maj9",
+    "maj10",
+    "maj11",
+    "maj12",
+    "maj13",
+    "maj14",
+    "maj15",
+    "maj16",
+    "maj17",
+    "maj18",
+    "maj19",
+    "maj20",
+    "maj21",
+    "maj22",
+    "maj23",
+    "maj24",
+    "maj25",
+    "maj26",
+    "maj27",
+    "maj28",
+    "maj29",
+    "maj30",
+    "maj31"
+};
+
+
+
+ZcComThread::ZcComThread(qintptr socketDescriptor,QObject *parent) : QThread(parent)
+{
+    getdata = false;
+    c_start = 0;
+    c_end = 0;
+
+    day = 255;
+    count = 0;
+    groupNum = 0;
+    stat_count = 0;
+
+    harDate = (QDate::currentDate());
+    ua_count =0;
+    ub_count =0;
+    uc_count = 0;
+    ia_count = 0;
+    ib_count = 0;
+    ic_count = 0;
+
+
+    dataTotal.clear();
+
+    idx =0;
+    keep = false;
+    this->socketDescriptor = socketDescriptor;
+
+
+}
+
+
+
+void ZcComThread::run()
+{
+
+    QTcpSocket *so = new QTcpSocket;
+
+    if(!so->setSocketDescriptor(this->socketDescriptor)){
+        so->abort();
+        return;
+    }
+
+    keep = true;
+    err_count = 0;
+    while (keep) {
+        if(so->state() != QTcpSocket::ConnectedState){
+            close_self(so);
+            return ;
+        }
+        if(so->waitForReadyRead()){
+            err_count++;
+            readdata(so);
+        }
+        if(err_count > 6){
+            close_self(so);
+            return ;
+        }
+    }
+    so->abort();
+}
+
+void ZcComThread::close_self(QTcpSocket *so)
+{
+    so->abort();
+    keep = false;
+}
+
+void ZcComThread::stop()
+{
+    keep = false;
+}
+
+
+int ZcComThread::getHead(QByteArray data)
+{
+    for(int i=0;i<data.length();i++){
+        if((data.at(i)&0xff) == 0x40){
+            if(i < (data.length()-1)){
+                if((data.at(i+1)&0xff) == 0x40){
+                    return i;
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+int ZcComThread::gettail(QByteArray data)
+{
+    for(int i=0;i<data.length();i++){
+        if((data.at(i)&0xff) == 0x23){
+            if(i < (data.length()-1)){
+                if((data.at(i+1)&0xff) == 0x23){
+                    return i;
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+
+void ZcComThread::readdata(QTcpSocket *so)
+{
+    dataTotal.append(so->readAll());
+
+    QString comData="";
+    for(int i=0;i<dataTotal.length();i++){
+        comData.append(QString("%1").arg(dataTotal.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit comLog(QString("[%1] %2").arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")).arg(comData));
+
+    for(int i=0;i<11;i++){
+        if((dataTotal.length() > 0)&&(!getdata)){
+            c_start = getHead(dataTotal);
+            c_end = gettail(dataTotal);
+
+            if((c_start > -1)&&(c_end>c_start)){
+                quint16 len = static_cast<quint16>(((dataTotal.at(c_start+27)&0x00ff)<<8)|(dataTotal.at(c_start+26)&0x00ff));
+                if(c_end != (c_start+27+len+3))
+                    c_end = (c_start+27+len+3);
+
+                QByteArray data = dataTotal.mid(c_start,(c_end-c_start+2));
+                dataTotal.remove(c_start,(c_end-c_start+2));
+                this->dealdata(so,data);
+            }
+        }
+    }
+
+}
+
+
+void ZcComThread::dealdata(QTcpSocket *so,QByteArray data)
+{
+    getdata = true;
+
+    QString comData="",sql="" ;
+
+    QString t = (QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss");
+    int yy = (QDateTime::currentDateTime().date().year())/100;
+
+    for(int i=0;i<data.length();i++){
+        comData.append(QString(" %1").arg(data.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit comLog(QString("[%1] %2").arg((QDateTime::currentDateTime()).toString("yyyy-MM-dd HH:mm:ss")).arg(comData));
+
+    QString column,valueData,setValue;
+    QByteArray Dat = data.mid(2,(data.length()-5));
+    quint8 crc = sumCrc(Dat,static_cast<int>(Dat.length()));
+    printf("crc = %x\n",crc&0xff);
+    if((crc&0xff)==(data.at(data.length()-3)&0xff)){
+        zcdev->devs[idx].lastCommTime = QDateTime::currentDateTime().toTime_t() ;
+
+        if(day != QDate::currentDate().day()){
+            day = QDate::currentDate().day();
+            rtn1 = mk_time_rtn(data);
+            so->write(rtn1);
+            rtn1.clear();
+            so->flush();
+            msleep(200);
+
+
+            zcdev->devs[idx].harDateShm = QDate::currentDate();
+
+        }
+
+        if((data.at(22)&0xff)==0x01){//心跳  4.1 心跳 默认30s 40 40 03 01   01 29 09 01 03 16   01 01 88 88 80 00 00 00 77 77 FF FF   01   03 2A 01  00 00 D7 23 23
+            err_count = 0;
+            rtn1 = mk_login_rtn(data);
+            so->write(rtn1);
+            rtn1.clear();
+
+            so->flush();
+            msleep(200);
+        }else if((data.at(22)&0xff)==0x02){//数据上传 处理所有02上传数据的同时也要处理06的(第一次上传没有接收到服务器应答就开始重传了)
+            err_count = 0;
+            switch (data.at(28)&0xff) {
+            case 0x11:
+            {
+                //数据报文产生的时间
+                QString date = QString("%1-%2-%3").arg(data.at(283)&0xff,2,10,QChar('0')).arg(data.at(282)&0xff,2,10,QChar('0')).arg(data.at(281)&0xff,2,10,QChar('0'));
+                QString datetime = QString("%1-%2-%3 %4:%5:%6").arg(data.at(283)&0xff,2,10,QChar('0')).arg(data.at(282)&0xff,2,10,QChar('0')).arg(data.at(281)&0xff,2,10,QChar('0')).arg(data.at(280)&0xff,2,10,QChar('0')).arg(data.at(279)&0xff,2,10,QChar('0')).arg(data.at(278)&0xff,2,10,QChar('0'));
+                //printf("datetime [%s]\n",datetime.toUtf8().data());
+
+                //遥信
+                quint8 devicestatus1 = static_cast<quint8>(data.at(33)&0xff);
+                quint8 devicestatus2 = static_cast<quint8>(data.at(34)&0xff);
+                quint8 devicestatus3 = static_cast<quint8>(data.at(35)&0xff);
+                quint8 devicestatus4 = static_cast<quint8>(data.at(36)&0xff);
+                quint8 devicestatus5 = static_cast<quint8>(data.at(37)&0xff);
+                QString alarm1 = QString("%1").arg(devicestatus1,8,2,QChar('0'));
+                QString alarm2 = QString("%1").arg(devicestatus2,8,2,QChar('0'));
+                QString alarm3 = QString("%1").arg(devicestatus3,8,2,QChar('0'));
+                QString alarm4 = QString("%1").arg(devicestatus4,8,2,QChar('0'));
+                QString alarm5 = QString("%1").arg(devicestatus5,8,2,QChar('0'));
+                QString alarm = QString("%1%2%3%4%5").arg(alarm1).arg(alarm2).arg(alarm3).arg(alarm4).arg(alarm5);
+                //printf("alarm [%s]\n",alarm.toUtf8().data());
+
+                int m =1,k =0,count=0;
+                for(int i=0;i<33;i++){
+
+                    column.append(QString("%1,").arg(digital[i]));
+                    valueData.append(QString("%1,").arg(alarm.mid(k,1)));
+                    setValue.append(QString("%1=%2,").arg(digital[i]).arg(alarm.mid(k,1)));
+                    zcdev->devs[idx].alarm[i].digitalValue = (alarm.mid(k,1)).toUInt();
+                    k++;
+
+                }
+
+                //printf("setValue [%s]\n",setValue.toUtf8().data());
+                QString tmp1 = QString("[%1] switch data [%2] [%3]").arg(datetime).arg(alarm).arg(setValue);
+                emit comLog(tmp1);
+
+                sql.append(QString("insert into ht_switch_data(id,deviceName,DI2,DI3,%1dataTime) values(NULL,'%2',0,0,%3'%4');").arg(column).arg(deviceid).arg(valueData).arg(datetime));
+                //printf("ht_switch_data sql: %s\n",sql.toUtf8().data());
+                emit appendsql(sql);
+                sql.clear();
+                column.clear();
+                valueData.clear();
+
+                sql.append(QString("update rt_switch_data set %1dataTime='%2' where deviceName = '%3'").arg(setValue).arg(datetime).arg(deviceid));
+                emit appendsql(sql);
+                sql.clear();
+                setValue.clear();
+
+                //遥测
+                int start = 38;
+                QString str = "";
+                for(int j=0;j<60;j++){
+
+                    if(j==7){//剩余电流(漏电流 mA)
+                        quint16 I = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(I));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(I));
+
+                        start += 2;
+                    }else if(j==30){ //"昨日 Pmax 发生时间" - "yyMMddHHmmss"
+                        str.append(QString("%1%2%3%4%5%6").arg(data.at(start)&0xff,2,10,QChar('0')).arg(data.at(start+1)&0xff,2,10,QChar('0')).arg(data.at(start+2)&0xff,2,10,QChar('0')).arg(data.at(start+3)&0xff,2,10,QChar('0')).arg(data.at(start+4)&0xff,2,10,QChar('0')).arg(data.at(start+5)&0xff,2,10,QChar('0')));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(str));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(str));
+
+                        str.clear();
+                        start += 6;
+                    }else if(j==32){
+                        //庄城的“零序电压”忽略不保存,183的“零序电流”写入默认值0.00
+                        str.clear();
+                        start += 4;
+                    }else if((j==42)||(j==43)||(j==44)||(j==45)||(j==46)||(j==47)) {
+                        //设备信号强度、电压暂升次数(次)、电压暂降次数(次)、电压中断次数(次)、母线停电次数(次)、设备复位次数(次)
+                        quint32 v = static_cast<quint32>(((data.at(start)&0x000000ff)<<24)|((data.at(start+1)&0x000000ff)<<16)|((data.at(start+2)&0x000000ff)<<8)|(data.at(start+3)&0x000000ff));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(v));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(v));
+
+                        start += 4;
+                    }else{
+                        //4位十六进制转浮点数
+                        quint32 hex = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float value = *(float*)&hex;
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(value));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(value));
+
+                        str.clear();
+                        start += 4;
+                    }
+                }
+
+                //printf("setValue [%s]\n",setValue.toUtf8().data());
+                QString tmp2 = QString("[%1] analog data [%2]").arg(datetime).arg(setValue);
+                emit comLog(tmp2);
+
+                sql.append(QString("insert into ht_analog_data(id,deviceName,I0,%1freezingTime,dataTime) values(NULL,'%2',0.00,%3'%4','%5');").arg(column).arg(deviceid).arg(valueData).arg(date).arg(datetime));
+                //printf("ht_analog_data sql: %s\n",sql.toUtf8().data());
+                emit appendsql(sql);
+                sql.clear();
+                column.clear();
+                valueData.clear();
+
+                sql.append(QString("update rt_analog_data set %1freezingTime = '%2',dataTime='%3' where deviceName = '%4';").arg(setValue).arg(date).arg(datetime).arg(deviceid));
+                emit appendsql(sql);
+                sql.clear();
+                setValue.clear();
+
+                rtn1 = mk_login_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+            }
+                break;
+            case 0x12:
+            {
+                //SOE 数据报文产生的时间
+                QString datetime = QString("%1-%2-%3 %4:%5:%6").arg(data.at(43)&0xff,2,10,QChar('0')).arg(data.at(42)&0xff,2,10,QChar('0')).arg(data.at(41)&0xff,2,10,QChar('0')).arg(data.at(40)&0xff,2,10,QChar('0')).arg(data.at(39)&0xff,2,10,QChar('0')).arg(data.at(38)&0xff,2,10,QChar('0'));
+
+                quint8 devicestatus1 = static_cast<quint8>(data.at(33)&0xff);
+                quint8 devicestatus2 = static_cast<quint8>(data.at(34)&0xff);
+                quint8 devicestatus3 = static_cast<quint8>(data.at(35)&0xff);
+                quint8 devicestatus4 = static_cast<quint8>(data.at(36)&0xff);
+                quint8 devicestatus5 = static_cast<quint8>(data.at(37)&0xff);
+                QString alarm1 = QString("%1").arg(devicestatus1,8,2,QChar('0'));
+                QString alarm2 = QString("%1").arg(devicestatus2,8,2,QChar('0'));
+                QString alarm3 = QString("%1").arg(devicestatus3,8,2,QChar('0'));
+                QString alarm4 = QString("%1").arg(devicestatus4,8,2,QChar('0'));
+                QString alarm5 = QString("%1").arg(devicestatus5,8,2,QChar('0'));
+                QString alarm = QString("%1%2%3%4%5").arg(alarm1).arg(alarm2).arg(alarm3).arg(alarm4).arg(alarm5);
+
+                QString tmp3 = QString("[%1] SOE data [%2]").arg(datetime).arg(alarm);
+                emit comLog(tmp3);
+
+                int m =1,k =0,count=0;
+                for(int i=0;i<33;i++){
+
+                    //以每个开关量的首报为状态变化的判断标准
+                    uint digitalValue = (alarm.mid(k,1)).toUInt();
+                    QString mDesc = "";
+                    if(digitalValue != zcdev->devs[idx].alarm[i].digitalValue){
+                        if(digitalValue == 1){
+                            mDesc.append(digitalDescTable[i]).append("动作");
+
+                            zcdev->devs[idx].alarm[i].digitalValue = digitalValue;
+                            sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',0);").arg(deviceid).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital[i]).arg(digitalValue).arg(mDesc).arg(datetime));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+                        }else{
+                            mDesc.append(digitalDescTable[i]).append("复归");
+
+                            zcdev->devs[idx].alarm[i].digitalValue = digitalValue;
+                            sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',2);").arg(deviceid).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital[i]).arg(digitalValue).arg(mDesc).arg(datetime));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+
+                            sql.append(QString("update alarm_power set handling_time = '%1',handling_status = 3 where device_code = '%2' and meas_name = '%3' and digital_value = 1 and handling_status = 0;").arg(datetime).arg(deviceid).arg(digital[i]));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+                        }
+                    }
+                    k++;
+                }
+                rtn1 = mk_soe_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+
+                so->flush();
+                msleep(200);
+
+
+            }
+                break;
+            case 0x15:
+            {
+                switch (data.at(32)&0xff) {
+                case 0x00: //实时数值
+                {
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harData = "";
+                    for(int i=1;i<32;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harData.append(QString(",%1").arg(f/10));
+                        start += 4;
+
+                        if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                            if(i == 1)
+                                (zcdev->devs[idx].har[0].ui_ct)++;
+                            zcdev->devs[idx].har[0].col[i-1].maj[(zcdev->devs[idx].har[0].ui_ct)-1].value = f/10;
+                        }else if(psgType == 1){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[1].ui_ct)++;
+                            zcdev->devs[idx].har[1].col[i-1].maj[(zcdev->devs[idx].har[1].ui_ct)-1].value = f/10;
+                        }else if(psgType == 2){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[2].ui_ct)++;
+                            zcdev->devs[idx].har[2].col[i-1].maj[(zcdev->devs[idx].har[2].ui_ct)-1].value = f/10;
+                        }else if(psgType == 3){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[3].ui_ct)++;
+                            zcdev->devs[idx].har[3].col[i-1].maj[(zcdev->devs[idx].har[3].ui_ct)-1].value = f/10;
+                        }else if(psgType == 4){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[4].ui_ct)++;
+                            zcdev->devs[idx].har[4].col[i-1].maj[(zcdev->devs[idx].har[4].ui_ct)-1].value = f/10;
+                        }else if(psgType == 5){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[5].ui_ct)++;
+                            zcdev->devs[idx].har[5].col[i-1].maj[(zcdev->devs[idx].har[5].ui_ct)-1].value = f/10;
+                        }
+                    }
+
+                    sql.append(QString("insert into wave_har_data values (NULL,'%1',%2,%3%4,'%5','%6');").arg(deviceid).arg(0).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                    emit appendsql(sql);
+                    emit comLog(sql);
+                    sql.clear();
+                    harData.clear();
+
+                    rtn1 = mk_har_request(data,3);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+                }
+                    break;
+                case 0x01: //谐波含量
+                {
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harData = "";
+                    for(int i=1;i<32;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harData.append(QString(",%1").arg(f/100));
+                        start += 4;
+                    }
+
+                    sql.append(QString("insert into wave_har_data values (NULL,'%1',%2,%3%4,'%5','%6');").arg(deviceid).arg(1).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                    emit appendsql(sql);
+                    sql.clear();
+                    harData.clear();
+
+                    rtn1 = mk_har_request(data,2);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+
+                }
+                    break;
+                case 0x02: //日平均数值
+                {
+                    stat_count++;
+
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+                    QString tmptime = QString("%1%2-%3-%4").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harcolumn,harData,setHarValue;
+                    for(int i=0;i<31;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harcolumn.append(QString("%1,").arg(average[i]));
+                        harData.append(QString("%1,").arg(f/10));
+                        setHarValue.append(QString("%1=%2,").arg(average[i]).arg(f/10));
+
+                        start += 4;
+                    }
+
+                    if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                        if(ua_count == 0){
+                            ua_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 1){
+                        if(ub_count == 0){
+                            ub_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 2){
+                        if(uc_count == 0){
+                            uc_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 3){
+                        if(ia_count == 0){
+                            ia_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 4){
+                        if(ib_count == 0){
+                            ib_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 5){
+                        if(ic_count == 0){
+                            ic_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }
+                    sql.clear();
+                    harcolumn.clear();
+                    harData.clear();
+                    setHarValue.clear();
+
+                    rtn1 = mk_har_request(data,0);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+
+                    if(stat_count == 12){
+                        //统计计算前一天每个通道每次谐波的%95值
+                        QString setMajValue = "";
+
+                        //对每个通道的每组谐波数据进行排序 从小到大
+                        this->maj_sort(0,zcdev->devs[idx].har[0].ui_ct);
+                        this->maj_sort(1,zcdev->devs[idx].har[1].ui_ct);
+                        this->maj_sort(2,zcdev->devs[idx].har[2].ui_ct);
+                        this->maj_sort(3,zcdev->devs[idx].har[3].ui_ct);
+                        this->maj_sort(4,zcdev->devs[idx].har[4].ui_ct);
+                        this->maj_sort(5,zcdev->devs[idx].har[5].ui_ct);
+
+                        //A相电压谐波
+                        int s = static_cast<int>((zcdev->devs[idx].har[0].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[0].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 0 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //B相电压谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[1].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[1].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 1 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //C相电压谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[2].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[2].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 2 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //A相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[3].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[3].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 3 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //B相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[4].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[4].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 4 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //C相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[5].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[5].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 5 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+
+                        stat_count = 0;
+                        if(tmptime.compare(harDate.toString("yyyy-MM-dd")) != 0){
+                            harDate = harDate.addDays(1);
+                        }
+                        ua_count = 0;
+                        ub_count = 0;
+                        uc_count = 0;
+                        ia_count = 0;
+                        ib_count = 0;
+                        ic_count = 0;
+
+                        zcdev->devs[idx].har[0].ui_ct = 0;
+                        zcdev->devs[idx].har[1].ui_ct = 0;
+                        zcdev->devs[idx].har[2].ui_ct = 0;
+                        zcdev->devs[idx].har[3].ui_ct = 0;
+                        zcdev->devs[idx].har[4].ui_ct = 0;
+                        zcdev->devs[idx].har[5].ui_ct = 0;
+                    }
+
+                }
+                    break;
+                default:
+                    break;
+                }
+            }
+                break;
+            case 0x16: //日最大值
+            {
+                stat_count++;
+
+                int psgType = data.at(33)&0xff;
+                QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(256)&0xff,2,10,QChar('0')).arg(data.at(255)&0xff,2,10,QChar('0')).arg(data.at(254)&0xff,2,10,QChar('0')).arg(data.at(253)&0xff,2,10,QChar('0')).arg(data.at(252)&0xff,2,10,QChar('0')).arg(data.at(251)&0xff,2,10,QChar('0'));
+                QString tmptime = QString("%1%2-%3-%4").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0'));
+
+                int start = 34;
+                QString harcolumn,harData,setHarValue;
+                for(int i=0;i<31;i++){
+                    quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                    float f = *(float*)&h;
+
+                    QString maxtime = QString("%1 %2:%3:%4").arg(harDate.toString("yyyy-MM-dd")).arg(data.at(start+4)&0xff,2,10,QChar('0')).arg(data.at(start+5)&0xff,2,10,QChar('0')).arg(data.at(start+6)&0xff,2,10,QChar('0'));
+
+                    harcolumn.append(QString("%1,%2,").arg(maxinfo[i]).arg(maxtimeinfo[i]));
+                    harData.append(QString("%1,'%2',").arg(f/10).arg(maxtime));
+                    setHarValue.append(QString("%1=%2,%3='%4',").arg(maxinfo[i]).arg(f/10).arg(maxtimeinfo[i]).arg(maxtime));
+
+                    start += 7;
+                }
+
+                if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                    if(ua_count == 0){
+                        ua_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 1){
+                    if(ub_count == 0){
+                        ub_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 2){
+                    if(uc_count == 0){
+                        uc_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 3){
+                    if(ia_count == 0){
+                        ia_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 4){
+                    if(ib_count == 0){
+                        ib_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 5){
+                    if(ic_count == 0){
+                        ic_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }
+                emit comLog(sql);
+                sql.clear();
+                harcolumn.clear();
+                harData.clear();
+                setHarValue.clear();
+
+                rtn1 = mk_har_request(data,1);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+
+                if(stat_count == 12){
+                    //统计计算前一天每个通道每次谐波的%95值
+                    QString setMajValue = "";
+
+                    //对每个通道的每组谐波数据进行排序 从小到大
+                    this->maj_sort(0,zcdev->devs[idx].har[0].ui_ct);
+                    this->maj_sort(1,zcdev->devs[idx].har[1].ui_ct);
+                    this->maj_sort(2,zcdev->devs[idx].har[2].ui_ct);
+                    this->maj_sort(3,zcdev->devs[idx].har[3].ui_ct);
+                    this->maj_sort(4,zcdev->devs[idx].har[4].ui_ct);
+                    this->maj_sort(5,zcdev->devs[idx].har[5].ui_ct);
+
+                    //A相电压谐波
+                    int s = static_cast<int>((zcdev->devs[idx].har[0].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[0].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 0 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //B相电压谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[1].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[1].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 1 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //C相电压谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[2].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[2].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 2 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //A相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[3].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[3].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 3 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //B相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[4].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[4].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 4 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //C相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[5].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[5].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 5 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+
+                    stat_count = 0;
+                    if(tmptime.compare(harDate.toString("yyyy-MM-dd")) != 0){
+                        harDate = harDate.addDays(1);
+                    }
+                    ua_count = 0;
+                    ub_count = 0;
+                    uc_count = 0;
+                    ia_count = 0;
+                    ib_count = 0;
+                    ic_count = 0;
+
+                    zcdev->devs[idx].har[0].ui_ct = 0;
+                    zcdev->devs[idx].har[1].ui_ct = 0;
+                    zcdev->devs[idx].har[2].ui_ct = 0;
+                    zcdev->devs[idx].har[3].ui_ct = 0;
+                    zcdev->devs[idx].har[4].ui_ct = 0;
+                    zcdev->devs[idx].har[5].ui_ct = 0;
+                }
+            }
+                break;
+            case 0x18://故障录波
+            {
+                //页号
+                int n = (QString("%1").arg(data.at(33)&0xff,2,10)).toInt();
+                printf("n = %d\n",n);
+                int start = 34;
+                //故障录波发生时间
+                QString waveTime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(199)&0xff,2,10,QChar('0')).arg(data.at(198)&0xff,2,10,QChar('0')).arg(data.at(197)&0xff,2,10,QChar('0')).arg(data.at(196)&0xff,2,10,QChar('0')).arg(data.at(195)&0xff,2,10,QChar('0')).arg(data.at(194)&0xff,2,10,QChar('0'));
+                //发送时间
+                QString sendTime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(205)&0xff,2,10,QChar('0')).arg(data.at(204)&0xff,2,10,QChar('0')).arg(data.at(203)&0xff,2,10,QChar('0')).arg(data.at(202)&0xff,2,10,QChar('0')).arg(data.at(201)&0xff,2,10,QChar('0')).arg(data.at(200)&0xff,2,10,QChar('0'));
+
+
+                if(n == 7){
+                    for(int i=0;i<10;i++){
+                        groupNum++;
+                        //2位十六进制转浮点数
+                        //UA UB UC IA IB IC IR
+                        quint16 hex = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+                        float ua = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+2)&0x00ff)<<8)|(data.at(start+3)&0x00ff));
+                        float ub = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+4)&0x00ff)<<8)|(data.at(start+5)&0x00ff));
+                        float uc = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+6)&0x00ff)<<8)|(data.at(start+7)&0x00ff));
+                        float ia = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+8)&0x00ff)<<8)|(data.at(start+9)&0x00ff));
+                        float ib = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+10)&0x00ff)<<8)|(data.at(start+11)&0x00ff));
+                        float ic = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+12)&0x00ff)<<8)|(data.at(start+13)&0x00ff));
+                        float ir = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat());
+                        //BIT15:开入1 BIT14:火灾预警总 BIT13:线路电气故障总 BIT12:缺相 BIT11:过压 BIT10:欠压 BIT9:电流越限 BIT8:过流跳闸 BIT7:剩余电流越限 BIT6:T1超温 BIT5:T2超温 BIT4:T3超温 BIT3:T4超温 BIT2:环境温度超温 BIT1-0:预留
+                        hex = static_cast<quint16>(((data.at(start+14)&0x00ff)<<8)|(data.at(start+15)&0x00ff));
+                        QString str = QString("%1").arg(hex,16,2,QChar('0'));
+                        QString temp = QString("[%1] wave record [ua:%2 ub:%3 uc:%4 ia:%5 ib:%6 ic:%7 ir:%8 [%9]]").arg(t).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(str);
+                        emit comLog(temp);
+                        QString L = "";
+                        for(int j=0;j<16;j++){
+                            L.append(QString(",%1").arg(str.mid(j,1)));
+                        }
+
+                        if(i == 9){
+                            sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12');").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        }else{
+                            sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12'),").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        }
+
+                        start += 16;
+                    }
+                    sql.append(QString("insert into wave_record_data values %1").arg(sqldata));
+                    emit appendsql(sql);
+                    emit comLog(sql);
+                    sql.clear();
+
+                    sqldata.clear();
+                    groupNum = 0;
+
+                    rtn1 = mk_wave_request(data,2);
+                    so->write(rtn1);
+                    rtn1.clear();
+
+                }else{
+                    for(int i=0;i<10;i++){
+                        groupNum++;
+                        //2位十六进制转浮点数
+                        //UA UB UC IA IB IC IR
+                        quint16 hex = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+                        float ua = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+2)&0x00ff)<<8)|(data.at(start+3)&0x00ff));
+                        float ub = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+4)&0x00ff)<<8)|(data.at(start+5)&0x00ff));
+                        float uc = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+6)&0x00ff)<<8)|(data.at(start+7)&0x00ff));
+                        float ia = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+8)&0x00ff)<<8)|(data.at(start+9)&0x00ff));
+                        float ib = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+10)&0x00ff)<<8)|(data.at(start+11)&0x00ff));
+                        float ic = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+12)&0x00ff)<<8)|(data.at(start+13)&0x00ff));
+                        float ir = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat());
+                        //BIT15:开入1 BIT14:火灾预警总 BIT13:线路电气故障总 BIT12:缺相 BIT11:过压 BIT10:欠压 BIT9:电流越限 BIT8:过流跳闸 BIT7:剩余电流越限 BIT6:T1超温 BIT5:T2超温 BIT4:T3超温 BIT3:T4超温 BIT2:环境温度超温 BIT1-0:预留
+                        hex = static_cast<quint16>(((data.at(start+14)&0x00ff)<<8)|(data.at(start+15)&0x00ff));
+                        QString str = QString("%1").arg(hex,16,2,QChar('0'));
+                        QString temp = QString("[%1] wave record [ua:%2 ub:%3 uc:%4 ia:%5 ib:%6 ic:%7 ir:%8 [%9]]").arg(t).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(str);
+                        emit comLog(temp);
+                        QString L = "";
+                        for(int j=0;j<16;j++){
+                            L.append(QString(",%1").arg(str.mid(j,1)));
+                        }
+
+                        sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12'),").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        start += 16;
+                    }
+
+                }
+            }
+                break;
+            default:
+            {
+                rtn1 = mk_login_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+            }
+                break;
+
+            }
+
+        }else if((data.at(22)&0xff)==0x04){//登录
+            err_count = 0;
+            deviceid.clear();
+            for(int i=12;i<20;i++){
+                deviceid.append(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0')));
+            }
+
+            printf("deviceid: %s\n",deviceid.toUtf8().data());
+            emit comLog(QString("deviceid: %1").arg(deviceid));
+
+            for(int i=0;i<1024;i++){
+                if(zcdev->devs[i].enabled == 0x01){
+                    if(deviceid.compare(zcdev->devs[i].deviceCode)==0){
+                        idx = i;
+                        break;
+                    }
+                }
+            }
+
+            rtn1 = mk_login_rtn(data);
+            so->write(rtn1);
+            rtn1.clear();
+            so->flush();
+            msleep(200);
+
+            if((zcdev->devs[idx].harDateShm) != (QDate::currentDate())){//设备隔天没有登录的情况,初始化计数值
+
+                for(int i=0;i<6;i++){
+                    zcdev->devs[idx].har[i].ui_ct = 0;
+                }
+
+                zcdev->devs[idx].harDateShm = (QDate::currentDate());
+            }
+
+        }else if((data.at(22)&0xff)==0x06){//补发
+            err_count = 0;
+            switch (data.at(28)&0xff) {
+            case 0x11:
+            {
+                //数据报文产生的时间
+                QString date = QString("%1-%2-%3").arg(data.at(283)&0xff,2,10,QChar('0')).arg(data.at(282)&0xff,2,10,QChar('0')).arg(data.at(281)&0xff,2,10,QChar('0'));
+                QString datetime = QString("%1-%2-%3 %4:%5:%6").arg(data.at(283)&0xff,2,10,QChar('0')).arg(data.at(282)&0xff,2,10,QChar('0')).arg(data.at(281)&0xff,2,10,QChar('0')).arg(data.at(280)&0xff,2,10,QChar('0')).arg(data.at(279)&0xff,2,10,QChar('0')).arg(data.at(278)&0xff,2,10,QChar('0'));
+                //printf("datetime [%s]\n",datetime.toUtf8().data());
+
+                //遥信
+                quint8 devicestatus1 = static_cast<quint8>(data.at(33)&0xff);
+                quint8 devicestatus2 = static_cast<quint8>(data.at(34)&0xff);
+                quint8 devicestatus3 = static_cast<quint8>(data.at(35)&0xff);
+                quint8 devicestatus4 = static_cast<quint8>(data.at(36)&0xff);
+                quint8 devicestatus5 = static_cast<quint8>(data.at(37)&0xff);
+                QString alarm1 = QString("%1").arg(devicestatus1,8,2,QChar('0'));
+                QString alarm2 = QString("%1").arg(devicestatus2,8,2,QChar('0'));
+                QString alarm3 = QString("%1").arg(devicestatus3,8,2,QChar('0'));
+                QString alarm4 = QString("%1").arg(devicestatus4,8,2,QChar('0'));
+                QString alarm5 = QString("%1").arg(devicestatus5,8,2,QChar('0'));
+                QString alarm = QString("%1%2%3%4%5").arg(alarm1).arg(alarm2).arg(alarm3).arg(alarm4).arg(alarm5);
+                //printf("alarm [%s]\n",alarm.toUtf8().data());
+
+                int m =1,k =0,count=0;
+                for(int i=0;i<33;i++){
+
+                    column.append(QString("%1,").arg(digital[i]));
+                    valueData.append(QString("%1,").arg(alarm.mid(k,1)));
+                    setValue.append(QString("%1=%2,").arg(digital[i]).arg(alarm.mid(k,1)));
+                    zcdev->devs[idx].alarm[i].digitalValue = (alarm.mid(k,1)).toUInt();
+                    k++;
+
+                }
+
+                //printf("setValue [%s]\n",setValue.toUtf8().data());
+                QString tmp1 = QString("[%1] switch data 06 [%2] [%3]").arg(datetime).arg(alarm).arg(setValue);
+                emit comLog(tmp1);
+
+                sql.append(QString("insert into ht_switch_data(id,deviceName,DI2,DI3,%1dataTime) values(NULL,'%2',0,0,%3'%4');").arg(column).arg(deviceid).arg(valueData).arg(datetime));
+                //printf("ht_switch_data sql: %s\n",sql.toUtf8().data());
+                emit appendsql(sql);
+                sql.clear();
+                column.clear();
+                valueData.clear();
+
+                sql.append(QString("update rt_switch_data set %1dataTime='%2' where deviceName = '%3'").arg(setValue).arg(datetime).arg(deviceid));
+                emit appendsql(sql);
+                sql.clear();
+                setValue.clear();
+
+                //遥测
+                int start = 38;
+                QString str = "";
+                for(int j=0;j<60;j++){
+
+                    if(j==7){//剩余电流(漏电流 mA)
+                        quint16 I = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(I));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(I));
+
+                        start += 2;
+                    }else if(j==30){ //"昨日 Pmax 发生时间" - "yyMMddHHmmss"
+                        str.append(QString("%1%2%3%4%5%6").arg(data.at(start)&0xff,2,10,QChar('0')).arg(data.at(start+1)&0xff,2,10,QChar('0')).arg(data.at(start+2)&0xff,2,10,QChar('0')).arg(data.at(start+3)&0xff,2,10,QChar('0')).arg(data.at(start+4)&0xff,2,10,QChar('0')).arg(data.at(start+5)&0xff,2,10,QChar('0')));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(str));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(str));
+
+                        str.clear();
+                        start += 6;
+                    }else if(j==32){
+                        //庄城的“零序电压”忽略不保存,183的“零序电流”写入默认值0.00
+                        str.clear();
+                        start += 4;
+                    }else if((j==42)||(j==43)||(j==44)||(j==45)||(j==46)||(j==47)) {
+                        //设备信号强度、电压暂升次数(次)、电压暂降次数(次)、电压中断次数(次)、母线停电次数(次)、设备复位次数(次)
+                        quint32 v = static_cast<quint32>(((data.at(start)&0x000000ff)<<24)|((data.at(start+1)&0x000000ff)<<16)|((data.at(start+2)&0x000000ff)<<8)|(data.at(start+3)&0x000000ff));
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(v));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(v));
+
+                        start += 4;
+                    }else{
+                        //4位十六进制转浮点数
+                        quint32 hex = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float value = *(float*)&hex;
+
+                        column.append(QString("%1,").arg(analogInfo[j]));
+                        valueData.append(QString("%1,").arg(value));
+                        setValue.append(QString("%1=%2,").arg(analogInfo[j]).arg(value));
+
+                        str.clear();
+                        start += 4;
+                    }
+                }
+
+                //printf("setValue [%s]\n",setValue.toUtf8().data());
+                QString tmp2 = QString("[%1] analog data 06 [%2]").arg(datetime).arg(setValue);
+                emit comLog(tmp2);
+
+                sql.append(QString("insert into ht_analog_data(id,deviceName,I0,%1freezingTime,dataTime) values(NULL,'%2',0.00,%3'%4','%5');").arg(column).arg(deviceid).arg(valueData).arg(date).arg(datetime));
+                //printf("ht_analog_data sql: %s\n",sql.toUtf8().data());
+                emit appendsql(sql);
+                sql.clear();
+                column.clear();
+                valueData.clear();
+
+                sql.append(QString("update rt_analog_data set %1freezingTime = '%2',dataTime='%3' where deviceName = '%4';").arg(setValue).arg(date).arg(datetime).arg(deviceid));
+                emit appendsql(sql);
+                sql.clear();
+                setValue.clear();
+
+                rtn1 = mk_login_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+            }
+                break;
+            case 0x12:
+            {
+                //SOE 数据报文产生的时间
+                QString datetime = QString("%1-%2-%3 %4:%5:%6").arg(data.at(43)&0xff,2,10,QChar('0')).arg(data.at(42)&0xff,2,10,QChar('0')).arg(data.at(41)&0xff,2,10,QChar('0')).arg(data.at(40)&0xff,2,10,QChar('0')).arg(data.at(39)&0xff,2,10,QChar('0')).arg(data.at(38)&0xff,2,10,QChar('0'));
+
+                quint8 devicestatus1 = static_cast<quint8>(data.at(33)&0xff);
+                quint8 devicestatus2 = static_cast<quint8>(data.at(34)&0xff);
+                quint8 devicestatus3 = static_cast<quint8>(data.at(35)&0xff);
+                quint8 devicestatus4 = static_cast<quint8>(data.at(36)&0xff);
+                quint8 devicestatus5 = static_cast<quint8>(data.at(37)&0xff);
+                QString alarm1 = QString("%1").arg(devicestatus1,8,2,QChar('0'));
+                QString alarm2 = QString("%1").arg(devicestatus2,8,2,QChar('0'));
+                QString alarm3 = QString("%1").arg(devicestatus3,8,2,QChar('0'));
+                QString alarm4 = QString("%1").arg(devicestatus4,8,2,QChar('0'));
+                QString alarm5 = QString("%1").arg(devicestatus5,8,2,QChar('0'));
+                QString alarm = QString("%1%2%3%4%5").arg(alarm1).arg(alarm2).arg(alarm3).arg(alarm4).arg(alarm5);
+
+                QString tmp3 = QString("[%1] SOE data 06 [%2]").arg(datetime).arg(alarm);
+                emit comLog(tmp3);
+
+                int m =1,k =0,count=0;
+                for(int i=0;i<33;i++){
+
+                    //以每个开关量的首报为状态变化的判断标准
+                    uint digitalValue = (alarm.mid(k,1)).toUInt();
+                    QString mDesc = "";
+                    if(digitalValue != zcdev->devs[idx].alarm[i].digitalValue){
+                        if(digitalValue == 1){
+                            mDesc.append(digitalDescTable[i]).append("动作");
+
+                            zcdev->devs[idx].alarm[i].digitalValue = digitalValue;
+                            sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',0);").arg(deviceid).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital[i]).arg(digitalValue).arg(mDesc).arg(datetime));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+                        }else{
+                            mDesc.append(digitalDescTable[i]).append("复归");
+
+                            zcdev->devs[idx].alarm[i].digitalValue = digitalValue;
+                            sql.append(QString("insert into alarm_power(id,device_code,alarm_name,sending_time,alarm_type,meas_name,digital_value,meas_desc,soe_time,handling_status) values (NULL,'%1','时间顺序记录','%2','alert','%3',%4,'%5','%6',2);").arg(deviceid).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(digital[i]).arg(digitalValue).arg(mDesc).arg(datetime));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+
+                            sql.append(QString("update alarm_power set handling_time = '%1',handling_status = 3 where device_code = '%2' and meas_name = '%3' and digital_value = 1 and handling_status = 0;").arg(datetime).arg(deviceid).arg(digital[i]));
+                            emit appendAlarm(deviceid,sql,datetime,mDesc,QString("%1").arg(digitalValue),digital[i]);
+                            sql.clear();
+                        }
+                    }
+                    k++;
+                }
+                rtn1 = mk_soe_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+
+                so->flush();
+                msleep(200);
+
+            }
+                break;
+            case 0x15:
+            {
+                switch (data.at(32)&0xff) {
+                case 0x00: //实时数值
+                {
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harData = "";
+                    for(int i=1;i<32;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harData.append(QString(",%1").arg(f/10));
+                        start += 4;
+
+                        if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                            if(i == 1)
+                                (zcdev->devs[idx].har[0].ui_ct)++;
+                            zcdev->devs[idx].har[0].col[i-1].maj[(zcdev->devs[idx].har[0].ui_ct)-1].value = f/10;
+                        }else if(psgType == 1){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[1].ui_ct)++;
+                            zcdev->devs[idx].har[1].col[i-1].maj[(zcdev->devs[idx].har[1].ui_ct)-1].value = f/10;
+                        }else if(psgType == 2){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[2].ui_ct)++;
+                            zcdev->devs[idx].har[2].col[i-1].maj[(zcdev->devs[idx].har[2].ui_ct)-1].value = f/10;
+                        }else if(psgType == 3){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[3].ui_ct)++;
+                            zcdev->devs[idx].har[3].col[i-1].maj[(zcdev->devs[idx].har[3].ui_ct)-1].value = f/10;
+                        }else if(psgType == 4){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[4].ui_ct)++;
+                            zcdev->devs[idx].har[4].col[i-1].maj[(zcdev->devs[idx].har[4].ui_ct)-1].value = f/10;
+                        }else if(psgType == 5){
+                            if(i == 1)
+                            (zcdev->devs[idx].har[5].ui_ct)++;
+                            zcdev->devs[idx].har[5].col[i-1].maj[(zcdev->devs[idx].har[5].ui_ct)-1].value = f/10;
+                        }
+                    }
+
+                    sql.append(QString("insert into wave_har_data values (NULL,'%1',%2,%3%4,'%5','%6');").arg(deviceid).arg(0).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                    emit appendsql(sql);
+                    emit comLog(sql);
+                    sql.clear();
+                    harData.clear();
+
+                    rtn1 = mk_har_request(data,3);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+                }
+                    break;
+                case 0x01: //谐波含量
+                {
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harData = "";
+                    for(int i=1;i<32;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harData.append(QString(",%1").arg(f/100));
+                        start += 4;
+                    }
+
+                    sql.append(QString("insert into wave_har_data values (NULL,'%1',%2,%3%4,'%5','%6');").arg(deviceid).arg(1).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                    emit appendsql(sql);
+                    sql.clear();
+                    harData.clear();
+
+                    rtn1 = mk_har_request(data,2);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+
+                }
+                    break;
+                case 0x02: //日平均数值
+                {
+                    stat_count++;
+
+                    int psgType = data.at(33)&0xff;
+                    QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0')).arg(data.at(160)&0xff,2,10,QChar('0')).arg(data.at(159)&0xff,2,10,QChar('0')).arg(data.at(158)&0xff,2,10,QChar('0'));
+                    QString tmptime = QString("%1%2-%3-%4").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0'));
+
+                    int start = 34;
+                    QString harcolumn,harData,setHarValue;
+                    for(int i=0;i<31;i++){
+                        quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                        float f = *(float*)&h;
+
+                        harcolumn.append(QString("%1,").arg(average[i]));
+                        harData.append(QString("%1,").arg(f/10));
+                        setHarValue.append(QString("%1=%2,").arg(average[i]).arg(f/10));
+
+                        start += 4;
+                    }
+
+                    if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                        if(ua_count == 0){
+                            ua_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 1){
+                        if(ub_count == 0){
+                            ub_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 2){
+                        if(uc_count == 0){
+                            uc_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 3){
+                        if(ia_count == 0){
+                            ia_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 4){
+                        if(ib_count == 0){
+                            ib_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }else if(psgType == 5){
+                        if(ic_count == 0){
+                            ic_count++;
+                            sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                            emit appendsql(sql);
+                        }else{
+
+                            sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                            emit appendsql(sql);
+                        }
+                    }
+                    sql.clear();
+                    harcolumn.clear();
+                    harData.clear();
+                    setHarValue.clear();
+
+                    rtn1 = mk_har_request(data,0);
+                    so->write(rtn1);
+                    rtn1.clear();
+                    so->flush();
+                    msleep(200);
+
+                    if(stat_count == 12){
+                        //统计计算前一天每个通道每次谐波的%95值
+                        QString setMajValue = "";
+
+                        //对每个通道的每组谐波数据进行排序 从小到大
+                        this->maj_sort(0,zcdev->devs[idx].har[0].ui_ct);
+                        this->maj_sort(1,zcdev->devs[idx].har[1].ui_ct);
+                        this->maj_sort(2,zcdev->devs[idx].har[2].ui_ct);
+                        this->maj_sort(3,zcdev->devs[idx].har[3].ui_ct);
+                        this->maj_sort(4,zcdev->devs[idx].har[4].ui_ct);
+                        this->maj_sort(5,zcdev->devs[idx].har[5].ui_ct);
+
+                        //A相电压谐波
+                        int s = static_cast<int>((zcdev->devs[idx].har[0].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[0].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 0 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //B相电压谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[1].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[1].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 1 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //C相电压谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[2].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[2].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 2 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //A相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[3].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[3].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 3 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //B相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[4].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[4].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 4 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+                        //C相电流谐波
+                        s = static_cast<int>((zcdev->devs[idx].har[5].ui_ct)*(0.95));
+                        for(int i=0;i<31;i++){
+                            setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[5].col[i].maj[s-1].value));
+                        }
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 5 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                        sql.clear();
+                        setMajValue.clear();
+
+
+                        stat_count = 0;
+                        if(tmptime.compare(harDate.toString("yyyy-MM-dd")) != 0){
+                            harDate = harDate.addDays(1);
+                        }
+                        ua_count = 0;
+                        ub_count = 0;
+                        uc_count = 0;
+                        ia_count = 0;
+                        ib_count = 0;
+                        ic_count = 0;
+
+                        zcdev->devs[idx].har[0].ui_ct = 0;
+                        zcdev->devs[idx].har[1].ui_ct = 0;
+                        zcdev->devs[idx].har[2].ui_ct = 0;
+                        zcdev->devs[idx].har[3].ui_ct = 0;
+                        zcdev->devs[idx].har[4].ui_ct = 0;
+                        zcdev->devs[idx].har[5].ui_ct = 0;
+                    }
+
+                }
+                    break;
+                default:
+                    break;
+                }
+            }
+                break;
+            case 0x16: //日最大值
+            {
+                stat_count++;
+
+                int psgType = data.at(33)&0xff;
+                QString sendtime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(256)&0xff,2,10,QChar('0')).arg(data.at(255)&0xff,2,10,QChar('0')).arg(data.at(254)&0xff,2,10,QChar('0')).arg(data.at(253)&0xff,2,10,QChar('0')).arg(data.at(252)&0xff,2,10,QChar('0')).arg(data.at(251)&0xff,2,10,QChar('0'));
+                QString tmptime = QString("%1%2-%3-%4").arg(yy).arg(data.at(163)&0xff,2,10,QChar('0')).arg(data.at(162)&0xff,2,10,QChar('0')).arg(data.at(161)&0xff,2,10,QChar('0'));
+
+                int start = 34;
+                QString harcolumn,harData,setHarValue;
+                for(int i=0;i<31;i++){
+                    quint32 h = static_cast<quint32>(((data.at(start+3)&0x000000ff)<<24)|((data.at(start+2)&0x000000ff)<<16)|((data.at(start+1)&0x000000ff)<<8)|(data.at(start)&0x000000ff));
+                    float f = *(float*)&h;
+
+                    QString maxtime = QString("%1 %2:%3:%4").arg(harDate.toString("yyyy-MM-dd")).arg(data.at(start+4)&0xff,2,10,QChar('0')).arg(data.at(start+5)&0xff,2,10,QChar('0')).arg(data.at(start+6)&0xff,2,10,QChar('0'));
+
+                    harcolumn.append(QString("%1,%2,").arg(maxinfo[i]).arg(maxtimeinfo[i]));
+                    harData.append(QString("%1,'%2',").arg(f/10).arg(maxtime));
+                    setHarValue.append(QString("%1=%2,%3='%4',").arg(maxinfo[i]).arg(f/10).arg(maxtimeinfo[i]).arg(maxtime));
+
+                    start += 7;
+                }
+
+                if(psgType == 0){ //通道类型(0 A相电压 1 B相电压 2 C相电压 3 A相电流 4 B相电流 5 C相电流)
+                    if(ua_count == 0){
+                        ua_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 1){
+                    if(ub_count == 0){
+                        ub_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 2){
+                    if(uc_count == 0){
+                        uc_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 3){
+                    if(ia_count == 0){
+                        ia_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 4){
+                    if(ib_count == 0){
+                        ib_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }else if(psgType == 5){
+                    if(ic_count == 0){
+                        ic_count++;
+                        sql.append(QString("insert into wave_statistic_data(id,deviceName,psgType,%1dataDate,sendTime) values (NULL,'%2',%3,%4'%5','%6');").arg(harcolumn).arg(deviceid).arg(psgType).arg(harData).arg(harDate.toString("yyyy-MM-dd")).arg(sendtime));
+                        emit appendsql(sql);
+                    }else{
+
+                        sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = %4 and dataDate = '%5';").arg(setHarValue).arg(sendtime).arg(deviceid).arg(psgType).arg(harDate.toString("yyyy-MM-dd")));
+                        emit appendsql(sql);
+                    }
+                }
+                emit comLog(sql);
+                sql.clear();
+                harcolumn.clear();
+                harData.clear();
+                setHarValue.clear();
+
+                rtn1 = mk_har_request(data,1);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+
+                if(stat_count == 12){
+                    //统计计算前一天每个通道每次谐波的%95值
+                    QString setMajValue = "";
+
+                    //对每个通道的每组谐波数据进行排序 从小到大
+                    this->maj_sort(0,zcdev->devs[idx].har[0].ui_ct);
+                    this->maj_sort(1,zcdev->devs[idx].har[1].ui_ct);
+                    this->maj_sort(2,zcdev->devs[idx].har[2].ui_ct);
+                    this->maj_sort(3,zcdev->devs[idx].har[3].ui_ct);
+                    this->maj_sort(4,zcdev->devs[idx].har[4].ui_ct);
+                    this->maj_sort(5,zcdev->devs[idx].har[5].ui_ct);
+
+                    //A相电压谐波
+                    int s = static_cast<int>((zcdev->devs[idx].har[0].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[0].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 0 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //B相电压谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[1].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[1].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 1 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //C相电压谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[2].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[2].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 2 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //A相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[3].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[3].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 3 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //B相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[4].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[4].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 4 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+                    //C相电流谐波
+                    s = static_cast<int>((zcdev->devs[idx].har[5].ui_ct)*(0.95));
+                    for(int i=0;i<31;i++){
+                        setMajValue.append(QString("%1=%2,").arg(majinfo[i]).arg(zcdev->devs[idx].har[5].col[i].maj[s-1].value));
+                    }
+                    sql.append(QString("update wave_statistic_data set %1sendTime ='%2' where deviceName = '%3' and psgType = 5 and dataDate = '%4';").arg(setMajValue).arg(sendtime).arg(deviceid).arg(harDate.toString("yyyy-MM-dd")));
+                    emit appendsql(sql);
+                    sql.clear();
+                    setMajValue.clear();
+
+
+                    stat_count = 0;
+                    if(tmptime.compare(harDate.toString("yyyy-MM-dd")) != 0){
+                        harDate = harDate.addDays(1);
+                    }
+                    ua_count = 0;
+                    ub_count = 0;
+                    uc_count = 0;
+                    ia_count = 0;
+                    ib_count = 0;
+                    ic_count = 0;
+
+                    zcdev->devs[idx].har[0].ui_ct = 0;
+                    zcdev->devs[idx].har[1].ui_ct = 0;
+                    zcdev->devs[idx].har[2].ui_ct = 0;
+                    zcdev->devs[idx].har[3].ui_ct = 0;
+                    zcdev->devs[idx].har[4].ui_ct = 0;
+                    zcdev->devs[idx].har[5].ui_ct = 0;
+                }
+            }
+                break;
+            case 0x18://故障录波
+            {
+                //页号
+                int n = (QString("%1").arg(data.at(33)&0xff,2,10)).toInt();
+                printf("n = %d\n",n);
+                int start = 34;
+                //故障录波发生时间
+                QString waveTime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(199)&0xff,2,10,QChar('0')).arg(data.at(198)&0xff,2,10,QChar('0')).arg(data.at(197)&0xff,2,10,QChar('0')).arg(data.at(196)&0xff,2,10,QChar('0')).arg(data.at(195)&0xff,2,10,QChar('0')).arg(data.at(194)&0xff,2,10,QChar('0'));
+                //发送时间
+                QString sendTime = QString("%1%2-%3-%4 %5:%6:%7").arg(yy).arg(data.at(205)&0xff,2,10,QChar('0')).arg(data.at(204)&0xff,2,10,QChar('0')).arg(data.at(203)&0xff,2,10,QChar('0')).arg(data.at(202)&0xff,2,10,QChar('0')).arg(data.at(201)&0xff,2,10,QChar('0')).arg(data.at(200)&0xff,2,10,QChar('0'));
+
+
+                if(n == 7){
+                    for(int i=0;i<10;i++){
+                        groupNum++;
+                        //2位十六进制转浮点数
+                        //UA UB UC IA IB IC IR
+                        quint16 hex = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+                        float ua = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+2)&0x00ff)<<8)|(data.at(start+3)&0x00ff));
+                        float ub = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+4)&0x00ff)<<8)|(data.at(start+5)&0x00ff));
+                        float uc = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+6)&0x00ff)<<8)|(data.at(start+7)&0x00ff));
+                        float ia = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+8)&0x00ff)<<8)|(data.at(start+9)&0x00ff));
+                        float ib = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+10)&0x00ff)<<8)|(data.at(start+11)&0x00ff));
+                        float ic = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+12)&0x00ff)<<8)|(data.at(start+13)&0x00ff));
+                        float ir = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat());
+                        //BIT15:开入1 BIT14:火灾预警总 BIT13:线路电气故障总 BIT12:缺相 BIT11:过压 BIT10:欠压 BIT9:电流越限 BIT8:过流跳闸 BIT7:剩余电流越限 BIT6:T1超温 BIT5:T2超温 BIT4:T3超温 BIT3:T4超温 BIT2:环境温度超温 BIT1-0:预留
+                        hex = static_cast<quint16>(((data.at(start+14)&0x00ff)<<8)|(data.at(start+15)&0x00ff));
+                        QString str = QString("%1").arg(hex,16,2,QChar('0'));
+                        QString temp = QString("[%1] wave record [ua:%2 ub:%3 uc:%4 ia:%5 ib:%6 ic:%7 ir:%8 [%9]]").arg(t).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(str);
+                        //emit comLog(temp);
+                        QString L = "";
+                        for(int j=0;j<16;j++){
+                            L.append(QString(",%1").arg(str.mid(j,1)));
+                        }
+
+                        if(i == 9){
+                            sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12');").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        }else{
+                            sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12'),").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        }
+
+                        start += 16;
+                    }
+                    sql.append(QString("insert into wave_record_data values %1").arg(sqldata));
+                    emit appendsql(sql);
+                    emit comLog(sql);
+                    sql.clear();
+
+                    sqldata.clear();
+                    groupNum = 0;
+
+                    rtn1 = mk_wave_request(data,2);
+                    so->write(rtn1);
+                    rtn1.clear();
+
+                }else{
+                    for(int i=0;i<10;i++){
+                        groupNum++;
+                        //2位十六进制转浮点数
+                        //UA UB UC IA IB IC IR
+                        quint16 hex = static_cast<quint16>(((data.at(start)&0x00ff)<<8)|(data.at(start+1)&0x00ff));
+                        float ua = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+2)&0x00ff)<<8)|(data.at(start+3)&0x00ff));
+                        float ub = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+4)&0x00ff)<<8)|(data.at(start+5)&0x00ff));
+                        float uc = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+6)&0x00ff)<<8)|(data.at(start+7)&0x00ff));
+                        float ia = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+8)&0x00ff)<<8)|(data.at(start+9)&0x00ff));
+                        float ib = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+10)&0x00ff)<<8)|(data.at(start+11)&0x00ff));
+                        float ic = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat())/10;
+                        hex = static_cast<quint16>(((data.at(start+12)&0x00ff)<<8)|(data.at(start+13)&0x00ff));
+                        float ir = ((QString("%1").arg(hex,6,10,QChar('0'))).toFloat());
+                        //BIT15:开入1 BIT14:火灾预警总 BIT13:线路电气故障总 BIT12:缺相 BIT11:过压 BIT10:欠压 BIT9:电流越限 BIT8:过流跳闸 BIT7:剩余电流越限 BIT6:T1超温 BIT5:T2超温 BIT4:T3超温 BIT3:T4超温 BIT2:环境温度超温 BIT1-0:预留
+                        hex = static_cast<quint16>(((data.at(start+14)&0x00ff)<<8)|(data.at(start+15)&0x00ff));
+                        QString str = QString("%1").arg(hex,16,2,QChar('0'));
+                        QString temp = QString("[%1] wave record [ua:%2 ub:%3 uc:%4 ia:%5 ib:%6 ic:%7 ir:%8 [%9]]").arg(t).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(str);
+                        //emit comLog(temp);
+                        QString L = "";
+                        for(int j=0;j<16;j++){
+                            L.append(QString(",%1").arg(str.mid(j,1)));
+                        }
+
+                        sqldata.append(QString("(NULL,'%1',%2,%3,%4,%5,%6,%7,%8,%9%10,'%11','%12'),").arg(deviceid).arg(groupNum).arg(ua).arg(ub).arg(uc).arg(ia).arg(ib).arg(ic).arg(ir).arg(L).arg(waveTime).arg(sendTime));
+
+                        start += 16;
+                    }
+
+                }
+            }
+                break;
+            default:
+            {
+                rtn1 = mk_login_rtn(data);
+                so->write(rtn1);
+                rtn1.clear();
+                so->flush();
+                msleep(200);
+            }
+                break;
+
+            }
+
+        }else{
+
+        }
+    }
+
+    getdata = false;
+}
+
+
+
+void ZcComThread::maj_sort(int psg,int u_ct)
+{
+    float tmp = 0.00;
+    //通道
+    for(int l=0;l<31;l++){
+        //1-31组
+        for(int i=0;i<u_ct;i++){
+            for(int j=i+1;j<u_ct;j++){
+                if(zcdev->devs[idx].har[psg].col[l].maj[i].value > zcdev->devs[idx].har[psg].col[l].maj[j].value){
+                    tmp = zcdev->devs[idx].har[psg].col[l].maj[i].value;
+                    zcdev->devs[idx].har[psg].col[l].maj[i].value = zcdev->devs[idx].har[psg].col[l].maj[j].value;
+                    zcdev->devs[idx].har[psg].col[l].maj[j].value = tmp;
+                }
+            }
+        }
+    }
+}
+
+
+
+//下发时间同步
+//下发设置时钟时间为2022-01-01 01:01:01
+//40 40 03 01
+//09 28 09 01 03 16
+//01 01 88 88 80 00 00 00 77 77 FF FF
+//03   //报文类型
+//00 00  //回应消息 msgid
+//00
+//11 00   //应用数据单元长度
+//24 07 D2 00 00 01 01 01 01 01 16 01 01 01 01 01 01
+//09 23 23
+QByteArray ZcComThread::mk_time_rtn(QByteArray data)
+{
+    int cur=0,crc=0;
+    QDateTime t = QDateTime::currentDateTime();
+    int year = t.date().year();
+    int yy = year%100;
+    int mon = t.date().month();
+    int day = t.date().day();
+    int hour = t.time().hour();
+    int min = t.time().minute();
+    int sec = t.time().second();
+
+    QByteArray rtn = QByteArray(48,0x00);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(data.at(2)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(3)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(10)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(11)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(12)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(13)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(14)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(15)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(16)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(17)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(18)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(19)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(20)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(21)&0xff);
+    rtn[cur++] = static_cast<char>(0x03);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x11);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x24);
+    rtn[cur++] = static_cast<char>(0x07);
+    rtn[cur++] = static_cast<char>(0xD2);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    for(int i=2;i<cur;i++){
+        crc += rtn[i]&0xff;
+    }
+    rtn[cur++] = static_cast<char>(crc&0xff);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x23);
+
+    return rtn;
+}
+
+//0x26 主机应答
+//40 40 03 01
+//09 28 09 01 03 16
+//01 01 88 88 80 00 00 00 77 77 FF FF
+//03 00 00 00
+//0B 00  //应用数据单元长度
+//26 07 D2 00 00 01 01 01 01 01 16
+//E5 23 23
+QByteArray ZcComThread::mk_soe_rtn(QByteArray data)
+{
+    int cur=0,crc=0;
+    QDateTime t = QDateTime::currentDateTime();
+    int year = t.date().year();
+    int yy = year%100;
+    int mon = t.date().month();
+    int day = t.date().day();
+    int hour = t.time().hour();
+    int min = t.time().minute();
+    int sec = t.time().second();
+
+    QByteArray rtn = QByteArray(42,0x00);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(data.at(2)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(3)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(10)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(11)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(12)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(13)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(14)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(15)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(16)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(17)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(18)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(19)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(20)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(21)&0xff);
+    rtn[cur++] = static_cast<char>(0x03);
+    rtn[cur++] = static_cast<char>(data.at(23)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(24)&0xff);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x0B);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x26);
+    rtn[cur++] = static_cast<char>(0x07);
+    rtn[cur++] = static_cast<char>(0xD2);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    for(int i=2;i<cur;i++){
+        crc += rtn[i]&0xff;
+    }
+    rtn[cur++] = static_cast<char>(crc&0xff);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x23);
+
+    return rtn;
+}
+
+
+//5.2 故障录波下发请求和服务器端特殊帧应答
+//40 40 03 01
+//09 28 09 01 03 16
+//01 01 88 88 80 00 00 00 77 77 FF FF
+//03 00 00 01 07 00
+//23 07 D2
+//00 00
+//00    控制类型 0:请求上报 1:重新开始录波 2:确认文件接收完成
+//00    分页 0-7
+//09 28 09 01 03 16
+//DD 23 23
+QByteArray ZcComThread::mk_wave_request(QByteArray data,int n) //其中 n 为控制类型
+{
+    int cur=0,crc=0;
+    QDateTime t = QDateTime::currentDateTime();
+    int year = t.date().year();
+    int yy = year%100;
+    int mon = t.date().month();
+    int day = t.date().day();
+    int hour = t.time().hour();
+    int min = t.time().minute();
+    int sec = t.time().second();
+
+    QByteArray rtn = QByteArray(44,0x00);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(data.at(2)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(3)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(10)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(11)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(12)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(13)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(14)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(15)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(16)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(17)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(18)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(19)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(20)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(21)&0xff);
+    rtn[cur++] = static_cast<char>(0x03);
+    rtn[cur++] = static_cast<char>(data.at(23)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(24)&0xff);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x0D);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x07);
+    rtn[cur++] = static_cast<char>(0xD2);
+    rtn[cur++] = static_cast<char>(data.at(31)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(32)&0xff);
+    rtn[cur++] = static_cast<char>((((n/16)&0x0f)<<4)|((n%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(33)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    for(int i=2;i<cur;i++){
+        crc += rtn[i]&0xff;
+    }
+    rtn[cur++] = static_cast<char>(crc&0xff);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x23);
+
+    return rtn;
+
+}
+
+
+//40 40 03 01
+//09 28 09 01 03 16
+//01 01 88 88 80 00 00 00 77 77 FF FF
+//03
+//00 00
+//00
+//07 00
+//25 07 D2 00 00
+//03 数据类型 0:日平均谐波数值 1:日最大谐波数值 2:谐波百分比 3:实时数值
+//01 通道 0:UA 1:UB 2:UC 3:IA 4:IB 5:IC
+//09 28 09 01 03 16
+//E3 23 23
+QByteArray ZcComThread::mk_har_request(QByteArray data,int n) //n 为 数据类型
+{
+    int cur=0,crc=0;
+    QDateTime t = QDateTime::currentDateTime();
+    int year = t.date().year();
+    int yy = year%100;
+    int mon = t.date().month();
+    int day = t.date().day();
+    int hour = t.time().hour();
+    int min = t.time().minute();
+    int sec = t.time().second();
+
+    QByteArray rtn = QByteArray(44,0x00);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(data.at(2)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(3)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(10)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(11)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(12)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(13)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(14)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(15)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(16)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(17)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(18)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(19)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(20)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(21)&0xff);
+    rtn[cur++] = static_cast<char>(0x03);
+    rtn[cur++] = static_cast<char>(data.at(23)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(24)&0xff);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x0D);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x25);
+    rtn[cur++] = static_cast<char>(0x07);
+    rtn[cur++] = static_cast<char>(0xD2);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>((((n/16)&0x0f)<<4)|((n%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(33)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    for(int i=2;i<cur;i++){
+        crc += rtn[i]&0xff;
+    }
+    rtn[cur++] = static_cast<char>(crc&0xff);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x23);
+
+    return rtn;
+
+}
+
+
+
+//40 40 03 01  //与请求登录报文一致
+//01 29 09 01 03 16  //系统时间
+//01 01 88 88 80 00 00 00 77 77 FF FF  //与请求登录报文一致
+//05   //报文类型为05
+//00 03 //回应消息 msgid 要和请求消息 msgid 保持 一致
+//00
+//00 00
+//D7  //校验码
+//23 23
+QByteArray ZcComThread::mk_login_rtn(QByteArray data)
+{
+    int cur=0,crc=0;
+    QDateTime t = QDateTime::currentDateTime();
+    int year = t.date().year();
+    int yy = year%100;
+    int mon = t.date().month();
+    int day = t.date().day();
+    int hour = t.time().hour();
+    int min = t.time().minute();
+    int sec = t.time().second();
+
+    QByteArray rtn = QByteArray(31,0x00);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(0x40);
+    rtn[cur++] = static_cast<char>(data.at(2)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(3)&0xff);
+    rtn[cur++] = static_cast<char>((((sec/16)&0x0f)<<4)|((sec%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((min/16)&0x0f)<<4)|((min%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((hour/16)&0x0f)<<4)|((hour%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((day/16)&0x0f)<<4)|((day%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((mon/16)&0x0f)<<4)|((mon%16)&0x0f));
+    rtn[cur++] = static_cast<char>((((yy/16)&0x0f)<<4)|((yy%16)&0x0f));
+    rtn[cur++] = static_cast<char>(data.at(10)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(11)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(12)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(13)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(14)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(15)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(16)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(17)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(18)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(19)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(20)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(21)&0xff);
+    rtn[cur++] = static_cast<char>(0x05);
+    rtn[cur++] = static_cast<char>(data.at(23)&0xff);
+    rtn[cur++] = static_cast<char>(data.at(24)&0xff);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    rtn[cur++] = static_cast<char>(0x00);
+    for(int i=2;i<cur;i++){
+        crc += rtn[i]&0xff;
+    }
+    rtn[cur++] = static_cast<char>(crc&0xff);
+    rtn[cur++] = static_cast<char>(0x23);
+    rtn[cur++] = static_cast<char>(0x23);
+
+    return rtn;
+}
+
+quint8 ZcComThread::hexstr_to_byte(QString dat)
+{
+    quint8 tmp[2];
+    QByteArray Dat = dat.toLower().toLatin1();
+    quint8 temp;
+    temp = Dat.at(0)&0xff;
+    if((temp>=0x30)&&(temp<=0x39))
+        tmp[0] = temp-0x30;
+    else
+        tmp[0] = temp-0x37;
+    temp = Dat.at(1)&0xff;
+    if((temp>=0x30)&&(temp<=0x39))
+        tmp[1] = temp-0x30;
+    else
+        tmp[1] = temp-0x37;
+    return static_cast<quint8>(((tmp[0]&0x0f)<<4)|(tmp[1]&0x0f));
+}
+
+quint8 ZcComThread::sumCrc(QByteArray data,int len)
+{
+    quint8 crc = 0x00;
+    for(int i=0;i<len;i++){
+        //printf("%s ",(QString("%1").arg(data.at(i)&0xff,2,16,QChar('0'))).toUtf8().data());
+        crc += static_cast<quint8>(data.at(i)&0xff);
+    }
+    return crc;
+}
+
+
+
+

+ 55 - 0
ytWGZc/ytWGZcCore/zccomthread.h

@@ -0,0 +1,55 @@
+#ifndef ZCCOMTHREAD_H
+#define ZCCOMTHREAD_H
+
+#include <QThread>
+#include <QTcpSocket>
+#include <QDateTime>
+#include <QTimer>
+
+class ZcComThread : public QThread
+{
+    Q_OBJECT
+public:
+    explicit ZcComThread(qintptr socketDescriptor,QObject *parent = nullptr);
+    void run() override;
+    void close_self(QTcpSocket *so);
+    void stop();
+    void readdata(QTcpSocket *so);
+    void dealdata(QTcpSocket *so,QByteArray data);
+    quint8 sumCrc(QByteArray data, int len);
+    QByteArray mk_login_rtn(QByteArray data);
+    QByteArray mk_time_rtn(QByteArray data);
+    QByteArray mk_soe_rtn(QByteArray data);
+    QByteArray mk_wave_request(QByteArray data,int n);
+    QByteArray mk_har_request(QByteArray data,int n);
+    quint8 hexstr_to_byte(QString dat);
+    void maj_sort(int psg,int u_ct);
+    int getHead(QByteArray data);
+    int gettail(QByteArray data);
+
+signals:
+    void comLog(QString comLog);
+    void appendsql(QString sql);
+    void appendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName);
+
+public slots:
+
+private:
+    qintptr socketDescriptor;
+    bool keep;
+    int err_count;
+    QByteArray rtn1;
+    QByteArray dataTotal;
+    QString deviceid;
+    int count,day,idx,groupNum;
+    QString sqldata;
+    int c_start,c_end;
+    bool getdata;
+
+    int stat_count; //日统计谐波组数
+    int ua_count,ub_count,uc_count,ia_count,ib_count,ic_count;
+
+    QDate harDate; //谐波所属日期
+};
+
+#endif // ZCCOMTHREAD_H

+ 264 - 0
ytWGZc/ytWGZcCore/zccore.cpp

@@ -0,0 +1,264 @@
+#include "zccore.h"
+#include "coreshm.h"
+
+ZCCore::ZCCore(QObject *parent) : QObject(parent)
+{
+    WXList.clear();
+
+    timer = new QTimer(this);
+    connect(timer,&QTimer::timeout,this,&ZCCore::time_out);
+
+    hour = 255;
+//    netAccessManager = new QNetworkAccessManager(this);
+//    connect(netAccessManager,&QNetworkAccessManager::finished,this,&ZCCore::finishedSlot);
+
+    netAccessManager1 = new QNetworkAccessManager(this);
+    connect(netAccessManager1,&QNetworkAccessManager::finished,this,&ZCCore::finishedSlot1);
+    isFinish = true;
+
+    logthread = new logThread(this);
+    logthread->start();
+
+    dbthread = new dbThread(this);
+    dbthread->start();
+    connect(dbthread,&dbThread::AlarmReport,this,&ZCCore::AlarmReport);
+
+    tcpcore = new TcpCore(this);
+    connect(tcpcore,&TcpCore::comLog,this,&ZCCore::comLog);
+    connect(tcpcore,&TcpCore::appendsql,this,&ZCCore::appendsql);
+    connect(tcpcore,&TcpCore::appendAlarm,this,&ZCCore::appendAlarm);
+}
+
+ZCCore::~ZCCore()
+{
+//    netAccessManager->deleteLater();
+    netAccessManager1->deleteLater();
+
+    logthread->stop();
+    dbthread->stop();
+}
+
+void ZCCore::start()
+{
+    timer->start(1000);
+    tcpcore->start();
+}
+
+void ZCCore::time_out()
+{
+    if((isFinish)&&(WXList.length()>0)){
+        sendData();
+    }
+
+//    if(hour != QDateTime::currentDateTime().time().hour()){
+//        hour = QDateTime::currentDateTime().time().hour();
+
+//        QByteArray post_data;
+//        uint t = QDateTime::currentDateTime().toTime_t();
+
+//        QString tmp="";
+//            QString number= QString("%1%2%3").arg("usky").arg(t).arg("056ac8fae059c9c9e700b734922edfc8");
+//            QByteArray str;
+//            str = QCryptographicHash::hash(number.toLatin1(),QCryptographicHash::Md5);
+//            tmp.append(str.toHex());
+
+
+//        post_data.append(QString("requestType=%1&").arg(3));
+//        post_data.append(QString("publicKey=%1&").arg(tmp));
+//        post_data.append(QString("timeStamp=%1").arg(t));
+
+//        QNetworkRequest *req = new QNetworkRequest();
+//        req->setUrl(QUrl("https://iot.usky.cn/ytapi/admin/Manage/wooGiApi"));
+//        req->setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
+//        req->setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());
+//        QNetworkReply* reply = netAccessManager->post(*req,post_data);
+
+
+//    }
+}
+
+void ZCCore::comLog(QString comData)
+{
+    logthread->appendData(comData);
+}
+
+void ZCCore::appendsql(QString sql)
+{
+    dbthread->appendSql(sql);
+}
+
+void ZCCore::appendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName)
+{
+    AlarmRep rep = AlarmRep(deviceCode,sql,soetime,mDesc,digitalValue,measName);
+    dbthread->appendAlarm(rep);
+}
+
+void ZCCore::AlarmReport(QString DeviceCode,QString lastid,QString SETime,QString MeasDesc,QString DigitalValue,QString MeasName)
+{
+    QString tt = QString("%1%2").arg((QDateTime::currentDateTime().date().year()/100)).arg(SETime);
+    unsigned int soeTime = (QDateTime::fromString(tt,"yyyy-MM-dd HH:mm:ss")).toTime_t();
+    unsigned int busTime0,busTime1;
+    for(int i=0;i<1024;i++){
+        if(zcdev->devs[i].enabled == 0x01){
+            if(DeviceCode.compare(zcdev->devs[i].deviceCode)==0){
+                zcdev->devs[i].lastCommTime=(QDateTime::currentDateTime()).toTime_t();
+                if(zcdev->devs[i].deviceType == 6){
+                    for(int j=0;j<33;j++){
+                        if(QString(zcdev->devs[i].alarm[j].measName).compare("BusOutage")==0){
+                            busTime0 = zcdev->devs[i].alarm[j].soeTime0;
+                            busTime1 = zcdev->devs[i].alarm[j].soeTime1;
+
+                        }
+                    }
+                    for(int j=0;j<33;j++){
+                        if(MeasName.compare(zcdev->devs[i].alarm[j].measName)==0){
+                            if(DigitalValue.compare("0")==0){
+                                if((soeTime-zcdev->devs[i].alarm[j].soeTime0)>60){
+                                    if((soeTime-busTime0)>60){
+                                        WXRep wxrep = WXRep(DeviceCode,lastid,SETime,MeasDesc,DigitalValue,MeasName);
+                                        WXList.append(wxrep);
+                                        //推送微信端
+                                        //sendData();
+                                        printf("推送微信端 soeTime = %d, busTime0 = %d ,digital[digitalNo] = %s,DigitalValue.toUtf8().data()= %s,DigitalValue.toUInt() = %d \n",soeTime,busTime0,MeasName.toUtf8().data(),DigitalValue.toUtf8().data(),DigitalValue.toUInt());
+
+
+                                        zcdev->devs[i].alarm[j].soeTime0 = soeTime;
+                                    }
+                                }
+
+                            }else{
+                                if((soeTime-zcdev->devs[i].alarm[j].soeTime1)>60){
+                                    if((soeTime-busTime1)>60){
+                                        WXRep wxrep = WXRep(DeviceCode,lastid,SETime,MeasDesc,DigitalValue,MeasName);
+                                        WXList.append(wxrep);
+                                        //推送微信端
+                                        //sendData();
+                                        printf("推送微信端 soeTime = %d, busTime1 = %d ,digital[digitalNo] = %s,DigitalValue.toUtf8().data()= %s,DigitalValue.toUInt() = %d \n",soeTime,busTime1,MeasName.toUtf8().data(),DigitalValue.toUtf8().data(),DigitalValue.toUInt());
+
+
+                                        zcdev->devs[i].alarm[j].soeTime1 = soeTime;
+                                    }
+                                }
+
+                            }
+
+                        }
+                    }
+                }
+
+                break;
+            }
+        }
+    }
+
+
+}
+
+void ZCCore::sendData()
+{
+    isFinish = false;
+    WXRep data = WXList.first();
+    //WXList.removeFirst();
+    QByteArray post_data;
+    post_data.append(QString("device_code=%1&").arg(data.DeviceCode));
+    post_data.append(QString("insert_id=%1&").arg(data.LastId));
+    post_data.append(QString("phone=%1&").arg("17630065224"));
+    post_data.append(QString("time=%1&").arg(data.SoeTime));
+    post_data.append(QString("evt_name=%1&").arg(data.MeasDesc));
+    post_data.append(QString("user_from=%1&").arg("CDL1"));
+    post_data.append(QString("alarm_status=%1&").arg(data.DigitalValue));
+    post_data.append(QString("meas_name=%1&").arg(data.MeasName));
+    post_data.append(QString("bz=%1").arg("测试阶段"));
+
+    QNetworkRequest *req = new QNetworkRequest();
+    //req->setUrl(QUrl("https://wx.ewoogi.com/USKYOF/USKYOF.php/Home/Powerwarn/message_dl"));
+    //测试地址
+    req->setUrl(QUrl("https://iot.usky.cn/ytapi/admin/Manage/ceShiUrl"));
+    req->setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
+    req->setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());
+    QNetworkReply* reply = netAccessManager1->post(*req,post_data);
+
+
+}
+
+//void ZCCore::finishedSlot(QNetworkReply *reply)
+//{
+//    printf("enter finishedSlot ++++++++++++++\n");
+//    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
+//    if(status_code == 200){
+//        if(reply->error() == QNetworkReply::NoError){
+//            QString message = QString::fromUtf8(reply->readAll());
+//            QByteArray data = message.toLatin1();
+//            QJsonParseError json_err;
+//            QJsonDocument jsondoc(QJsonDocument::fromJson(data,&json_err));
+//            //printf("json_err.error = %d\n ",json_err.error);
+//            if(json_err.error==QJsonParseError::NoError){
+//                QJsonObject root = jsondoc.object();
+//                QJsonObject obj = root.value("data").toObject();
+//                QString num = "";
+//                int t = 0;
+//                if((!obj.value("publicKey").isUndefined())&&(!obj.value("publicKey").isNull())){
+//                    num = obj.value("publicKey").toString();
+//                }
+//                if((!obj.value("timeStamp").isUndefined())&&(!obj.value("timeStamp").isNull())){
+//                    t = obj.value("timeStamp").toInt();
+//                }
+
+//                QString temp="";
+//                QString number = QString("%1%2%3").arg("usky").arg(t).arg("056ac8fae059c9c9e700b734922edfc8");
+//                QByteArray str = QCryptographicHash::hash(number.toLatin1(),QCryptographicHash::Md5);
+//                temp.append(str.toHex());
+//                if(QString::compare(num,temp)!=0){
+//                    exit(1);
+//                }
+
+
+//            }
+
+
+//        }else{
+
+//        }
+
+//    }else{
+
+//    }
+
+//    reply->abort();
+//    reply->close();
+//    reply->deleteLater();
+
+
+//}
+
+void ZCCore::finishedSlot1(QNetworkReply *reply)
+{
+    isFinish = true;
+    WXList.removeFirst();
+
+    //printf("enter finishedSlot1++++++++++++++\n");
+    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
+    if(status_code == 200){
+        if(reply->error() == QNetworkReply::NoError){
+            QString message = QString::fromUtf8(reply->readAll());
+            logthread->appendData(QString("%1 WXChartThread send success  message: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(message));
+        }else{
+//            count++;
+//            sendData();
+//            if(count > 9){
+//                count = 0;
+//                WXList.removeFirst();
+//            }
+
+            //logThread->appendData(QString("WXChartThread send error 重发次数: %1 InsertId: %2").arg(count).arg(WXList.first().LastId));
+            logthread->appendData(QString("%1 WXChartThread send error ").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")));
+        }
+
+    }else{
+        logthread->appendData(QString("%1-----WXChartThread::finishedSlot1 fail------").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")));
+    }
+
+    reply->abort();
+    reply->close();
+    reply->deleteLater();
+}

+ 71 - 0
ytWGZc/ytWGZcCore/zccore.h

@@ -0,0 +1,71 @@
+#ifndef ZCCORE_H
+#define ZCCORE_H
+
+#include <QObject>
+#include <QTimer>
+#include <QDateTime>
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonParseError>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+
+#include "logthread.h"
+#include "dbthread.h"
+#include "tcpcore.h"
+
+class WXRep {
+public:
+    WXRep(QString devicecode="",QString lastid="",QString soetime="", QString measdesc="", QString digitalvalue="", QString measname=""){
+        DeviceCode = devicecode;
+        LastId = lastid;
+        SoeTime = soetime;
+        MeasDesc=measdesc;
+        DigitalValue=digitalvalue;
+        MeasName=measname;
+    }
+
+    QString DeviceCode;
+    QString LastId;
+    QString SoeTime;
+    QString MeasDesc;
+    QString DigitalValue;
+    QString MeasName;
+};
+
+class ZCCore : public QObject
+{
+    Q_OBJECT
+public:
+    explicit ZCCore(QObject *parent = nullptr);
+    ~ZCCore();
+    void start();
+    void sendData();
+
+signals:
+
+public slots:
+    void time_out();
+//    void finishedSlot(QNetworkReply *reply);
+    void finishedSlot1(QNetworkReply *reply);
+    void comLog(QString comData);
+    void appendsql(QString sql);
+    void appendAlarm(QString deviceCode,QString sql,QString soetime,QString mDesc,QString digitalValue,QString measName);
+    void AlarmReport(QString DeviceCode,QString lastid,QString SoeTime,QString MeasDesc,QString DigitalValue,QString MeasName);
+
+private:
+    QTimer *timer;
+
+    int hour;
+//    QNetworkAccessManager *netAccessManager;
+    QNetworkAccessManager *netAccessManager1;
+    bool isFinish;
+
+    logThread *logthread;
+    dbThread *dbthread;
+    TcpCore *tcpcore;
+    QList<WXRep>WXList;
+};
+
+#endif // ZCCORE_H