Эх сурвалжийг харах

Merge pull request !10018 from LR04.02_RVCTerminalPlus/feature_heartbeat_0309

Gifur 2 жил өмнө
parent
commit
aa55462824

+ 2 - 0
Module/include/EventCode.h

@@ -926,6 +926,8 @@ ERROR_ACCESSAUTH_CONNECT_ACS}
 #define LOG_EVT_INC_DEVICE_LOCK_ON 0x5030501A			//设备锁定
 #define LOG_EVT_INC_DEVICE_UNLOCK 0x5030501B			//设备解除锁定
 #define LOG_EVT_INC_DEVICE_KICK_OFF 0x5030501C			//设备罚出
+#define LOG_EVT_CONNECT_BRANCH 0x5030501D			    //连接分行服务
+#define LOG_EVT_CONNECT_CENTER 0x5030501E			    //连接总行服务
 
 
 

+ 3 - 0
Module/mod_heartbeat/CMakeLists.txt

@@ -20,13 +20,16 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${MODULE_BASE_DIR}/mod_ScannerSet
 	${MODULE_BASE_DIR}/mod_selfchecker
 	${MODULE_BASE_DIR}/mod_healthmanager
+	${CONAN_INCLUDE_DIRS_JSONCPP}
 )
+target_link_directories(${MODULE_NAME} PRIVATE ${CONAN_LIB_DIRS_JSONCPP})
 
 # 添加实体需要依赖的其他共享库(包括系统库)
 if(MSVC)
 set(${MODULE_PREFIX}_LIBS  Ws2_32 Mswsock AdvApi32 pdh ${SPBASE_LIB} ${RVCCOMM_LIB})
 else()
 set(${MODULE_PREFIX}_LIBS  ${SPBASE_LIB} ${RVCCOMM_LIB})
+set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_ALL_LIBS} ${CONAN_PKG_LIBS_JSONCPP})
 endif(MSVC)
 
 target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS})

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 343 - 251
Module/mod_heartbeat/HeartBeatFSM.cpp


+ 95 - 6
Module/mod_heartbeat/HeartBeatFSM.h

@@ -26,6 +26,7 @@
 using namespace HeartBeat;
 #include "SpSecureClient.h"
 #include "EventCode.h"
+#include "IHttpFunc.h"
 #include "CardIssuer_client_g.h"
 //using namespace CardIssuer;
 #include "PinPad_client_g.h"
@@ -40,6 +41,12 @@ using namespace ScannerSet;
 
 typedef DWORD (__stdcall *LpRestorePerfRegistryFromFile)(LPCWSTR szFileName, LPCWSTR szLangId);
 
+#define LOG_EVT_HEARTBEAT_TASK_START		0x50310000		//新心跳服务启动
+#define LOG_EVT_HEARTBEAT_TASK_NOT_START	0x50310001		//新心跳服务未启动
+#define LOG_EVT_HEARTBEAT_HTTP_ERROR		0x50310002		//新心跳服务连接失败
+
+
+
 #pragma pack(1)
 // [StructName("FNTSTAT")]
 struct HandReq
@@ -154,7 +161,7 @@ struct TerminalInfo
 // Terminal Performance Information Struct[Josephus in 9:09:47 2016/4/23]
 struct TermianlCounter
 {
-	
+
 	DWORD			serverIP;
 	uint16_t	totalMem; //MB
 	uint16_t	freeMem;  //MB
@@ -166,6 +173,64 @@ struct TermianlCounter
 	uint16_t	cpuLoad;
 };
 
+namespace HttpStruct
+{
+	//发送心跳接口
+	struct SendHandShakeReq : CHTTPReq {
+		string m_reqStr;
+		string ToJson() {
+			return m_reqStr;
+		}
+	};
+	struct SendHandShakeRet : CHTTPRet {
+		string m_retStr;
+		bool Parse(string strData) {
+			m_retStr = strData;
+			return true;
+		}
+	};
+}
+struct CShakeHandVO
+{
+	string terminalNo;
+	long ip;
+	string warningLevel;
+	string runState;
+	string customerHandle;
+	string callState;
+	string localMaintain;
+	string remoteMaintain;
+	string termStage;
+	string preTermStage;
+	string netState;
+	string preNetState;
+};
+struct CShakeHandSystemInfo
+{
+	long serverIP;
+	long totalMem;
+	long freeMem;
+	long procNum;
+	long threadNum;
+	long handleNum;
+	long freeDisk;
+	string osStartTime;
+	long cpuLoad;
+};
+
+struct CShakeHandErrorVO
+{
+	long warnLevel;
+	string reserved1;
+	string errList;
+};
+struct CHandShakeHttp
+{	//存储到运行时
+	CShakeHandVO shakehandvo;
+	CShakeHandSystemInfo shakeHandSystemInfo;
+	CShakeHandErrorVO shakeHandErrorVO;
+};
+
 
 enum InstructionType
 {
@@ -257,7 +322,8 @@ public:
 	CHeartBeatFSM():m_initTimes(0),m_bUseBackup(false),m_testResult(Error_Succeed),
 	m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
 	, m_tradeState(99),m_bJBMachine(false), m_pCRAClient(NULL), m_pIDClient(NULL) , m_pPinPadClient(NULL)
-	, m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""){}
+	, m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""), m_strHandShakeUrl(""),m_bAlarmed(false)
+	,m_longConnInterval(20000),m_handShakeConnInterval(20000){}
 	~CHeartBeatFSM(){}
 	virtual ErrorCodeEnum OnInit();
 	virtual ErrorCodeEnum OnExit();
