diff --git a/product/common/sysconfig/signal_srv.xml b/product/common/sysconfig/signal_srv.xml
index 01f6d4c2..64f45495 100644
--- a/product/common/sysconfig/signal_srv.xml
+++ b/product/common/sysconfig/signal_srv.xml
@@ -9,11 +9,20 @@
-->
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/product/src/application/signal_srv/SignalSrvThread.cpp b/product/src/application/signal_srv/SignalSrvThread.cpp
index 414fb557..6c1eff0d 100644
--- a/product/src/application/signal_srv/SignalSrvThread.cpp
+++ b/product/src/application/signal_srv/SignalSrvThread.cpp
@@ -9,7 +9,8 @@
#include "alarm/CAlarmDataCollect.h"
#include "processCheck/CProcessCheckSignalManage.h"
#include "processCheck/CProcessQueryThread.h"
-
+#include "appCheck/CAppQueryThread.h"
+#include "appCheck/CAppCheckSignalManage.h"
using namespace std;
using namespace iot_public;
@@ -46,11 +47,14 @@ int iot_service::SignalSrvThread::setMaster()
{
m_bMaster=true;
//CAlarmSignalManage::instance()->initialize();
-
//CAlarmDataCollect::instance()->initialize();
- CProcessCheckSignalManage::instance()->initialize();
- CProcessQueryThread::instance()->initialize();
+ //CProcessCheckSignalManage::instance()->initialize();
+ //CProcessQueryThread::instance()->initialize();
+
+ CAppCheckSignalManage::instance()->initialize();
+ CAppQueryThread::instance()->initialize();
+
return iotSuccess;
}
@@ -63,7 +67,10 @@ int iot_service::SignalSrvThread::setSlave()
//CAlarmDataCollect::instance()->release();
//CAlarmSignalManage::instance()->release();
- CProcessQueryThread::instance()->release();
+ //CProcessQueryThread::instance()->release();
+
+ CAppQueryThread::instance()->release();
+
return iotSuccess;
}
@@ -77,7 +84,9 @@ void iot_service::SignalSrvThread::execute()
}
- CProcessCheckSignalManage::instance()->handleSignal();
+ //CProcessCheckSignalManage::instance()->handleSignal();
+
+ CAppCheckSignalManage::instance()->handleSignal();
}
diff --git a/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.cpp b/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.cpp
new file mode 100644
index 00000000..8551342e
--- /dev/null
+++ b/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.cpp
@@ -0,0 +1,176 @@
+#include "CAppCheckSignalManage.h"
+#include "SignalSrvCommon.h"
+#include "QSet"
+#include "rapidjson/document.h"
+#include "rapidjson/error/en.h"
+#include
+#include
+#include "pub_utility_api/FileUtil.h"
+#include
+#include "pub_logger_api/logger.h"
+#include "CAppQueryCommon.h"
+
+
+
+static QMutex g_mutex;
+CAppCheckSignalManage *CAppCheckSignalManage::pInstance = NULL;
+
+CAppCheckSignalManage *CAppCheckSignalManage::instance()
+{
+ QMutexLocker locker(&g_mutex);
+ if(pInstance == NULL)
+ {
+ pInstance = new CAppCheckSignalManage();
+ }
+ return pInstance;
+}
+
+void CAppCheckSignalManage::initialize()
+{
+ loadConfig();
+}
+
+bool CAppCheckSignalManage::setGpio(QString value)
+{
+#ifdef Q_OS_WIN
+#else
+ QFile file(m_strAlmIO);
+ if (!file.open(QIODevice::WriteOnly)) {
+ LOGERROR("open %s faild %s when want to write %s",m_strAlmIO.toStdString().c_str(),file.errorString().toStdString().c_str(),value.toStdString().c_str());
+ return false;
+ }
+
+ file.write(value.toUtf8());
+ file.close();
+#endif
+
+ return true;
+}
+
+void CAppCheckSignalManage::updateAppSatus(int appId, int appStatus)
+{
+ QMutexLocker locker(&m_mutex);
+ if(appId==m_checkAppId)
+ {
+ m_mapAppStatus[m_checkAppId]=appStatus;
+ }
+
+}
+
+void CAppCheckSignalManage::handleSignal()
+{
+ QMutexLocker locker(&m_mutex);
+ if(!m_bActive)
+ {
+ return;
+ }
+
+ if(m_mapAppStatus.contains(m_checkAppId)&&m_mapAppStatus[m_checkAppId]==EN_APP_STATUS::EN_APP_RUNNING)
+ {
+ setGpio(m_strAlmClrValue);
+ }
+ else
+ {
+ setGpio(m_strAlmActValue);
+ }
+}
+
+void CAppCheckSignalManage::loadConfig()
+{
+ QDomDocument doc;
+ QString strCfg = iot_public::CFileUtil::getPathOfCfgFile(iot_service::CN_CFG_NAME,CN_DIR_PRODUCT).c_str();
+
+ QFile file(strCfg);
+ if (!file.open(QIODevice::ReadOnly))
+ {
+ LOGERROR("signal_srv can not found file(%s)",strCfg.toStdString().c_str());
+ return;
+ }
+ if (!doc.setContent(&file)){
+ file.close();
+ return;
+ }
+ file.close();
+ QDomElement root = doc.documentElement();
+ QDomElement alarmSignalNode= root.firstChildElement("app_check_signal");
+
+ if (alarmSignalNode.isNull()) {
+ LOGINFO("signal_srv can not found app_check_signal node,and not outputsignal");
+ return ;
+ }
+
+
+ QDomElement almIoElem = alarmSignalNode.firstChildElement("alm_io");
+ if (!almIoElem.isNull())
+ {
+ m_strAlmIO=almIoElem.attribute("file");
+ LOGINFO("alm_io file: %s",almIoElem.attribute("file").toStdString().c_str());
+ }
+ else
+ {
+ LOGERROR("alm_io can not find!");
+ return ;
+ }
+
+ QDomElement appCheckElem = alarmSignalNode.firstChildElement("app_check");
+ QDomElement almActElem = alarmSignalNode.firstChildElement("alm_act");
+ QDomElement almClrElem = alarmSignalNode.firstChildElement("alm_clr");
+
+ if(!appCheckElem.isNull())
+ {
+ m_checkAppId=appCheckElem.attribute("check_app_id").toInt();
+ m_connectDomainId=appCheckElem.attribute("conn_domain_id").toInt();
+ m_connectAppId=appCheckElem.attribute("conn_app_id").toInt();
+ LOGINFO("app_check_id: %s conn_domain_id %s conn_app_id %s",appCheckElem.attribute("check_app_id").toStdString().c_str(),
+ appCheckElem.attribute("domain_id").toStdString().c_str(),appCheckElem.attribute("conn_app_id").toStdString().c_str());
+ }
+ else
+ {
+ LOGERROR("app_check app_id can not find!");
+ return ;
+ }
+
+
+ if (!almActElem.isNull())
+ {
+ m_strAlmActValue=almActElem.attribute("value");
+ LOGINFO("alm_act value: %s",almActElem.attribute("value").toStdString().c_str());
+ }
+ else
+ {
+ LOGERROR("alm_act value can not find!");
+ return ;
+ }
+
+
+ if (!almClrElem.isNull())
+ {
+ m_strAlmClrValue=almClrElem.attribute("value");
+ LOGINFO("alm_clr value: %s",almClrElem.attribute("value").toStdString().c_str());
+ }
+ else
+ {
+ LOGERROR("alm_clr value can not find!");
+ return ;
+ }
+
+ m_bActive=true;
+ LOGINFO("app_check_signal load config ok and will use");
+}
+
+int CAppCheckSignalManage::getConnectDomainId()
+{
+ return m_connectDomainId;
+}
+
+
+int CAppCheckSignalManage::getConnectAppId()
+{
+ return m_connectAppId;
+}
+
+
+CAppCheckSignalManage::CAppCheckSignalManage()
+{
+ loadConfig();
+}
diff --git a/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.h b/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.h
new file mode 100644
index 00000000..3bc2b5fe
--- /dev/null
+++ b/product/src/application/signal_srv/appCheck/CAppCheckSignalManage.h
@@ -0,0 +1,49 @@
+#pragma once
+#include
+#include
+#include
+#include "CAppQueryCommon.h"
+
+
+class CAppCheckSignalManage
+{
+public:
+ static CAppCheckSignalManage * instance();
+
+ ~CAppCheckSignalManage();
+
+
+ void initialize();
+
+ bool setGpio(QString value);
+
+ void updateAppSatus(int appId,int appStatus);
+
+ void handleSignal();
+
+ void loadConfig();
+
+ int getConnectDomainId();
+ int getConnectAppId();
+
+private:
+ CAppCheckSignalManage();
+
+private:
+ static CAppCheckSignalManage * pInstance;
+ QMutex m_mutex;
+
+ QString m_strAlmIO;
+ QString m_strAlmActValue;
+ QString m_strAlmClrValue;
+
+ QMap m_mapAppStatus;
+
+ int m_connectDomainId=0;
+ int m_connectAppId=0;
+
+ int m_checkAppId=0;
+
+ bool m_bActive=false;
+
+};
diff --git a/product/src/application/signal_srv/appCheck/CAppQueryCommon.h b/product/src/application/signal_srv/appCheck/CAppQueryCommon.h
new file mode 100644
index 00000000..3cc9f943
--- /dev/null
+++ b/product/src/application/signal_srv/appCheck/CAppQueryCommon.h
@@ -0,0 +1,37 @@
+#pragma once
+#include
+const std::string CN_TN_SysRunRedundancyInfo = "sys_run_redundancy_info";
+
+struct SApp
+{
+ std::string m_nodeName;
+ int m_appId;
+ std::string m_appName;
+ std::string m_desc;
+ int m_isActive ;
+ int m_isMaster ;
+ int m_isSlave ;
+ int m_hasMaster;
+ SApp()
+ {
+ m_nodeName = "";
+ m_appId =0;
+ m_appName = "";
+ m_desc = "";
+ m_isActive = 0;
+ m_isMaster = 0;
+ m_isSlave = 0;
+ m_hasMaster = 0;
+ }
+};
+
+
+
+enum EN_APP_STATUS
+{
+ EN_APP_STOP = 0, //<已停止
+ EN_APP_RUNNING, //<正在运行
+ EN_APP_UNKNOW, //<未知
+ EN_APP_HALF //<半运行
+};
+
diff --git a/product/src/application/signal_srv/appCheck/CAppQueryThread.cpp b/product/src/application/signal_srv/appCheck/CAppQueryThread.cpp
new file mode 100644
index 00000000..9e63caf0
--- /dev/null
+++ b/product/src/application/signal_srv/appCheck/CAppQueryThread.cpp
@@ -0,0 +1,87 @@
+#include "CAppQueryThread.h"
+#include "CAppQueryCommon.h"
+#include "CAppCheckSignalManage.h"
+#include "rdb_net_api/CRdbNetApi.h"
+#include "pub_logger_api/logger.h"
+
+
+static QMutex g_mutex;
+CAppQueryThread *CAppQueryThread::m_pInstance = NULL;
+
+CAppQueryThread *CAppQueryThread::instance()
+{
+ QMutexLocker locker(&g_mutex);
+ if(m_pInstance == NULL)
+ {
+ m_pInstance = new CAppQueryThread();
+ }
+ return m_pInstance;
+}
+
+
+
+CAppQueryThread::CAppQueryThread():CTimerThreadBase("CAppQueryThread",2000)
+{
+ initData();
+}
+
+
+CAppQueryThread::~CAppQueryThread()
+{
+
+}
+
+
+
+void CAppQueryThread::execute()
+{
+ queryAppRunInfo();
+}
+
+void CAppQueryThread::initialize()
+{
+ resume();
+ LOGINFO("CAppQueryThread::initialize()");
+
+}
+
+void CAppQueryThread::release()
+{
+ suspend();
+ LOGINFO("CAppQueryThread::release()");
+}
+
+bool CAppQueryThread::queryAppRunInfo()
+{
+ bool bRet = false;
+ iot_idl::RdbRet objRdbRet;
+ std::vector vecColumn = {"app_id","node_name","is_active","is_master","is_slave"};
+
+ bRet=m_objRdbNetApi.queryTotal(CN_TN_SysRunRedundancyInfo,vecColumn,objRdbRet,false,false);
+
+ if(!bRet ||objRdbRet.msgrecord_size() < 0)
+ {
+ return false;
+ }
+
+ for(int i=0;iupdateAppSatus( app.m_appId, app.m_isActive);
+ }
+
+ return true;
+}
+
+void CAppQueryThread::initData()
+{
+ int connDomainId=CAppCheckSignalManage::instance()->getConnectDomainId();
+ int connAppId=CAppCheckSignalManage::instance()->getConnectAppId();
+ m_objRdbNetApi.connect(connDomainId,connAppId);
+}
diff --git a/product/src/application/signal_srv/appCheck/CAppQueryThread.h b/product/src/application/signal_srv/appCheck/CAppQueryThread.h
new file mode 100644
index 00000000..3cb4b6e6
--- /dev/null
+++ b/product/src/application/signal_srv/appCheck/CAppQueryThread.h
@@ -0,0 +1,46 @@
+#pragma once
+#include "CAppQueryThread.h"
+#include "pub_utility_api/TimerThreadBase.h"
+#include "rdb_net_api/CRdbNetApi.h"
+#include "CAppQueryCommon.h"
+
+using namespace iot_dbms;
+class CAppQueryThread : public iot_public::CTimerThreadBase
+{
+
+public:
+ static CAppQueryThread *instance();
+
+ virtual ~CAppQueryThread();
+
+ /**
+ * @brief execute 业务处理函数,必须继承实现自己的业务逻辑
+ */
+ virtual void execute();
+
+
+ void initialize();
+
+ void release();
+
+private:
+
+ /**
+ * @brief queryAppRunInfo 查询进程信息
+ * @return true-成功 false-失败
+ */
+ bool queryAppRunInfo();
+
+ void initData();
+
+ CAppQueryThread();
+
+
+private:
+ static CAppQueryThread * m_pInstance;
+ CRdbNetApi m_objRdbNetApi; //< 网络查询对象
+};
+
+
+
+
diff --git a/product/src/application/signal_srv/signal_srv.pro b/product/src/application/signal_srv/signal_srv.pro
index 29376305..e0b0c8d8 100644
--- a/product/src/application/signal_srv/signal_srv.pro
+++ b/product/src/application/signal_srv/signal_srv.pro
@@ -23,7 +23,9 @@ SOURCES += main.cpp \
alarm/CAlarmDataCollect.cpp \
alarm/CAlarmSignalManage.cpp \
processCheck/CProcessQueryThread.cpp \
- processCheck/CProcessCheckSignalManage.cpp
+ processCheck/CProcessCheckSignalManage.cpp \
+ appCheck/CAppCheckSignalManage.cpp \
+ appCheck/CAppQueryThread.cpp
HEADERS += \
SignalSrvApp.h \
@@ -34,7 +36,13 @@ HEADERS += \
alarm/CAlarmSignalManage.h \
processCheck/CProcessQueryThread.h \
processCheck/CProcessCheckSignalManage.h \
- processCheck/CProcessQueryCommon.h
+ processCheck/CProcessQueryCommon.h \
+ processCheck/CProcessCheckSignalManage.h \
+ processCheck/CProcessQueryCommon.h \
+ processCheck/CProcessQueryThread.h \
+ appCheck/CAppCheckSignalManage.h \
+ appCheck/CAppQueryCommon.h \
+ appCheck/CAppQueryThread.h
LIBS +=\