Bladeren bron

修改报警规则

// 报警规则1:满足条件报警
// - :   -∞   +∞   默认范围
// > :   max  +∞   介于中间报警
// < :   -∞   min  介于中间报警
// []:   min  max  介于中间报警
// 报警规则2:系统中仅存在一条活跃报警;新报警产生后,应该将历史报警恢复。
// 报警关键字:object,新报警产生时,与本模块alarmRuleId不相符的活跃报警,应当恢复
// update相关代码,在mysql触发器中执行
舍得 1 jaar geleden
bovenliggende
commit
1bdaa20849
5 gewijzigde bestanden met toevoegingen van 65 en 75 verwijderingen
  1. 31 47
      AlarmRecognition/Module.cpp
  2. 17 17
      AlarmRecognition/Module.h
  3. 10 0
      EngineAlarm/DataEngine.cpp
  4. 5 4
      MQTTAgent/MQTTAgent.cpp
  5. 2 7
      MQTTAgent/MQTTAgent.pro

+ 31 - 47
AlarmRecognition/Module.cpp

@@ -83,19 +83,19 @@ void Module::Setup(ModuleInfo mi)
                 dbOperator2 = json["Operator2"].toDouble();
             }
 
-            std::string szOp = json["Operator"].toString().toLocal8Bit().toStdString();
-            if( strcasecmp(szOp.c_str(), "range") == 0)
+            tr.szOperator = json["Operator"].toString().toLocal8Bit().toStdString();
+            if( strcasecmp(tr.szOperator.c_str(), "range") == 0)
             {
                 tr.dbMin = dbOperator1;
                 tr.dbMax = dbOperator2;
             }
-            else if( strcasecmp(szOp.c_str(), "above") == 0)
+            else if( strcasecmp(tr.szOperator.c_str(), "above") == 0)
             {
-                tr.dbMax = dbOperator1;
+                tr.dbMin = dbOperator1;
             }
-            else if( strcasecmp(szOp.c_str(), "below") == 0)
+            else if( strcasecmp(tr.szOperator.c_str(), "below") == 0)
             {
-                tr.dbMin = dbOperator1;
+                tr.dbMax = dbOperator1;
             }
             m_mpRangeConfig[tr.szName.toLocal8Bit().toStdString()] = tr;
         }
@@ -151,58 +151,42 @@ void Module::OnSubData(std::string table,std::string val)
     {
         std::string szDataName = itr->first;
 
-        m_mpRangeConfig[szDataName].nStatus = EAS_Normal;
+        // set current status
+        int nStatus = 0;
         std::list<tagKeyValue>::iterator itrV;
         for( itrV = m_mpDataValue[szDataName].begin(); itrV != m_mpDataValue[szDataName].end(); ++itrV)
         {
             tagKeyValue tKV = *itrV;
-
-            if( itrV->value > m_mpRangeConfig[szDataName].dbMax )
+            if( itrV->value >= m_mpRangeConfig[szDataName].dbMin &&
+                itrV->value <= m_mpRangeConfig[szDataName].dbMax )
             {
-                m_mpRangeConfig[szDataName].nStatus |= 0x01;
-            }
-            else if( itrV->value < m_mpRangeConfig[szDataName].dbMin )
-            {
-                m_mpRangeConfig[szDataName].nStatus |= 0x02;
-            }
-            else
-            {
-                m_mpRangeConfig[szDataName].nStatus = EAS_Normal;
+                nStatus |= 1;
             }
         }
 
-        //qDebug() << __FILE__ << __LINE__ << name.c_str() << m_mpRangeConfig[name].nStatus;
-        std::vector<std::string>::iterator itr;
-        for( itr = m_szOutputs.begin(); itr != m_szOutputs.end(); ++itr )
+        // new alarm
+        if( nStatus == 1 && m_mpRangeConfig[szDataName].nStatus == 0)
         {
-            QString szStatus;
-            switch( m_mpRangeConfig[szDataName].nStatus )
+            m_mpRangeConfig[szDataName].nStatus = 1;
+
+            std::vector<std::string>::iterator itr;
+            for( itr = m_szOutputs.begin(); itr != m_szOutputs.end(); ++itr )
             {
-            case EAS_Normal:
-                szStatus = "[]";
-                break;
-            case EAS_OverThan:
-                szStatus = ">";
-                break;
-            case EAS_UnderThan:
-                szStatus = "<";
-                break;
-            case EAS_Both:
-                szStatus = "><";
-                break;
+                if( m_mpRangeConfig[szDataName].nStatus != 0)
+                {
+                    QString szJson;
+                    szJson += "{";
+                    szJson += QString("\"occurTime\":\"%1\",").arg(QDateTime::currentDateTime().toString("hh:mm:ss.zzz"));
+                    szJson += QString("\"status\":0,");
+                    szJson += QString("\"content\":\"%1 %2\",").arg(szDataName.c_str()).arg(m_mpRangeConfig[szDataName].szOperator.c_str());
+                    szJson += QString("\"alarmRuleId\":\"%1\",").arg(m_mpRangeConfig[szDataName].alarmRuleId.c_str());
+                    szJson += QString("\"alarmRuleVersion\":%1,").arg(m_mpRangeConfig[szDataName].alarmRuleVersion);
+                    szJson += QString("\"level\":%1,").arg(m_mpRangeConfig[szDataName].level);
+                    szJson += QString("\"object\":\"%1\"").arg(m_mpRangeConfig[szDataName].object.c_str());
+                    szJson += "}";
+                    m_pDataConsumer->OnData(*itr,QVariant(szJson));
+                }
             }
-
-            QString szJson;
-            szJson += "{";
-            szJson += QString("\"occurTime\":\"%1\",").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss:zzz"));
-            szJson += QString("\"status\":%1,").arg(m_mpRangeConfig[szDataName].status);
-            szJson += QString("\"content\":\"%1 %2\",").arg(szDataName.c_str()).arg(szStatus);
-            szJson += QString("\"alarmRuleId\":\"%1\",").arg(m_mpRangeConfig[szDataName].alarmRuleId.c_str());
-            szJson += QString("\"alarmRuleVersion\":%1,").arg(m_mpRangeConfig[szDataName].alarmRuleVersion);
-            szJson += QString("\"level\":%1,").arg(m_mpRangeConfig[szDataName].level);
-            szJson += QString("\"object\":\"%1\"").arg(m_mpRangeConfig[szDataName].object.c_str());
-            szJson += "}";
-            m_pDataConsumer->OnData(*itr,QVariant(szJson));
         }
     }
     m_objDataLock.unlock();

