#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;i30) WaitEcho=false; usleep(100000); } } quint16 SmartLightCommThread::chk_crcc(QByteArray buff, int len) { quint16 default_data = 0xa001; quint16 crc = 0xffff; for(int j=0;j(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(ServerAddr1&0xff); body[1] = static_cast((ServerAddr1>>8)&0xff); body[2] = static_cast((ServerAddr1>>16)&0xff); body[3] = static_cast((ServerAddr1>>24)&0xff); body[4] = static_cast(ServerAddr0&0xff); body[5] = static_cast((ServerAddr0>>8)&0xff); body[6] = static_cast((ServerAddr0>>16)&0xff); body[7] = static_cast(0x00); body[8] = static_cast(0x0e); body[9] = static_cast(0xe0); body[10] = static_cast(0x00); body[11] = static_cast(0x00); body[12] = static_cast(type&0xff); body[13] = static_cast(0x00); body[14] = static_cast(cur&0xff); body[15] = static_cast(num&0xff); body[16] = static_cast((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10)); body[17] = static_cast((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10)); body[18] = static_cast((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10)); body[19] = static_cast((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10)); body[20] = static_cast(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(ServerAddr1&0xff); body[1] = static_cast((ServerAddr1>>8)&0xff); body[2] = static_cast((ServerAddr1>>16)&0xff); body[3] = static_cast((ServerAddr1>>24)&0xff); body[4] = static_cast(ServerAddr0&0xff); body[5] = static_cast((ServerAddr0>>8)&0xff); body[6] = static_cast((ServerAddr0>>16)&0xff); body[7] = static_cast(0x00); body[8] = static_cast(0x0d); body[9] = static_cast(0xe0); int pno = get_fp_byte(f_pno); body[10] = static_cast((pno>>8)&0xff); body[11] = static_cast(pno&0xff); int fno = get_fp_byte(f_fno); body[12] = static_cast((fno>>8)&0xff); body[13] = static_cast(fno&0xff); if(body.length()==22){ body[14] = static_cast((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f)); body[15] = static_cast((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f)); body[16] = static_cast((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f)); body[17] = static_cast((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10)); body[18] = static_cast((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10)); body[19] = static_cast((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10)); body[20] = static_cast((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10)); body[21] = static_cast(0x05); }else if(body.length()==26){ body[14] = static_cast((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f)); body[15] = static_cast((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f)); body[16] = static_cast((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f)); body[17] = static_cast((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f)); body[18] = static_cast((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f)); body[19] = static_cast(sep); body[20] = static_cast(num); body[21] = static_cast((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10)); body[22] = static_cast((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10)); body[23] = static_cast((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10)); body[24] = static_cast((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10)); body[25] = static_cast(0x05); }else if(body.length()==29){ body[14] = static_cast((((t1.time().minute()/10)&0x0f)<<4)|((t1.time().minute()%10)&0x0f)); body[15] = static_cast((((t1.time().hour()/10)&0x0f)<<4)|((t1.time().hour()%10)&0x0f)); body[16] = static_cast((((t1.date().day()/10)&0x0f)<<4)|((t1.date().day()%10)&0x0f)); body[17] = static_cast((((t1.date().month()/10)&0x0f)<<4)|((t1.date().month()%10)&0x0f)); body[18] = static_cast((((t1.date().year()/10)&0x0f)<<4)|((t1.date().year()%10)&0x0f)); body[19] = static_cast((((t2.time().minute()/10)&0x0f)<<4)|((t2.time().minute()%10)&0x0f)); body[20] = static_cast((((t2.time().hour()/10)&0x0f)<<4)|((t2.time().hour()%10)&0x0f)); body[21] = static_cast((((t2.date().day()/10)&0x0f)<<4)|((t2.date().day()%10)&0x0f)); body[22] = static_cast((((t2.date().month()/10)&0x0f)<<4)|((t2.date().month()%10)&0x0f)); body[23] = static_cast((((t2.date().year()/10)&0x0f)<<4)|((t2.date().year()%10)&0x0f)); body[24] = static_cast((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10)); body[25] = static_cast((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10)); body[26] = static_cast((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10)); body[27] = static_cast((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10)); body[28] = static_cast(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(ServerAddr1&0xff); body[1] = static_cast((ServerAddr1>>8)&0xff); body[2] = static_cast((ServerAddr1>>16)&0xff); body[3] = static_cast((ServerAddr1>>24)&0xff); body[4] = static_cast(ServerAddr0&0xff); body[5] = static_cast((ServerAddr0>>8)&0xff); body[6] = static_cast((ServerAddr0>>16)&0xff); body[7] = static_cast(0x00); body[8] = static_cast(0x00); body[9] = static_cast(0xe0); body[10] = static_cast(0x00); body[11] = static_cast(0x00); body[12] = static_cast(0x01); body[13] = static_cast(0x00); body[14] = static_cast(0x00); body[15] = static_cast((((dt.time().second()/10)&0x0f)<<4)|(dt.time().second()%10)); body[16] = static_cast((((dt.time().minute()/10)&0x0f)<<4)|(dt.time().minute()%10)); body[17] = static_cast((((dt.time().hour()/10)&0x0f)<<4)|(dt.time().hour()%10)); body[18] = static_cast((((dt.date().day()/10)&0x0f)<<4)|(dt.date().day()%10)); body[19] = static_cast(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(0x68); data[1] = static_cast(len&0xff); data[2] = static_cast((len>>8)&0xff); data[3] = static_cast(len&0xff); data[4] = static_cast((len>>8)&0xff); data[5] = static_cast(0x68); data[6] = static_cast(ServerAddr1&0xff); data[7] = static_cast((ServerAddr1>>8)&0xff); data[8] = static_cast((ServerAddr1>>16)&0xff); data[9] = static_cast((ServerAddr1>>24)&0xff); data[10] = static_cast(ServerAddr0&0xff); data[11] = static_cast((ServerAddr0>>8)&0xff); data[12] = static_cast((ServerAddr0>>16)&0xff); data[13] = static_cast(0x00); for(int i=8;i(body.at(i)&0xff); quint16 crc = chk_crcc(data.mid(6,len),len); data[data.length()-3] = static_cast(crc&0xff); data[data.length()-2] = static_cast((crc>>8)&0xff); data[data.length()-1] = static_cast(0x16); return data; } float SmartLightCommThread::get_repValue(int type, QByteArray dat) { switch (type) { case 0x01: if(dat.length()==2){ return static_cast(((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((((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(d*10000); break; case 0x01: return static_cast(d*1000); break; case 0x02: return static_cast(d*100); break; case 0x03: return static_cast(d*10); break; case 0x04: return static_cast(d); break; case 0x05: return static_cast(d*0.1); break; case 0x06: return static_cast(d*0.01); break; case 0x07: return static_cast(d*0.001); break; } } break; case 0x04: case 0x06: case 0x08: if(dat.length()==2){ return static_cast((((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(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<=(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>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(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(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(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(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(arg1),static_cast(arg2),static_cast(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<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(arg1),static_cast(arg2),static_cast(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<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(arg1),static_cast(arg2),static_cast(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;i0){ 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(arg1),static_cast(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(arg1),static_cast(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(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(arg1),static_cast(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(((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(value),'g',3))); o_data.append(QString::fromUtf8(" 功率因素:%1%%").arg(QString::number(static_cast(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(arg1),static_cast(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(((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(value),'g',3))); o_data.append(QString::fromUtf8(" 电流值:%1A").arg(QString::number(static_cast(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(arg1),static_cast(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(((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(arg1),static_cast(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(arg1),static_cast(arg2),static_cast(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(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(arg1),static_cast(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(arg1),static_cast(arg2),static_cast(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(arg1),static_cast(arg2),static_cast(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(value); emit getEAlarm(DeviceID,err_code,sta,static_cast(arg1),static_cast(arg2),static_cast(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(((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(value),'g',3))); o_data.append(QString::fromUtf8(" 杆电压:%1V").arg(QString::number(static_cast(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(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(((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(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(arg1),static_cast(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(arg1),static_cast(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;vsmartLightList[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(arg1),static_cast(arg2),static_cast(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((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(v1),'g',3))); o_data.append(QString::fromUtf8(" 电流:%1A").arg(QString::number(static_cast(v2),'g',3))); o_data.append(QString::fromUtf8(" 有功功率:%1W/VAR").arg(QString::number(static_cast(v3),'g',3))); o_data.append(QString::fromUtf8(" 功率因素:%1%").arg(QString::number(static_cast(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(arg1),static_cast(arg2),static_cast(arg3),v1,v2, QString("%1,%2").arg(QString::number(static_cast(v3),'g',3)).arg(QString::number(static_cast(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;ismartLightList[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;iabort(); keepcomm = false; } void SmartLightCommThread::stop() { keepcomm = false; }