@@ -283,8 +349,13 @@ public:
 	unsigned int s5_on_event(FSMEvent* pEvt);
 
 	DWORD m_dwServIP;
+	CSimpleStringA m_strHandShakeUrl;//心跳地址
 	int Starting();
 	int DoHandShake();
+	int DoNewHandShake();
+	bool HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk);
+	string HandShakeJsonStr();
+	static void HttpsLogCallBack(const char* logtxt);
 	void SetConnNULL(){}
 	ErrorCodeEnum SetErrorList(int warmLevel,CSimpleStringA strList);
 	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
@@ -326,8 +397,11 @@ protected:
 	void DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
 	
 private:
+	ErrorCodeEnum GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore);
 	
 	int m_tmpTestFlag;
+	int m_longConnInterval;//长连接时间间隔
+	int m_handShakeConnInterval;//新心跳时间间隔
 	SOCKET m_ConnSocket;
 	CSimpleStringA m_servStr,m_servIP,m_servStrB,m_servIPB,m_entErrorList,m_localDeviceNo,m_ILDeviceNo,m_tmpMultiBlob, m_terminalStage;
 	int m_port,m_portB,m_initTimes,m_warnLevel,m_tradeState;
@@ -341,6 +415,9 @@ private:
 	CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
 	IDCertificate::IDCertService_ClientBase *m_pIDClient;
 	PinPad::PinPadService_ClientBase *m_pPinPadClient;
+
+	bool m_bAlarmed;
+	bool m_isCardStore;
 };
 struct StartTask : public ITaskSp
 {
@@ -378,7 +455,7 @@ struct LodctrTask : public ITaskSp
 		HMODULE hDll = LoadLibrary("loadperf.dll");
 		if(hDll == NULL)
 		{
-			Dbg("Load loadperf.dll failed %d", GetLastError());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load loadperf.dll failed %d", GetLastError());
 			return;
 		}
 
@@ -387,12 +464,12 @@ struct LodctrTask : public ITaskSp
 			"RestorePerfRegistryFromFileW");
 		if(restoreFunc == NULL)
 		{
-			Dbg("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
 			return;
 		}
 
 		DWORD dwRet = restoreFunc(NULL, NULL);
-		Dbg("restoreFunc returned 0x%08x", dwRet);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restoreFunc returned 0x%08x", dwRet);
 		if(dwRet == 0)
 		{
 			fsm->SetLodCtrStatus(1);
@@ -464,7 +541,7 @@ struct LocalProcessCrossCallTask : public ITaskSp
 		ZeroMemory(pBuf, nBufSize + 1);
 		memcpy(pBuf, reqInfo, nBufSize);
 		xreqInfo = (CrossCallReq*)pBuf;
-		Dbg("id:%x",xreqInfo->nEntityID);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("id:%x",xreqInfo->nEntityID);
 	}
 	~LocalProcessCrossCallTask()
 	{
@@ -507,6 +584,18 @@ struct ProcessPreOnlineTask : public ITaskSp
 	}
 };
 
