diff --git a/src/faultMgr/c_program/beatProc/beatProc.c b/src/faultMgr/c_program/beatProc/beatProc.c index edcaa61..f2ef521 100644 --- a/src/faultMgr/c_program/beatProc/beatProc.c +++ b/src/faultMgr/c_program/beatProc/beatProc.c @@ -257,70 +257,179 @@ void localBeatRecv(BYTE oidLen, DWORD *oidArr, BYTE *pdata,WORD dataLen,snmp_add } } }*/ - //another omc - if(psysconf->systypeno == 0) - { - if(oidArr[7] == 2 && oidArr[8] == 4 && oidArr[9] == 10) + + //check oidlen + // if(oidLen > oidArr[psysconf->prefixoidlen]+1) + // { + // //ems_debug(BEATPROC_DEBUG_LOGFILE,"The length of oid is big"); + // return; + // } + + // 处理告警 Trap (OID 以 .8 结尾) + if (oidArr[psysconf->prefixoidlen] == 8) { - update_ems_process_state(oidArr,pdata); + + //处理心跳 Trap (OID 以 .2 结尾) + // 打印 pdata 的内容 + // char pdatastring[256] = {0}; + // char tmpstr[16]; + // for (int j = 0; j < dataLen; j++) + // { + // sprintf(tmpstr, "%02X ", pdata[j]); + // strcat(pdatastring, tmpstr); + // } + // char oidstring[256] = {0}; + // oidtostr(oidArr, oidLen, oidstring); + // ems_debug(BEATPROC_DEBUG_LOGFILE, "Received alarm trap OID: %s, data: %s", oidstring, pdatastring); + + sysno=pdata[0]; + subsysno=pdata[1]; + if(sysno >= psysconf->maxsysnum || subsysno >= psysconf->maxsubsysnum) + { + ems_debug(BEATPROC_DEBUG_LOGFILE,"System %s sysno or subsysno is too big,[%d,%d] > [%d,%d]",psysconf->systypename,sysno,subsysno,psysconf->maxsysnum,psysconf->maxsubsysnum); return; } - - for(i=0;i<4;i++) - { - //ems_debug(BEATPROC_DEBUG_LOGFILE,"pdata[39+%d]:%d",i,(int *)pdata[39+i]); - //ems_debug(BEATPROC_DEBUG_LOGFILE,"beatProcSequenceNum[%d]:%d",i,(int)beatProcSequenceNum[i]); - if(pdata[39+i] != beatProcSequenceNum[i]) + // 提取时间戳(第 3-6 字节) + unsigned long alarmTime = (pdata[2] << 24) | (pdata[3] << 16) | (pdata[4] << 8) | pdata[5]; + + // 将时间戳转换为字符串形式的 alarmId + char alarmIdStr[32]; + sprintf(alarmIdStr, "%lu", alarmTime); + + + + // 转换时间戳为时间格式 + char alarmTimeStr[20]; // 格式化后的时间字符串 + time_t alarmTime_t = (time_t)alarmTime; + strftime(alarmTimeStr, sizeof(alarmTimeStr), "%Y-%m-%d %H:%M:%S", localtime(&alarmTime_t)); + + + // 提取其他字段 + int clearMode = pdata[6]; // 清除码 + int compCode = pdata[8]; // 组件 ID + int alarmCode = pdata[9]; // 告警码 + + + // 提取告警信息(第 11 字节开始) + char alarmInfo[256] = {0}; + memcpy(alarmInfo, &pdata[10], dataLen - 10); // 剩余字节为告警信息 + + MYSQL *pubConn = mysql_conn("localhost","OMC_PUB"); + if (pubConn == NULL) + { + ems_debug(BEATPROC_DEBUG_LOGFILE, "Connect to OMC_PUB fail"); + return; + } + + // 构造 SQL 语句 + if (clearMode == 0) + { + + // 清除告警 + sprintf(beatproc_sqlstr, + "UPDATE sysAlarmInfo SET clearTime=CURRENT_TIMESTAMP, clearMode=0, clearBy='System' " + "WHERE sysTypeNo=%d AND sysNo=%d AND subSysNo=%d AND compCode=%d AND alarmCode=%d AND clearMode=1 AND alarmId='%s';", + psysconf->systypeno, sysno, subsysno, compCode, alarmCode, alarmIdStr); + + if (mysql_getnores(pubConn, beatproc_sqlstr) != 0) + { + ems_debug(BEATPROC_DEBUG_LOGFILE, "[SQL ERR], %s", beatproc_sqlstr); + } + else + { + ems_debug(BEATPROC_DEBUG_LOGFILE, "Alarm cleared: %s", beatproc_sqlstr); + } + mysql_close(pubConn); + return; + } + else if (clearMode == 1) + { + + // 新增告警 + sprintf(beatproc_sqlstr, + "INSERT INTO sysAlarmInfo (sysTypeNo, sysNo, subSysNo, compCode, alarmCode, alarmTime, clearTime, clearMode, alarmId, alarmInfo) " + "VALUES (%d, %d, %d, %d, %d, '%s', '0000-00-00 00:00:00', 1, '%s', '%s');", + psysconf->systypeno, sysno, subsysno, compCode, alarmCode, alarmTimeStr, alarmIdStr, alarmInfo); + + if (mysql_getnores(pubConn, beatproc_sqlstr) != 0) + { + ems_debug(BEATPROC_DEBUG_LOGFILE, "[SQL ERR], %s", beatproc_sqlstr); + } + else + { + ems_debug(BEATPROC_DEBUG_LOGFILE, "New alarm inserted: %s", beatproc_sqlstr); + } + mysql_close(pubConn); + return; + } + } //end if .8 + else{ + //another omc + if(psysconf->systypeno == 0) { - //ems_debug(BEATPROC_DEBUG_LOGFILE,"beatProcSequenceNum:%s",Sequencstring); + if(oidArr[7] == 2 && oidArr[8] == 4 && oidArr[9] == 10) + { + update_ems_process_state(oidArr,pdata); + return; + } + + for(i=0;i<4;i++) + { + //ems_debug(BEATPROC_DEBUG_LOGFILE,"pdata[39+%d]:%d",i,(int *)pdata[39+i]); + //ems_debug(BEATPROC_DEBUG_LOGFILE,"beatProcSequenceNum[%d]:%d",i,(int)beatProcSequenceNum[i]); + + if(pdata[39+i] != beatProcSequenceNum[i]) + { + //ems_debug(BEATPROC_DEBUG_LOGFILE,"beatProcSequenceNum:%s",Sequencstring); + return; + } + } + //ems_debug(BEATPROC_DEBUG_LOGFILE,"EqHBProSequenceNum:%s",Sequencstring); + + } + //msc trap message for parameter + else if(psysconf->systypeno == 320) + { + if(oidLen <= psysconf->prefixoidlen) + { + ems_debug(BEATPROC_DEBUG_LOGFILE,"MSC trap message oid is too short %d <= %d",oidLen,psysconf->prefixoidlen); + return; + } + //parameter + if(oidArr[psysconf->prefixoidlen] == 2) + { + update_msc_trap_msg(oidLen,oidArr,pdata,dataLen,addr); + return; + } + } + + + + //check sysno and subsysno + sysno=pdata[0]; + subsysno=pdata[1]; + if(sysno >= psysconf->maxsysnum || subsysno >= psysconf->maxsubsysnum) + { + ems_debug(BEATPROC_DEBUG_LOGFILE,"System %s sysno or subsysno is too big,[%d,%d] > [%d,%d]",psysconf->systypename,sysno,subsysno,psysconf->maxsysnum,psysconf->maxsubsysnum); return; } - } - //ems_debug(BEATPROC_DEBUG_LOGFILE,"EqHBProSequenceNum:%s",Sequencstring); - - } - //msc trap message for parameter - else if(psysconf->systypeno == 320) - { - if(oidLen <= psysconf->prefixoidlen) - { - ems_debug(BEATPROC_DEBUG_LOGFILE,"MSC trap message oid is too short %d <= %d",oidLen,psysconf->prefixoidlen); - return; - } - //parameter - if(oidArr[psysconf->prefixoidlen] == 2) - { - update_msc_trap_msg(oidLen,oidArr,pdata,dataLen,addr); - return; - } - } - - - - //check sysno and subsysno - sysno=pdata[0]; - subsysno=pdata[1]; - if(sysno >= psysconf->maxsysnum || subsysno >= psysconf->maxsubsysnum) - { - ems_debug(BEATPROC_DEBUG_LOGFILE,"System %s sysno or subsysno is too big,[%d,%d] > [%d,%d]",psysconf->systypename,sysno,subsysno,psysconf->maxsysnum,psysconf->maxsubsysnum); - return; - } - - if(psysconf->systems[sysno][subsysno].isalive == 0) - { - psysconf->systems[sysno][subsysno].isalive=1; - //printf("%s-%d-%d-%d is alive\n",psysconf->systypename,index,sysno,subsysno); - } - - if(psysconf->isalive == 0) - { - psysconf->isalive=1; - } - - psysconf->systems[sysno][subsysno].lastupdatetime=time(NULL); - - update_state(psysconf,sysno,subsysno,pdata,dataLen,addr); + + if(psysconf->systems[sysno][subsysno].isalive == 0) + { + psysconf->systems[sysno][subsysno].isalive=1; + //printf("%s-%d-%d-%d is alive\n",psysconf->systypename,index,sysno,subsysno); + } + + if(psysconf->isalive == 0) + { + psysconf->isalive=1; + } + + psysconf->systems[sysno][subsysno].lastupdatetime=time(NULL); + + update_state(psysconf,sysno,subsysno,pdata,dataLen,addr); + } }