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 +=\