+struct NewHandShakeTask : public ITaskSp
+{
+	CHeartBeatFSM* fsm;
+
+	NewHandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
+
+	void Process()
+	{
+		fsm->DoNewHandShake();
+	}
+};
+
 class HeartBeatConnection : public SpSecureClient
 {
 public:

+ 7 - 0
Module/mod_heartbeat/HeartBeat_def_g.h

@@ -26,6 +26,13 @@ namespace HeartBeat {
 #define HeartBeatService_MethodSignature_CallFromILToRVC 975871920
 #define HeartBeatService_MethodSignature_CallResultToIL 221065913
 
+#define HeartBeatService_LogCode_Instruction "QLR040250300"
+#define HeartBeatService_LogCode_CardActive "QLR040250301"
+#define HeartBeatService_LogCode_CrossTermCall "QLR040250302"
+#define HeartBeatService_LogCode_CrossTermInvokeInfo "QLR040250303"
+#define HeartBeatService_LogCode_CallFromILToRVC "QLR040250304"
+#define HeartBeatService_LogCode_CallResultToIL "QLR040250305"
+
 struct HeartBeatService_Instruction_Req
 {
 	int type;

+ 10 - 10
Module/mod_heartbeat/mod_heartbeat.cpp

@@ -35,7 +35,7 @@ ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA
 		m_pSelfCheckerClient = new SelfCheckerService_ClientBase(this);
 		if (m_pSelfCheckerClient == NULL)
 		{
-			Dbg("create(new) client failed.");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("create(new) client failed.");
 			return Error_Resource;
 		}
 		Dbg("creat selfchecher client suc.");
@@ -50,7 +50,7 @@ ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA
 			eErr = spWait->WaitAnswer(2000);
 		if (eErrConn != Error_Succeed || eErr != Error_Succeed)
 		{
-			Dbg("connect to selfchecker failed.");
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("connect to selfchecker failed.");
 			if(eErrConn != Error_Succeed) m_pSelfCheckerClient->SafeDelete();
 			else m_pSelfCheckerClient->GetFunction()->CloseSession();
 			m_pSelfCheckerClient = NULL;
@@ -66,7 +66,7 @@ ErrorCodeEnum CHeartBeatEntity::GetEntityErrorList(int &warmLevel,CSimpleStringA
 	eErr = m_pSelfCheckerClient->GetEntityErrorList(req,ans,5000);
 	if (eErr != Error_Succeed)
 	{
-		Dbg("GetEntityErrorList failed.%d",eErr);
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetEntityErrorList failed.%d",eErr);
 		m_bConnetedSS = false;
 		m_pSelfCheckerClient->GetFunction()->CloseSession();
 		m_pSelfCheckerClient = NULL;
@@ -82,12 +82,12 @@ void CHeartBeatEntity::OnSysVarEvent(const char *pszKey,
 	{
 		if (_strnicmp(pszValue, "L", strlen("L")) == 0)
 		{
-			Dbg("To set trade manager state to 8.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set trade manager state to 8.");
 			m_fsm.SetTradeManagerState(8);
 		}
 		else
 		{
-			Dbg("To set trade manager state to 1.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set trade manager state to 1.");
 			m_fsm.SetTradeManagerState(1);
 		}
 	}
@@ -95,17 +95,17 @@ void CHeartBeatEntity::OnSysVarEvent(const char *pszKey,
 	{
 		if (_strnicmp(pszValue, "L", strlen("L")) == 0)
 		{
-			Dbg("To set terminal manager state to 7.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set terminal manager state to 7.");
 			m_fsm.SetTradeManagerState(7);
 		}
 		else if (_strnicmp(pszValue, "N", strlen("N")) == 0)
 		{
-			Dbg("To set terminal manager state to 1.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set terminal manager state to 1.");
 			m_fsm.SetTradeManagerState(1);
 		}
 		else if (_strnicmp(pszValue, "K", strlen("K")) == 0)
 		{
-			Dbg("To set terminal manager state to 6.");
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set terminal manager state to 6.");
 			m_fsm.SetTradeManagerState(6);
 		}
 	}
@@ -113,7 +113,7 @@ void CHeartBeatEntity::OnSysVarEvent(const char *pszKey,
 	{
 		if (_strnicmp(pszValue, "A", strlen("A")) == 0)
 		{
-			Dbg("To set terminal stage to %s.",pszValue);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("To set terminal stage to %s.",pszValue);
 			m_fsm.SetTerminalStageState(pszValue);
 		}
 	}
@@ -128,7 +128,7 @@ void CHeartBeatEntity::OnBroadcastEvent(CUUID SubID, const char *pszEntityName,
 			SpBuffer2Object(Buffer, tm);
 			if (tm.op == 99)
 			{
-				Dbg("Receive healthmanager event 99,to set terminal manager state to 1.");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Receive healthmanager event 99,to set terminal manager state to 1.");
 				m_fsm.SetTradeManagerState(1);
 			}
 		}

+ 0 - 2
Module/mod_heartbeat/mod_heartbeat.h

@@ -34,7 +34,6 @@ public:
 	{
 		LOG_FUNCTION();
 		ErrorCodeEnum rt = m_fsm.Init(this);
-		Dbg("Init:%d", rt);
 		GetFunction()->RegistSysVarEvent("TradeManageState", this);
 		GetFunction()->RegistSysVarEvent("TerminalManagerState", this);
 		GetFunction()->RegistSysVarEvent("TerminalStage", this);
@@ -95,7 +94,6 @@ public:
 		const char *pszValue, const char *pszOldValue, const char *pszEntityName);
 	virtual void OnSelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
 	{
-		LOG_FUNCTION();
 		m_fsm.SelfTest(eTestType,pTransactionContext);
 		int warnLevel;
 		CSimpleStringA strList("");

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно