hanzhengyi před 4 roky
rodič
revize
c3619fbc76

+ 34 - 0
cpp/main.cpp

@@ -0,0 +1,34 @@
+#include <QCoreApplication>
+
+#include "smartlightshm.h"
+#include "core.h"
+
+SL_Shm *slShm;
+WebDataShm *webData;
+
+bool load_shm()
+{
+    int shmid;
+    key_t key;
+    if((key = ftok(SHM_PATH,static_cast<int>(SHM_PORT)))==-1)
+        return false;
+    if((shmid = shmget(key,sizeof(SL_Shm),IPC_CREAT|0666))==-1)
+        return false;
+    slShm = static_cast<SL_Shm *>(shmat(shmid,nullptr,0));
+    if((key = ftok(WEB_SHM_PATH,static_cast<int>(WEB_SHM_PORT)))==-1)
+        return false;
+    if((shmid = shmget(key,sizeof(WebDataShm),IPC_CREAT|0666))==-1)
+        return false;
+    webData = static_cast<WebDataShm *>(shmat(shmid,nullptr,0));
+    return true;
+}
+
+int main(int argc, char *argv[])
+{
+    QCoreApplication a(argc, argv);
+    if(load_shm()){
+        Core *core = new Core(nullptr);
+        core->start();
+    }
+    return a.exec();
+}

+ 4448 - 0
cpp/smartlightcommthread.cpp

@@ -0,0 +1,4448 @@
+#include "smartlightcommthread.h"
+#include "smartlightshm.h"
+
+SmartLightCommThread::SmartLightCommThread(qintptr socketDescriptor, QObject *parent)
+    : QThread (parent)
+{
+    idx = -1;
+    ErrorCount[0] = 0x0000;
+    ErrorCount[1] = 0x0000;
+    WirelessSignal = 0xff;
+    keepcomm = false;
+    CmdList.clear();
+    this->SocketDescriptor = socketDescriptor;
+}
+
+SmartLightCommThread::~SmartLightCommThread()
+{
+    deleteLater();
+}
+
+QString SmartLightCommThread::deviceID()
+{
+    return DeviceID;
+}
+
+void SmartLightCommThread::run()
+{
+    QTcpSocket *so = new QTcpSocket;
+    if(!so->setSocketDescriptor(this->SocketDescriptor))
+    {
+        so->abort();
+        return;
+    }
+    WaitEcho = false;
+    WaitCount = 0;
+    DevType = -1;
+    DeviceID = "";
+    keepcomm = true;
+    err_count = 0;
+    while (keepcomm) {
+        if(so->state()!=QTcpSocket::ConnectedState){
+            close_self(so);
+            return;
+        }
+        if(so->waitForReadyRead(1000)){
+            WaitCount = 0;
+            readData(so);
+        }
+        if(CmdList.length()>0){
+            if(!WaitEcho){
+                QByteArray cmd = CmdList.first();
+                so->write(cmd);
+                so->flush();
+                CmdList.removeFirst();
+                QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+                        .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+                for(int i=0;i<cmd.length();i++){
+                    Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
+                }
+                emit CommData(DeviceID, 2, Data);
+                WaitCount = 0;
+            }
+        }
+        if(WaitEcho)
+            WaitCount++;
+        if(WaitCount>30)
+            WaitEcho=false;
+        usleep(100000);
+    }
+}
+
+quint16 SmartLightCommThread::chk_crcc(QByteArray buff, int len)
+{
+    quint16 default_data = 0xa001;
+    quint16 crc = 0xffff;
+    for(int j=0;j<len;j++)
+    {
+        crc ^= static_cast<quint8>(buff[j]&0xff);
+        for(int i=0;i<8;i++)
+        {
+            if(crc&0x01)
+            {
+                crc >>= 1;
+                crc ^= default_data;
+            }else
+                crc >>= 1;
+        }
+    }
+    return crc;
+}
+
+void SmartLightCommThread::mk_EventList_qry(QString deviceId, quint8 type, quint8 cur, quint8 num)
+{
+    UN_REFERENCED_PARAMETER(deviceId);
+    if((type==0x01)||(type==0x02)){
+        QDateTime dt = QDateTime::currentDateTime();
+        QByteArray body = QByteArray(21,0x00);
+        body[0] = static_cast<char>(ServerAddr1&0xff);
+        body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+        body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+        body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+        body[4] = static_cast<char>(ServerAddr0&0xff);
+        body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+        body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x0e);
+        body[9] = static_cast<char>(0xe0);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(type&0xff);
+        body[13] = static_cast<char>(0x00);
+        body[14] = static_cast<char>(cur&0xff);
+        body[15] = static_cast<char>(num&0xff);
+        body[16] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[17] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[18] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[19] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[20] = static_cast<char>(0x05);
+        QByteArray cmd = mkDataFrame(body);
+        CmdList.append(cmd);
+    }
+}
+
+int SmartLightCommThread::get_fp_byte(int num)
+{
+    if(num>0)
+        return  ((0x0100<<((num-1)&0x07))|(num>>3));
+    return 0;
+}
+
+quint8 SmartLightCommThread::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));
+}
+
+void SmartLightCommThread::mk_hisData_qry(QString deviceId, quint16 f_pno, quint16 f_fno, QDateTime t1, QDateTime t2, quint8 sep, quint8 num)
+{
+    UN_REFERENCED_PARAMETER(deviceId);
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(1,0x00);
+    if((f_fno==2)||(f_fno==9)){
+        body = QByteArray(22,0x00);
+    }else if((f_fno==1)||(f_fno==17)||(f_fno==18)||(f_fno==19)||(f_fno==20)||(f_fno==21)||(f_fno==22)){
+        body = QByteArray(26,0x00);
+    }else if((f_fno==41)||(f_fno==42)||(f_fno==43)||(f_fno==61)||(f_fno==62)){
+        body = QByteArray(29,0x00);
+    }
+    body[0] = static_cast<char>(ServerAddr1&0xff);
+    body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+    body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+    body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+    body[4] = static_cast<char>(ServerAddr0&0xff);
+    body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+    body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x0d);
+    body[9] = static_cast<char>(0xe0);
+    int pno = get_fp_byte(f_pno);
+    body[10] = static_cast<char>((pno>>8)&0xff);
+    body[11] = static_cast<char>(pno&0xff);
+    int fno = get_fp_byte(f_fno);
+    body[12] = static_cast<char>((fno>>8)&0xff);
+    body[13] = static_cast<char>(fno&0xff);
+    if(body.length()==22){
+        body[14] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[17] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[18] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[19] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[20] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[21] = static_cast<char>(0x05);
+    }else if(body.length()==26){
+        body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[19] = static_cast<char>(sep);
+        body[20] = static_cast<char>(num);
+        body[21] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[22] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[23] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[24] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[25] = static_cast<char>(0x05);
+    }else if(body.length()==29){
+        body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[19] = static_cast<char>((((t2.time().minute()/10)&0x0f)<<4)|((t2.time().minute()%10)&0x0f));
+        body[20] = static_cast<char>((((t2.time().hour()/10)&0x0f)<<4)|((t2.time().hour()%10)&0x0f));
+        body[21] = static_cast<char>((((t2.date().day()/10)&0x0f)<<4)|((t2.date().day()%10)&0x0f));
+        body[22] = static_cast<char>((((t2.date().month()/10)&0x0f)<<4)|((t2.date().month()%10)&0x0f));
+        body[23] = static_cast<char>((((t2.date().year()/10)&0x0f)<<4)|((t2.date().year()%10)&0x0f));
+        body[24] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[25] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[26] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[27] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[28] = static_cast<char>(0x05);
+    }
+    if(body.length()>1){
+        QByteArray cmd = mkDataFrame(body);
+        CmdList.append(cmd);
+    }
+}
+
+//复位命令
+void SmartLightCommThread::reset_command(QString deviceId)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(21,0x00);
+    body[0] = static_cast<char>(0x01);
+    body[1] = static_cast<char>(0x00);
+    body[2] = static_cast<char>(0x00);
+    body[3] = static_cast<char>(0x00);
+    body[4] = static_cast<char>(0x00);
+    body[5] = static_cast<char>(0x00);
+    body[6] = static_cast<char>(0x00);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x01);
+    body[9] = static_cast<char>(0xe0);
+    body[10] = static_cast<char>(0x00);
+    body[11] = static_cast<char>(0x00);
+    body[12] = static_cast<char>(0x01);
+    body[13] = static_cast<char>(0x00);
+    body[14] = static_cast<char>(0x01);
+    body[15] = static_cast<char>(0x00);
+    body[16] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+    body[17] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+    body[18] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+    body[19] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+    body[20] = static_cast<char>(0x05);
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//设置参数开关灯时间
+void SmartLightCommThread::request_set_parameters_command(QString deviceId, int parameterType, QString tmp)
+{
+    QJsonDocument document;
+    QJsonParseError err;
+    document = QJsonDocument::fromJson(tmp.toUtf8(), &err);
+    if (err.error != QJsonParseError::NoError){
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(tmp)
+                .arg(err.error);
+        emit CommData(DeviceID, 2, Data);
+        qDebug() << "Parse json " << tmp.toUtf8() << " error: " << err.error;
+        return;
+    }
+    QJsonArray data_list=document.array();
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==9){
+        body= QByteArray(22,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x01);
+        int ncount = data_list.size();
+        QJsonArray senddata;
+//        for (int j = 0; j < ncount; j++)
+//        {
+            QJsonValue name_value = data_list.at(0);
+            QJsonObject temp1 = name_value.toObject();
+            QJsonValue value = temp1.value("date");
+            QString studentname = value.toString();
+//        }
+        int month = studentname.mid(0, 2).toInt();
+        int day = studentname.mid(3, 2).toInt();
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(month)
+                .arg(day);
+        emit CommData(DeviceID, 2, Data);
+        QString hex1 = QString("%1").arg(month, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        QString hex2 = QString("%1").arg(day, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+        body[15] = static_cast<char>(Dat2[0]&0xff);
+        body[16] = static_cast<char>(0x01);
+        body[17] = static_cast<char>(0x00);
+        QString on_hour = temp1.value("on_hour").toString();
+        QString on_minute = temp1.value("on_minute").toString();
+        QString off_hour = temp1.value("off_hour").toString();
+        QString off_minute = temp1.value("off_minute").toString();
+        QTime on_time = QTime::fromString(on_hour+":"+on_minute,"hh:mm");
+        QTime off_time = QTime::fromString(off_hour+":"+off_minute,"hh:mm");
+        QByteArray Dat3 =mkB19time(on_time);
+        QByteArray Dat4 =mkB19time(off_time);
+        body[18] = static_cast<char>(Dat3[0]&0xff);
+        body[19] = static_cast<char>(Dat3[1]&0xff);
+        body[20] = static_cast<char>(Dat4[0]&0xff);
+        body[21] = static_cast<char>(Dat4[1]&0xff);
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//设置参数通信参数配置
+void SmartLightCommThread::request_set_parameters_communication_command(QString deviceId, int parameterType, int timeOut,int retransmissionsNumber, int realTimeData, int historicalData, int eventData, int heartbeatCycle)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==1){
+        body= QByteArray(18,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x00);
+        body[14] = static_cast<char>(((((timeOut%100)/10)&0x0f)<<4)|(((timeOut%100)%10)&0x0f));
+        body[15] = static_cast<char>(((retransmissionsNumber&0x0f)<<4)|((timeOut/100)&0x0f));
+        if(realTimeData==1&&historicalData==1&&eventData==1){
+            body[16] = static_cast<char>(0x07);
+        }else if(realTimeData==1&&historicalData==1&&eventData==0){
+            body[16] = static_cast<char>(0x03);
+        }else if(realTimeData==1&&historicalData==0&&eventData==1){
+            body[16] = static_cast<char>(0x05);
+        }else if(realTimeData==1&&historicalData==0&&eventData==0){
+            body[16] = static_cast<char>(0x01);
+        }else if(realTimeData==0&&historicalData==1&&eventData==1){
+            body[16] = static_cast<char>(0x06);
+        }else if(realTimeData==0&&historicalData==0&&eventData==1){
+            body[16] = static_cast<char>(0x04);
+        }else if(realTimeData==0&&historicalData==1&&eventData==0){
+            body[16] = static_cast<char>(0x02);
+        }else if(realTimeData==0&&historicalData==0&&eventData==0){
+            body[16] = static_cast<char>(0x00);
+        }
+        QString hex1 = QString("%1").arg(heartbeatCycle, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[17] = static_cast<char>(Dat1[0]&0xff);
+    }else if(parameterType==5){
+        body= QByteArray(19,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x10);
+        body[13] = static_cast<char>(0x00);
+        QString hex = QString("%1").arg(timeOut, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString hex1 = QString("%1").arg(retransmissionsNumber, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        QString hex2 = QString("%1").arg(realTimeData, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        QString hex3 = QString("%1").arg(historicalData, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        QString hex4 = QString("%1").arg(eventData, 2, 16, QChar('0'));
+        QByteArray Dat4 = QByteArray(1,0x00);
+        Dat4[0] = static_cast<char>(hexstr_to_byte(hex4)&0xff);
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat1[0]&0xff);
+        body[16] = static_cast<char>(Dat2[0]&0xff);
+        body[17] = static_cast<char>(Dat3[0]&0xff);
+        body[18] = static_cast<char>(Dat4[0]&0xff);
+    }else if(parameterType==11){
+        body= QByteArray(21,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x04);
+        body[13] = static_cast<char>(0x01);
+        QByteArray Dat =mkB08integer(timeOut);//DI
+        QByteArray Dat1 =mkB10integer(retransmissionsNumber);//AI
+        QByteArray Dat2 =mkB08integer(realTimeData);//智能表
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat[1]&0xff);
+        body[16] = static_cast<char>(Dat1[0]&0xff);
+        body[17] = static_cast<char>(Dat1[1]&0xff);
+        body[18] = static_cast<char>(Dat1[2]&0xff);
+        body[19] = static_cast<char>(Dat2[0]&0xff);
+        body[20] = static_cast<char>(Dat2[1]&0xff);
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//设置参数主站IP、控制回路
+void SmartLightCommThread::request_set_parameters_ip_command(QString deviceId, int parameterType, int address1,int address2, int address3, int address4, int port, QString apn)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==2){
+        body= QByteArray(36,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x00);
+        QString hex = QString("%1").arg(address1, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString hex1 = QString("%1").arg(address2, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        QString hex2 = QString("%1").arg(address3, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        QString hex3 = QString("%1").arg(address4, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat1[0]&0xff);
+        body[16] = static_cast<char>(Dat2[0]&0xff);
+        body[17] = static_cast<char>(Dat3[0]&0xff);
+        QString hex4 = QString("%1").arg(port, 4, 16, QChar('0'));
+        QString hex5 = hex4.mid(0, 2);
+        QString hex6 = hex4.mid(2, 2);
+        QByteArray Dat4 = QByteArray(2,0x00);
+        Dat4[0] = static_cast<char>(hexstr_to_byte(hex5)&0xff);
+        Dat4[1] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+        body[18] = static_cast<char>(Dat4[1]&0xff);
+        body[19] = static_cast<char>(Dat4[0]&0xff);
+    }else if(parameterType==12){
+        body= QByteArray(18,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x01);
+        QString bin1 = apn.mid(0, 8);
+        bool ok;
+        int c = bin1.toInt(&ok,2);//先转为10进制
+        QString d = QString("%1").arg(c,2,16,QLatin1Char('0')); //10进制转16进制
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(d)&0xff);
+        QString bin2 = apn.mid(8, 8);
+        bool ok1;
+        int c1 = bin2.toInt(&ok1,2);//先转为10进制
+        QString d1 = QString("%1").arg(c1,2,16,QLatin1Char('0')); //10进制转16进制
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(d1)&0xff);
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat1[0]&0xff);
+        QString hex2 = QString("%1").arg(address1, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        QString hex3 = QString("%1").arg(address2, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        body[16] = static_cast<char>(Dat2[0]&0xff);
+        body[17] = static_cast<char>(Dat3[0]&0xff);
+    }else if(parameterType==13||parameterType==19){
+        body= QByteArray(16+address3*11,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=address1%8;
+        int pn_int=(address1-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        if(address1==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(address1==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==13){
+            body[12] = static_cast<char>(0x10);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==19){
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x02);
+        }
+        QString hex2 = QString("%1").arg(address2, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        QString hex3 = QString("%1").arg(address3, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        body[14] = static_cast<char>(Dat2[0]&0xff);
+        body[15] = static_cast<char>(Dat3[0]&0xff);
+        QJsonDocument document;
+        QJsonParseError err;
+        document = QJsonDocument::fromJson(apn.toUtf8(), &err);
+        if (err.error != QJsonParseError::NoError){
+            QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(apn)
+                    .arg(err.error);
+            emit CommData(DeviceID, 2, Data);
+            qDebug() << "Parse json " << apn.toUtf8() << " error: " << err.error;
+            return;
+        }
+        QJsonArray data_list=document.array();
+        for (int j = 0; j < address3; j++)
+        {
+            QJsonValue name_value = data_list.at(j);
+            QJsonObject temp1 = name_value.toObject();
+            int configurationNumber = temp1.value("configuration_number").toInt();
+            QString hex4 = QString("%1").arg(configurationNumber, 2, 16, QChar('0'));
+            QByteArray Dat4 = QByteArray(1,0x00);
+            Dat4[0] = static_cast<char>(hexstr_to_byte(hex4)&0xff);
+            body[16+11*j] = static_cast<char>(Dat4[0]&0xff);
+            int operationMode = temp1.value("Operation_mode").toInt();
+            QString hex5 = QString("%1").arg(operationMode, 2, 16, QChar('0'));
+            QByteArray Dat5 = QByteArray(1,0x00);
+            Dat5[0] = static_cast<char>(hexstr_to_byte(hex5)&0xff);
+            body[17+11*j] = static_cast<char>(Dat5[0]&0xff);
+            int controlType = temp1.value("control_type").toInt();
+            QString hex6 = QString("%1").arg(controlType, 2, 16, QChar('0'));
+            QByteArray Dat6 = QByteArray(1,0x00);
+            Dat6[0] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+            body[18+11*j] = static_cast<char>(Dat6[0]&0xff);
+            int switchPosition = temp1.value("switch_position").toInt();
+            QString hex7 = QString("%1").arg(switchPosition, 2, 16, QChar('0'));
+            QByteArray Dat7 = QByteArray(1,0x00);
+            Dat7[0] = static_cast<char>(hexstr_to_byte(hex7)&0xff);
+            body[19+11*j] = static_cast<char>(Dat7[0]&0xff);
+            int relativeTime = temp1.value("relative_time").toInt();
+            QString hex8 = QString("%1").arg(relativeTime, 2, 16, QChar('0'));
+            QByteArray Dat8 = QByteArray(1,0x00);
+            Dat8[0] = static_cast<char>(hexstr_to_byte(hex8)&0xff);
+            body[20+11*j] = static_cast<char>(Dat8[0]&0xff);
+            QString absoluteTime = temp1.value("absolute_time").toString();
+            QDateTime time = QDateTime::fromString(absoluteTime, "yyyy-MM-dd hh:mm:ss");
+            QByteArray Dat9 =mkB01datetime(time);
+            body[21+11*j] = static_cast<char>(Dat9[0]&0xff);
+            body[22+11*j] = static_cast<char>(Dat9[1]&0xff);
+            body[23+11*j] = static_cast<char>(Dat9[2]&0xff);
+            body[24+11*j] = static_cast<char>(Dat9[3]&0xff);
+            body[25+11*j] = static_cast<char>(Dat9[4]&0xff);
+            body[26+11*j] = static_cast<char>(Dat9[5]&0xff);
+        }
+    }else if(parameterType==20){
+        body= QByteArray(15+address2,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=address1%8;
+        int pn_int=(address1-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        if(address1==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(address1==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x02);
+        QString hex2 = QString("%1").arg(address2, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        body[14] = static_cast<char>(Dat2[0]&0xff);
+        QJsonDocument document;
+        QJsonParseError err;
+        document = QJsonDocument::fromJson(apn.toUtf8(), &err);
+        if (err.error != QJsonParseError::NoError){
+            QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(apn)
+                    .arg(err.error);
+            emit CommData(DeviceID, 2, Data);
+            qDebug() << "Parse json " << apn.toUtf8() << " error: " << err.error;
+            return;
+        }
+        QJsonObject data_list=document.object();
+        for (int j = 0; j < address3; j++)
+        {
+            QString s = QString::number(j+1, 10);
+            int groupNumber = data_list.value("group_number"+s).toInt();
+            QString hex3 = QString("%1").arg(groupNumber, 2, 16, QChar('0'));
+            QByteArray Dat3 = QByteArray(1,0x00);
+            Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+            body[15+j] = static_cast<char>(Dat3[0]&0xff);
+        }
+    }else if(parameterType==25){
+        body= QByteArray(16+address1*3,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x03);
+        QString hex2 = QString("%1").arg(address1, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        body[14] = static_cast<char>(Dat2[0]&0xff);
+        QString hex3 = QString("%1").arg(address2, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        body[15] = static_cast<char>(Dat3[0]&0xff);
+        QJsonDocument document;
+        QJsonParseError err;
+        document = QJsonDocument::fromJson(apn.toUtf8(), &err);
+        if (err.error != QJsonParseError::NoError){
+            QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(apn)
+                    .arg(err.error);
+            emit CommData(DeviceID, 2, Data);
+            qDebug() << "Parse json " << apn.toUtf8() << " error: " << err.error;
+            return;
+        }
+        QJsonArray data_list=document.array();
+        for (int j = 0; j < address1; j++)
+        {
+            QJsonValue name_value = data_list.at(j);
+            QJsonObject temp1 = name_value.toObject();
+            int portType = temp1.value("port_type").toInt();
+            QString hex4 = QString("%1").arg(portType, 2, 16, QChar('0'));
+            QByteArray Dat4 = QByteArray(1,0x00);
+            Dat4[0] = static_cast<char>(hexstr_to_byte(hex4)&0xff);
+            body[16+3*j] = static_cast<char>(Dat4[0]&0xff);
+            int linesIdentification = temp1.value("lines_identification").toInt();
+            int portWays = temp1.value("port_ways").toInt();
+            body[17+3*j] = static_cast<char>(((linesIdentification&0x01)<<7)|(portWays&0x0f));
+            int pointPhase = temp1.value("point_phase").toInt();
+            QString hex6 = QString("%1").arg(pointPhase, 2, 16, QChar('0'));
+            QByteArray Dat6 = QByteArray(1,0x00);
+            Dat6[0] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+            body[18+3*j] = static_cast<char>(Dat6[0]&0xff);
+        }
+    }else if(parameterType==26){
+        body= QByteArray(15+address1*12,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x03);
+        QString hex2 = QString("%1").arg(address1, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        body[14] = static_cast<char>(Dat2[0]&0xff);
+        QJsonDocument document;
+        QJsonParseError err;
+        document = QJsonDocument::fromJson(apn.toUtf8(), &err);
+        if (err.error != QJsonParseError::NoError){
+            QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(apn)
+                    .arg(err.error);
+            emit CommData(DeviceID, 2, Data);
+            qDebug() << "Parse json " << apn.toUtf8() << " error: " << err.error;
+            return;
+        }
+        QJsonArray data_list=document.array();
+        for (int j = 0; j < address1; j++)
+        {
+            QJsonValue name_value = data_list.at(j);
+            QJsonObject temp1 = name_value.toObject();
+            int enableIdentity = temp1.value("enable_identity").toInt();
+            QString hex3 = QString("%1").arg(enableIdentity, 2, 16, QChar('0'));
+            QByteArray Dat3 = QByteArray(1,0x00);
+            Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+            body[15+12*j] = static_cast<char>(Dat3[0]&0xff);
+            int portType = temp1.value("port_type").toInt();
+            QString hex4 = QString("%1").arg(portType, 2, 16, QChar('0'));
+            QByteArray Dat4 = QByteArray(1,0x00);
+            Dat4[0] = static_cast<char>(hexstr_to_byte(hex4)&0xff);
+            body[16+12*j] = static_cast<char>(Dat4[0]&0xff);
+            int linesIdentification = temp1.value("lines_identification").toInt();
+            int portWays = temp1.value("port_ways").toInt();
+            body[17+12*j] = static_cast<char>(((linesIdentification&0x01)<<7)|(portWays&0x0f));
+            int pointPhase = temp1.value("point_phase").toInt();
+            QString hex6 = QString("%1").arg(pointPhase, 2, 16, QChar('0'));
+            QByteArray Dat6 = QByteArray(1,0x00);
+            Dat6[0] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+            body[18+12*j] = static_cast<char>(Dat6[0]&0xff);
+            QString onUpperLimit = temp1.value("on_upper_limit").toString();
+            int onUpperLimitLength = onUpperLimit.length();
+            QString s = ".";
+            int onUpperLimitIntLength = onUpperLimit.indexOf(s);
+            float d;
+            int g;
+            if(onUpperLimitIntLength==-1){
+                if(onUpperLimitLength<=3){
+                    d=onUpperLimit.toFloat();
+                    g=0;
+                }else if(onUpperLimitLength>3&&onUpperLimitLength<=7){
+                    d=onUpperLimit.mid(0,3).toFloat();
+                    g=onUpperLimitLength-3;
+                }else if(onUpperLimitLength>7){
+                    d=onUpperLimit.mid(0,3).toFloat();
+                    g=4;
+                }
+            }else{
+                if(onUpperLimitIntLength==1){
+                   int onUpperIntLimit = onUpperLimit.mid(0,1).toInt();
+                   if(onUpperIntLimit==0){
+                       QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                       d = str.toFloat();
+                       g=-3;
+                   }else{
+                       QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                       d = str.toFloat();
+                       g=-2;
+                   }
+                }else if(onUpperLimitIntLength==2){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=-1;
+                }else if(onUpperLimitIntLength==3){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=0;
+                }else if(onUpperLimitIntLength==4){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=1;
+                }else if(onUpperLimitIntLength==5){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=2;
+                }else if(onUpperLimitIntLength==6){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=3;
+                }else if(onUpperLimitIntLength==7){
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=4;
+                }else{
+                    QString str=QString("%1").arg(onUpperLimit.toFloat(),0,'G',3);
+                    d = str.toFloat();
+                    g=4;
+                }
+            }
+            d = onUpperLimitLength-onUpperLimitIntLength+1;
+        }
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//设置参数单灯事件检测配置参数
+void SmartLightCommThread::request_set_parameters_event_detection_command(QString deviceId, int parameterType, int excessiveCurrent,int excessiveCurrentRecovery,int lowCurrent, int lowCurrentRecovery, int capacitorFailure, int capacitorFailureRecovery, int lampFailure, int lampFailureRecovery, int fuseFailure, int fuseFailureRecovery)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==6){
+        body= QByteArray(26,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x44);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x20);
+        body[13] = static_cast<char>(0x00);
+        QString hex = QString("%1").arg(excessiveCurrent, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString hex1 = QString("%1").arg(excessiveCurrentRecovery, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        QString hex2 = QString("%1").arg(lowCurrent, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        QString hex3 = QString("%1").arg(lowCurrentRecovery, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        QString hex4 = QString("%1").arg(capacitorFailure, 4, 16, QChar('0'));
+        QString hex41 = hex4.mid(0, 2);
+        QString hex42 = hex4.mid(2, 2);
+        QByteArray Dat4 = QByteArray(2,0x00);
+        Dat4[0] = static_cast<char>(hexstr_to_byte(hex41)&0xff);
+        Dat4[1] = static_cast<char>(hexstr_to_byte(hex42)&0xff);
+        QString hex5 = QString("%1").arg(capacitorFailureRecovery, 4, 16, QChar('0'));
+        QString hex51 = hex5.mid(0, 2);
+        QString hex52 = hex5.mid(2, 2);
+        QByteArray Dat5 = QByteArray(2,0x00);
+        Dat5[0] = static_cast<char>(hexstr_to_byte(hex51)&0xff);
+        Dat5[1] = static_cast<char>(hexstr_to_byte(hex52)&0xff);
+        QString hex6 = QString("%1").arg(lampFailure, 2, 16, QChar('0'));
+        QByteArray Dat6 = QByteArray(1,0x00);
+        Dat6[0] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+        QString hex7 = QString("%1").arg(lampFailureRecovery, 2, 16, QChar('0'));
+        QByteArray Dat7 = QByteArray(1,0x00);
+        Dat7[0] = static_cast<char>(hexstr_to_byte(hex7)&0xff);
+        QString hex8 = QString("%1").arg(fuseFailure, 2, 16, QChar('0'));
+        QByteArray Dat8 = QByteArray(1,0x00);
+        Dat8[0] = static_cast<char>(hexstr_to_byte(hex8)&0xff);
+        QString hex9 = QString("%1").arg(fuseFailureRecovery, 2, 16, QChar('0'));
+        QByteArray Dat9 = QByteArray(1,0x00);
+        Dat9[0] = static_cast<char>(hexstr_to_byte(hex9)&0xff);
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat1[0]&0xff);
+        body[16] = static_cast<char>(Dat2[0]&0xff);
+        body[17] = static_cast<char>(Dat3[0]&0xff);
+        body[18] = static_cast<char>(Dat4[1]&0xff);
+        body[19] = static_cast<char>(Dat4[0]&0xff);
+        body[20] = static_cast<char>(Dat5[1]&0xff);
+        body[21] = static_cast<char>(Dat5[0]&0xff);
+        body[22] = static_cast<char>(Dat6[0]&0xff);
+        body[23] = static_cast<char>(Dat7[0]&0xff);
+        body[24] = static_cast<char>(Dat8[0]&0xff);
+        body[25] = static_cast<char>(Dat9[0]&0xff);
+    }
+        QByteArray cmd = resetDataFrame(body);
+        CmdList.append(cmd);
+}
+
+//控制命令开关灯
+void SmartLightCommThread::request_control_command(QString deviceId, int parameterType, int pn, int controlType, int economizeGear)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==2||parameterType==1||parameterType==3||parameterType==9){
+        body= QByteArray(16,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(controlType)
+                .arg(economizeGear);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==1){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x00);
+        }else if(parameterType==2){
+            body[12] = static_cast<char>(0x02);
+            body[13] = static_cast<char>(0x00);
+        }else if(parameterType==3){
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x00);
+        }else if(parameterType==9){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x01);
+        }
+        if(controlType==3){
+            QString hex1 = QString("%1").arg(controlType, 2, 16, QChar('0'));
+            QByteArray Dat1 = QByteArray(1,0x00);
+            Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+            QString hex2 = QString("%1").arg(economizeGear, 2, 16, QChar('0'));
+            QByteArray Dat2 = QByteArray(1,0x00);
+            Dat2[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+            body[14] = static_cast<char>(Dat1[0]&0xff);
+            body[15] = static_cast<char>(Dat2[0]&0xff);
+        }else{
+            QString hex1 = QString("%1").arg(controlType, 2, 16, QChar('0'));
+            QByteArray Dat1 = QByteArray(1,0x00);
+            Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+            body[14] = static_cast<char>(Dat1[0]&0xff);
+            body[15] = static_cast<char>(0x00);
+        }
+    }else if(parameterType==10||parameterType==11){//单灯控制器复位
+        body= QByteArray(15,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(controlType)
+                .arg(economizeGear);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==10){
+            body[12] = static_cast<char>(0x02);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==11){
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x01);
+        }
+        QString hex1 = QString("%1").arg(controlType, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+    }
+
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//控制命令单灯预约
+void SmartLightCommThread::request_control_command_appointment(QString deviceId, int parameterType, int pn,int configure, int controlType, int economizeGear,QString control_time)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==12||parameterType==13||parameterType==17){
+        body= QByteArray(23,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(controlType)
+                .arg(economizeGear);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==12){
+            body[12] = static_cast<char>(0x08);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==13){
+            body[12] = static_cast<char>(0x10);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==17){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x02);
+        }
+        QString hex1 = QString("%1").arg(configure, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+        QDateTime time = QDateTime::fromString(control_time, "yyyy-MM-dd hh:mm:ss");
+        QByteArray Dat2 =mkB01datetime(time);
+        body[15] = static_cast<char>(Dat2[0]&0xff);
+        body[16] = static_cast<char>(Dat2[1]&0xff);
+        body[17] = static_cast<char>(Dat2[2]&0xff);
+        body[18] = static_cast<char>(Dat2[3]&0xff);
+        body[19] = static_cast<char>(Dat2[4]&0xff);
+        body[20] = static_cast<char>(Dat2[5]&0xff);
+        QString hex3 = QString("%1").arg(controlType, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex3)&0xff);
+        body[21] = static_cast<char>(Dat3[0]&0xff);
+        QString hex4 = QString("%1").arg(economizeGear, 2, 16, QChar('0'));
+        QByteArray Dat4 = QByteArray(1,0x00);
+        Dat4[0] = static_cast<char>(hexstr_to_byte(hex4)&0xff);
+        body[22] = static_cast<char>(Dat4[0]&0xff);
+    }else if(parameterType==14||parameterType==15||parameterType==18){
+        body= QByteArray(15,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(controlType)
+                .arg(economizeGear);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==14){
+            body[12] = static_cast<char>(0x20);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==15){
+            body[12] = static_cast<char>(0x40);
+            body[13] = static_cast<char>(0x01);
+        }else if(parameterType==18){
+            body[12] = static_cast<char>(0x02);
+            body[13] = static_cast<char>(0x02);
+        }
+        QString hex1 = QString("%1").arg(configure, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+    }
+
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//控制命令对时命令
+void SmartLightCommThread::request_control_command_time(QString deviceId, int parameterType, QString control_time)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==31){
+        body= QByteArray(20,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x40);
+        body[13] = static_cast<char>(0x03);
+        QDateTime time = QDateTime::fromString(control_time, "yyyy-MM-dd hh:mm:ss");
+        QByteArray Dat =mkB01datetime(time);
+        body[14] = static_cast<char>(Dat[0]&0xff);
+        body[15] = static_cast<char>(Dat[1]&0xff);
+        body[16] = static_cast<char>(Dat[2]&0xff);
+        body[17] = static_cast<char>(Dat[3]&0xff);
+        body[18] = static_cast<char>(Dat[4]&0xff);
+        body[19] = static_cast<char>(Dat[5]&0xff);
+    }
+
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//控制命令无参数
+void SmartLightCommThread::request_control_command_no_parameters(QString deviceId, int parameterType)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==4){
+        body= QByteArray(14,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x45);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x00);
+    }
+
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//请求实时数据命令无参数
+void SmartLightCommThread::request_real_time_data_command(QString deviceId,int parameterType)
+{
+    QString Data = QString("[ %1 %2 %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg("12345678")
+            .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+    emit CommData(DeviceID, 2, Data);
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(14,0x00);
+    body[0] = static_cast<char>(0x00);
+    body[1] = static_cast<char>(0x09);
+    body[2] = static_cast<char>(0x00);
+    body[3] = static_cast<char>(0x00);
+    body[4] = static_cast<char>(0x00);
+    body[5] = static_cast<char>(0x00);
+    body[6] = static_cast<char>(0x00);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x4C);
+    if(parameterType==2){
+        body[9] = static_cast<char>(0x73);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==3){
+        body[9] = static_cast<char>(0x74);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x04);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==4){
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==25){
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x03);
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//请求实时数据命令参数
+void SmartLightCommThread::request_real_time_data_command2(QString deviceId, int parameterType, int pn, int queryNumber, int startPoint)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==9){
+        body= QByteArray(14,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4C);
+        body[9] = static_cast<char>(0x76);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(Dat[0]&0xff)
+                .arg(Dat[0]&0xff);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x01);
+    }else if(parameterType==10){
+        body= QByteArray(14,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4C);
+        body[9] = static_cast<char>(0x76);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(Dat[0]&0xff)
+                .arg(Dat[0]&0xff);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x01);
+    }else if(parameterType==11){
+        body= QByteArray(16,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4C);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x04);
+        body[13] = static_cast<char>(0x01);
+        if(startPoint>255){
+            if(queryNumber>120){
+                body[14] = static_cast<char>(0x0A);
+                body[15] = static_cast<char>(0xFF);
+            }else{
+                QString hex = QString("%1").arg(queryNumber, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                body[14] = static_cast<char>(Dat[0]&0xff);
+                body[15] = static_cast<char>(0xFF);
+            }
+        }else{
+            if(queryNumber>120){
+                QString hex = QString("%1").arg(startPoint, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                body[14] = static_cast<char>(0x0A);
+                body[15] = static_cast<char>(Dat[0]&0xff);
+            }else{
+                QString hex = QString("%1").arg(queryNumber, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                QString hex1 = QString("%1").arg(startPoint, 2, 16, QChar('0'));
+                QByteArray Dat1 = QByteArray(1,0x00);
+                Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+                body[14] = static_cast<char>(Dat[0]&0xff);
+                body[15] = static_cast<char>(Dat1[0]&0xff);
+            }
+        }
+    }else if(parameterType==12){
+        body= QByteArray(16,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4C);
+        body[9] = static_cast<char>(0x75);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x01);
+        if(startPoint>255){
+            if(queryNumber>120){
+                body[14] = static_cast<char>(0x0A);
+                body[15] = static_cast<char>(0xFF);
+            }else{
+                QString hex = QString("%1").arg(queryNumber, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                body[14] = static_cast<char>(Dat[0]&0xff);
+                body[15] = static_cast<char>(0xFF);
+            }
+        }else{
+            if(queryNumber>120){
+                QString hex = QString("%1").arg(startPoint, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                body[14] = static_cast<char>(0x0A);
+                body[15] = static_cast<char>(Dat[0]&0xff);
+            }else{
+                QString hex = QString("%1").arg(queryNumber, 2, 16, QChar('0'));
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+                QString hex1 = QString("%1").arg(startPoint, 2, 16, QChar('0'));
+                QByteArray Dat1 = QByteArray(1,0x00);
+                Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+                body[14] = static_cast<char>(Dat[0]&0xff);
+                body[15] = static_cast<char>(Dat1[0]&0xff);
+            }
+        }
+    }else if(parameterType==17||parameterType==33||parameterType==34||parameterType==35||parameterType==36||parameterType==37||parameterType==38||parameterType==39||parameterType==100){
+        body= QByteArray(14,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4C);
+        body[9] = static_cast<char>(0x76);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(Dat[0]&0xff)
+                .arg(Dat[0]&0xff);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==17){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==33){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==34){
+            body[12] = static_cast<char>(0x02);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==35){
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==36){
+            body[12] = static_cast<char>(0x08);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==37){
+            body[12] = static_cast<char>(0x10);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==38){
+            body[12] = static_cast<char>(0x20);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==39){
+            body[12] = static_cast<char>(0x40);
+            body[13] = static_cast<char>(0x04);
+        }else if(parameterType==100){
+            body[12] = static_cast<char>(0x08);
+            body[13] = static_cast<char>(0x0C);
+        }
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//请求历史数据
+void SmartLightCommThread::request_historical_data_command(QString deviceId, int parameterType, int pn, int dataFreezingDensity, int dataPoints,QString start_time)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==1||parameterType==17||parameterType==18||parameterType==19||parameterType==20||parameterType==21||parameterType==22){
+        body = QByteArray(21,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4D);
+        body[9] = static_cast<char>(0x76);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(Dat[0]&0xff)
+                .arg(Dat[0]&0xff);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==1){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x00);
+        }else if(parameterType==17){
+            body[12] = static_cast<char>(0x01);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==18){
+            body[12] = static_cast<char>(0x02);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==19){
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==20){
+            body[12] = static_cast<char>(0x08);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==21){
+            body[12] = static_cast<char>(0x10);
+            body[13] = static_cast<char>(0x02);
+        }else if(parameterType==22){
+            body[12] = static_cast<char>(0x20);
+            body[13] = static_cast<char>(0x02);
+        }
+        QDateTime time = QDateTime::fromString(start_time, "yyyy-MM-dd hh:mm:ss");
+        QByteArray Dat1 =mkB15datetime(time);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+        body[15] = static_cast<char>(Dat1[1]&0xff);
+        body[16] = static_cast<char>(Dat1[2]&0xff);
+        body[17] = static_cast<char>(Dat1[3]&0xff);
+        body[18] = static_cast<char>(Dat1[4]&0xff);
+        QString hex1 = QString("%1").arg(dataFreezingDensity, 2, 16, QChar('0'));
+        QByteArray Dat2 = QByteArray(1,0x00);
+        Dat2[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[19] = static_cast<char>(Dat2[0]&0xff);
+        QString hex2 = QString("%1").arg(dataPoints, 2, 16, QChar('0'));
+        QByteArray Dat3 = QByteArray(1,0x00);
+        Dat3[0] = static_cast<char>(hexstr_to_byte(hex2)&0xff);
+        body[20] = static_cast<char>(Dat3[0]&0xff);
+    }else if(parameterType==2){
+        body = QByteArray(17,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4D);
+        body[9] = static_cast<char>(0x76);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x00);
+        QDate date = QDate::fromString(start_time, "yyyy-MM-dd");
+        QByteArray Dat1 =mkB20date(date);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+        body[15] = static_cast<char>(Dat1[1]&0xff);
+        body[16] = static_cast<char>(Dat1[2]&0xff);
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//请求事件数据
+void SmartLightCommThread::request_event_data_command(QString deviceId, int parameterType, int pm, int pn)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(16,0x00);
+    body[0] = static_cast<char>(0x00);
+    body[1] = static_cast<char>(0x09);
+    body[2] = static_cast<char>(0x00);
+    body[3] = static_cast<char>(0x00);
+    body[4] = static_cast<char>(0x00);
+    body[5] = static_cast<char>(0x00);
+    body[6] = static_cast<char>(0x00);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x4E);
+    body[9] = static_cast<char>(0x76);
+    body[10] = static_cast<char>(0x00);
+    body[11] = static_cast<char>(0x00);
+    if(parameterType==1){
+        body[12] = static_cast<char>(0x01);
+    }else if(parameterType==2){
+        body[12] = static_cast<char>(0x02);
+    }
+    body[13] = static_cast<char>(0x00);
+    QString hex = QString("%1").arg(pm, 2, 16, QChar('0'));
+    QByteArray Dat = QByteArray(1,0x00);
+    Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+    body[14] = static_cast<char>(Dat[0]&0xff);
+    QString hex1 = QString("%1").arg(pn, 2, 16, QChar('0'));
+    QByteArray Dat1 = QByteArray(1,0x00);
+    Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+    body[15] = static_cast<char>(Dat1[0]&0xff);
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//查询参数控制器开关灯时间参数命令
+void SmartLightCommThread::query_parameters_commandf9(QString deviceId,int parameterType)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(18,0x00);
+    body[0] = static_cast<char>(0x00);
+    body[1] = static_cast<char>(0x09);
+    body[2] = static_cast<char>(0x00);
+    body[3] = static_cast<char>(0x00);
+    body[4] = static_cast<char>(0x00);
+    body[5] = static_cast<char>(0x00);
+    body[6] = static_cast<char>(0x00);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x4A);
+    body[9] = static_cast<char>(0x76);
+    body[10] = static_cast<char>(0x00);
+    body[11] = static_cast<char>(0x00);
+    body[12] = static_cast<char>(0x01);
+    body[13] = static_cast<char>(0x01);
+    body[14] = static_cast<char>(0x01);
+    body[15] = static_cast<char>(0x01);
+    body[16] = static_cast<char>(0x00);
+    body[17] = static_cast<char>(0x0a);
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//查询参数命令带参数
+void SmartLightCommThread::query_parameters_command_parameter(QString deviceId,int parameterType,int pn,int number,QString dataList)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body;
+    if(parameterType==13||parameterType==19||parameterType==20){
+        body= QByteArray(14,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4A);
+        body[9] = static_cast<char>(0x76);
+        int pn_re=pn%8;
+        int pn_int=(pn-pn_re)/8+1;
+        QString hex = QString("%1").arg(pn_int, 2, 16, QChar('0'));
+        QByteArray Dat = QByteArray(1,0x00);
+        Dat[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+        QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(Dat[0]&0xff)
+                .arg(Dat[0]&0xff);
+        emit CommData(DeviceID, 2, Data);
+        if(pn==0){
+            body[10] = static_cast<char>(0x00);
+            body[11] = static_cast<char>(0x00);
+        }else{
+            if(pn_re==1){
+                body[10] = static_cast<char>(0x01);
+            }else if(pn_re==2){
+                body[10] = static_cast<char>(0x02);
+            }else if(pn_re==3){
+                body[10] = static_cast<char>(0x04);
+            }else if(pn_re==4){
+                body[10] = static_cast<char>(0x08);
+            }else if(pn_re==5){
+                body[10] = static_cast<char>(0x10);
+            }else if(pn_re==6){
+                body[10] = static_cast<char>(0x20);
+            }else if(pn_re==7){
+                body[10] = static_cast<char>(0x40);
+            }else if(pn_re==0){
+                body[10] = static_cast<char>(0x80);
+            }
+            if(pn==8){
+                body[11] = static_cast<char>(0x01);
+            }else{
+                body[11] = static_cast<char>(Dat[0]&0xff);
+            }
+        }
+        if(parameterType==13){
+            body[12] = static_cast<char>(0x10);
+            body[13] = static_cast<char>(0x01);
+        }else if (parameterType==19) {
+            body[12] = static_cast<char>(0x04);
+            body[13] = static_cast<char>(0x02);
+        }else if (parameterType==20) {
+            body[12] = static_cast<char>(0x08);
+            body[13] = static_cast<char>(0x02);
+        }
+    }else if(parameterType==17){
+        body= QByteArray(15+2*number,0x00);
+        body[0] = static_cast<char>(0x00);
+        body[1] = static_cast<char>(0x09);
+        body[2] = static_cast<char>(0x00);
+        body[3] = static_cast<char>(0x00);
+        body[4] = static_cast<char>(0x00);
+        body[5] = static_cast<char>(0x00);
+        body[6] = static_cast<char>(0x00);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x4A);
+        body[9] = static_cast<char>(0x76);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x02);
+        QString hex1 = QString("%1").arg(number, 2, 16, QChar('0'));
+        QByteArray Dat1 = QByteArray(1,0x00);
+        Dat1[0] = static_cast<char>(hexstr_to_byte(hex1)&0xff);
+        body[14] = static_cast<char>(Dat1[0]&0xff);
+        QJsonDocument document;
+        QJsonParseError err;
+        document = QJsonDocument::fromJson(dataList.toUtf8(), &err);
+        if (err.error != QJsonParseError::NoError){
+            QString Data = QString("[ %1 %2 +++++++++ %3 >>>>>>>>>>>>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(dataList)
+                    .arg(err.error);
+            emit CommData(DeviceID, 2, Data);
+            qDebug() << "Parse json " << dataList.toUtf8() << " error: " << err.error;
+            return;
+        }
+        QJsonArray data_list=document.array();
+        for (int j = 0; j < number; j++)
+        {
+            QJsonValue name_value = data_list.at(j);
+            QJsonObject temp1 = name_value.toObject();
+            int serialNumber = temp1.value("serial_number").toInt();
+            QString hex4 = QString("%1").arg(serialNumber, 4, 16, QChar('0'));
+            QString hex5 = hex4.mid(0,2);
+            QString hex6 = hex4.mid(2,2);
+            QByteArray Dat4 = QByteArray(2,0x00);
+            Dat4[0] = static_cast<char>(hexstr_to_byte(hex5)&0xff);
+            Dat4[1] = static_cast<char>(hexstr_to_byte(hex6)&0xff);
+            body[15+2*j] = static_cast<char>(Dat4[0]&0xff);
+            body[16+2*j] = static_cast<char>(Dat4[1]&0xff);
+        }
+    }
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+//查询参数命令
+void SmartLightCommThread::query_parameters_command(QString deviceId,int parameterType, int pseq)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(14,0x00);
+    body[0] = static_cast<char>(0x00);
+    body[1] = static_cast<char>(0x09);
+    body[2] = static_cast<char>(0x00);
+    body[3] = static_cast<char>(0x00);
+    body[4] = static_cast<char>(0x00);
+    body[5] = static_cast<char>(0x00);
+    body[6] = static_cast<char>(0x00);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x4A);
+    QString hex1 = QString("%1").arg(pseq, 1, 16);
+    QString hex = QString("%1%2").arg(7).arg(hex1);
+    QByteArray Dat1 = QByteArray(1,0x00);
+    Dat1[0] = static_cast<char>(hexstr_to_byte(hex)&0xff);
+    body[9] = static_cast<char>(Dat1[0]&0xff);
+    if(parameterType==1){//终端上行通信口通信参数设置
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x01);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==2){//主站IP地址和端口
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x02);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==3){//终端事件记录配置设置
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x04);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==4){//设备基本信息
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==5){//终端事件检测配置参数
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x10);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==6){//单灯事件检测配置参数
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x20);
+        body[13] = static_cast<char>(0x00);
+    }else if(parameterType==11){//信息量检测间隔时间参数
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x04);
+        body[13] = static_cast<char>(0x01);
+    }else if(parameterType==12){//控制回路参数
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x08);
+        body[13] = static_cast<char>(0x01);
+    }else if(parameterType==88){//防盗通道配置
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(0x80);
+        body[13] = static_cast<char>(0x0A);
+    }
+
+    QByteArray cmd = resetDataFrame(body);
+    CmdList.append(cmd);
+}
+
+QByteArray SmartLightCommThread::resetDataFrame(QByteArray body){
+    QByteArray data = QByteArray(body.length()+9,0x00);
+    int len = body.length();
+    data[0] = static_cast<char>(0x68);
+    data[1] = static_cast<char>(len&0xff);
+    data[2] = static_cast<char>((len>>8)&0xff);
+    data[3] = static_cast<char>(len&0xff);
+    data[4] = static_cast<char>((len>>8)&0xff);
+    data[5] = static_cast<char>(0x68);
+    data[6] = static_cast<char>(0x00);
+    data[7] = static_cast<char>(0x09);
+    data[8] = static_cast<char>(0x00);
+    data[9] = static_cast<char>(0x00);
+    data[10] = static_cast<char>(0x00);
+    data[11] = static_cast<char>(0x00);
+    data[12] = static_cast<char>(0x00);
+    data[13] = static_cast<char>(0x00);
+    for(int i=8;i<body.length();i++)
+        data[6+i] = static_cast<char>(body.at(i)&0xff);
+    quint16 crc = chk_crcc(data.mid(6,len),len);
+    data[data.length()-3] = static_cast<char>(crc&0xff);
+    data[data.length()-2] = static_cast<char>((crc>>8)&0xff);
+    data[data.length()-1] = static_cast<char>(0x16);
+    return data;
+}
+
+void SmartLightCommThread::confirm_report(QTcpSocket *so)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(20,0x00);
+    body[0] = static_cast<char>(ServerAddr1&0xff);
+    body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+    body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+    body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+    body[4] = static_cast<char>(ServerAddr0&0xff);
+    body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+    body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x00);
+    body[9] = static_cast<char>(0xe0);
+    body[10] = static_cast<char>(0x00);
+    body[11] = static_cast<char>(0x00);
+    body[12] = static_cast<char>(0x01);
+    body[13] = static_cast<char>(0x00);
+    body[14] = static_cast<char>(0x00);
+    body[15] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+    body[16] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+    body[17] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+    body[18] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+    body[19] = static_cast<char>(0x05);
+    QByteArray cmd = mkDataFrame(body);
+    so->write(cmd);
+    so->flush();
+    QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+            .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+    for(int i=0;i<cmd.length();i++){
+        Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit CommData(DeviceID, 2, Data);
+}
+
+QByteArray SmartLightCommThread::mkDataFrame(QByteArray body){
+    QByteArray data = QByteArray(body.length()+9,0x00);
+    int len = body.length();
+    data[0] = static_cast<char>(0x68);
+    data[1] = static_cast<char>(len&0xff);
+    data[2] = static_cast<char>((len>>8)&0xff);
+    data[3] = static_cast<char>(len&0xff);
+    data[4] = static_cast<char>((len>>8)&0xff);
+    data[5] = static_cast<char>(0x68);
+    data[6] = static_cast<char>(ServerAddr1&0xff);
+    data[7] = static_cast<char>((ServerAddr1>>8)&0xff);
+    data[8] = static_cast<char>((ServerAddr1>>16)&0xff);
+    data[9] = static_cast<char>((ServerAddr1>>24)&0xff);
+    data[10] = static_cast<char>(ServerAddr0&0xff);
+    data[11] = static_cast<char>((ServerAddr0>>8)&0xff);
+    data[12] = static_cast<char>((ServerAddr0>>16)&0xff);
+    data[13] = static_cast<char>(0x00);
+    for(int i=8;i<body.length();i++)
+        data[6+i] = static_cast<char>(body.at(i)&0xff);
+    quint16 crc = chk_crcc(data.mid(6,len),len);
+    data[data.length()-3] = static_cast<char>(crc&0xff);
+    data[data.length()-2] = static_cast<char>((crc>>8)&0xff);
+    data[data.length()-1] = static_cast<char>(0x16);
+    return data;
+}
+
+float SmartLightCommThread::get_repValue(int type, QByteArray dat)
+{
+    switch (type) {
+    case 0x01:
+        if(dat.length()==2){
+            return static_cast<float>(((dat.at(1)&0xf0)>>4)*100
+                    +(dat.at(1)&0x0f)*10
+                    +((dat.at(0)&0xf0)>>4)
+                    +(dat.at(0)&0x0f)*0.1);
+        }
+        break;
+    case 0x02:
+        if(dat.length()==3){
+            return static_cast<float>((((dat.at(2)&0x80)==0x80)?-1:1)
+                                      *(((dat.at(2)&0x70)>>4)*100
+                                        +(dat.at(2)&0x0f)*10
+                                        +((dat.at(1)&0xf0)>>4)
+                                        +((dat.at(1)&0x0f)*0.1)
+                                        +(((dat.at(0)&0xf0)>>4)*0.01)
+                                        +((dat.at(0)&0x0f)*0.001)));
+        }
+        break;
+    case 0x03:
+    case 0x05:
+    case 0x07:
+        if(dat.length()==2){
+            int d = (((dat.at(1)&0x10)==0x10)?-1:1)
+                    *((dat.at(1)&0x0f)*100+((dat.at(0)&0xf0)>>4)*10+(dat.at(0)&0x0f));
+            switch ((dat.at(1)>>5)&0x07) {
+            case 0x00:
+                return static_cast<float>(d*10000);
+                break;
+            case 0x01:
+                return static_cast<float>(d*1000);
+                break;
+            case 0x02:
+                return static_cast<float>(d*100);
+                break;
+            case 0x03:
+                return static_cast<float>(d*10);
+                break;
+            case 0x04:
+                return static_cast<float>(d);
+                break;
+            case 0x05:
+                return static_cast<float>(d*0.1);
+                break;
+            case 0x06:
+                return static_cast<float>(d*0.01);
+                break;
+            case 0x07:
+                return static_cast<float>(d*0.001);
+                break;
+            }
+        }
+        break;
+    case 0x04:
+    case 0x06:
+    case 0x08:
+        if(dat.length()==2){
+            return static_cast<float>((((dat.at(1)&0x80)==0x80)?-1:1)
+                                      *(((dat.at(1)&0x70)>>4)*100
+                                        +(dat.at(1)&0x0f)*10
+                                        +((dat.at(0)&0xf0)>>4)
+                                        +((dat.at(0)&0x0f)*0.1)));
+        }
+        break;
+    }
+    return static_cast<float>(0.0);
+}
+
+bool SmartLightCommThread::checkDataBody(QTcpSocket *so, QByteArray body)
+{
+    int ud_cur=0;
+    int len = body.length();
+    quint8 f_dir=0x00;
+    quint8 f_prm=0x00;
+    quint8 f_afn=0x00;
+    quint8 f_seq=0x00;
+    quint8 f_con=0x00;
+    quint8 f_fin=0x00;
+    quint8 f_fir=0x00;
+    quint8 f_tpv=0x00;
+    quint16 f_dlen=0x0000;
+    quint16 f_prof=0x0000;
+    quint16 f_sn=0x0000;
+    quint16 f_pno=0x0000;
+    quint16 f_fno=0x0000;
+    if(DevType==0x00){
+        ud_cur = 8;
+    }else{
+        f_prof = (body.at(ud_cur+0)&0x00ff)|((body.at(ud_cur+1)&0x00ff)<<8);
+        f_sn = (body.at(ud_cur+2)&0x00ff)|((body.at(ud_cur+3)&0x00ff)<<8);
+        ud_cur =12;
+    }
+    f_dir = (body.at(ud_cur+0)&0x80)>>7;
+    f_prm = (body.at(ud_cur+0)&0x40)>>6;
+    f_afn = body.at(ud_cur+0)&0x1f;
+    f_seq = body.at(ud_cur+1)&0x0f;
+    f_con = (body.at(ud_cur+1)&0x10)>>4;
+    f_fin = (body.at(ud_cur+1)&0x20)>>5;
+    f_fir = (body.at(ud_cur+1)&0x40)>>6;
+    f_tpv = (body.at(ud_cur+1)&0x80)>>7;
+    f_pno = (body.at(ud_cur+3)&0x00ff)*8;
+    for(int i=0;i<8;i++){
+        int bit = 0x01<<i;
+        if((body.at(ud_cur+2)&bit)==bit){
+            f_pno += (i+1);
+            break;
+        }
+    }
+    f_fno = (body.at(ud_cur+5)&0x00ff)*8;
+    for(int i=0;i<8;i++){
+        int bit = 0x01<<i;
+        if((body.at(ud_cur+4)&bit)==bit){
+            f_fno += (i+1);
+            break;
+        }
+    }
+    switch (f_afn) {
+    case 0x00://确认、否认
+        if(f_pno==0){
+            QString response_type = "";
+            if(f_fno==1){//全部确认
+                response_type="全部确认";
+            }else if(f_fno==2){//全部否认
+                response_type="全部否认";
+            }else if(f_fno==3){//按数据单元标识确认和否认
+                response_type="按数据单元标识确认和否认";
+            }else if(f_fno==4){//安全认证错误应答
+                response_type="安全认证错误应答";
+            }
+            QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tresponse_type:%14")
+                    .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(response_type);
+            emit CommData(DeviceID, 1, o_Data);
+        }
+        break;
+    case 0x01://复位
+        if(f_pno==0){
+            if(f_fno==1){//终端复位
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==2){//上行通信重连指令
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==3){//终端模块复位
+                f_dlen=5;
+                if(len>=(ud_cur+6+3)){
+                    ErrorCount[0] = body.at(ud_cur+7)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+8)&0xff;
+                    WirelessSignal = body.at(ud_cur+6)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }
+            QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13")
+                    .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal);
+            emit CommData(DeviceID, 1, o_Data);
+        }
+        break;
+    case 0x02://链路接口检测
+        if(f_pno==0){
+            if(f_fno==1){//登录
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==2){//退出
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==3){//心跳
+                f_dlen=5;
+                if(len>=(ud_cur+6+3)){
+                    ErrorCount[0] = body.at(ud_cur+7)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+8)&0xff;
+                    WirelessSignal = body.at(ud_cur+6)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }
+            QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13")
+                    .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal);
+            emit CommData(DeviceID, 1, o_Data);
+        }
+        break;
+    case 0x04://设置参数
+        break;
+    case 0x05://控制命令
+        break;
+    case 0x09://请求终端配置
+        break;
+    case 0x0a://查询参数
+        if(f_pno==0){
+            if(f_fno==1){
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(body.at(ud_cur+6));
+                QString over_time1(Dat.toHex());
+//                QString over_time1 = QString::fromUtf8(Dat);
+                QString over_time2 = QString("%1").arg(body.at(ud_cur+7)&0x0f);
+                QString over_time3 = "0x0"+over_time2+over_time1;
+//                QByteArray Dat1 = QByteArray(1,0x0000);
+//                Dat1[0] = static_cast<char>(hexstr_to_byte(over_time3)&0xffff);
+                int over_time = over_time3.toInt(NULL, 16);
+                int retransmission = (body.at(ud_cur+7)&0xf0)>>4;
+                int anasta = (body.at(ud_cur+8)&0xff);
+                int realTimeData=0;
+                int historicalData=0;
+                int eventData =0;
+                if(anasta==0x00){
+                    realTimeData=0;
+                    historicalData=0;
+                    eventData=0;
+                }else if(anasta==0x01){
+                    realTimeData=1;
+                    historicalData=0;
+                    eventData=0;
+                }else if(anasta==0x02){
+                    realTimeData=0;
+                    historicalData=1;
+                    eventData=0;
+                }else if(anasta==0x03){
+                    realTimeData=1;
+                    historicalData=1;
+                    eventData=0;
+                }else if(anasta==0x04){
+                    realTimeData=0;
+                    historicalData=0;
+                    eventData=1;
+                }else if(anasta==0x05){
+                    realTimeData=1;
+                    historicalData=0;
+                    eventData=1;
+                }else if(anasta==0x06){
+                    realTimeData=0;
+                    historicalData=1;
+                    eventData=1;
+                }else if(anasta==0x07){
+                    realTimeData=1;
+                    historicalData=1;
+                    eventData=1;
+                }
+                int heartbeat = (body.at(ud_cur+9)&0xff);
+                QJsonObject o_Data2;
+                o_Data2.insert("retransmission", retransmission);
+                o_Data2.insert("realTimeData", realTimeData);
+                o_Data2.insert("historicalData", historicalData);
+                o_Data2.insert("eventData", eventData);
+                o_Data2.insert("heartbeat", heartbeat);
+                o_Data2.insert("tovTimeInt", over_time);
+                QJsonObject o_Data1;
+                o_Data1.insert("code", 200);
+                o_Data1.insert("msg", "操作成功");
+                o_Data1.insert("data", o_Data2);
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\toverTime:%14\tretransmission:%15\trealTimeData:%16\thistoricalData:%17\teventData:%18\theartbeat:%19\tovTimeInt:%20")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(over_time3).arg(retransmission).arg(realTimeData).arg(historicalData).arg(eventData).arg(heartbeat).arg(over_time);
+                emit CommData(DeviceID, 11, QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+            }else if(f_fno==2){
+                int address1 = (body.at(ud_cur+6)&0xff);
+                int address2 = (body.at(ud_cur+7)&0xff);
+                int address3 = (body.at(ud_cur+8)&0xff);
+                int address4 = (body.at(ud_cur+9)&0xff);
+                QByteArray Dat = QByteArray(1,0x00);
+                Dat[0] = static_cast<char>(body.at(ud_cur+10));
+                QByteArray Dat1 = QByteArray(1,0x00);
+                Dat1[0] = static_cast<char>(body.at(ud_cur+11));
+                QString portString1(Dat.toHex());
+                QString portString2(Dat1.toHex());
+                QString portString = portString2+portString1;
+                int port = portString.toInt(NULL, 16);
+                QString addresss = QString("%1.%2.%3.%4").arg(address1).arg(address2).arg(address3).arg(address4);
+                QJsonObject o_Data;
+                o_Data.insert("addresss", addresss);
+                o_Data.insert("port", port);
+                emit CommData(DeviceID, 11, QString(QJsonDocument(o_Data).toJson()).replace("\"","\\\""));
+            }else if(f_fno==3){
+                
+            }
+        }
+        break;
+    case 0x0c://请求实时数据
+        if(f_pno==0){
+            if(f_fno==2){//终端日历时钟
+                QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+11)&0xf0)>>4)*10+(body.at(ud_cur+11)&0x0f)),
+                                              (((body.at(ud_cur+10)&0x10)>>4)*10+(body.at(ud_cur+10)&0x0f)),
+                                              (((body.at(ud_cur+9)&0xf0)>>4)*10+(body.at(ud_cur+9)&0x0f))),
+                                        QTime((((body.at(ud_cur+8)&0xf0)>>4)*10+(body.at(ud_cur+8)&0x0f)),
+                                              (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)),
+                                              (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f))));
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\ttime:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(t.toString("yyyy-MM-dd HH:mm:ss"));
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==3){//节能开关档位
+                quint8 gear = body.at(ud_cur+6)&0xff;
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tgear:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(gear);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==4){//单灯轮询当前状态查询
+                int polsta = (body.at(ud_cur+6)&0x01);
+                int consta = (body.at(ud_cur+7)&0x01);
+                QString polling = "";
+                QString conenble = "";
+                if(polsta==0x01){
+                    polling="轮询中";
+                }else{
+                    polling="不轮询";
+                }
+                if(consta==0x01){
+                    conenble="发现";
+                }else{
+                    conenble="未发现";
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tpolling:%14\tcontroll:%15")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(polling).arg(conenble);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==9){//模拟量查询
+                QString ananame = "";
+                int anasta = (body.at(ud_cur+6)&0xff);
+                if(anasta==0x00){
+                    ananame="未知";
+                }else if(anasta==0x01){
+                    ananame="电压";
+                }else if(anasta==0x02){
+                    ananame="电流";
+                }else if(anasta==0x03){
+                    ananame="有功功率";
+                }else if(anasta==0x04){
+                    ananame="无功功率";
+                }else if(anasta==0x05){
+                    ananame="功率因数";
+                }else if(anasta==0x06){
+                    ananame="频率";
+                }else if(anasta==0x07){
+                    ananame="相角";
+                }else if(anasta==0x08){
+                    ananame="照度";
+                }
+                int analog_data = ((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100;
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\ttype:%14\tvalue:%15")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(ananame).arg(analog_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==10){//状态量查询
+                int state_data = (body.at(ud_cur+6)&0xff);
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(state_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==11){//模拟量批量查询
+                quint8 query_number = body.at(ud_cur+6)&0xff;
+                quint8 start_point = body.at(ud_cur+7)&0xff;
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<query_number;i++){
+                    QString ananame = "";
+                    quint8 point = body.at(ud_cur+8+4*i)&0xff;
+                    int anasta = (body.at(ud_cur+9+4*i)&0xff);
+                    if(anasta==0x00){
+                        ananame="未知";
+                    }else if(anasta==0x01){
+                        ananame="电压";
+                    }else if(anasta==0x02){
+                        ananame="电流";
+                    }else if(anasta==0x03){
+                        ananame="有功功率";
+                    }else if(anasta==0x04){
+                        ananame="无功功率";
+                    }else if(anasta==0x05){
+                        ananame="功率因数";
+                    }else if(anasta==0x06){
+                        ananame="频率";
+                    }else if(anasta==0x07){
+                        ananame="相角";
+                    }else if(anasta==0x08){
+                        ananame="照度";
+                    }
+                    quint8 f_g1=0x00;
+                    quint8 f_g2=0x00;
+                    quint8 f_g3=0x00;
+                    quint8 f_s=0x00;
+                    double analog_data;
+                    f_s = (body.at(ud_cur+11+4*i)&0x10)>>4;
+                    f_g1 = (body.at(ud_cur+11+4*i)&0x20)>>5;
+                    f_g2 = (body.at(ud_cur+11+4*i)&0x40)>>6;
+                    f_g3 = (body.at(ud_cur+11+4*i)&0x80)>>7;
+                    if(f_s==0x01){
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*10000);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*1000);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*100);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*10);
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*1);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.1);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.01);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.001);
+                        }
+                    }else{
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*10000;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*1000;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*100;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*10;
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*1;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.1;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.01;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+10+4*i)&0xf0)>>4)*10+(body.at(ud_cur+10+4*i)&0x0f)+(body.at(ud_cur+11+4*i)&0x0f)*100)*0.001;
+                        }
+                    }
+                    QJsonObject o_Data2;
+                    o_Data2.insert("point", point);
+                    o_Data2.insert("type", ananame);
+                    o_Data2.insert("value", analog_data);
+                    o_Data1.append(o_Data2);
+                }
+
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tquery_number:%14\tstart_point:%15\tdata_list:%16")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(query_number).arg(start_point).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==12){//遥信量批量查询
+                quint8 query_number = body.at(ud_cur+6)&0xff;
+                quint8 start_point = body.at(ud_cur+7)&0xff;
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<query_number;i++){
+                    quint8 point = body.at(ud_cur+8+2*i)&0xff;
+                    int status_data = (body.at(ud_cur+9+2*i)&0xff);
+                    QJsonObject o_Data2;
+                    o_Data2.insert("point", point);
+                    o_Data2.insert("value", status_data);
+                    o_Data1.append(o_Data2);
+                }
+
+                QString o_Data = QString("dir:%1,prm:%2,afn:%3,seq:%4,con:%5,fin:%6,fir:%7,tpv:%8,pno:%9,fno:%10,ec0:%11,ec1:%12,sig:%13,query_number:%14,start_point:%15,data_list:%16")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(query_number).arg(start_point).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==33||f_fno==34||f_fno==35||f_fno==36||f_fno==37||f_fno==38||f_fno==39){//pn=0
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(0);
+                emit CommData(DeviceID, 1, o_Data);
+            }
+        }else{
+            if(f_fno==9){//模拟量查询
+                QString ananame = "";
+                int anasta = (body.at(ud_cur+6)&0xff);
+                if(anasta==0x00){
+                    ananame="未知";
+                }else if(anasta==0x01){
+                    ananame="电压";
+                }else if(anasta==0x02){
+                    ananame="电流";
+                }else if(anasta==0x03){
+                    ananame="有功功率";
+                }else if(anasta==0x04){
+                    ananame="无功功率";
+                }else if(anasta==0x05){
+                    ananame="功率因数";
+                }else if(anasta==0x06){
+                    ananame="频率";
+                }else if(anasta==0x07){
+                    ananame="相角";
+                }else if(anasta==0x08){
+                    ananame="照度";
+                }
+                quint8 f_g1=0x00;
+                quint8 f_g2=0x00;
+                quint8 f_g3=0x00;
+                quint8 f_s=0x00;
+                double analog_data;
+                f_s = (body.at(ud_cur+8)&0x10)>>4;
+                f_g1 = (body.at(ud_cur+8)&0x20)>>5;
+                f_g2 = (body.at(ud_cur+8)&0x40)>>6;
+                f_g3 = (body.at(ud_cur+8)&0x80)>>7;
+                if(f_s==0x01){
+                    if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*10000);
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*1000);
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*100);
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*10);
+                    }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*1);
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.1);
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.01);
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                        analog_data = -((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.001);
+                    }
+                }else{
+                    if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*10000;
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*1000;
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*100;
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*10;
+                    }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*1;
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.1;
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.01;
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                        analog_data = (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)+(body.at(ud_cur+8)&0x0f)*100)*0.001;
+                    }
+                }
+                QString o_Data = QString("dir:%1\tpointprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\ttype:%14\tvalue:%15")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(ananame).arg(analog_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==10){//状态量查询
+                int state_data = (body.at(ud_cur+6)&0xff);
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(state_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==33){//单灯运行状态查询
+                int swtich_status = (body.at(ud_cur+6)&0xff);
+                int run_status = (body.at(ud_cur+7)&0xff);
+                QString swtich_name = "";
+                QString run_name = "";
+                if(swtich_status==0x00){
+                    swtich_name="关灯";
+                }else if(swtich_status==0x01){
+                    swtich_name="正常开灯";
+                }else if(swtich_status==0x02){
+                    swtich_name="节能开灯状态";
+                }
+                if(run_status==0x00){
+                    run_name="正常";
+                }else if(run_status==0x01){
+                    run_name="灯亮但有异常";
+                }else if(run_status==0x02){
+                    run_name="异常灭灯 ";
+                }else if(run_status==0x03){
+                    run_name="其他";
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tswtich_status:%14\trun_status:%15")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(swtich_name).arg(run_name);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==34){//单灯电压查询
+                double analog_data;
+                analog_data = ((body.at(ud_cur+6)&0xf0)>>4)+(body.at(ud_cur+6)&0x0f)*0.1+(body.at(ud_cur+7)&0x0f)*10+((body.at(ud_cur+7)&0xf0)>>4)*100;
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(analog_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==35){//单灯电流查询
+                quint8 f_s=0x00;
+                double ele_data;
+                f_s = (body.at(ud_cur+8)&0x80)>>7;
+                if(f_s==0x01){
+                    ele_data = -(((body.at(ud_cur+6)&0xf0)>>4)*0.01+(body.at(ud_cur+6)&0x0f)*0.001+(body.at(ud_cur+7)&0x0f)*0.1+((body.at(ud_cur+7)&0xf0)>>4)+(body.at(ud_cur+8)&0x0f)*10+((body.at(ud_cur+8)&0x70)>>4)*100);
+                }else{
+                    ele_data = ((body.at(ud_cur+6)&0xf0)>>4)*0.01+(body.at(ud_cur+6)&0x0f)*0.001+(body.at(ud_cur+7)&0x0f)*0.1+((body.at(ud_cur+7)&0xf0)>>4)+(body.at(ud_cur+8)&0x0f)*10+((body.at(ud_cur+8)&0x70)>>4)*100;
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(ele_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==36||f_fno==38||f_fno==39){//单灯有功功率查询
+                quint8 f_g1=0x00;
+                quint8 f_g2=0x00;
+                quint8 f_g3=0x00;
+                quint8 f_s=0x00;
+                double active_power_data;
+                f_s = (body.at(ud_cur+7)&0x10)>>4;
+                f_g1 = (body.at(ud_cur+7)&0x20)>>5;
+                f_g2 = (body.at(ud_cur+7)&0x40)>>6;
+                f_g3 = (body.at(ud_cur+7)&0x80)>>7;
+                if(f_s==0x01){
+                    if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*10000);
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*1000);
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*100);
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*10);
+                    }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*1);
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.1);
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.01);
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                        active_power_data = -((((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.001);
+                    }
+                }else{
+                    if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*10000;
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*1000;
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*100;
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*10;
+                    }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*1;
+                    }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.1;
+                    }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.01;
+                    }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                        active_power_data = (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)+(body.at(ud_cur+7)&0x0f)*100)*0.001;
+                    }
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(active_power_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==37){//单灯功率因数查询
+                quint8 f_s=0x00;
+                double power_factor_data;
+                f_s = (body.at(ud_cur+7)&0x80)>>7;
+                if(f_s==0x01){
+                    power_factor_data = -((body.at(ud_cur+6)&0x0f)*0.1+((body.at(ud_cur+6)&0xf0)>>4)+(body.at(ud_cur+7)&0x0f)*10+((body.at(ud_cur+7)&0x70)>>4)*100);
+                }else{
+                    power_factor_data = (body.at(ud_cur+6)&0x0f)*0.1+((body.at(ud_cur+6)&0xf0)>>4)+(body.at(ud_cur+7)&0x0f)*10+((body.at(ud_cur+7)&0x70)>>4)*100;
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tvalue:%14")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(power_factor_data);
+                emit CommData(DeviceID, 1, o_Data);
+            }
+        }
+        break;
+    case 0x0d://请求历史数据
+        if(f_pno==0){
+            if(f_fno==1||f_fno==17||f_fno==18||f_fno==19||f_fno==20||f_fno==21||f_fno==22){//控制器模拟量历史数据曲线
+                QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+10)&0xf0)>>4)*10+(body.at(ud_cur+10)&0x0f)),
+                                              (((body.at(ud_cur+9)&0xf0)>>4)*10+(body.at(ud_cur+9)&0x0f)),
+                                              (((body.at(ud_cur+8)&0xf0)>>4)*10+(body.at(ud_cur+8)&0x0f))),
+                                        QTime((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)),
+                                              (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)),
+                                              0));
+                quint8 data_freezing_density = body.at(ud_cur+11)&0xff;
+                quint8 data_points = body.at(ud_cur+12)&0xff;
+                QString ananame = "";
+                int anasta = (body.at(ud_cur+13)&0xff);
+                if(anasta==0x00){
+                    ananame="未知";
+                }else if(anasta==0x01){
+                    ananame="电压";
+                }else if(anasta==0x02){
+                    ananame="电流";
+                }else if(anasta==0x03){
+                    ananame="有功功率";
+                }else if(anasta==0x04){
+                    ananame="无功功率";
+                }else if(anasta==0x05){
+                    ananame="功率因数";
+                }else if(anasta==0x06){
+                    ananame="频率";
+                }else if(anasta==0x07){
+                    ananame="相角";
+                }else if(anasta==0x08){
+                    ananame="照度";
+                }
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<data_points;i++){
+                    quint8 f_g1=0x00;
+                    quint8 f_g2=0x00;
+                    quint8 f_g3=0x00;
+                    quint8 f_s=0x00;
+                    double analog_data;
+                    f_s = (body.at(ud_cur+15+2*i)&0x10)>>4;
+                    f_g1 = (body.at(ud_cur+15+2*i)&0x20)>>5;
+                    f_g2 = (body.at(ud_cur+15+2*i)&0x40)>>6;
+                    f_g3 = (body.at(ud_cur+15+2*i)&0x80)>>7;
+                    if(f_s==0x01){
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10000);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1000);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*100);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10);
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.1);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.01);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.001);
+                        }
+                    }else{
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10000;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1000;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*100;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10;
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.1;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.01;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.001;
+                        }
+                    }
+                    QJsonObject o_Data2;
+                    o_Data2.insert("point", i+1);
+                    o_Data2.insert("type", ananame);
+                    o_Data2.insert("value", analog_data);
+                    o_Data1.append(o_Data2);
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tdata_freezing_density:%14\tdata_points:%15\tdata_time:%16\tdata_list:%17")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(data_freezing_density).arg(data_points).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==2){
+                QDate t = QDate(2000+(((body.at(ud_cur+8)&0xf0)>>4)*10+(body.at(ud_cur+8)&0x0f)),
+                                              (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)),
+                                              (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)));
+                quint8 records_number  = body.at(ud_cur+9)&0xff;
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<records_number;i++){
+                    QDateTime t1 = QDateTime(QDate(2000+(((body.at(ud_cur+15+9*i)&0xf0)>>4)*10+(body.at(ud_cur+15+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+14+9*i)&0x10)>>4)*10+(body.at(ud_cur+14+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+13+9*i)&0xf0)>>4)*10+(body.at(ud_cur+13+9*i)&0x0f))),
+                                            QTime((((body.at(ud_cur+12+9*i)&0xf0)>>4)*10+(body.at(ud_cur+12+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+11+9*i)&0xf0)>>4)*10+(body.at(ud_cur+11+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+10+9*i)&0xf0)>>4)*10+(body.at(ud_cur+10+9*i)&0x0f))));
+                    quint8 control_point  = body.at(ud_cur+16+9*i)&0xff;
+                    int control_type  = body.at(ud_cur+17+9*i)&0xff;
+                    QString control_name = "";
+                    if(control_type==0x00){
+                        control_name="开";
+                    }else if(control_type==0x01){
+                        control_name="关";
+                    }else if(control_type==0x02){
+                        control_name="节能开关调档";
+                    }
+                    quint8 economize_gear  = body.at(ud_cur+18+9*i)&0xff;
+                    QJsonObject o_Data2;
+                    o_Data2.insert("time", t.toString("yyyy-MM-dd HH:mm:ss"));
+                    o_Data2.insert("point", control_point);
+                    o_Data2.insert("type", control_name);
+                    o_Data2.insert("value", economize_gear);
+                    o_Data1.append(o_Data2);
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tdata:%14\trecords_numbers:%15\tdata_list:%16")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(t.toString("yyyy-MM-dd")).arg(records_number).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }
+        }else{
+            if(f_fno==1||f_fno==17||f_fno==18||f_fno==19||f_fno==20||f_fno==21||f_fno==22){//控制器模拟量历史数据曲线
+                QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+10)&0xf0)>>4)*10+(body.at(ud_cur+10)&0x0f)),
+                                              (((body.at(ud_cur+9)&0xf0)>>4)*10+(body.at(ud_cur+9)&0x0f)),
+                                              (((body.at(ud_cur+8)&0xf0)>>4)*10+(body.at(ud_cur+8)&0x0f))),
+                                        QTime((((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)),
+                                              (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)),
+                                              0));
+                quint8 data_freezing_density = body.at(ud_cur+11)&0xff;
+                quint8 data_points = body.at(ud_cur+12)&0xff;
+                QString ananame = "";
+                int anasta = (body.at(ud_cur+13)&0xff);
+                if(anasta==0x00){
+                    ananame="未知";
+                }else if(anasta==0x01){
+                    ananame="电压";
+                }else if(anasta==0x02){
+                    ananame="电流";
+                }else if(anasta==0x03){
+                    ananame="有功功率";
+                }else if(anasta==0x04){
+                    ananame="无功功率";
+                }else if(anasta==0x05){
+                    ananame="功率因数";
+                }else if(anasta==0x06){
+                    ananame="频率";
+                }else if(anasta==0x07){
+                    ananame="相角";
+                }else if(anasta==0x08){
+                    ananame="照度";
+                }
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<data_points;i++){
+                    quint8 f_g1=0x00;
+                    quint8 f_g2=0x00;
+                    quint8 f_g3=0x00;
+                    quint8 f_s=0x00;
+                    double analog_data;
+                    f_s = (body.at(ud_cur+15+2*i)&0x10)>>4;
+                    f_g1 = (body.at(ud_cur+15+2*i)&0x20)>>5;
+                    f_g2 = (body.at(ud_cur+15+2*i)&0x40)>>6;
+                    f_g3 = (body.at(ud_cur+15+2*i)&0x80)>>7;
+                    if(f_s==0x01){
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10000);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1000);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*100);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10);
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1);
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.1);
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.01);
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = -((((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.001);
+                        }
+                    }else{
+                        if(f_g1==0x00&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10000;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1000;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*100;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x00){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*10;
+                        }else if(f_g1==0x00&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*1;
+                        }else if(f_g1==0x01&&f_g2==0x00&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.1;
+                        }else if(f_g1==0x00&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.01;
+                        }else if(f_g1==0x01&&f_g2==0x01&&f_g3==0x01){
+                            analog_data = (((body.at(ud_cur+14+2*i)&0xf0)>>4)*10+(body.at(ud_cur+14+2*i)&0x0f)+(body.at(ud_cur+15+2*i)&0x0f)*100)*0.001;
+                        }
+                    }
+                    QJsonObject o_Data2;
+                    o_Data2.insert("point", i+1);
+                    o_Data2.insert("type", ananame);
+                    o_Data2.insert("value", analog_data);
+                    o_Data1.append(o_Data2);
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tdata_freezing_density:%14\tdata_points:%15\tdata_time:%16\tdata_list:%17")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(data_freezing_density).arg(data_points).arg(t.toString("yyyy-MM-dd HH:mm:ss")).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }else if(f_fno==2){
+                QDate t = QDate(2000+(((body.at(ud_cur+8)&0xf0)>>4)*10+(body.at(ud_cur+8)&0x0f)),
+                                              (((body.at(ud_cur+7)&0xf0)>>4)*10+(body.at(ud_cur+7)&0x0f)),
+                                              (((body.at(ud_cur+6)&0xf0)>>4)*10+(body.at(ud_cur+6)&0x0f)));
+                quint8 records_number  = body.at(ud_cur+9)&0xff;
+                QJsonArray o_Data1;
+                for(quint8 i=0;i<records_number;i++){
+                    QDateTime t1 = QDateTime(QDate(2000+(((body.at(ud_cur+15+9*i)&0xf0)>>4)*10+(body.at(ud_cur+15+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+14+9*i)&0x10)>>4)*10+(body.at(ud_cur+14+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+13+9*i)&0xf0)>>4)*10+(body.at(ud_cur+13+9*i)&0x0f))),
+                                            QTime((((body.at(ud_cur+12+9*i)&0xf0)>>4)*10+(body.at(ud_cur+12+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+11+9*i)&0xf0)>>4)*10+(body.at(ud_cur+11+9*i)&0x0f)),
+                                                  (((body.at(ud_cur+10+9*i)&0xf0)>>4)*10+(body.at(ud_cur+10+9*i)&0x0f))));
+                    quint8 control_point  = body.at(ud_cur+16+9*i)&0xff;
+                    int control_type  = body.at(ud_cur+17+9*i)&0xff;
+                    QString control_name = "";
+                    if(control_type==0x00){
+                        control_name="开";
+                    }else if(control_type==0x01){
+                        control_name="关";
+                    }else if(control_type==0x02){
+                        control_name="节能开关调档";
+                    }
+                    quint8 economize_gear  = body.at(ud_cur+18+9*i)&0xff;
+                    QJsonObject o_Data2;
+                    o_Data2.insert("time", t.toString("yyyy-MM-dd HH:mm:ss"));
+                    o_Data2.insert("point", control_point);
+                    o_Data2.insert("type", control_name);
+                    o_Data2.insert("value", economize_gear);
+                    o_Data1.append(o_Data2);
+                }
+                QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13\tdata:%14\trecords_numbers:%15\tdata_list:%16")
+                        .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal).arg(t.toString("yyyy-MM-dd")).arg(records_number).arg(QString(QJsonDocument(o_Data1).toJson()).replace("\"","\\\""));
+                emit CommData(DeviceID, 1, o_Data);
+            }
+        }
+        break;
+    case 0x0e://请求事件数据
+        if(f_pno==0){
+            if(f_fno==1){//重要事件
+                if(len>(ud_cur+6+4)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    quint8 Err_Cur = body.at(ud_cur+8)&0xff;
+                    quint8 Err_End = body.at(ud_cur+9)&0xff;
+                    int err_len=0;
+                    slShm->smartLightList[idx].ErrCount[0]=(ErrorCount[0]&0xff);
+                    slShm->smartLightList[idx].ErrCount[1]=(ErrorCount[1]&0xff);
+                    for(quint8 i=0;i<=(Err_End-Err_Cur);i++){
+                        quint8 evid = (Err_Cur+i)&0xff;
+                        if(len>(ud_cur+6+4+err_len+2)){
+                            quint8 err_code = body.at(ud_cur+err_len+10)&0xff;
+                            quint8 evt_len = body.at(ud_cur+err_len+11)&0xff;
+                            QString o_data = "";
+                            if(len>=(ud_cur+6+4+err_len+2+evt_len)){
+                                o_data.append(QString("%1 ").arg(err_code,2,16,QChar('0')));
+                                o_data.append(QString("%1 ").arg(evt_len,2,16,QChar('0')));
+                                for(int j=0;j<evt_len;j++)
+                                    o_data.append(QString("%1 ").arg(body.at(ud_cur+6+4+err_len+2+j)&0xff,2,16,QChar('0')));
+                                emit CommData(DeviceID, 1, o_data);
+                                switch (err_code) {
+                                case 1://ACU失电记录
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" ACU失电记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 2://正常开灯成功记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常开灯成功记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 3://正常开灯失败记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常开灯失败记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 4://正常关灯成功记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常关开灯成功记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 5://正常关灯失败记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常关灯失败记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 6://异常开灯记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 异常开灯记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(",异常原因:"));
+                                        if(arg1==0x01)
+                                            o_data.append(QString::fromUtf8("调试"));
+                                        else
+                                            o_data.append(QString::fromUtf8("未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 7://异常关灯记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 异常关灯记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(",异常原因:"));
+                                        if(arg1==0x01)
+                                            o_data.append(QString::fromUtf8("调试"));
+                                        else
+                                            o_data.append(QString::fromUtf8("未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 8://模拟量上限告警(关灯时间内)
+                                case 9://模拟量上限告警(开灯时间内)
+                                case 10://模拟量下限告警(开灯时间内)
+                                    if(evt_len>=11){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0x03);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0x07);
+                                        float value = get_repValue(static_cast<int>(arg3),body.mid(ud_cur+err_len+21,evt_len-9));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if((err_code==8)||(err_code==9))
+                                            o_data.append(QString::fromUtf8(" 模拟量上限告警"));
+                                        else if(err_code==10)
+                                            o_data.append(QString::fromUtf8(" 模拟量下限告警"));
+                                        if(err_code==8)
+                                            o_data.append(QString::fromUtf8("(关灯时间内) "));
+                                        else if((err_code==9)||(err_code==10))
+                                            o_data.append(QString::fromUtf8("(开灯时间内) "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" %1 %2 ").arg((arg1&0x7f)?QString::fromUtf8("%1").arg(arg1&0x7f):QString::fromUtf8("总")).arg((arg1&0x80)?QString::fromUtf8("出线"):QString::fromUtf8("进线")));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("相位:未知"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("相位:A相"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("相位:B相"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8("相位:C相"));
+                                        o_data.append(QString::fromUtf8(" 当前值:%1%2").arg(QString::number(static_cast<double>(value),'g',3))
+                                                      .arg(arg3==0x01?"V"
+                                                                    :(arg3==0x02?"A"
+                                                                               :(((arg3==0x03)||(arg3==0x04))?"W/VAR"
+                                                                                                            :(arg3==0x05?"%"
+                                                                                                                       :(arg3==0x06?"Hz"
+                                                                                                                                  :(arg3==0x07?"°"
+                                                                                                                                             :(arg3==0x08?"lx"
+                                                                                                                                                        :""))))))));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 11://终端通信故障
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 终端通信故障 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 12://接口转换模块故障
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接口转换模块故障 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 13://接触器档位切换正常记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接触器档位正常切换 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 14://接触器档位切换失败记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接触器档位切换失败 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 15://单灯正常开灯记录
+                                case 16://单灯正常关灯记录
+                                    if(evt_len>=9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = ((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8));
+                                        uint arg2 = ((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
+                                        if(evt_len==(9+arg2*2)){
+                                            QString others="[";
+                                            for(uint i=0;i<arg2;i++){
+                                                if(i==0)
+                                                    others.append(QString("%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
+                                                else
+                                                    others.append(QString(",%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
+                                            }
+                                            others.append("]");
+                                            o_data = "";
+                                            o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                            if(err_code==15){
+                                                o_data.append(QString::fromUtf8(" 单灯正常开灯记录 "));
+                                                o_data.append(QString::fromUtf8("开灯成功:%1 ").arg(arg1));
+                                                o_data.append(QString::fromUtf8("开灯失败:%1 ").arg(arg2));
+                                            }else if(err_code==16){
+                                                o_data.append(QString::fromUtf8(" 单灯正常关灯记录 "));
+                                                o_data.append(QString::fromUtf8("关灯成功:%1 ").arg(arg1));
+                                                o_data.append(QString::fromUtf8("关灯失败:%1 ").arg(arg2));
+                                            }
+                                            if(arg2>0){
+                                                o_data.append(QString::fromUtf8("失败灯号:"));
+                                                o_data.append(others);
+                                            }
+                                            emit CommData(DeviceID, 1, o_data);
+                                            if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                                slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                                slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                                slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                                slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                                emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,others,t);
+                                            }
+                                        }
+
+                                    }
+                                    break;
+                                case 17://单灯异常开灯记录
+                                case 18://单灯异常关灯记录
+                                    if(evt_len==9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
+                                        uint arg2 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==17)
+                                            o_data.append(QString::fromUtf8(" 单灯异常开灯 "));
+                                        else if(err_code==18)
+                                            o_data.append(QString::fromUtf8(" 单灯异常关灯 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("原因:调试"));
+                                        else if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("原因:未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 19://单灯过流记录
+                                case 20://单灯欠流记录
+                                    if(evt_len>=10){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        uint arg2 = (evt_len>10)?(body.at(ud_cur+err_len+22)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==19)
+                                            o_data.append(QString::fromUtf8(" 单灯过流记录 "));
+                                        else if(err_code==20)
+                                            o_data.append(QString::fromUtf8(" 单灯欠流记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 21://单灯电流故障记录
+                                    if(evt_len>=12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        float v2 = get_repValue(5,body.mid(22,2));
+                                        uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 功率因素:%1%%").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 22://单灯灯具故障记录
+                                case 23://单灯熔丝故障记录
+                                    if(evt_len>=12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(1,body.mid(20,2));
+                                        float v2 = get_repValue(2,body.mid(23,2));
+                                        uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==22)
+                                            o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
+                                        else if(err_code==23)
+                                            o_data.append(QString::fromUtf8(" 单灯熔丝故障记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电压值:%1V").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 电流值:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 24://单灯通信故障记录
+                                    if(evt_len==12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8)));
+                                        QDateTime t2 = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+23)&0xf0)>>4)*10+(body.at(ud_cur+err_len+23)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+22)&0xf0)>>4)*10+(body.at(ud_cur+err_len+22)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+21)&0xf0)>>4)*10+(body.at(ud_cur+err_len+21)&0x0f))),
+                                                                 QTime((((body.at(ud_cur+err_len+20)&0xf0)>>4)*10+(body.at(ud_cur+err_len+20)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+19)&0xf0)>>4)*10+(body.at(ud_cur+err_len+19)&0x0f)),
+                                                                       0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯通信故障记录 "));
+                                        o_data.append(QString::fromUtf8(" 终端控制器设备序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("最后通信时间:%1").arg(t2.toString("yyyy-MM-dd HH:mm:ss")));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = t2.toTime_t();
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(t2.toTime_t()),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 25://设施物理状态报警记录
+                                    if(evt_len==9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 设施物理状态报警记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 遥信点(设备)编号:%1").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:开关"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:失电"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:接触器状态"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:节能档位状态"));
+                                        else if(arg2==0x04)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:中间继电器状态"));
+                                        else if(arg2==0x05)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:手自动切换"));
+                                        else if(arg2==0x06)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:门磁"));
+                                        else if(arg2==0x07)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:设施物理状态"));
+                                        o_data.append(QString::fromUtf8(" 设施状态:%1").arg(arg3));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 26://进线缺相事件记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 进线缺相事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 第%1进线").arg(((arg1>>6)&0x03))+1);
+                                        if((arg1&0x08)){
+                                            if(arg1&0x01)
+                                                o_data.append(QString::fromUtf8(" A相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" A相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" A相未接"));
+                                        }
+                                        if((arg1&0x10)){
+                                            if(arg1&0x02)
+                                                o_data.append(QString::fromUtf8(" B相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" B相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" B相未接"));
+                                        }
+                                        if((arg1&0x20)){
+                                            if(arg1&0x04)
+                                                o_data.append(QString::fromUtf8(" C相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" C相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" C相未接"));
+                                        }
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 27://门磁状态变化事件
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 门磁状态变化事件 "));
+                                        if((arg1==0x00)&&(arg2==0x00)){
+                                            o_data.append(QString::fromUtf8("门被关闭,告警解除"));
+                                        }else if((arg1==0x01)&&(arg2==0x01)){
+                                            o_data.append(QString::fromUtf8("门被打开,告警"));
+                                        }else if((arg1==0x02)&&(arg2==0x02)){
+                                            o_data.append(QString::fromUtf8("门被打开,正常"));
+                                        }
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 28://校时失败事件记录
+                                case 29://校时成功事件记录
+                                    if(evt_len>=7){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==28)
+                                            o_data.append(QString::fromUtf8(" 校时失败事件记录 "));
+                                        else if(err_code==29)
+                                            o_data.append(QString::fromUtf8(" 校时成功事件记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 30://箱防雷失效事件
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 箱防雷失效事件 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 33://回路切换事件记录
+                                    if(evt_len>=9){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        int sta = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 回路切换事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("计划自主操作"));
+                                        else if(sta==0x02)
+                                            o_data.append(QString::fromUtf8("应急操作"));
+                                        else if(sta==0x03)
+                                            o_data.append(QString::fromUtf8("根据光照度操作"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 34://回路状态异常事件记录
+                                    if(evt_len>=9){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 回路状态异常事件记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 35://出线状态异常事件记录
+                                    if(evt_len==10){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        int value = (body.at(ud_cur+err_len+21)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 出线状态异常事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 出线ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("相位:未知"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("相位:A相"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("相位:B相"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8("相位:C相"));
+                                        o_data.append(QString::fromUtf8(" 隶属回路控制状态:%1").arg(arg3,8,2,QChar('0')));
+                                        o_data.append(QString::fromUtf8(" 出线当前状态:%1").arg(value,8,2,QChar('0')));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = static_cast<float>(value);
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 36://灯杆漏电事件记录
+                                    if(evt_len==12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        float v2 = get_repValue(1,body.mid(22,2));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 灯杆漏电事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8(" 漏电流:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 杆电压:%1V").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 37://灯杆防雷器失效事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 灯杆防雷器失效事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 38://断线报警事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 断线报警事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 监测出线ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("正常"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("被盗"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("非法接入"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 39://光感报警事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 光感报警事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8("回路ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("光照度低于开灯光照度阈值"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("光照度高于开灯光照度阈值"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 51://升级成功事件记录
+                                    if(evt_len==15){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
+                                        int sta = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg1 = 0;
+                                        uint arg2 = 0;
+                                        uint arg3 = 0;
+                                        QString others = QString(body.mid(19,8));
+                                        QStringList vers = others.split(".");
+                                        if(vers.length()>0){
+                                            for(int v=0;v<vers.length();v++){
+                                                if(v==0)
+                                                    arg1 = vers.at(v).toUInt();
+                                                else if(v==1)
+                                                    arg2 = vers.at(v).toUInt();
+                                                else if(v==2)
+                                                    arg3 = vers.at(v).toUInt();
+                                                else
+                                                    break;
+                                            }
+                                        }
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 升级成功事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("升级失败"));
+                                        else
+                                            o_data.append(QString::fromUtf8("升级成功"));
+                                        o_data.append(QString::fromUtf8("版本号:%1").arg(others));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,others,t);
+                                        }
+                                    }
+                                    break;
+                                case 52://单灯状态变化记录
+                                    if(evt_len==20){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
+                                        int sta = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg1 = static_cast<uint>((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
+                                        uint arg2 = (body.at(ud_cur+err_len+21)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+22)&0xff);
+                                        float v1 = get_repValue(1,body.mid(23,2));
+                                        float v2 = get_repValue(2,body.mid(25,3));
+                                        float v3 = get_repValue(3,body.mid(28,2));
+                                        float v4 = get_repValue(5,body.mid(30,2));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯状态变化记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        if(arg2==0)
+                                            o_data.append(QString::fromUtf8("开关灯状态:开"));
+                                        else if(arg2==1)
+                                            o_data.append(QString::fromUtf8("开关灯状态:关"));
+                                        else if(arg2==2){
+                                            o_data.append(QString::fromUtf8("开关灯状态:节能开关调档"));
+                                            o_data.append(QString::fromUtf8(" 节能档位:%1").arg(arg3));
+                                        }
+                                        o_data.append(QString::fromUtf8(" 电压:%1V").arg(QString::number(static_cast<double>(v1),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 电流:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 有功功率:%1W/VAR").arg(QString::number(static_cast<double>(v3),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 功率因素:%1%").arg(QString::number(static_cast<double>(v4),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),v1,v2,
+                                                           QString("%1,%2").arg(QString::number(static_cast<double>(v3),'g',3)).arg(QString::number(static_cast<double>(v4),'g',3)),t);
+                                        }
+                                    }
+                                    break;
+                                }
+                                err_len += (2+evt_len);
+                            }else
+                                break;
+                        }else
+                            break;
+                    }
+                }
+            }else if(f_fno==2){//一般事件
+
+            }
+        }
+        break;
+    case 0x10://数据转发
+        break;
+    }
+    return true;
+}
+
+void SmartLightCommThread::check_idx()
+{
+    quint8 idhash = 0x00;
+    char *deviceid = DeviceID.toLocal8Bit().data();
+    for(int i=0;i<strlen(deviceid);i++){
+        idhash = (idhash+deviceid[i]&0xff)&0xff;
+    }
+    for(int i=0;i<DevNum;i++){
+        if(slShm->smartLightList[i].Enabled==0x01){
+            if(idhash==slShm->smartLightList[i].LightCodeHash){
+                if(strcmp(deviceid,slShm->smartLightList[i].LigthCode)==0){
+                    idx = i;
+                    return;
+                }
+            }
+        }else{
+            idx = i;
+            sprintf(slShm->smartLightList[i].LigthCode,"%s",deviceid);
+            slShm->smartLightList[i].Enabled=0x01;
+            emit getNewDev(DeviceID);
+            return;
+        }
+    }
+}
+
+bool SmartLightCommThread::checkDataFrame(QTcpSocket *so, QByteArray dat)
+{
+    int Len[2];
+    int len = dat.length();
+
+    if(((dat.at(0)&0xff)==0x68)&&((dat.at(5)&0xff)==0x68)&&((dat.at(len-1)&0xff)==0x16)){
+        Len[0] = (dat.at(1)&0x00ff)|((dat.at(2)&0x00ff)<<8);
+        Len[1] = (dat.at(3)&0x00ff)|((dat.at(4)&0x00ff)<<8);
+        if(Len[0]==Len[1]){
+            if(dat.length()==(Len[0]+9)){
+                quint16 crc = chk_crcc(dat.mid(6,Len[0]),Len[0]);
+                if(((dat.at(len-3)&0xff)==(crc&0xff))&&((dat.at(len-2)&0xff)==((crc>>8)&0xff))){
+                    if(DevType<0){
+                        DevType = dat.at(13)&0xff;
+                        quint32 deviceId = 0;
+                        for(int i=12;i>5;i--){
+                            if((((dat.at(i)>>4)&0x0f)<10)&&((dat.at(i)&0x0f)<10)){
+                                deviceId = deviceId*100+((dat.at(i)>>4)&0x0f)*10+(dat.at(i)&0x0f);
+                            }else
+                                return false;
+                        }
+                        DeviceID = QString("%1").arg(deviceId,14,10,QChar('0'));
+                    }
+                    if(DeviceID.length()==14){
+                        if(idx<0)
+                            check_idx();
+                        return checkDataBody(so,dat.mid(6,Len[0]));
+                    }
+                    return false;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+void SmartLightCommThread::readData(QTcpSocket *so){
+    QByteArray data = so->readAll();
+    QString Data = QString("[ %1 %2 %3 <<< ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+            .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+    for(int i=0;i<data.length();i++){
+        Data.append(QString(" %1").arg(data.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit CommData(DeviceID, 1, Data);
+    bool data_ok = checkDataFrame(so, data);
+}
+
+void SmartLightCommThread::close_self(QTcpSocket *so)
+{
+    so->abort();
+    keepcomm = false;
+}
+
+void SmartLightCommThread::stop()
+{
+    keepcomm = false;
+}
+
+QByteArray SmartLightCommThread::mkB01datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(6,0x00);
+    dat[0] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|((dt.time().second()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|((dt.time().minute()%10)&0x0f));
+    dat[2] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[3] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    dat[4] = static_cast<char>(((dt.date().dayOfWeek()&0x07)<<5)|(((dt.date().month()/10)&0x01)<<4)|((dt.date().month()%10)&0x0f));
+    dat[5] = static_cast<char>(((((dt.date().year()%100)/10)&0x0f)<<4)|((dt.date().year()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB02float(float d, int g)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    if((g<5)&&(g>-4)){
+        int D = static_cast<int>(static_cast<double>(d)/qPow(10,g));
+        dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+        dat[1] = static_cast<char>((((4-g)&0x07)<<5)|((d<0)?0x10:0x00)|((D/100)&0x0f));
+    }
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB03integer(int d, int g)
+{
+    QByteArray dat = QByteArray(4,0x00);
+    if((g>-1)&&(g<2)){
+        dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+        dat[1] = static_cast<char>(((((d%10000)/1000)&0x0f)<<4)|(((d%1000)/100)&0x0f));
+        dat[2] = static_cast<char>(((((d%1000000)/100000)&0x0f)<<4)|(((d%100000)/10000)&0x0f));
+        dat[3] = static_cast<char>(((g&0x01)<<6)|((d<0)?0x10:0x00)|((d/1000000)&0x0f));
+    }
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB04integer(int d, int s0)
+{
+    QByteArray dat = QByteArray(1, 0x00);
+    if((s0>-1)&&(s0<2)){
+        dat[0] = static_cast<char>(((s0&0x01)<<7)|(((d/10)&0x07)<<4)|((d%10)&0x0f));
+    }
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB05float(float d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*10);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((d<0)?0x80:0x00)|((((D%10000)/1000)&0x07)<<4)|(((D%1000)/100)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB06float(float d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*100);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((d<0)?0x80:0x00)|((((D%10000)/1000)&0x07)<<4)|(((D%1000)/100)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB07float(float d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*10);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB08integer(int d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+//    int D = static_cast<int>(static_cast<double>(d)*100);
+    dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+    dat[1] = static_cast<char>(((((d%10000)/1000)&0x0f)<<4)|(((d%1000)/100)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB09float(float d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*10000);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((d<0)?0x80:0x00)|((((D%1000000)/100000)&0x07)<<4)|(((D%100000)/10000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB10integer(int d)
+{
+    QByteArray dat = QByteArray(3,0x00);
+    dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+    dat[1] = static_cast<char>(((((d%10000)/1000)&0x0f)<<4)|(((d%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((d%1000000)/100000)&0x0f)<<4)|(((d%100000)/10000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB11double(double d)
+{
+    QByteArray dat = QByteArray(5,0x00);
+    long long D = static_cast<long long>(d*100);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((D%1000000)/100000)&0x0f)<<4)|(((D%100000)/10000)&0x0f));
+    dat[3] = static_cast<char>(((((D%100000000)/10000000)&0x0f)<<4)|(((D%10000000)/1000000)&0x0f));
+    dat[4] = static_cast<char>(((((D%10000000000)/1000000000)&0x0f)<<4)|(((D%1000000000)/100000000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB12longlong(long long d)
+{
+    QByteArray dat = QByteArray(6,0x00);
+    dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+    dat[1] = static_cast<char>(((((d%10000)/1000)&0x0f)<<4)|(((d%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((d%1000000)/100000)&0x0f)<<4)|(((d%100000)/10000)&0x0f));
+    dat[3] = static_cast<char>(((((d%100000000)/10000000)&0x0f)<<4)|(((d%10000000)/1000000)&0x0f));
+    dat[4] = static_cast<char>(((((d%10000000000)/1000000000)&0x0f)<<4)|(((d%1000000000)/100000000)&0x0f));
+    dat[5] = static_cast<char>(((((d%1000000000000)/100000000000)&0x0f)<<4)|(((d%100000000000)/10000000000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB13float(float d)
+{
+    QByteArray dat = QByteArray(4,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*10000);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((D%1000000)/100000)&0x0f)<<4)|(((D%100000)/10000)&0x0f));
+    dat[3] = static_cast<char>(((((D%100000000)/10000000)&0x0f)<<4)|(((D%10000000)/1000000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB14double(double d)
+{
+    QByteArray dat = QByteArray(5,0x00);
+    long long D = static_cast<long long>(d*10000);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((D%1000000)/100000)&0x0f)<<4)|(((D%100000)/10000)&0x0f));
+    dat[3] = static_cast<char>(((((D%100000000)/10000000)&0x0f)<<4)|(((D%10000000)/1000000)&0x0f));
+    dat[4] = static_cast<char>(((((D%10000000000)/1000000000)&0x0f)<<4)|(((D%1000000000)/100000000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB15datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(5,0x00);
+    dat[0] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|((dt.time().minute()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[2] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    dat[3] = static_cast<char>((((dt.date().month()/10)&0x01)<<4)|((dt.date().month()%10)&0x0f));
+    dat[4] = static_cast<char>(((((dt.date().year()%100)/10)&0x0f)<<4)|((dt.date().year()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB16datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(4,0x00);
+    dat[0] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|((dt.time().second()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|((dt.time().minute()%10)&0x0f));
+    dat[2] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[3] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB17datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(4,0x00);
+    dat[0] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|((dt.time().minute()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[2] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    dat[3] = static_cast<char>((((dt.date().month()/10)&0x01)<<4)|((dt.date().month()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB18datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(3,0x00);
+    dat[0] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|((dt.time().minute()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[2] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB19time(QTime t)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    dat[0] = static_cast<char>((((t.minute()/10)&0x0f)<<4)|((t.minute()%10)&0x0f));
+    dat[1] = static_cast<char>((((t.hour()/10)&0x0f)<<4)|((t.hour()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB20date(QDate d)
+{
+    QByteArray dat = QByteArray(3,0x00);
+    dat[0] = static_cast<char>((((d.day()/10)&0x0f)<<4)|((d.day()%10)&0x0f));
+    dat[1] = static_cast<char>((((d.month()/10)&0x01)<<4)|((d.month()%10)&0x0f));
+    dat[2] = static_cast<char>(((((d.year()%100)/10)&0x0f)<<4)|((d.year()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB21date(QDate d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    dat[0] = static_cast<char>((((d.month()/10)&0x01)<<4)|((d.month()%10)&0x0f));
+    dat[1] = static_cast<char>(((((d.year()%100)/10)&0x0f)<<4)|((d.year()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB22integer(int d)
+{
+    QByteArray dat = QByteArray(1,0x00);
+    dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB23float(float d)
+{
+    QByteArray dat = QByteArray(3,0x00);
+    int D = static_cast<int>(d*100);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((D%1000000)/100000)&0x0f)<<4)|(((D%100000)/10000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB24datetime(QDateTime dt)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    dat[0] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|((dt.time().hour()%10)&0x0f));
+    dat[1] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|((dt.date().day()%10)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB25float(float d)
+{
+    QByteArray dat = QByteArray(3,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*1000);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((d<0)?0x80:0x00)|((((D%1000000)/100000)&0x07)<<4)|(((D%100000)/10000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB26float(float d)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    int D = static_cast<int>(static_cast<double>(d)*1000);
+    dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+    dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB27integer(int d)
+{
+    QByteArray dat = QByteArray(4,0x00);
+    dat[0] = static_cast<char>(((((d%100)/10)&0x0f)<<4)|((d%10)&0x0f));
+    dat[1] = static_cast<char>(((((d%10000)/1000)&0x0f)<<4)|(((d%1000)/100)&0x0f));
+    dat[2] = static_cast<char>(((((d%1000000)/100000)&0x0f)<<4)|(((d%100000)/10000)&0x0f));
+    dat[3] = static_cast<char>(((((d%100000000)/10000000)&0x0f)<<4)|(((d%10000000)/1000000)&0x0f));
+    return dat;
+}
+
+QByteArray SmartLightCommThread::mkB28double(double d, int g)
+{
+    QByteArray dat = QByteArray(2,0x00);
+    if((g<5)&&(g>-4)){
+        long long D = static_cast<long long>(d/qPow(10,g));
+        dat[0] = static_cast<char>(((((D%100)/10)&0x0f)<<4)|((D%10)&0x0f));
+        dat[1] = static_cast<char>(((((D%10000)/1000)&0x0f)<<4)|(((D%1000)/100)&0x0f));
+        dat[2] = static_cast<char>((((4-g)&0x07)<<5)|((d<0)?0x10:0x00)|((D/10000)&0x0f));
+    }
+    return dat;
+}

+ 1637 - 0
cpp/smartlightcommthread.cpp.bak

@@ -0,0 +1,1637 @@
+#include "smartlightcommthread.h"
+#include "smartlightshm.h"
+
+SmartLightCommThread::SmartLightCommThread(qintptr socketDescriptor, QObject *parent)
+    : QThread (parent)
+{
+    idx = -1;
+    ErrorCount[0] = 0x0000;
+    ErrorCount[1] = 0x0000;
+    WirelessSignal = 0xff;
+    keepcomm = false;
+    CmdList.clear();
+    this->SocketDescriptor = socketDescriptor;
+}
+
+SmartLightCommThread::~SmartLightCommThread()
+{
+    deleteLater();
+}
+
+QString SmartLightCommThread::deviceID()
+{
+    return DeviceID;
+}
+
+void SmartLightCommThread::run()
+{
+    QTcpSocket *so = new QTcpSocket;
+    if(!so->setSocketDescriptor(this->SocketDescriptor))
+    {
+        so->abort();
+        return;
+    }
+    WaitEcho = false;
+    WaitCount = 0;
+    DevType = -1;
+    DeviceID = "";
+    keepcomm = true;
+    err_count = 0;
+    while (keepcomm) {
+        if(so->state()!=QTcpSocket::ConnectedState){
+            close_self(so);
+            return;
+        }
+        if(so->waitForReadyRead(1000)){
+            WaitCount = 0;
+            readData(so);
+        }
+        if(CmdList.length()>0){
+            if(!WaitEcho){
+                QByteArray cmd = CmdList.first();
+                so->write(cmd);
+                so->flush();
+                CmdList.removeFirst();
+                QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+                        .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+                for(int i=0;i<cmd.length();i++){
+                    Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
+                }
+                emit CommData(DeviceID, 2, Data);
+                WaitCount = 0;
+            }
+        }
+        if(WaitEcho)
+            WaitCount++;
+        if(WaitCount>30)
+            WaitEcho=false;
+        usleep(100000);
+    }
+}
+
+quint16 SmartLightCommThread::chk_crcc(QByteArray buff, int len)
+{
+    quint16 default_data = 0xa001;
+    quint16 crc = 0xffff;
+    for(int j=0;j<len;j++)
+    {
+        crc ^= static_cast<quint8>(buff[j]&0xff);
+        for(int i=0;i<8;i++)
+        {
+            if(crc&0x01)
+            {
+                crc >>= 1;
+                crc ^= default_data;
+            }else
+                crc >>= 1;
+        }
+    }
+    return crc;
+}
+
+void SmartLightCommThread::mk_EventList_qry(QString deviceId, quint8 type, quint8 cur, quint8 num)
+{
+    UN_REFERENCED_PARAMETER(deviceId);
+    if((type==0x01)||(type==0x02)){
+        QDateTime dt = QDateTime::currentDateTime();
+        QByteArray body = QByteArray(21,0x00);
+        body[0] = static_cast<char>(ServerAddr1&0xff);
+        body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+        body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+        body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+        body[4] = static_cast<char>(ServerAddr0&0xff);
+        body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+        body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+        body[7] = static_cast<char>(0x00);
+        body[8] = static_cast<char>(0x0e);
+        body[9] = static_cast<char>(0xe0);
+        body[10] = static_cast<char>(0x00);
+        body[11] = static_cast<char>(0x00);
+        body[12] = static_cast<char>(type&0xff);
+        body[13] = static_cast<char>(0x00);
+        body[14] = static_cast<char>(cur&0xff);
+        body[15] = static_cast<char>(num&0xff);
+        body[16] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[17] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[18] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[19] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[20] = static_cast<char>(0x05);
+        QByteArray cmd = mkDataFrame(body);
+        CmdList.append(cmd);
+    }
+}
+
+int SmartLightCommThread::get_fp_byte(int num)
+{
+    if(num>0)
+        return  ((0x0100<<((num-1)&0x07))|(num>>3));
+    return 0;
+}
+
+void SmartLightCommThread::mk_hisData_qry(QString deviceId, quint16 f_pno, quint16 f_fno, QDateTime t1, QDateTime t2, quint8 sep, quint8 num)
+{
+    UN_REFERENCED_PARAMETER(deviceId);
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(1,0x00);
+    if((f_fno==2)||(f_fno==9)){
+        body = QByteArray(22,0x00);
+    }else if((f_fno==1)||(f_fno==17)||(f_fno==18)||(f_fno==19)||(f_fno==20)||(f_fno==21)||(f_fno==22)){
+        body = QByteArray(26,0x00);
+    }else if((f_fno==41)||(f_fno==42)||(f_fno==43)||(f_fno==61)||(f_fno==62)){
+        body = QByteArray(29,0x00);
+    }
+    body[0] = static_cast<char>(ServerAddr1&0xff);
+    body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+    body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+    body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+    body[4] = static_cast<char>(ServerAddr0&0xff);
+    body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+    body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x0d);
+    body[9] = static_cast<char>(0xe0);
+    int pno = get_fp_byte(f_pno);
+    body[10] = static_cast<char>((pno>>8)&0xff);
+    body[11] = static_cast<char>(pno&0xff);
+    int fno = get_fp_byte(f_fno);
+    body[12] = static_cast<char>((fno>>8)&0xff);
+    body[13] = static_cast<char>(fno&0xff);
+    if(body.length()==22){
+        body[14] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[17] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[18] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[19] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[20] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[21] = static_cast<char>(0x05);
+    }else if(body.length()==26){
+        body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[19] = static_cast<char>(sep);
+        body[20] = static_cast<char>(num);
+        body[21] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[22] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[23] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[24] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[25] = static_cast<char>(0x05);
+    }else if(body.length()==29){
+        body[14] = static_cast<char>((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f));
+        body[15] = static_cast<char>((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f));
+        body[16] = static_cast<char>((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f));
+        body[17] = static_cast<char>((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f));
+        body[18] = static_cast<char>((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f));
+        body[19] = static_cast<char>((((t2.time().minute()/10)&0x0f)<<4)|((t2.time().minute()%10)&0x0f));
+        body[20] = static_cast<char>((((t2.time().hour()/10)&0x0f)<<4)|((t2.time().hour()%10)&0x0f));
+        body[21] = static_cast<char>((((t2.date().day()/10)&0x0f)<<4)|((t2.date().day()%10)&0x0f));
+        body[22] = static_cast<char>((((t2.date().month()/10)&0x0f)<<4)|((t2.date().month()%10)&0x0f));
+        body[23] = static_cast<char>((((t2.date().year()/10)&0x0f)<<4)|((t2.date().year()%10)&0x0f));
+        body[24] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+        body[25] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+        body[26] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+        body[27] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+        body[28] = static_cast<char>(0x05);
+    }
+    if(body.length()>1){
+        QByteArray cmd = mkDataFrame(body);
+        CmdList.append(cmd);
+    }
+}
+
+void SmartLightCommThread::confirm_report(QTcpSocket *so)
+{
+    QDateTime dt = QDateTime::currentDateTime();
+    QByteArray body = QByteArray(20,0x00);
+    body[0] = static_cast<char>(ServerAddr1&0xff);
+    body[1] = static_cast<char>((ServerAddr1>>8)&0xff);
+    body[2] = static_cast<char>((ServerAddr1>>16)&0xff);
+    body[3] = static_cast<char>((ServerAddr1>>24)&0xff);
+    body[4] = static_cast<char>(ServerAddr0&0xff);
+    body[5] = static_cast<char>((ServerAddr0>>8)&0xff);
+    body[6] = static_cast<char>((ServerAddr0>>16)&0xff);
+    body[7] = static_cast<char>(0x00);
+    body[8] = static_cast<char>(0x00);
+    body[9] = static_cast<char>(0xe0);
+    body[10] = static_cast<char>(0x00);
+    body[11] = static_cast<char>(0x00);
+    body[12] = static_cast<char>(0x01);
+    body[13] = static_cast<char>(0x00);
+    body[14] = static_cast<char>(0x00);
+    body[15] = static_cast<char>((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10));
+    body[16] = static_cast<char>((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10));
+    body[17] = static_cast<char>((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10));
+    body[18] = static_cast<char>((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10));
+    body[19] = static_cast<char>(0x05);
+    QByteArray cmd = mkDataFrame(body);
+    so->write(cmd);
+    so->flush();
+    QString Data = QString("[ %1 %2 %3 >>> ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+            .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+    for(int i=0;i<cmd.length();i++){
+        Data.append(QString(" %1").arg(cmd.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit CommData(DeviceID, 2, Data);
+}
+
+QByteArray SmartLightCommThread::mkDataFrame(QByteArray body){
+    QByteArray data = QByteArray(body.length()+9,0x00);
+    int len = body.length();
+    data[0] = static_cast<char>(0x68);
+    data[1] = static_cast<char>(len&0xff);
+    data[2] = static_cast<char>((len>>8)&0xff);
+    data[3] = static_cast<char>(len&0xff);
+    data[4] = static_cast<char>((len>>8)&0xff);
+    data[5] = static_cast<char>(0x68);
+    data[6] = static_cast<char>(ServerAddr1&0xff);
+    data[7] = static_cast<char>((ServerAddr1>>8)&0xff);
+    data[8] = static_cast<char>((ServerAddr1>>16)&0xff);
+    data[9] = static_cast<char>((ServerAddr1>>24)&0xff);
+    data[10] = static_cast<char>(ServerAddr0&0xff);
+    data[11] = static_cast<char>((ServerAddr0>>8)&0xff);
+    data[12] = static_cast<char>((ServerAddr0>>16)&0xff);
+    data[13] = static_cast<char>(0x00);
+    for(int i=8;i<body.length();i++)
+        data[6+i] = static_cast<char>(body.at(i)&0xff);
+    quint16 crc = chk_crcc(data.mid(6,len),len);
+    data[data.length()-3] = static_cast<char>(crc&0xff);
+    data[data.length()-2] = static_cast<char>((crc>>8)&0xff);
+    data[data.length()-1] = static_cast<char>(0x16);
+    return data;
+}
+
+float SmartLightCommThread::get_repValue(int type, QByteArray dat)
+{
+    switch (type) {
+    case 0x01:
+        if(dat.length()==2){
+            return static_cast<float>(((dat.at(1)&0xf0)>>4)*100
+                    +(dat.at(1)&0x0f)*10
+                    +((dat.at(0)&0xf0)>>4)
+                    +(dat.at(0)&0x0f)*0.1);
+        }
+        break;
+    case 0x02:
+        if(dat.length()==3){
+            return static_cast<float>((((dat.at(2)&0x80)==0x80)?-1:1)
+                                      *(((dat.at(2)&0x70)>>4)*100
+                                        +(dat.at(2)&0x0f)*10
+                                        +((dat.at(1)&0xf0)>>4)
+                                        +((dat.at(1)&0x0f)*0.1)
+                                        +(((dat.at(0)&0xf0)>>4)*0.01)
+                                        +((dat.at(0)&0x0f)*0.001)));
+        }
+        break;
+    case 0x03:
+    case 0x05:
+    case 0x07:
+        if(dat.length()==2){
+            int d = (((dat.at(1)&0x10)==0x10)?-1:1)
+                    *((dat.at(1)&0x0f)*100+((dat.at(0)&0xf0)>>4)*10+(dat.at(0)&0x0f));
+            switch ((dat.at(1)>>5)&0x07) {
+            case 0x00:
+                return static_cast<float>(d*10000);
+                break;
+            case 0x01:
+                return static_cast<float>(d*1000);
+                break;
+            case 0x02:
+                return static_cast<float>(d*100);
+                break;
+            case 0x03:
+                return static_cast<float>(d*10);
+                break;
+            case 0x04:
+                return static_cast<float>(d);
+                break;
+            case 0x05:
+                return static_cast<float>(d*0.1);
+                break;
+            case 0x06:
+                return static_cast<float>(d*0.01);
+                break;
+            case 0x07:
+                return static_cast<float>(d*0.001);
+                break;
+            }
+        }
+        break;
+    case 0x04:
+    case 0x06:
+    case 0x08:
+        if(dat.length()==2){
+            return static_cast<float>((((dat.at(1)&0x80)==0x80)?-1:1)
+                                      *(((dat.at(1)&0x70)>>4)*100
+                                        +(dat.at(1)&0x0f)*10
+                                        +((dat.at(0)&0xf0)>>4)
+                                        +((dat.at(0)&0x0f)*0.1)));
+        }
+        break;
+    }
+    return static_cast<float>(0.0);
+}
+
+bool SmartLightCommThread::checkDataBody(QTcpSocket *so, QByteArray body)
+{
+    int ud_cur=0;
+    int len = body.length();
+    quint8 f_dir=0x00;
+    quint8 f_prm=0x00;
+    quint8 f_afn=0x00;
+    quint8 f_seq=0x00;
+    quint8 f_con=0x00;
+    quint8 f_fin=0x00;
+    quint8 f_fir=0x00;
+    quint8 f_tpv=0x00;
+    quint16 f_dlen=0x0000;
+    quint16 f_prof=0x0000;
+    quint16 f_sn=0x0000;
+    quint16 f_pno=0x0000;
+    quint16 f_fno=0x0000;
+    if(DevType==0x00){
+        ud_cur = 8;
+    }else{
+        f_prof = (body.at(ud_cur+0)&0x00ff)|((body.at(ud_cur+1)&0x00ff)<<8);
+        f_sn = (body.at(ud_cur+2)&0x00ff)|((body.at(ud_cur+3)&0x00ff)<<8);
+        ud_cur =12;
+    }
+    f_dir = (body.at(ud_cur+0)&0x80)>>7;
+    f_prm = (body.at(ud_cur+0)&0x40)>>6;
+    f_afn = body.at(ud_cur+0)&0x1f;
+    f_seq = body.at(ud_cur+1)&0x0f;
+    f_con = (body.at(ud_cur+1)&0x10)>>4;
+    f_fin = (body.at(ud_cur+1)&0x20)>>5;
+    f_fir = (body.at(ud_cur+1)&0x40)>>6;
+    f_tpv = (body.at(ud_cur+1)&0x80)>>7;
+    f_pno = (body.at(ud_cur+3)&0x00ff)*8;
+    for(int i=0;i<8;i++){
+        int bit = 0x01<<i;
+        if((body.at(ud_cur+2)&bit)==bit){
+            f_pno += (i+1);
+            break;
+        }
+    }
+    f_fno = (body.at(ud_cur+5)&0x00ff)*8;
+    for(int i=0;i<8;i++){
+        int bit = 0x01<<i;
+        if((body.at(ud_cur+4)&bit)==bit){
+            f_fno += (i+1);
+            break;
+        }
+    }
+    switch (f_afn) {
+    case 0x00://确认、否认
+        break;
+    case 0x01://复位
+        break;
+    case 0x02://链路接口检测
+        if(f_pno==0){
+            if(f_fno==1){//登录
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==2){//退出
+                f_dlen=4;
+                if(len>=(ud_cur+6+2)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }else if(f_fno==3){//心跳
+                f_dlen=5;
+                if(len>=(ud_cur+6+3)){
+                    ErrorCount[0] = body.at(ud_cur+7)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+8)&0xff;
+                    WirelessSignal = body.at(ud_cur+6)&0xff;
+                    if(f_con==0x01){
+                        confirm_report(so);
+                    }
+                }
+            }
+            QString o_Data = QString("dir:%1\tprm:%2\tafn:%3\tseq:%4\tcon:%5\tfin:%6\tfir:%7\ttpv:%8\tpno:%9\tfno:%10\tec0:%11\tec1:%12\tsig:%13")
+                    .arg(f_dir).arg(f_prm).arg(f_afn,2,16,QChar('0')).arg(f_seq).arg(f_con).arg(f_fin).arg(f_fir).arg(f_tpv).arg(f_pno).arg(f_fno).arg(ErrorCount[0]).arg(ErrorCount[1]).arg(WirelessSignal);
+            emit CommData(DeviceID, 1, o_Data);
+        }
+        break;
+    case 0x04://设置参数
+        break;
+    case 0x05://控制命令
+        break;
+    case 0x09://请求终端配置
+        break;
+    case 0x0a://查询参数
+        break;
+    case 0x0c://请求实时数据
+        break;
+    case 0x0d://请求历史数据
+        break;
+    case 0x0e://请求事件数据
+        if(f_pno==0){
+            if(f_fno==1){//重要事件
+                if(len>(ud_cur+6+4)){
+                    ErrorCount[0] = body.at(ud_cur+6)&0xff;
+                    ErrorCount[1] = body.at(ud_cur+7)&0xff;
+                    quint8 Err_Cur = body.at(ud_cur+8)&0xff;
+                    quint8 Err_End = body.at(ud_cur+9)&0xff;
+                    int err_len=0;
+                    slShm->smartLightList[idx].ErrCount[0]=(ErrorCount[0]&0xff);
+                    slShm->smartLightList[idx].ErrCount[1]=(ErrorCount[1]&0xff);
+                    for(quint8 i=0;i<=(Err_End-Err_Cur);i++){
+                        quint8 evid = (Err_Cur+i)&0xff;
+                        if(len>(ud_cur+6+4+err_len+2)){
+                            quint8 err_code = body.at(ud_cur+err_len+10)&0xff;
+                            quint8 evt_len = body.at(ud_cur+err_len+11)&0xff;
+                            QString o_data = "";
+                            if(len>=(ud_cur+6+4+err_len+2+evt_len)){
+                                o_data.append(QString("%1 ").arg(err_code,2,16,QChar('0')));
+                                o_data.append(QString("%1 ").arg(evt_len,2,16,QChar('0')));
+                                for(int j=0;j<evt_len;j++)
+                                    o_data.append(QString("%1 ").arg(body.at(ud_cur+6+4+err_len+2+j)&0xff,2,16,QChar('0')));
+                                emit CommData(DeviceID, 1, o_data);
+                                switch (err_code) {
+                                case 1://ACU失电记录
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" ACU失电记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 2://正常开灯成功记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常开灯成功记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 3://正常开灯失败记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常开灯失败记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 4://正常关灯成功记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常关开灯成功记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 5://正常关灯失败记录
+                                    if(evt_len==5){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 正常关灯失败记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 6://异常开灯记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 异常开灯记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(",异常原因:"));
+                                        if(arg1==0x01)
+                                            o_data.append(QString::fromUtf8("调试"));
+                                        else
+                                            o_data.append(QString::fromUtf8("未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 7://异常关灯记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 异常关灯记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(",异常原因:"));
+                                        if(arg1==0x01)
+                                            o_data.append(QString::fromUtf8("调试"));
+                                        else
+                                            o_data.append(QString::fromUtf8("未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 8://模拟量上限告警(关灯时间内)
+                                case 9://模拟量上限告警(开灯时间内)
+                                case 10://模拟量下限告警(开灯时间内)
+                                    if(evt_len>=11){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0x01);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0x03);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0x07);
+                                        float value = get_repValue(static_cast<int>(arg3),body.mid(ud_cur+err_len+21,evt_len-9));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if((err_code==8)||(err_code==9))
+                                            o_data.append(QString::fromUtf8(" 模拟量上限告警"));
+                                        else if(err_code==10)
+                                            o_data.append(QString::fromUtf8(" 模拟量下限告警"));
+                                        if(err_code==8)
+                                            o_data.append(QString::fromUtf8("(关灯时间内) "));
+                                        else if((err_code==9)||(err_code==10))
+                                            o_data.append(QString::fromUtf8("(开灯时间内) "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" %1 %2 ").arg((arg1&0x7f)?QString::fromUtf8("%1").arg(arg1&0x7f):QString::fromUtf8("总")).arg((arg1&0x80)?QString::fromUtf8("出线"):QString::fromUtf8("进线")));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("相位:未知"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("相位:A相"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("相位:B相"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8("相位:C相"));
+                                        o_data.append(QString::fromUtf8(" 当前值:%1%2").arg(QString::number(static_cast<double>(value),'g',3))
+                                                      .arg(arg3==0x01?"V"
+                                                                    :(arg3==0x02?"A"
+                                                                               :(((arg3==0x03)||(arg3==0x04))?"W/VAR"
+                                                                                                            :(arg3==0x05?"%"
+                                                                                                                       :(arg3==0x06?"Hz"
+                                                                                                                                  :(arg3==0x07?"°"
+                                                                                                                                             :(arg3==0x08?"lx"
+                                                                                                                                                        :""))))))));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 11://终端通信故障
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 终端通信故障 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 12://接口转换模块故障
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0x01);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接口转换模块故障 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 13://接触器档位切换正常记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接触器档位正常切换 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 14://接触器档位切换失败记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 接触器档位切换失败 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg1&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg2&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        for(int i=0;i<8;i++)
+                                            o_data.append((arg3&(0x01<<i))?QString::fromUtf8("闭合 "):QString::fromUtf8("断开 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 15://单灯正常开灯记录
+                                case 16://单灯正常关灯记录
+                                    if(evt_len>=9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = ((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8));
+                                        uint arg2 = ((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
+                                        if(evt_len==(9+arg2*2)){
+                                            QString others="[";
+                                            for(uint i=0;i<arg2;i++){
+                                                if(i==0)
+                                                    others.append(QString("%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
+                                                else
+                                                    others.append(QString(",%1").arg(((body.at(ud_cur+err_len+21+i*2)&0x00ff)|((body.at(ud_cur+err_len+22+i*2)&0x00ff)<<8))));
+                                            }
+                                            others.append("]");
+                                            o_data = "";
+                                            o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                            if(err_code==15){
+                                                o_data.append(QString::fromUtf8(" 单灯正常开灯记录 "));
+                                                o_data.append(QString::fromUtf8("开灯成功:%1 ").arg(arg1));
+                                                o_data.append(QString::fromUtf8("开灯失败:%1 ").arg(arg2));
+                                            }else if(err_code==16){
+                                                o_data.append(QString::fromUtf8(" 单灯正常关灯记录 "));
+                                                o_data.append(QString::fromUtf8("关灯成功:%1 ").arg(arg1));
+                                                o_data.append(QString::fromUtf8("关灯失败:%1 ").arg(arg2));
+                                            }
+                                            if(arg2>0){
+                                                o_data.append(QString::fromUtf8("失败灯号:"));
+                                                o_data.append(others);
+                                            }
+                                            emit CommData(DeviceID, 1, o_data);
+                                            if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                                slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                                slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                                slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                                slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                                emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,others,t);
+                                            }
+                                        }
+
+                                    }
+                                    break;
+                                case 17://单灯异常开灯记录
+                                case 18://单灯异常关灯记录
+                                    if(evt_len==9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
+                                        uint arg2 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==17)
+                                            o_data.append(QString::fromUtf8(" 单灯异常开灯 "));
+                                        else if(err_code==18)
+                                            o_data.append(QString::fromUtf8(" 单灯异常关灯 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("原因:调试"));
+                                        else if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("原因:未知"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 19://单灯过流记录
+                                case 20://单灯欠流记录
+                                    if(evt_len>=10){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = ((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        uint arg2 = (evt_len>10)?(body.at(ud_cur+err_len+22)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==19)
+                                            o_data.append(QString::fromUtf8(" 单灯过流记录 "));
+                                        else if(err_code==20)
+                                            o_data.append(QString::fromUtf8(" 单灯欠流记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 21://单灯电流故障记录
+                                    if(evt_len>=12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        float v2 = get_repValue(5,body.mid(22,2));
+                                        uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电流值:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 功率因素:%1%%").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 控制态:%1").arg(arg2));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 22://单灯灯具故障记录
+                                case 23://单灯熔丝故障记录
+                                    if(evt_len>=12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(1,body.mid(20,2));
+                                        float v2 = get_repValue(2,body.mid(23,2));
+                                        uint arg2 = (evt_len>12)?(body.at(ud_cur+err_len+24)&0xff):0x00;
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==22)
+                                            o_data.append(QString::fromUtf8(" 单灯电流故障记录 "));
+                                        else if(err_code==23)
+                                            o_data.append(QString::fromUtf8(" 单灯熔丝故障记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("电压值:%1V").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 电流值:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 24://单灯通信故障记录
+                                    if(evt_len==12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+17)&0x00ff)|((body.at(ud_cur+err_len+18)&0x00ff)<<8)));
+                                        QDateTime t2 = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+23)&0xf0)>>4)*10+(body.at(ud_cur+err_len+23)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+22)&0xf0)>>4)*10+(body.at(ud_cur+err_len+22)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+21)&0xf0)>>4)*10+(body.at(ud_cur+err_len+21)&0x0f))),
+                                                                 QTime((((body.at(ud_cur+err_len+20)&0xf0)>>4)*10+(body.at(ud_cur+err_len+20)&0x0f)),
+                                                                       (((body.at(ud_cur+err_len+19)&0xf0)>>4)*10+(body.at(ud_cur+err_len+19)&0x0f)),
+                                                                       0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯通信故障记录 "));
+                                        o_data.append(QString::fromUtf8(" 终端控制器设备序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8("最后通信时间:%1").arg(t2.toString("yyyy-MM-dd HH:mm:ss")));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = t2.toTime_t();
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(t2.toTime_t()),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 25://设施物理状态报警记录
+                                    if(evt_len==9){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 设施物理状态报警记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 遥信点(设备)编号:%1").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:开关"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:失电"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:接触器状态"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:节能档位状态"));
+                                        else if(arg2==0x04)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:中间继电器状态"));
+                                        else if(arg2==0x05)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:手自动切换"));
+                                        else if(arg2==0x06)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:门磁"));
+                                        else if(arg2==0x07)
+                                            o_data.append(QString::fromUtf8(" 遥信点类型:设施物理状态"));
+                                        o_data.append(QString::fromUtf8(" 设施状态:%1").arg(arg3));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 26://进线缺相事件记录
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 进线缺相事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 第%1进线").arg(((arg1>>6)&0x03))+1);
+                                        if((arg1&0x08)){
+                                            if(arg1&0x01)
+                                                o_data.append(QString::fromUtf8(" A相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" A相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" A相未接"));
+                                        }
+                                        if((arg1&0x10)){
+                                            if(arg1&0x02)
+                                                o_data.append(QString::fromUtf8(" B相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" B相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" B相未接"));
+                                        }
+                                        if((arg1&0x20)){
+                                            if(arg1&0x04)
+                                                o_data.append(QString::fromUtf8(" C相正常"));
+                                            else
+                                                o_data.append(QString::fromUtf8(" C相缺相"));
+                                        }else{
+                                           o_data.append(QString::fromUtf8(" C相未接"));
+                                        }
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 27://门磁状态变化事件
+                                    if(evt_len==7){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 门磁状态变化事件 "));
+                                        if((arg1==0x00)&&(arg2==0x00)){
+                                            o_data.append(QString::fromUtf8("门被关闭,告警解除"));
+                                        }else if((arg1==0x01)&&(arg2==0x01)){
+                                            o_data.append(QString::fromUtf8("门被打开,告警"));
+                                        }else if((arg1==0x02)&&(arg2==0x02)){
+                                            o_data.append(QString::fromUtf8("门被打开,正常"));
+                                        }
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,0,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 28://校时失败事件记录
+                                case 29://校时成功事件记录
+                                    if(evt_len>=7){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        if(err_code==28)
+                                            o_data.append(QString::fromUtf8(" 校时失败事件记录 "));
+                                        else if(err_code==29)
+                                            o_data.append(QString::fromUtf8(" 校时成功事件记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            emit getEAlarm(DeviceID,err_code,0,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 30://箱防雷失效事件
+                                    if(evt_len==6){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 箱防雷失效事件 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            emit getEAlarm(DeviceID,err_code,sta,0,0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 33://回路切换事件记录
+                                    if(evt_len>=9){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        uint arg1 = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+19)&0xff);
+                                        int sta = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 回路切换事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("计划自主操作"));
+                                        else if(sta==0x02)
+                                            o_data.append(QString::fromUtf8("应急操作"));
+                                        else if(sta==0x03)
+                                            o_data.append(QString::fromUtf8("根据光照度操作"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 34://回路状态异常事件记录
+                                    if(evt_len>=9){//结构有疑问,需要测试确认,yao
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 回路状态异常事件记录 "));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 35://出线状态异常事件记录
+                                    if(evt_len==10){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+20)&0xff);
+                                        int value = (body.at(ud_cur+err_len+21)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 出线状态异常事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 出线ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("相位:未知"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("相位:A相"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("相位:B相"));
+                                        else if(arg2==0x03)
+                                            o_data.append(QString::fromUtf8("相位:C相"));
+                                        o_data.append(QString::fromUtf8(" 隶属回路控制状态:%1").arg(arg3,8,2,QChar('0')));
+                                        o_data.append(QString::fromUtf8(" 出线当前状态:%1").arg(value,8,2,QChar('0')));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = static_cast<float>(value);
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),value,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 36://灯杆漏电事件记录
+                                    if(evt_len==12){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        float value = get_repValue(2,body.mid(20,2));
+                                        float v2 = get_repValue(1,body.mid(22,2));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 灯杆漏电事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
+                                        o_data.append(QString::fromUtf8(" 漏电流:%1A").arg(QString::number(static_cast<double>(value),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 杆电压:%1V").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[0] = value;
+                                            slShm->smartLightList[idx].LastEvent[evid].VALUE[1] = v2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,value,v2,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 37://灯杆防雷器失效事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = static_cast<uint>(((body.at(ud_cur+err_len+18)&0x00ff)|((body.at(ud_cur+err_len+19)&0x00ff)<<8)));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 灯杆防雷器失效事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 单灯设备序号:%1 ").arg(arg1));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),0,0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 38://断线报警事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 断线报警事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 监测出线ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("正常"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("被盗"));
+                                        else if(arg2==0x02)
+                                            o_data.append(QString::fromUtf8("非法接入"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 39://光感报警事件记录
+                                    if(evt_len==8){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+16)&0xf0)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f)),
+                                                                      0));
+                                        int sta = (body.at(ud_cur+err_len+17)&0xff);
+                                        uint arg1 = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg2 = (body.at(ud_cur+err_len+19)&0xff);
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 光感报警事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8("回路ID:%1 ").arg(arg1));
+                                        if(arg2==0x00)
+                                            o_data.append(QString::fromUtf8("光照度低于开灯光照度阈值"));
+                                        else if(arg2==0x01)
+                                            o_data.append(QString::fromUtf8("光照度高于开灯光照度阈值"));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),0,0.0,0.0,"",t);
+                                        }
+                                    }
+                                    break;
+                                case 51://升级成功事件记录
+                                    if(evt_len==15){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
+                                        int sta = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg1 = 0;
+                                        uint arg2 = 0;
+                                        uint arg3 = 0;
+                                        QString others = QString(body.mid(19,8));
+                                        QStringList vers = others.split(".");
+                                        if(vers.length()>0){
+                                            for(int v=0;v<vers.length();v++){
+                                                if(v==0)
+                                                    arg1 = vers.at(v).toUInt();
+                                                else if(v==1)
+                                                    arg2 = vers.at(v).toUInt();
+                                                else if(v==2)
+                                                    arg3 = vers.at(v).toUInt();
+                                                else
+                                                    break;
+                                            }
+                                        }
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 升级成功事件记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("升级失败"));
+                                        else
+                                            o_data.append(QString::fromUtf8("升级成功"));
+                                        o_data.append(QString::fromUtf8("版本号:%1").arg(others));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),0.0,0.0,others,t);
+                                        }
+                                    }
+                                    break;
+                                case 52://单灯状态变化记录
+                                    if(evt_len==20){
+                                        QDateTime t = QDateTime(QDate(2000+(((body.at(ud_cur+err_len+17)&0xf0)>>4)*10+(body.at(ud_cur+err_len+17)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+16)&0x10)>>4)*10+(body.at(ud_cur+err_len+16)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+15)&0xf0)>>4)*10+(body.at(ud_cur+err_len+15)&0x0f))),
+                                                                QTime((((body.at(ud_cur+err_len+14)&0xf0)>>4)*10+(body.at(ud_cur+err_len+14)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+13)&0xf0)>>4)*10+(body.at(ud_cur+err_len+13)&0x0f)),
+                                                                      (((body.at(ud_cur+err_len+12)&0xf0)>>4)*10+(body.at(ud_cur+err_len+12)&0x0f))));
+                                        int sta = (body.at(ud_cur+err_len+18)&0xff);
+                                        uint arg1 = static_cast<uint>((body.at(ud_cur+err_len+19)&0x00ff)|((body.at(ud_cur+err_len+20)&0x00ff)<<8));
+                                        uint arg2 = (body.at(ud_cur+err_len+21)&0xff);
+                                        uint arg3 = (body.at(ud_cur+err_len+22)&0xff);
+                                        float v1 = get_repValue(1,body.mid(23,2));
+                                        float v2 = get_repValue(2,body.mid(25,3));
+                                        float v3 = get_repValue(3,body.mid(28,2));
+                                        float v4 = get_repValue(5,body.mid(30,2));
+                                        o_data = "";
+                                        o_data.append(t.toString("yyyy-MM-dd HH:mm:ss"));
+                                        o_data.append(QString::fromUtf8(" 单灯状态变化记录 "));
+                                        if(sta==0x01)
+                                            o_data.append(QString::fromUtf8("开始"));
+                                        else
+                                            o_data.append(QString::fromUtf8("恢复"));
+                                        o_data.append(QString::fromUtf8(" 灯具序号:%1 ").arg(arg1));
+                                        if(arg2==0)
+                                            o_data.append(QString::fromUtf8("开关灯状态:开"));
+                                        else if(arg2==1)
+                                            o_data.append(QString::fromUtf8("开关灯状态:关"));
+                                        else if(arg2==2){
+                                            o_data.append(QString::fromUtf8("开关灯状态:节能开关调档"));
+                                            o_data.append(QString::fromUtf8(" 节能档位:%1").arg(arg3));
+                                        }
+                                        o_data.append(QString::fromUtf8(" 电压:%1V").arg(QString::number(static_cast<double>(v1),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 电流:%1A").arg(QString::number(static_cast<double>(v2),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 有功功率:%1W/VAR").arg(QString::number(static_cast<double>(v3),'g',3)));
+                                        o_data.append(QString::fromUtf8(" 功率因素:%1%").arg(QString::number(static_cast<double>(v4),'g',3)));
+                                        emit CommData(DeviceID, 1, o_data);
+                                        if(slShm->smartLightList[idx].LastEvent[evid].TIME!=t.toTime_t()){
+                                            slShm->smartLightList[idx].LastEvent[evid].TIME = t.toTime_t();
+                                            slShm->smartLightList[idx].LastEvent[evid].ERC = err_code;
+                                            slShm->smartLightList[idx].LastEvent[evid].STA = sta&0xff;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[0] = arg1;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[1] = arg2;
+                                            slShm->smartLightList[idx].LastEvent[evid].ARG[2] = arg3;
+                                            emit getEAlarm(DeviceID,err_code,sta,static_cast<int>(arg1),static_cast<int>(arg2),static_cast<int>(arg3),v1,v2,
+                                                           QString("%1,%2").arg(QString::number(static_cast<double>(v3),'g',3)).arg(QString::number(static_cast<double>(v4),'g',3)),t);
+                                        }
+                                    }
+                                    break;
+                                }
+                                err_len += (2+evt_len);
+                            }else
+                                break;
+                        }else
+                            break;
+                    }
+                }
+            }else if(f_fno==2){//一般事件
+
+            }
+        }
+        break;
+    case 0x10://数据转发
+        break;
+    }
+    return true;
+}
+
+void SmartLightCommThread::check_idx()
+{
+    quint8 idhash = 0x00;
+    char *deviceid = DeviceID.toLocal8Bit().data();
+    for(int i=0;i<strlen(deviceid);i++){
+        idhash = (idhash+deviceid[i]&0xff)&0xff;
+    }
+    for(int i=0;i<DevNum;i++){
+        if(slShm->smartLightList[i].Enabled==0x01){
+            if(idhash==slShm->smartLightList[i].LightCodeHash){
+                if(strcmp(deviceid,slShm->smartLightList[i].LigthCode)==0){
+                    idx = i;
+                    return;
+                }
+            }
+        }else{
+            idx = i;
+            sprintf(slShm->smartLightList[i].LigthCode,"%s",deviceid);
+            slShm->smartLightList[i].Enabled=0x01;
+            emit getNewDev(DeviceID);
+            return;
+        }
+    }
+}
+
+bool SmartLightCommThread::checkDataFrame(QTcpSocket *so, QByteArray dat)
+{
+    int Len[2];
+    int len = dat.length();
+
+    if(((dat.at(0)&0xff)==0x68)&&((dat.at(5)&0xff)==0x68)&&((dat.at(len-1)&0xff)==0x16)){
+        Len[0] = (dat.at(1)&0x00ff)|((dat.at(2)&0x00ff)<<8);
+        Len[1] = (dat.at(3)&0x00ff)|((dat.at(4)&0x00ff)<<8);
+        if(Len[0]==Len[1]){
+            if(dat.length()==(Len[0]+9)){
+                quint16 crc = chk_crcc(dat.mid(6,Len[0]),Len[0]);
+                if(((dat.at(len-3)&0xff)==(crc&0xff))&&((dat.at(len-2)&0xff)==((crc>>8)&0xff))){
+                    if(DevType<0){
+                        DevType = dat.at(13)&0xff;
+                        quint32 deviceId = 0;
+                        for(int i=12;i>5;i--){
+                            if((((dat.at(i)>>4)&0x0f)<10)&&((dat.at(i)&0x0f)<10)){
+                                deviceId = deviceId*100+((dat.at(i)>>4)&0x0f)*10+(dat.at(i)&0x0f);
+                            }else
+                                return false;
+                        }
+                        DeviceID = QString("%1").arg(deviceId,14,10,QChar('0'));
+                    }
+                    if(DeviceID.length()==14){
+                        if(idx<0)
+                            check_idx();
+                        return checkDataBody(so,dat.mid(6,Len[0]));
+                    }
+                    return false;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+void SmartLightCommThread::readData(QTcpSocket *so){
+    QByteArray data = so->readAll();
+    QString Data = QString("[ %1 %2 %3 <<< ]").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz")).arg(so->peerAddress().toString())
+            .arg(DeviceID.length()>0?QString("%1").arg(DeviceID):QString(""));
+    for(int i=0;i<data.length();i++){
+        Data.append(QString(" %1").arg(data.at(i)&0xff,2,16,QChar('0')));
+    }
+    emit CommData(DeviceID, 1, Data);
+    bool data_ok = checkDataFrame(so, data);
+}
+
+void SmartLightCommThread::close_self(QTcpSocket *so)
+{
+    so->abort();
+    keepcomm = false;
+}
+
+void SmartLightCommThread::stop()
+{
+    keepcomm = false;
+}

+ 152 - 0
cpp/smartlightserver.cpp

@@ -0,0 +1,152 @@
+#include "smartlightserver.h"
+#include "smartlightshm.h"
+
+
+SmartLightServer::SmartLightServer(QObject *parent) : QTcpServer(parent)
+{
+    threadList.clear();
+}
+
+void SmartLightServer::start(){
+    if(!this->listen(QHostAddress::Any,ServerPort)){
+        exit(-1);
+    }
+}
+
+void SmartLightServer::incomingConnection(qintptr socketDescriptor){
+    SmartLightCommThread *thread = new SmartLightCommThread(socketDescriptor,this);
+    connect(thread,&SmartLightCommThread::CommData,this,&SmartLightServer::eCommData);
+    connect(thread,&SmartLightCommThread::getEAlarm,this,&SmartLightServer::egetEAlarm);
+    connect(thread,&SmartLightCommThread::getEAnalogValue,this,&SmartLightServer::egetEAnalogValue);
+    connect(thread,&SmartLightCommThread::getERealtimeValue,this,&SmartLightServer::getERealtimeValue);
+    connect(thread,&SmartLightCommThread::finished,this,&SmartLightServer::closeThread);
+    thread->start();
+    threadList.append(thread);
+}
+
+void SmartLightServer::eCommData(QString DeviceID, int dir, QString data)
+{
+    emit CommData(DeviceID, dir, data);
+}
+
+void SmartLightServer::egetEAlarm(QString DeviceCode, int erc, int sta, int arg1, int arg2, int arg3, float value, float v2, QString others, QDateTime t)
+{
+    emit getEAlarm(DeviceCode,erc,sta,arg1,arg2,arg3,value,v2,others,t);
+}
+
+void SmartLightServer::egetEAnalogValue(QString DeviceCode, int point, float ave, float rtv, QDateTime t, float maxv, QDateTime maxt, float minv, QDateTime mint)
+{
+    emit getEAnalogValue(DeviceCode,point,ave,rtv,t,maxv,maxt,minv,mint);
+}
+
+void SmartLightServer::egetERealtimeValue(QString DeviceCode, int point, float rtv, QDateTime t)
+{
+    emit getERealtimeValue(DeviceCode, point, rtv,t);
+}
+
+void SmartLightServer::mk_EventList_qry(QString deviceId, quint8 type, quint8 cur, quint8 num)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            thread->mk_EventList_qry(deviceId,type,cur,num);
+            break;
+        }
+    }
+}
+
+void SmartLightServer::mk_ResetList_qry(QString deviceId, int commandType, QString parameterType, int pseq)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            emit CommData(deviceId, 1, "servicedeviceId");
+            if(commandType==2){
+                thread->reset_command(deviceId);
+                break;
+            }else if(commandType==11){
+                if(QString::compare(parameterType,"f9")==0){
+                    thread->query_parameters_commandf9(deviceId,parameterType);
+                    break;
+                }else{
+                    thread->query_parameters_command(deviceId,parameterType,pseq);
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_realtime_qry(QString deviceId, int commandType, int parameterType, int pn, int queryNumber, int startPoint)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            if(commandType==12){
+                if(parameterType==2||parameterType==3||parameterType==4||parameterType==25){
+                    thread->request_real_time_data_command(deviceId,parameterType);
+                    break;
+                }else if(parameterType==9||parameterType==10||parameterType==11||parameterType==12||parameterType==17||parameterType==33||parameterType==34||parameterType==35||parameterType==36||parameterType==37||parameterType==38||parameterType==39||parameterType==100){
+                    thread->request_real_time_data_command2(deviceId,parameterType,pn,queryNumber,startPoint);
+                    break;
+                }
+            }else if(commandType==5){
+                if(parameterType==2||parameterType==1||parameterType==3||parameterType==9){
+                    thread->request_control_command(deviceId,parameterType,pn,queryNumber,startPoint);
+                    break;
+                }
+            }else if(commandType==14){
+                thread->request_event_data_command(deviceId,parameterType,pn,queryNumber);
+                break;
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_set_parameters_qry(QString deviceId, int commandType, int parameterType, QString data_list)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            if(commandType==4){
+                if(parameterType==9){
+                    thread->request_set_parameters_command(deviceId,parameterType,data_list);
+                    emit CommData(deviceId, 2, "++++++++++ceshi+++++++++++");
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_hisData_qry(QString deviceId, quint16 f_pno, quint16 f_fno, QDateTime t1, QDateTime t2, quint8 sep, quint8 num)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            thread->mk_hisData_qry(deviceId, f_pno, f_fno, t1, t2, sep, num);
+            break;
+        }
+    }
+}
+
+void SmartLightServer::closeThread()
+{
+    SmartLightCommThread *pThread = static_cast<SmartLightCommThread *>(sender());
+    if(pThread){
+        QList<SmartLightCommThread *>::iterator i;
+        for(i=threadList.begin();i!=threadList.end();i++){
+            SmartLightCommThread *thread = *i;
+            if(thread==pThread){
+                threadList.removeAll(thread);
+                pThread->deleteLater();
+                break;
+            }
+        }
+    }
+}

+ 152 - 0
cpp/smartlightserver.cpp.autosave

@@ -0,0 +1,152 @@
+#include "smartlightserver.h"
+#include "smartlightshm.h"
+
+
+SmartLightServer::SmartLightServer(QObject *parent) : QTcpServer(parent)
+{
+    threadList.clear();
+}
+
+void SmartLightServer::start(){
+    if(!this->listen(QHostAddress::Any,ServerPort)){
+        exit(-1);
+    }
+}
+
+void SmartLightServer::incomingConnection(qintptr socketDescriptor){
+    SmartLightCommThread *thread = new SmartLightCommThread(socketDescriptor,this);
+    connect(thread,&SmartLightCommThread::CommData,this,&SmartLightServer::eCommData);
+    connect(thread,&SmartLightCommThread::getEAlarm,this,&SmartLightServer::egetEAlarm);
+    connect(thread,&SmartLightCommThread::getEAnalogValue,this,&SmartLightServer::egetEAnalogValue);
+    connect(thread,&SmartLightCommThread::getERealtimeValue,this,&SmartLightServer::getERealtimeValue);
+    connect(thread,&SmartLightCommThread::finished,this,&SmartLightServer::closeThread);
+    thread->start();
+    threadList.append(thread);
+}
+
+void SmartLightServer::eCommData(QString DeviceID, int dir, QString data)
+{
+    emit CommData(DeviceID, dir, data);
+}
+
+void SmartLightServer::egetEAlarm(QString DeviceCode, int erc, int sta, int arg1, int arg2, int arg3, float value, float v2, QString others, QDateTime t)
+{
+    emit getEAlarm(DeviceCode,erc,sta,arg1,arg2,arg3,value,v2,others,t);
+}
+
+void SmartLightServer::egetEAnalogValue(QString DeviceCode, int point, float ave, float rtv, QDateTime t, float maxv, QDateTime maxt, float minv, QDateTime mint)
+{
+    emit getEAnalogValue(DeviceCode,point,ave,rtv,t,maxv,maxt,minv,mint);
+}
+
+void SmartLightServer::egetERealtimeValue(QString DeviceCode, int point, float rtv, QDateTime t)
+{
+    emit getERealtimeValue(DeviceCode, point, rtv,t);
+}
+
+void SmartLightServer::mk_EventList_qry(QString deviceId, quint8 type, quint8 cur, quint8 num)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            thread->mk_EventList_qry(deviceId,type,cur,num);
+            break;
+        }
+    }
+}
+
+void SmartLightServer::mk_ResetList_qry(QString deviceId, int commandType, int parameterType, int pseq)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            emit CommData(deviceId, 1, "servicedeviceId");
+            if(commandType==2){
+                thread->reset_command(deviceId);
+                break;
+            }else if(commandType==11){
+                if(parameterType==9){
+                    thread->query_parameters_commandf9(deviceId,parameterType);
+                    break;
+                }else{
+                    thread->query_parameters_command(deviceId,parameterType,pseq);
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_realtime_qry(QString deviceId, int commandType, int parameterType, int pn, int queryNumber, int startPoint)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            if(commandType==12){
+                if(parameterType==2||parameterType==3||parameterType==4||parameterType==25){
+                    thread->request_real_time_data_command(deviceId,parameterType);
+                    break;
+                }else if(parameterType==9||parameterType==10||parameterType==11||parameterType==12||parameterType==17||parameterType==33||parameterType==34||parameterType==35||parameterType==36||parameterType==37||parameterType==38||parameterType==39||parameterType==100){
+                    thread->request_real_time_data_command2(deviceId,parameterType,pn,queryNumber,startPoint);
+                    break;
+                }
+            }else if(commandType==5){
+                if(parameterType==2||parameterType==1||parameterType==3||parameterType==9){
+                    thread->request_control_command(deviceId,parameterType,pn,queryNumber,startPoint);
+                    break;
+                }
+            }else if(commandType==14){
+                thread->request_event_data_command(deviceId,parameterType,pn,queryNumber);
+                break;
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_set_parameters_qry(QString deviceId, int commandType, int parameterType, QString data_list)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            if(commandType==4){
+                if(parameterType==9){
+                    thread->request_set_parameters_command(deviceId,parameterType,data_list);
+                    emit CommData(deviceId, 2, "++++++++++ceshi+++++++++++");
+                    break;
+                }
+            }
+        }
+    }
+}
+
+void SmartLightServer::mk_hisData_qry(QString deviceId, quint16 f_pno, quint16 f_fno, QDateTime t1, QDateTime t2, quint8 sep, quint8 num)
+{
+    QList<SmartLightCommThread *>::iterator i;
+    for(i=threadList.begin();i!=threadList.end();i++){
+        SmartLightCommThread *thread = *i;
+        if(QString::compare(thread->deviceID(),deviceId)==0){
+            thread->mk_hisData_qry(deviceId, f_pno, f_fno, t1, t2, sep, num);
+            break;
+        }
+    }
+}
+
+void SmartLightServer::closeThread()
+{
+    SmartLightCommThread *pThread = static_cast<SmartLightCommThread *>(sender());
+    if(pThread){
+        QList<SmartLightCommThread *>::iterator i;
+        for(i=threadList.begin();i!=threadList.end();i++){
+            SmartLightCommThread *thread = *i;
+            if(thread==pThread){
+                threadList.removeAll(thread);
+                pThread->deleteLater();
+                break;
+            }
+        }
+    }
+}