+ 17 - 17
AlarmRecognition/Module.h

@@ -5,20 +5,20 @@
 #include <QtCore/QDateTime>
 #include <QtCore/QReadWriteLock>
 
-enum EAlarmStatus
-{
-    EAS_Normal = 0,
-    EAS_OverThan = 1,
-    EAS_UnderThan = 2,
-    EAS_Both = 3
-};
+// 数据越限报警:测试脚本,由td触发,报警结果推送到mqtt
+// CREATE TABLE IF NOT EXISTS lanpengdb.mokuai99(ts timestamp, dim1 double);
+// create topic mokuai99 as select * from lanpengdb.mokuai99;
+// delete from lanpengdb.mokuai99;
+// insert into lanpengdb.mokuai99 values(NOW,12.345);
 
-// 全局唯一实例
-// 数据越限报警
-// CREATE TABLE IF NOT EXISTS lanpengdb.mokuai2(ts timestamp, dim1 double);
-// create topic mokuai2 as select * from lanpengdb.mokuai2;
-// delete from lanpengdb.mokuai2;
-// insert into lanpengdb.mokuai2 values(NOW,12.345);
+// 报警规则1:满足条件报警
+// - :   -∞   +∞   默认范围
+// > :   max  +∞   介于中间报警
+// < :   -∞   min  介于中间报警
+// []:   min  max  介于中间报警
+// 报警规则2:系统中仅存在一条活跃报警;新报警产生后,应该将历史报警恢复。
+// 报警关键字:object,新报警产生时,与本模块alarmRuleId不相符的活跃报警,应当恢复
+// update相关代码,在mysql触发器中执行
 class ALARMRECOGNITION_EXPORT Module : public BaseModule
 {
 public:
@@ -30,7 +30,8 @@ private:
         double dbMax = __DBL_MAX__;
         double dbMin = __DBL_MIN__;
         uint uWinSize = 5;
-        int nStatus = EAS_Normal;
+        int nStatus = 0;
+        std::string szOperator;         // 操作符
 
         std::string alarmRuleId;        // 节点-标识码
         int alarmRuleVersion;
@@ -43,7 +44,7 @@ private:
             dbMax = __DBL_MAX__;
             dbMin = __DBL_MIN__;
             uWinSize = 5;
-            nStatus = EAS_Normal;
+            nStatus = 0;
         }
     };
     struct  tagKeyValue{
@@ -69,10 +70,9 @@ private:
 
 private:
     std::map<std::string,std::list<tagKeyValue>>
-                                        m_mpDataValue;       // 测量数据
+                                        m_mpDataValue;       // 测量数据:data name - list
     QReadWriteLock                      m_objDataLock;
 
-    //void Verify();
 public:
     virtual void Setup(ModuleInfo mi);
     virtual void regConsumer(DataConsumer* pDC) ;

+ 10 - 0
EngineAlarm/DataEngine.cpp

@@ -83,6 +83,11 @@ void loadConfig(std::string szFile,Config& config)
 
 void DataEngine::startup_DataAlarm(DeviceInfo di)
 {
+    if( di.ModuleInfo.vSettings.begin() == di.ModuleInfo.vSettings.end() )
+    {
+        return;
+    }
+
     DeviceController* pControler = new DeviceController();
     pControler->regConsumer(this);
     pControler->CreateDevice(di);
@@ -104,6 +109,11 @@ void DataEngine::startup_DataAlarm(DeviceInfo di)
 
 void DataEngine::startup_CommAlarm(DeviceInfo di)
 {
+    if( di.ModuleInfo.vSettings.begin() == di.ModuleInfo.vSettings.end() )
+    {
+        return;
+    }
+
     DeviceController* pControler = new DeviceController();
     pControler->regConsumer(this);
     pControler->CreateDevice(di);

+ 5 - 4
MQTTAgent/MQTTAgent.cpp

@@ -1,5 +1,6 @@
 #include "MQTTAgent.h"
 #include <QMqtt.h>
+#include <QtCore/QUuid>
 
 MQTTAgent* g_pThis;
 
@@ -30,10 +31,10 @@ bool MQTTAgent::Connect(tagSetup ts)
     m_pMqtt = new QMQTT::Client();
 
     connect(m_pMqtt, &QMQTT::Client::connected, []{
-        qDebug()<< __FILE__ << __LINE__ << "connected";
+        qDebug()<< __FILE__ << __LINE__ << QDateTime::currentDateTime().toString("hh:mm:ss.zzz") << "connected";
     });
     connect(m_pMqtt, &QMQTT::Client::disconnected, []{
-        qDebug()<< __FILE__ << __LINE__ << "disconnect";
+        qDebug()<< __FILE__ << __LINE__ << QDateTime::currentDateTime().toString("hh:mm:ss.zzz") << "disconnect";
     });
     connect(m_pMqtt, &QMQTT::Client::received, this, &onReceived);
 
@@ -42,7 +43,7 @@ bool MQTTAgent::Connect(tagSetup ts)
     //m_pMqtt->setHostName("www.kjxry.cn");
     m_pMqtt->setPort(ts.port);
     m_pMqtt->setKeepAlive(60);
-    m_pMqtt->setClientId("C001"); //唯一id, 相同id不能同时连接
+    m_pMqtt->setClientId(QUuid::createUuid().toString()); //唯一id, 相同id不能同时连接
     m_pMqtt->setUsername(ts.user.c_str());
     m_pMqtt->setPassword(ts.password.c_str());
 
@@ -104,7 +105,7 @@ void MQTTAgent::Publish(std::string szKey,QVariant v)
     if( m_pMqtt != nullptr )
     {
         m_pMqtt->publish(message);
-        qDebug() << __FILE__ << __LINE__ << szKey.c_str() << " " << v.toString();
+        //qDebug() << __FILE__ << __LINE__ << szKey.c_str() << " " << v.toString();
     }
 }
 

+ 2 - 7
MQTTAgent/MQTTAgent.pro

@@ -11,10 +11,11 @@ unix{
 }
 else{
 #DESTDIR = $$PWD/../bin/plugins
-DESTDIR = $$PWD/../lib
+DESTDIR = $$PWD/../bin
 }
 
 INCLUDEPATH += ../include
+LIBS += $$PWD/../bin/Qt5Qmqtt.dll
 #LIBS += -L$$PWD/lib/ -lQt5Qmqtt
 
 SOURCES += \
@@ -30,9 +31,3 @@ HEADERS += \
 FORMS += \
 #    widget.ui
 
-LIBS += $$PWD/../bin/Qt5Qmqtt.dll
-
-# Default rules for deployment.
-#qnx: target.path = /tmp/$${TARGET}/bin
-#else: unix:!android: target.path = /opt/$${TARGET}/bin
-#!isEmpty(target.path): INSTALLS += target