diff --git a/product/common/sysconfig/pub_log_cfg.xml b/product/common/sysconfig/pub_log_cfg.xml
index 76d547c6..498401fa 100644
--- a/product/common/sysconfig/pub_log_cfg.xml
+++ b/product/common/sysconfig/pub_log_cfg.xml
@@ -114,5 +114,8 @@ queueSize : 异步模式下日志队列大小,程序默认值100,单位条
-
+
+
+
+
diff --git a/product/common/sysconfig/signal_srv.xml b/product/common/sysconfig/signal_srv.xml
new file mode 100644
index 00000000..01f6d4c2
--- /dev/null
+++ b/product/common/sysconfig/signal_srv.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/product/src/application/application.pro b/product/src/application/application.pro
index c1ec3b91..32c2f90c 100644
--- a/product/src/application/application.pro
+++ b/product/src/application/application.pro
@@ -24,7 +24,8 @@ SUBDIRS += \
his_amend \
wave_record_server \
sysparams_server \
- strategy_server
+ strategy_server \
+ signal_srv
idong_task_link.depends = idong_srv_api
linkage_server.depends = linkage_server_api trigger_api
diff --git a/product/src/application/signal_srv/SignalSrvApp.cpp b/product/src/application/signal_srv/SignalSrvApp.cpp
new file mode 100644
index 00000000..253eba06
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvApp.cpp
@@ -0,0 +1,280 @@
+#include "SignalSrvApp.h"
+#include "pub_logger_api/logger.h"
+#include "pub_utility_api/SingleProcInstance.h"
+#include "net_msg_bus_api/MsgBusApi.h"
+#include "SignalSrvCommon.h"
+
+using namespace std;
+using namespace iot_public;
+using namespace iot_sys;
+using namespace iot_service;
+using namespace iot_net;
+
+#define OPT_DESC_APP "app"
+#define OPT_DESC_HELP "help"
+
+
+iot_service::SignalSrvApp::SignalSrvApp()
+ :m_ptrSysInfo(NULL),
+ m_ptrProcMng(NULL),
+ m_ptrRedundancyMng(NULL),
+ m_ptrSignalSrvMng(NULL)
+{
+}
+iot_service::SignalSrvApp::~SignalSrvApp()
+{
+ SignalSrvApp::stop();
+}
+
+
+bool iot_service::SignalSrvApp::start(int argc, char *argv[], int &/*nStatus*/)
+{
+ //1.解析启动参数
+ if(!parseCmdLine(argc, argv))
+ {
+ cerr<<"解析启动参数失败" <setCallback(m_ptrSignalSrvMng))
+ {
+ LOGERROR("设置冗余回调接口失败");
+ return false;
+ }
+ //9.更新当前进程冗余状态
+ if(iotSuccess !=m_ptrProcMng->updateProcessInfo(true,false,false))
+ {
+ LOGERROR("更新本进程的进程信息失败");
+ return false;
+ }
+
+ return true;
+}
+
+bool iot_service::SignalSrvApp::stop()
+{
+ //9.更新当前进程冗余状态
+ if(m_ptrProcMng !=NULL)
+ {
+ m_ptrProcMng->updateProcessInfo(false,false,false);
+ }
+ //8.取消冗余通知回调
+ if(m_ptrRedundancyMng !=NULL)
+ {
+ m_ptrRedundancyMng->unsetCallback();
+ }
+ //7.回收业务资源
+ clean();
+ //6.销毁冗余管理
+ m_ptrRedundancyMng.reset();
+ //5.销毁进程管理
+ if(m_ptrProcMng !=NULL)
+ {
+ m_ptrProcMng->unsetCallback();
+ m_ptrProcMng.reset();
+ }
+ //2.销毁日志系统
+ StopLogSystem();
+
+ return true;
+
+}
+
+int iot_service::SignalSrvApp::toQuit()
+{
+ if(m_ptrProcMng != NULL)
+ {
+ m_ptrProcMng->unsetCallback();
+ }
+ shutdown();
+ return iotSuccess;
+}
+
+bool iot_service::SignalSrvApp::parseCmdLine(int argc, char *argv[])
+{
+ //拼接启动参数,用于向进程管理注册
+ for(int i=1;i()->required(),"app label")
+ (OPT_DESC_HELP",h", "\tusage");
+ opt::store(opt::parse_command_line(argc, argv, desc), vm);
+ opt::notify(vm);
+ //输入的是help,则程序仅显示用法
+ if(vm.count(OPT_DESC_HELP))
+ {
+ showHelp(desc);
+ return false;
+ }
+ //输入错误,则显示用法
+ if(vm.count(OPT_DESC_APP)== 0)
+ {
+ showHelp(desc);
+ return false;
+ }
+ //获取应用名
+ if(vm.count(OPT_DESC_APP))
+ {
+ m_strAppName=vm[OPT_DESC_APP].as();
+ }
+ }
+ catch (std::exception &ex)
+ {
+ std::cerr<getLocalRunAppInfoByName(m_strAppName,m_stRunAppInfo))
+ {
+ LOGERROR("获取系统信息失败");
+ return false;
+ }
+ return true;
+}
+
+//向进程管理注册
+bool iot_service::SignalSrvApp::registToProcMng()
+{
+ SProcessInfoKey stProcKey;
+ stProcKey.nDomainId = m_stRunAppInfo.nDomainId;
+ stProcKey.nAppId = m_stRunAppInfo.nAppId;
+ stProcKey.strNodeName = m_stRunAppInfo.strLocalNodeName;
+ stProcKey.strProcName = CN_ProcName_SignalSrv;
+ stProcKey.strProcParam = m_strStartArgs;
+
+ m_ptrProcMng =getProcMngInstance(stProcKey);
+ if(m_ptrProcMng == NULL)
+ {
+ LOGERROR("创建进程管理访问库失败");
+ return false;
+ }
+ if(iotSuccess != m_ptrProcMng->setCallback(this))
+ {
+ LOGERROR("向进程管理设置回调函数失败");
+ return false;
+ }
+ return true;
+}
+
+bool iot_service::SignalSrvApp::initialize()
+{
+ //初始化消息总线
+ if(!initMsgBus(CN_ProcName_SignalSrv.c_str(),strUniqueName.c_str()))
+ {
+ LOGERROR("初始化消息总线失败");
+ return iotFailed;
+ }
+ //创建信号服务管理类
+ m_ptrSignalSrvMng =boost::make_shared(m_stRunAppInfo,m_ptrProcMng);
+ if(m_ptrSignalSrvMng ==NULL)
+ {
+ LOGERROR("创建信号服务管理类失败");
+ return false;
+ }
+ if(iotSuccess !=m_ptrSignalSrvMng->initialize())
+ {
+ LOGERROR("初始化信号服务管理类失败");
+ return false;
+ }
+ return true;
+}
+
+//清理业务资源
+bool iot_service::SignalSrvApp::clean()
+{
+ if(m_ptrSignalSrvMng!=NULL)
+ {
+ m_ptrSignalSrvMng.reset();
+ }
+ //销毁消息总线接口
+ if(!releaseMsgBus())
+ {
+ LOGERROR("销毁消息总线资源失败");
+ return false;
+ }
+ return true;
+}
diff --git a/product/src/application/signal_srv/SignalSrvApp.h b/product/src/application/signal_srv/SignalSrvApp.h
new file mode 100644
index 00000000..3e49d972
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvApp.h
@@ -0,0 +1,91 @@
+
+#pragma once
+
+#include "boost/program_options.hpp"
+#include "pub_utility_api/BaseService.h"
+#include "pub_sysinfo_api/SysInfoApi.h"
+#include "sys_proc_mng_api/ProcMngInterface.h"
+#include "SignalSrvMng.h"
+
+
+namespace iot_service {
+ class SignalSrvApp : public iot_public::CBaseService,public iot_sys::CProcessQuitInterface
+ {
+ public:
+ SignalSrvApp();
+ virtual ~SignalSrvApp();
+ /**
+ * @brief start 启动函数,允许子类执行它的启动活动,一般必须继承,并在其中实现自己的应用逻辑
+ * @param argc 传入参数的个数
+ * @param argv 传入的参数
+ * @param nStatus 错误码
+ * @return 启动成功,子类必须返回true,否则返回false
+ */
+ virtual bool start(int argc, char *argv[], int &nStatus);
+ /**
+ * @brief stop 服务停止清理函数,决定了main()的返回值,缺省返回true,一般需要继承,进行一些必要的资源清理
+ * @return 成功返回true,失败返回false
+ */
+ virtual bool stop();
+ /**
+ * @brief toQuit 用来通知进程退出,一般应用继承后调用service::shutdown()
+ * @return
+ */
+ virtual int toQuit();
+ private:
+ /**
+ * @brief parseCmdLine 解析启动参数
+ * @param argc 参数个数
+ * @param argv 参数列表
+ * @return 成功返回true,失败返回false
+ */
+ bool parseCmdLine(int argc, char *argv[]);
+ /**
+ * @brief showHelp 显示帮助信息
+ * @param objDesc 帮助信息描述
+ */
+ void showHelp(const boost::program_options::options_description &objDesc);
+ /**
+ * @brief isAlreadyRunning 判断同名参数进程是否已经有实例在运行
+ * @return 成功返回true,失败返回false
+ */
+ bool isAlreadyRunning();
+ /**
+ * @brief initLog 初始化日志
+ * @return 成功返回true,失败返回false
+ */
+ bool initLog();
+ /**
+ * @brief getSystemInf 读取系统配置相关信息
+ * @return 成功返回true,失败返回false
+ */
+ bool getSystemInfo();
+ /**
+ * @brief registToProcMng 向进程管理注册
+ * @return 成功返回true,失败返回false
+ */
+ bool registToProcMng();
+ /**
+ * @brief initialize 初始化业务资源
+ * @return 成功返回true,失败返回false
+ */
+ bool initialize();
+ /**
+ * @brief clean 清理业务资源
+ * @return 成功返回true,失败返回false
+ */
+ bool clean();
+ private:
+ std::string strUniqueName; //标识名
+ std::string m_strAppName; //应用名
+ iot_public::SRunAppInfo m_stRunAppInfo; //本应用相关运行参数
+ std::string m_strStartArgs; //保存进程启动参数
+ iot_public::SNodeInfo m_stLocalNodeInfo; //本机节点信息
+ iot_public::CSysInfoInterfacePtr m_ptrSysInfo; //创建系统信息访问智能库指针
+ iot_sys::CProcMngInterfacePtr m_ptrProcMng; //创建进程管理访问智能库指针
+ iot_sys::CRedundantMngInterfacePtr m_ptrRedundancyMng; //冗余管理类
+ SignalSrvMngPtr m_ptrSignalSrvMng; //计算量服务管理类
+ };
+
+} //namespace iot_service
+
diff --git a/product/src/application/signal_srv/SignalSrvCommon.h b/product/src/application/signal_srv/SignalSrvCommon.h
new file mode 100644
index 00000000..9d17b2e6
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvCommon.h
@@ -0,0 +1,7 @@
+#pragma once
+
+namespace iot_service {
+ const std::string CN_ProcName_SignalSrv="signal_srv";//当前进程名
+ const std::string CN_CFG_NAME = "signal_srv.xml";
+
+}
diff --git a/product/src/application/signal_srv/SignalSrvMng.cpp b/product/src/application/signal_srv/SignalSrvMng.cpp
new file mode 100644
index 00000000..8f233f05
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvMng.cpp
@@ -0,0 +1,60 @@
+
+
+#include "SignalSrvMng.h"
+#include "pub_logger_api/logger.h"
+
+iot_service::SignalSrvMng::SignalSrvMng(const iot_public::SRunAppInfo &stRunAppInfo,
+ const iot_sys::CProcMngInterfacePtr &ptrProcMng)
+ :m_stRunAppInfo(stRunAppInfo),
+ m_ptrProcMng(ptrProcMng),
+ m_ptrSignalSrvThread(NULL)
+{
+}
+
+
+iot_service::SignalSrvMng::~SignalSrvMng()
+{
+ if(m_ptrSignalSrvThread != NULL)
+ {
+ m_ptrSignalSrvThread->quit();
+ m_ptrSignalSrvThread.reset();
+ }
+ m_ptrProcMng.reset();
+}
+
+//冗余切换
+int iot_service::SignalSrvMng::redundantSwitch(bool bMaster, bool bSlave)
+{
+ LOGINFO("接收到冗余切换指令.Master=[%d],Slave=[%d]",bMaster,bSlave);
+ if(bMaster && !bSlave) //为主
+ {
+ m_ptrSignalSrvThread->setMaster();
+ m_ptrSignalSrvThread->resume();
+ }
+ else
+ {
+ m_ptrSignalSrvThread->suspend();
+ m_ptrSignalSrvThread->setSlave();
+ }
+
+ m_ptrProcMng->updateProcessInfo(true, bMaster, bSlave);
+
+ return iotSuccess;
+}
+
+//初始化
+int iot_service::SignalSrvMng::initialize()
+{
+ m_ptrSignalSrvThread =boost::make_shared(m_stRunAppInfo);
+ if(m_ptrSignalSrvThread == NULL)
+ {
+ LOGERROR("创建signal线程失败");
+ return iotFailed;
+ }
+ if(iotSuccess !=m_ptrSignalSrvThread->initialize())
+ {
+ LOGERROR("初始化signal线程失败");
+ return iotFailed;
+ }
+ return iotSuccess;
+}
diff --git a/product/src/application/signal_srv/SignalSrvMng.h b/product/src/application/signal_srv/SignalSrvMng.h
new file mode 100644
index 00000000..595140a5
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvMng.h
@@ -0,0 +1,41 @@
+
+#pragma once
+
+#include "pub_sysinfo_api/SysInfoApi.h"
+#include "sys_node_mng_api/NodeMngInterface.h"
+#include "sys_proc_mng_api/ProcMngInterface.h"
+#include "SignalSrvThread.h"
+
+
+
+
+
+namespace iot_service {
+ class SignalSrvMng : public iot_sys::CRedundantSwitchInterface
+ {
+ public:
+ SignalSrvMng(const iot_public::SRunAppInfo &stRunAppInfo,
+ const iot_sys::CProcMngInterfacePtr &ptrProcMng);
+ virtual ~SignalSrvMng();
+ /**
+ * @brief redundantSwitch 冗余切换,应用需要继承并重写,实现自身的冗余切换逻辑
+ * 在进程切换过程中,可能会被调用多次切换,业务进程需要保证幂等,无副作用
+ * @param bMaster 是否为主
+ * @param bSlave 是否为备
+ * @return 成功返回iotSuccess,失败返回错误码
+ */
+ virtual int redundantSwitch(bool bMaster, bool bSlave);
+ /**
+ * @brief initialize 初始化
+ * @return 成功返回iotSuccess,失败返回错误码
+ */
+ int initialize();
+ private:
+ iot_public::SRunAppInfo m_stRunAppInfo; //本应用相关运行参数
+ iot_sys::CProcMngInterfacePtr m_ptrProcMng; //进程管理访问库智能指针
+ SignalSrvThreadPtr m_ptrSignalSrvThread; //计算量主线程
+
+ };
+
+ typedef boost::shared_ptr SignalSrvMngPtr;
+} //namespace iot_service
diff --git a/product/src/application/signal_srv/SignalSrvThread.cpp b/product/src/application/signal_srv/SignalSrvThread.cpp
new file mode 100644
index 00000000..414fb557
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvThread.cpp
@@ -0,0 +1,85 @@
+#include "SignalSrvThread.h"
+#include
+#include
+#include
+#include "net_msg_bus_api/CMbCommunicator.h"
+#include "SignalSrvCommon.h"
+#include "common/MessageChannel.h"
+#include "alarm/CAlarmSignalManage.h"
+#include "alarm/CAlarmDataCollect.h"
+#include "processCheck/CProcessCheckSignalManage.h"
+#include "processCheck/CProcessQueryThread.h"
+
+
+using namespace std;
+using namespace iot_public;
+using namespace iot_service;
+using namespace iot_dbms;
+using namespace iot_service;
+using namespace iot_idl;
+
+
+const int CN_Scan_Period = 500; //扫描周期,单位ms
+
+iot_service::SignalSrvThread::SignalSrvThread(const iot_public::SRunAppInfo &stRunAppInfo)
+ :iot_public::CTimerThreadBase("SignalSrvThread",CN_Scan_Period),
+ m_stRunAppInfo(stRunAppInfo),
+ m_bMaster(false)
+{
+
+}
+iot_service::SignalSrvThread::~SignalSrvThread()
+{
+
+ //CAlarmDataCollect::instance()->release();
+ //CAlarmSignalManage::instance()->release();
+}
+
+
+int iot_service::SignalSrvThread::initialize()
+{
+
+ return iotSuccess;
+}
+
+int iot_service::SignalSrvThread::setMaster()
+{
+ m_bMaster=true;
+ //CAlarmSignalManage::instance()->initialize();
+
+ //CAlarmDataCollect::instance()->initialize();
+
+ CProcessCheckSignalManage::instance()->initialize();
+ CProcessQueryThread::instance()->initialize();
+
+ return iotSuccess;
+}
+
+
+int iot_service::SignalSrvThread::setSlave()
+{
+
+ m_bMaster=false;
+ //CAlarmDataCollect::instance()->release();
+ //CAlarmSignalManage::instance()->release();
+
+ CProcessQueryThread::instance()->release();
+ return iotSuccess;
+
+}
+
+void iot_service::SignalSrvThread::execute()
+{
+
+ if(!m_bMaster)
+ {
+ return;
+ }
+
+
+ CProcessCheckSignalManage::instance()->handleSignal();
+
+}
+
+
+
diff --git a/product/src/application/signal_srv/SignalSrvThread.h b/product/src/application/signal_srv/SignalSrvThread.h
new file mode 100644
index 00000000..24ec6300
--- /dev/null
+++ b/product/src/application/signal_srv/SignalSrvThread.h
@@ -0,0 +1,59 @@
+
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wignored-qualifiers"
+#endif
+
+
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
+#include "pub_utility_api/TimerThreadBase.h"
+#include "pub_sysinfo_api/SysInfoApi.h"
+#include "rdb_api/CRdbAccessEx.h"
+#include "../../include/service/dp_chg_data_api/CDpcdaForApp.h"
+#include "DataProcMessage.pb.h"
+#include "OptDataMessage.pb.h"
+#include "data_process_api/DataProcessApi.h"
+#include "rdb_api/RdbTableMng.h"
+
+
+
+
+namespace iot_service {
+ class SignalSrvThread : public iot_public::CTimerThreadBase
+ {
+ public:
+ SignalSrvThread(const iot_public::SRunAppInfo &stRunAppInfo);
+ virtual ~SignalSrvThread();
+ /**
+ * @brief execute 业务处理函数,必须继承实现自己的业务逻辑
+ */
+ virtual void execute();
+ /**
+ * @brief initialize 初始化
+ * @return 成功返回iotSuccess,失败返回失败码
+ */
+ int initialize();
+ /**
+ * @brief setMaster 设置为主
+ * @return 成功返回iotSuccess,失败返回失败码
+ */
+ int setMaster();
+ /**
+ * @brief setSlave 设置为备
+ * @return 成功返回iotSuccess,失败返回失败码
+ */
+ int setSlave();
+
+
+ private:
+ iot_public::SRunAppInfo m_stRunAppInfo; //本应用运行参数
+ bool m_bMaster;
+
+ };
+ typedef boost::shared_ptr SignalSrvThreadPtr;
+}
+
+
diff --git a/product/src/application/signal_srv/alarm/CAlarmDataCollect.cpp b/product/src/application/signal_srv/alarm/CAlarmDataCollect.cpp
new file mode 100644
index 00000000..d07eb5d0
--- /dev/null
+++ b/product/src/application/signal_srv/alarm/CAlarmDataCollect.cpp
@@ -0,0 +1,186 @@
+
+#include "CAlarmDataCollect.h"
+#include "pub_logger_api/logger.h"
+#include
+#include
+#include "CAlarmSignalManage.h"
+#include
+#include
+#include "alarm_server_api/AlarmCommonDef.h"
+using namespace iot_service;
+
+CAlarmDataCollect * CAlarmDataCollect::m_pInstance = NULL;
+
+
+CAlarmDataCollect::CAlarmDataCollect()
+ : CAlmApiForAlmClt()
+{
+
+}
+CAlarmDataCollect::~CAlarmDataCollect()
+{
+ LOGINFO("CAlarmDataCollect::~CAlarmDataCollect()");
+
+}
+
+CAlarmDataCollect *CAlarmDataCollect::instance()
+{
+ if(NULL == m_pInstance)
+ {
+ m_pInstance = new CAlarmDataCollect();
+ }
+ return m_pInstance;
+}
+
+
+void CAlarmDataCollect::initialize()
+{
+ resumeThread();
+ LOGINFO("CAlarmDataCollect::initialize()");
+}
+
+
+void CAlarmDataCollect::release()
+{
+ suspendThread(true);
+ LOGINFO("CAlarmDataCollect::release()");
+}
+
+bool CAlarmDataCollect::needSendAlarmSignal(const iot_idl::SAlmInfoToAlmClt &msg)
+{
+ if(msg.alm_type()==enAlarmType::ALM_TYPE_SOE)
+ {
+ return false;
+ }else if(msg.region_id()==-1)
+ {
+ return false;
+ }else if(msg.priority()==0)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool CAlarmDataCollect::requestCfmAlm(iot_idl::SAlmCltCfmAlm &objCfmAlm)
+{
+ Q_UNUSED(objCfmAlm)
+ LOGERROR("signal srv do nothing for requestCfmAlm");
+ return true;
+}
+bool CAlarmDataCollect::requestDelAlm(iot_idl::SAlmCltDelAlm &objDelAlm)
+{
+ Q_UNUSED(objDelAlm)
+ LOGERROR("signal srv do nothing for requestDelAlm");
+ return true;
+}
+
+void CAlarmDataCollect::handleAllAlmMsg(int domainId, iot_idl::SAlmCltAddAlm &objAllAlm)
+{
+ QMutexLocker locker(&m_mutex);
+ LOGDEBUG("========== AlarmDataCollect handleAllAlmMsg ==========");
+ CAlarmSignalManage::instance()->removeAlarmMsgByDomainID(domainId);
+ int nAlarmCount = objAllAlm.alm_info_size();
+
+ QMap> mapDomainUuid;
+ for(int nAddMsgIndex(0); nAddMsgIndex < nAlarmCount; nAddMsgIndex++)
+ {
+ iot_idl::SAlmInfoToAlmClt msg = objAllAlm.alm_info(nAddMsgIndex);
+ if(needSendAlarmSignal(msg))
+ {
+ QString uuid = QString::fromStdString(msg.uuid_base64());
+ if(mapDomainUuid.contains(msg.domain_id()))
+ {
+ mapDomainUuid[msg.domain_id()].insert(uuid);
+ }
+ else
+ {
+ QSet uuidList;
+ uuidList.insert(uuid);
+ mapDomainUuid[msg.domain_id()]=uuidList;
+ }
+ }
+
+
+ }
+ CAlarmSignalManage::instance()->addAlarmMsg(mapDomainUuid);
+ LOGDEBUG("handleAllAlmMsg END[%d] ",nAlarmCount);
+ return;
+}
+void CAlarmDataCollect::handleAddAlmMsg(iot_idl::SAlmCltAddAlm &objAddAlm)
+{
+ QMutexLocker locker(&m_mutex);
+ LOGDEBUG("========== AlarmDataCollect handleAddAlmMsg ==========");
+ int nAlarmCount = objAddAlm.alm_info_size();
+ QMap> mapDomainUuid;
+ for(int nAddMsgIndex(0); nAddMsgIndex < nAlarmCount; nAddMsgIndex++)
+ {
+ iot_idl::SAlmInfoToAlmClt msg = objAddAlm.alm_info(nAddMsgIndex);
+ if(needSendAlarmSignal(msg))
+ {
+ QString uuid = QString::fromStdString(msg.uuid_base64());
+ if(mapDomainUuid.contains(msg.domain_id()))
+ {
+ mapDomainUuid[msg.domain_id()].insert(uuid);
+ }
+ else
+ {
+ QSet uuidList;
+ uuidList.insert(uuid);
+ mapDomainUuid[msg.domain_id()]=uuidList;
+ }
+ }
+ }
+
+ CAlarmSignalManage::instance()->addAlarmMsg(mapDomainUuid);
+ LOGDEBUG("handleAddAlmMsg END[%d] ",nAlarmCount);
+ return;
+}
+
+void CAlarmDataCollect::handleCfmAlmMsg(iot_idl::SAlmCltCfmAlm &objCfmAlm)
+{
+ Q_UNUSED(objCfmAlm)
+ LOGDEBUG("signal srv do nothing for handleCfmAlmMsg");
+ return ;
+}
+
+void CAlarmDataCollect::handleDelAlmMsg(iot_idl::SAlmCltDelAlm &objDelAlm)
+{
+ QMutexLocker locker(&m_mutex);
+ LOGDEBUG("========== AlarmDataCollect handleDelAlmMsg ==========");
+ QMap> mapDomainUuid;
+ int nAlarmCount = objDelAlm.uuid_base64_size();
+ for(int nDelMsgIndex(0); nDelMsgIndex < nAlarmCount; nDelMsgIndex++)
+ {
+ QString uuid = QString::fromStdString(objDelAlm.uuid_base64(nDelMsgIndex));
+ if(mapDomainUuid.contains(objDelAlm.domain_id()))
+ {
+ mapDomainUuid[objDelAlm.domain_id()].insert(uuid);
+ }
+ else
+ {
+ QSet uuidList;
+ uuidList.insert(uuid);
+ mapDomainUuid[objDelAlm.domain_id()]=uuidList;
+ }
+ }
+ CAlarmSignalManage::instance()->removeAlarmMsg(mapDomainUuid);
+ LOGDEBUG("handleDelAlmMsg END[%d] ",nAlarmCount);
+ return ;
+}
+
+void CAlarmDataCollect::handleReleaseAlmMsg(iot_idl::SAlmCltReleaseAlm &objRelAlm)
+{
+ Q_UNUSED(objRelAlm)
+ LOGDEBUG("signal srv do nothing for handleReleaseAlmMsg");
+ return ;
+}
+
+void CAlarmDataCollect::handleLinkWave2AlmMsg(iot_idl::SAlmCltLinkWave2Alm &objWave2Alm)
+{
+ Q_UNUSED(objWave2Alm)
+ LOGDEBUG("signal srv do nothing for handleLinkWave2AlmMsg");
+ return ;
+}
+
+
diff --git a/product/src/application/signal_srv/alarm/CAlarmDataCollect.h b/product/src/application/signal_srv/alarm/CAlarmDataCollect.h
new file mode 100644
index 00000000..55e0ee03
--- /dev/null
+++ b/product/src/application/signal_srv/alarm/CAlarmDataCollect.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "AlarmMessage.pb.h"
+#include "alarm_server_api/CAlmApiForAlmClt.h"
+#include
+
+class CAlarmDataCollect : public iot_service::CAlmApiForAlmClt
+{
+
+public:
+ static CAlarmDataCollect *instance();
+
+ virtual ~CAlarmDataCollect();
+
+ virtual bool requestCfmAlm(iot_idl::SAlmCltCfmAlm &objCfmAlm);
+
+ virtual bool requestDelAlm(iot_idl::SAlmCltDelAlm &objDelAlm);
+
+ virtual void handleAllAlmMsg(int domainId, iot_idl::SAlmCltAddAlm &objAllAlm);
+
+ virtual void handleAddAlmMsg(iot_idl::SAlmCltAddAlm &objAddAlm);
+
+ virtual void handleCfmAlmMsg(iot_idl::SAlmCltCfmAlm &objCfmAlm);
+
+ virtual void handleDelAlmMsg(iot_idl::SAlmCltDelAlm &objDelAlm);
+
+ virtual void handleReleaseAlmMsg(iot_idl::SAlmCltReleaseAlm &objDelAlm);
+
+ virtual void handleLinkWave2AlmMsg(iot_idl::SAlmCltLinkWave2Alm &objWave2Alm);
+
+public:
+ void initialize();
+
+ void release();
+
+ bool needSendAlarmSignal(const iot_idl::SAlmInfoToAlmClt& msg);
+
+private:
+ CAlarmDataCollect();
+
+private:
+ static CAlarmDataCollect * m_pInstance;
+ QMutex m_mutex;
+};
diff --git a/product/src/application/signal_srv/alarm/CAlarmSignalManage.cpp b/product/src/application/signal_srv/alarm/CAlarmSignalManage.cpp
new file mode 100644
index 00000000..6b6d2a0f
--- /dev/null
+++ b/product/src/application/signal_srv/alarm/CAlarmSignalManage.cpp
@@ -0,0 +1,206 @@
+#include "pub_logger_api/logger.h"
+#include "CAlarmSignalManage.h"
+#include "QSet"
+#include "rapidjson/document.h"
+#include "rapidjson/error/en.h"
+#include
+#include
+#include "pub_utility_api/FileUtil.h"
+#include
+#include "SignalSrvCommon.h"
+
+static QMutex g_mutex;
+CAlarmSignalManage *CAlarmSignalManage::pInstance = NULL;
+CAlarmSignalManage *CAlarmSignalManage::instance()
+{
+ QMutexLocker locker(&g_mutex);
+ if(pInstance == NULL)
+ {
+ pInstance = new CAlarmSignalManage();
+ }
+ return pInstance;
+}
+CAlarmSignalManage::CAlarmSignalManage()
+{
+
+}
+
+
+
+void CAlarmSignalManage::initialize()
+{
+ release();
+ loadConfig();
+}
+
+void CAlarmSignalManage::release()
+{
+ QMutexLocker locker(&m_mutex);
+ m_mapDomainUuid.clear();
+}
+
+void CAlarmSignalManage::addAlarmMsg(const QMap> & mapDomainUuid)
+{
+ QMutexLocker locker(&m_mutex);
+ for (auto it = mapDomainUuid.cbegin(); it != mapDomainUuid.cend(); ++it) {
+ if (m_mapDomainUuid.contains(it.key()))
+ {
+ m_mapDomainUuid[it.key()].unite(it.value());
+ }
+ else
+ {
+ m_mapDomainUuid.insert(it.key(), it.value());
+ }
+ }
+
+}
+
+void CAlarmSignalManage::removeAlarmMsg(const QMap> & mapDomainUuid)
+{
+ QMutexLocker locker(&m_mutex);
+ for (auto it = mapDomainUuid.cbegin(); it != mapDomainUuid.cend(); ++it)
+ {
+ if (m_mapDomainUuid.contains(it.key())) {
+ m_mapDomainUuid[it.key()].subtract(it.value());
+ if (m_mapDomainUuid[it.key()].isEmpty()) {
+ m_mapDomainUuid.remove(it.key());
+ }
+ }
+
+ }
+
+
+}
+
+void CAlarmSignalManage::removeAlarmMsgByDomainID(const int &domainId)
+{
+ QMutexLocker locker(&m_mutex);
+ if(domainId==-1)
+ {
+ m_mapDomainUuid.clear();
+ }
+ else
+ {
+ m_mapDomainUuid.remove(domainId);
+ }
+}
+
+void CAlarmSignalManage::handleSignal()
+{
+ QMutexLocker locker(&m_mutex);
+ if(!m_bActive)
+ {
+ return;
+ }
+
+ if(hasAlarm())
+ {
+ setGpio(m_strAlmActValue);
+ }
+ else
+ {
+ setGpio(m_strAlmClrValue);
+ }
+
+
+}
+
+void CAlarmSignalManage::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("alarm_signal");
+
+ if (alarmSignalNode.isNull()) {
+ LOGINFO("signal_srv can not found alarm_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 almActElem = alarmSignalNode.firstChildElement("alm_act");
+ QDomElement almClrElem = alarmSignalNode.firstChildElement("alm_clr");
+
+ 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("alarm_signal load config ok and will use");
+}
+
+bool CAlarmSignalManage::hasAlarm()
+{
+ for (auto it = m_mapDomainUuid.cbegin(); it != m_mapDomainUuid.cend(); ++it)
+ {
+ const QSet &set = it.value();
+
+ if (!set.isEmpty()) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool CAlarmSignalManage::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;
+}
+
+
diff --git a/product/src/application/signal_srv/alarm/CAlarmSignalManage.h b/product/src/application/signal_srv/alarm/CAlarmSignalManage.h
new file mode 100644
index 00000000..ae0cdf27
--- /dev/null
+++ b/product/src/application/signal_srv/alarm/CAlarmSignalManage.h
@@ -0,0 +1,50 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+class CAlarmSignalManage
+{
+public:
+ static CAlarmSignalManage * instance();
+
+ ~CAlarmSignalManage();
+
+
+ void initialize();
+
+ void release();
+
+ void addAlarmMsg(const QMap> &mapDomainUuid);
+
+ void removeAlarmMsg(const QMap> &mapDomainUuid);
+
+ void removeAlarmMsgByDomainID(const int &domainId);
+
+ void handleSignal();
+
+ void loadConfig();
+
+ bool hasAlarm();
+
+ bool setGpio(QString value);
+
+private:
+ CAlarmSignalManage();
+
+private:
+ static CAlarmSignalManage * pInstance;
+
+ QMap> m_mapDomainUuid;
+ QMutex m_mutex;
+
+
+ QString m_strAlmIO;
+ QString m_strAlmActValue;
+ QString m_strAlmClrValue;
+
+ bool m_bActive=false;
+
+};
diff --git a/product/src/application/signal_srv/main.cpp b/product/src/application/signal_srv/main.cpp
new file mode 100644
index 00000000..b18e1d82
--- /dev/null
+++ b/product/src/application/signal_srv/main.cpp
@@ -0,0 +1,11 @@
+
+#include
+#include "SignalSrvApp.h"
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ iot_service::SignalSrvApp objApp;
+ return objApp.main(argc,argv);
+}
diff --git a/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.cpp b/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.cpp
new file mode 100644
index 00000000..3268f573
--- /dev/null
+++ b/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.cpp
@@ -0,0 +1,171 @@
+#include "CProcessCheckSignalManage.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 "CProcessQueryCommon.h"
+
+
+
+static QMutex g_mutex;
+CProcessCheckSignalManage *CProcessCheckSignalManage::pInstance = NULL;
+
+CProcessCheckSignalManage *CProcessCheckSignalManage::instance()
+{
+ QMutexLocker locker(&g_mutex);
+ if(pInstance == NULL)
+ {
+ pInstance = new CProcessCheckSignalManage();
+ }
+ return pInstance;
+}
+
+void CProcessCheckSignalManage::initialize()
+{
+ loadConfig();
+}
+
+bool CProcessCheckSignalManage::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 CProcessCheckSignalManage::updateProSatus(QString processName, int proStatus)
+{
+ QMutexLocker locker(&m_mutex);
+ if(processName==m_sSprocess.m_procName)
+ {
+ m_mapProcessStatus[processName]=proStatus;
+ }
+
+}
+
+void CProcessCheckSignalManage::handleSignal()
+{
+ QMutexLocker locker(&m_mutex);
+ if(!m_bActive)
+ {
+ return;
+ }
+
+ if(m_mapProcessStatus.contains(m_sSprocess.m_procName)&&m_mapProcessStatus[m_sSprocess.m_procName]==EN_PROC_STATUS::EN_PROC_RUNNING)
+ {
+ setGpio(m_strAlmClrValue);
+ }
+ else
+ {
+ setGpio(m_strAlmActValue);
+ }
+}
+
+void CProcessCheckSignalManage::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("proc_check_signal");
+
+ if (alarmSignalNode.isNull()) {
+ LOGINFO("signal_srv can not found proc_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 proCheckElem = alarmSignalNode.firstChildElement("proc_check");
+ QDomElement almActElem = alarmSignalNode.firstChildElement("alm_act");
+ QDomElement almClrElem = alarmSignalNode.firstChildElement("alm_clr");
+
+ if(!proCheckElem.isNull())
+ {
+ m_sSprocess.m_procName=proCheckElem.attribute("name");
+ m_sSprocess.m_domainId=proCheckElem.attribute("domain_id").toInt();
+ m_sSprocess.m_appId=proCheckElem.attribute("app_id").toInt();
+ LOGINFO("proc_check name: %s domain_id %s app_id %s",proCheckElem.attribute("name").toStdString().c_str(),
+ proCheckElem.attribute("domain_id").toStdString().c_str(),proCheckElem.attribute("domain_id").toStdString().c_str());
+ }
+ else
+ {
+ LOGERROR("proc_check name 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("proc_check_signal load config ok and will use");
+}
+
+SProcess &CProcessCheckSignalManage::getProcessInfo()
+{
+ return m_sSprocess;
+}
+
+
+
+CProcessCheckSignalManage::CProcessCheckSignalManage()
+{
+ loadConfig();
+}
diff --git a/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.h b/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.h
new file mode 100644
index 00000000..e7ef0c6a
--- /dev/null
+++ b/product/src/application/signal_srv/processCheck/CProcessCheckSignalManage.h
@@ -0,0 +1,44 @@
+#pragma once
+#include
+#include
+#include
+#include "CProcessQueryCommon.h"
+
+
+class CProcessCheckSignalManage
+{
+public:
+ static CProcessCheckSignalManage * instance();
+
+ ~CProcessCheckSignalManage();
+
+
+ void initialize();
+
+ bool setGpio(QString value);
+
+ void updateProSatus(QString processName,int proStatus);
+
+ void handleSignal();
+
+ void loadConfig();
+
+ SProcess& getProcessInfo();
+
+private:
+ CProcessCheckSignalManage();
+
+private:
+ static CProcessCheckSignalManage * pInstance;
+ bool m_bActive=false;
+ QMutex m_mutex;
+
+ QString m_strAlmIO;
+ QString m_strAlmActValue;
+ QString m_strAlmClrValue;
+ SProcess m_sSprocess;
+
+ QMap m_mapProcessStatus;
+
+
+};
diff --git a/product/src/application/signal_srv/processCheck/CProcessQueryCommon.h b/product/src/application/signal_srv/processCheck/CProcessQueryCommon.h
new file mode 100644
index 00000000..ce8f6537
--- /dev/null
+++ b/product/src/application/signal_srv/processCheck/CProcessQueryCommon.h
@@ -0,0 +1,50 @@
+#pragma once
+#include
+const std::string CN_TN_SysRunProcInfo = "sys_run_proc_info";
+struct SProcess
+{
+ std::string m_nodeName;
+ std::string m_procDesc;
+ QString m_procName;
+ std::string m_procParam;
+ long long m_procId;
+ int m_appId;
+ int m_domainId;
+ std::string m_appDesc;
+ int m_isStartUp;
+ int m_toQuit;
+ int m_isQuit;
+ float m_cpu;
+ int m_procNum;
+ float m_disk;
+ int m_isMaster ;
+ int m_isSlave ;
+
+ SProcess()
+ {
+ m_nodeName = "";
+ m_procDesc = "";
+ m_procName = "";
+ m_procId = -1;
+ m_appId = -1;
+ m_appDesc = "";
+ m_isStartUp = 0;
+ m_toQuit = 0;
+ m_isQuit = 0;
+ m_cpu = 0.0;
+ m_procNum = -1;
+ m_disk = 0.0;
+ m_isMaster = 0;
+ m_isSlave = 0;
+ }
+};
+
+
+
+enum EN_PROC_STATUS
+{
+ EN_PROC_STOP = 0, //<已停止
+ EN_PROC_RUNNING, //<正在运行
+ EN_PROC_UNKNOW //<未知
+};
+
diff --git a/product/src/application/signal_srv/processCheck/CProcessQueryThread.cpp b/product/src/application/signal_srv/processCheck/CProcessQueryThread.cpp
new file mode 100644
index 00000000..2ed4636c
--- /dev/null
+++ b/product/src/application/signal_srv/processCheck/CProcessQueryThread.cpp
@@ -0,0 +1,91 @@
+#include "CProcessQueryThread.h"
+#include "CProcessQueryCommon.h"
+#include "CProcessCheckSignalManage.h"
+#include "rdb_net_api/CRdbNetApi.h"
+#include "pub_logger_api/logger.h"
+
+
+static QMutex g_mutex;
+CProcessQueryThread *CProcessQueryThread::m_pInstance = NULL;
+
+CProcessQueryThread *CProcessQueryThread::instance()
+{
+ QMutexLocker locker(&g_mutex);
+ if(m_pInstance == NULL)
+ {
+ m_pInstance = new CProcessQueryThread();
+ }
+ return m_pInstance;
+}
+
+
+
+CProcessQueryThread::CProcessQueryThread():CTimerThreadBase("CProcessQueryThread",2000)
+{
+ initData();
+}
+
+
+CProcessQueryThread::~CProcessQueryThread()
+{
+
+}
+
+
+
+void CProcessQueryThread::execute()
+{
+ queryProcRunInfo();
+}
+
+void CProcessQueryThread::initialize()
+{
+ resume();
+ LOGINFO("CProcessQueryThread::initialize()");
+
+}
+
+void CProcessQueryThread::release()
+{
+ suspend();
+ LOGINFO("CProcessQueryThread::release()");
+}
+
+bool CProcessQueryThread::queryProcRunInfo()
+{
+ bool bRet = false;
+ iot_idl::RdbRet objRdbRet;
+ std::vector vecColumn = {"app_id","node_name","proc_name","proc_param","proc_id","is_startup","to_quit","is_quit","is_master","is_slave"};
+
+ bRet=m_objRdbNetApi.queryTotal(CN_TN_SysRunProcInfo,vecColumn,objRdbRet,false,false,5);
+
+ if(!bRet ||objRdbRet.msgrecord_size() < 0)
+ {
+ return false;
+ }
+
+ for(int i=0;iupdateProSatus(proc.m_procName, proc.m_isStartUp);
+ }
+
+ return true;
+}
+
+void CProcessQueryThread::initData()
+{
+ SProcess tmp=CProcessCheckSignalManage::instance()->getProcessInfo();
+ m_objRdbNetApi.connect(tmp.m_domainId,tmp.m_appId);
+}
diff --git a/product/src/application/signal_srv/processCheck/CProcessQueryThread.h b/product/src/application/signal_srv/processCheck/CProcessQueryThread.h
new file mode 100644
index 00000000..e8fe7a4d
--- /dev/null
+++ b/product/src/application/signal_srv/processCheck/CProcessQueryThread.h
@@ -0,0 +1,46 @@
+#pragma once
+#include "CProcessQueryThread.h"
+#include "pub_utility_api/TimerThreadBase.h"
+#include "rdb_net_api/CRdbNetApi.h"
+#include "CProcessQueryCommon.h"
+
+using namespace iot_dbms;
+class CProcessQueryThread : public iot_public::CTimerThreadBase
+{
+
+public:
+ static CProcessQueryThread *instance();
+
+ virtual ~CProcessQueryThread();
+
+ /**
+ * @brief execute 业务处理函数,必须继承实现自己的业务逻辑
+ */
+ virtual void execute();
+
+
+ void initialize();
+
+ void release();
+
+private:
+
+ /**
+ * @brief queryProcRunInfo 查询进程信息
+ * @return true-成功 false-失败
+ */
+ bool queryProcRunInfo();
+
+ void initData();
+
+ CProcessQueryThread();
+
+
+private:
+ static CProcessQueryThread * 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
new file mode 100644
index 00000000..29376305
--- /dev/null
+++ b/product/src/application/signal_srv/signal_srv.pro
@@ -0,0 +1,66 @@
+QT -= gui
+QT += xml
+
+TEMPLATE = app
+TARGET = signal_srv
+CONFIG += console
+
+# The following define makes your compiler emit warnings if you use
+# any feature of Qt which as been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if you use deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += main.cpp \
+ SignalSrvApp.cpp \
+ SignalSrvMng.cpp \
+ SignalSrvThread.cpp \
+ alarm/CAlarmDataCollect.cpp \
+ alarm/CAlarmSignalManage.cpp \
+ processCheck/CProcessQueryThread.cpp \
+ processCheck/CProcessCheckSignalManage.cpp
+
+HEADERS += \
+ SignalSrvApp.h \
+ SignalSrvMng.h \
+ SignalSrvThread.h \
+ alarm/CAlarmDataCollect.h \
+ SignalSrvCommon.h \
+ alarm/CAlarmSignalManage.h \
+ processCheck/CProcessQueryThread.h \
+ processCheck/CProcessCheckSignalManage.h \
+ processCheck/CProcessQueryCommon.h
+
+
+LIBS +=\
+ -lboost_system \
+ -lprotobuf \
+ -llog4cplus \
+ -lpub_logger_api \
+ -lboost_filesystem \
+ -lpub_sysinfo_api \
+ -lsys_node_mng_api \
+ -lsys_proc_mng_api \
+ -lpub_utility_api \
+ -lboost_program_options \
+ -lpub_sysinfo_api \
+ -lnet_msg_bus_api \
+ -lrdb_api \
+ -lboost_chrono
+
+
+LIBS += -lalarm_server_api -lrdb_net_api
+
+include($$PWD/../../idl_files/idl_files.pri)
+#-------------------------------------------------------------------
+COMMON_PRI=$$PWD/../../common.pri
+exists($$COMMON_PRI) {
+ include($$COMMON_PRI)
+}else {
+ error("FATAL error: can not find common.pri")
+}