HeartBeatFSM.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. #ifndef __HEARTBEAT_FSM_H
  2. #define __HEARTBEAT_FSM_H
  3. #pragma once
  4. #ifdef RVC_OS_WIN
  5. #ifndef WIN32_LEAN_AND_MEAN
  6. #define WIN32_LEAN_AND_MEAN
  7. #endif
  8. #include <windows.h>
  9. #include <winsock2.h>
  10. #include <ws2tcpip.h>
  11. #include <stdint.h>
  12. #include <tchar.h>
  13. #include <conio.h>
  14. #include <pdh.h>
  15. #include <pdhmsg.h>
  16. #include <Loadperf.h>
  17. #else
  18. #endif //RVC_OS_WIN
  19. #include "CardReadAdapter_client_g.h"
  20. #include "CardIssuerStore_client_g.h"
  21. #include "SpFSM.h"
  22. #include "HeartBeat_def_g.h"
  23. #include "HeartBeat_msg_g.h"
  24. using namespace HeartBeat;
  25. #include "SpSecureClient.h"
  26. #include "EventCode.h"
  27. #include "IHttpFunc.h"
  28. typedef DWORD (__stdcall *LpRestorePerfRegistryFromFile)(LPCWSTR szFileName, LPCWSTR szLangId);
  29. #pragma pack(1)
  30. // [StructName("FNTSTAT")]
  31. struct HandReq
  32. {
  33. char TerminalNo[16];
  34. uint32_t ip;
  35. char WarningLevel;
  36. char RunState;
  37. char CustomerHandle;
  38. char CallState;
  39. char LocalMaintain;
  40. char RemoteMaintain;
  41. char TermStage;
  42. char PreTermStage;
  43. char NetState;
  44. char PreNetState;
  45. };
  46. // [StructName("xxx")]
  47. struct HandErrListReq
  48. {
  49. int warnLevel;
  50. char reserved1;//用来存放交易控制标志
  51. char reserved2;
  52. char reserved3;
  53. char reserved4;
  54. char errList[512];
  55. };
  56. //[StructName("HANDANS")]
  57. struct HandAns
  58. {
  59. uint32_t EventCode;
  60. char param1[16];
  61. //int count;
  62. };
  63. struct CardActiveReq
  64. {
  65. uint32_t type;
  66. uint32_t slot;
  67. uint32_t reserved1;
  68. uint32_t reserved2;
  69. char Account[32];
  70. char FromTerminalNo[16];
  71. char TerminalNo[16];
  72. uint32_t EvtCode;
  73. uint32_t ErrCode;
  74. uint32_t findCard;
  75. uint32_t cardPos;
  76. char Param1[16];
  77. char Param2[1024];
  78. char Reserved3[128];
  79. char Reserved4[128];
  80. };
  81. #pragma pack()
  82. enum EvtType
  83. {
  84. USER_EVT_TEST = EVT_USER+1,
  85. USER_EVT_QUIT,
  86. USER_EVT_START,
  87. USER_EVT_STARTFINISHED,
  88. USER_EVT_HANDSHAKEFINISHED,
  89. USER_EVT_INSTRUCTION,
  90. USER_EVT_LOST,
  91. USER_EVT_STOP,
  92. USER_EVT_REJECT,
  93. USER_EVT_EXIT,
  94. USER_EVT_CARD_ACTIVE,
  95. USER_EVT_CARD_ACTIVE_FINISHED,
  96. };
  97. struct TermianlCounter
  98. {
  99. DWORD serverIP;
  100. uint16_t totalMem; //MB
  101. uint16_t freeMem; //MB
  102. uint16_t procNum;
  103. uint16_t threadNum;
  104. DWORD handleNum;
  105. DWORD freeDisk; //MB
  106. char osStartTime[22];
  107. uint16_t cpuLoad;
  108. };
  109. namespace HttpStruct
  110. {
  111. //发送心跳接口
  112. struct SendHandShakeReq : CHTTPReq {
  113. string m_reqStr;
  114. string ToJson() {
  115. return m_reqStr;
  116. }
  117. };
  118. struct SendHandShakeRet : CHTTPRet {
  119. string m_retStr;
  120. bool Parse(string strData) {
  121. m_retStr = strData;
  122. return true;
  123. }
  124. };
  125. }
  126. enum InstructionType
  127. {
  128. INC_UNKNOWN = 0,
  129. INC_GLOBAL_SETTING_SYNC,
  130. INC_COMM_RECONNECT,
  131. INC_START_REMOTE_CONTROL,
  132. INC_UPDATE_CHECK,
  133. INC_RECOVER_SERVICE,
  134. INC_PAUSE_SERVICE,
  135. INC_AREA_SERVICE_SWITCH,
  136. INC_VERSION_ROLLBACK,
  137. INC_BRIDGE,
  138. INC_VEDIO_CONNECTING,
  139. INC_TRADE_MANAGER_NORMAL,
  140. INC_TRADE_MANAGER_ON,
  141. INC_TRADE_MANAGER_OFF,
  142. INC_DEVICE_LOCK_ON,
  143. INC_DEVICE_UNLOCK,
  144. INC_DEVICE_KICK_OFF,
  145. };
  146. class CHeartBeatEntity;
  147. class CHeartBeatFSM;
  148. class InstructionEvent : public FSMEvent
  149. {
  150. public:
  151. InstructionEvent() : FSMEvent(USER_EVT_INSTRUCTION){}
  152. virtual ~InstructionEvent(){}
  153. SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx;
  154. protected:
  155. private:
  156. };
  157. class CardActiveEvent : public FSMEvent
  158. {
  159. public:
  160. CardActiveEvent() : FSMEvent(USER_EVT_CARD_ACTIVE){}
  161. virtual ~CardActiveEvent(){}
  162. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  163. protected:
  164. private:
  165. };
  166. class HeartBeatConnection;
  167. class CHeartBeatFSM : public FSMImpl<CHeartBeatFSM>
  168. {
  169. public:
  170. enum {s0,s1,s2,s3,s4,s5};
  171. BEGIN_FSM_STATE(CHeartBeatFSM)
  172. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  173. FSM_STATE_ENTRY(s1,"Starting",s1_on_entry,s1_on_exit,s1_on_event)
  174. FSM_STATE_ENTRY(s2,"Connected",s2_on_entry,s2_on_exit,s2_on_event)
  175. FSM_STATE_ENTRY(s3,"Lost",s3_on_entry,s3_on_exit,s3_on_event)
  176. FSM_STATE_ENTRY(s4,"Reject",s4_on_entry,s4_on_exit,s4_on_event)
  177. FSM_STATE_ENTRY(s5,"Failed",s5_on_entry,s5_on_exit,s5_on_event)
  178. END_FSM_STATE()
  179. BEGIN_FSM_RULE(CHeartBeatFSM,s0)
  180. FSM_RULE_ENTRY(s0,s1,USER_EVT_START,0)
  181. FSM_RULE_ENTRY(s1,s2,USER_EVT_STARTFINISHED,0)
  182. FSM_RULE_ENTRY(s1,s0,USER_EVT_STARTFINISHED,1)
  183. FSM_RULE_ENTRY(s2,s0,USER_EVT_STOP,0)
  184. FSM_RULE_ENTRY(s2,s0,USER_EVT_START,0)
  185. FSM_RULE_ENTRY(s4,s0,USER_EVT_STOP,0)
  186. END_FSM_RULE()
  187. CHeartBeatFSM():m_initTimes(0),m_testResult(Error_Succeed),
  188. m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
  189. ,m_pCRAClient(NULL),m_pCISClient(NULL)
  190. , m_strHandShakeUrl(""), m_bCrossUseJS(false), m_bSleepMode(false)
  191. ,m_longConnInterval(20000),m_handShakeConnInterval(20000), m_ConnectSleepInterval(20000){
  192. m_servStrBArr.Init(1);
  193. }
  194. ~CHeartBeatFSM(){}
  195. virtual ErrorCodeEnum OnInit();
  196. virtual ErrorCodeEnum OnExit();
  197. void s0_on_entry();
  198. void s0_on_exit();
  199. unsigned int s0_on_event(FSMEvent* pEvt);
  200. void s1_on_entry();
  201. void s1_on_exit();
  202. unsigned int s1_on_event(FSMEvent* pEvt);
  203. void s2_on_entry();
  204. void s2_on_exit();
  205. unsigned int s2_on_event(FSMEvent* pEvt);
  206. void s3_on_entry();
  207. void s3_on_exit();
  208. unsigned int s3_on_event(FSMEvent* pEvt);
  209. void s4_on_entry();
  210. void s4_on_exit();
  211. unsigned int s4_on_event(FSMEvent* pEvt);
  212. void s5_on_entry();
  213. void s5_on_exit();
  214. unsigned int s5_on_event(FSMEvent* pEvt);
  215. DWORD m_dwServIP;
  216. CSimpleStringA m_strHandShakeUrl;//心跳地址
  217. int Starting();
  218. int DoHandShake();
  219. int DoNewHandShake();
  220. bool HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk);
  221. string HandShakeJsonStr();
  222. static void HttpsLogCallBack(const char* logtxt);
  223. void SetConnNULL(){}
  224. ErrorCodeEnum SetErrorList(int warmLevel,CSimpleStringA strList);
  225. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  226. int GetWarnLevel(){return m_warnLevel;}
  227. // Terminal Performance Counter component [Josephus in 9:17:13 2016/4/23]
  228. ErrorCodeEnum GetPerformCounter(TermianlCounter& counter);
  229. const char* GetRunDiskPath()
  230. {
  231. return (LPCTSTR)m_csRunDiskName;
  232. }
  233. void SetLodCtrStatus(int val)
  234. {
  235. m_nLodCtrFlag = val;
  236. }
  237. int CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
  238. void LocalPreOnline(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type);
  239. void LocalPreOnlineJS(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type);
  240. void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode=0);
  241. void ProcessPreOnline(CardActiveReq* req);
  242. void ProcessCardActive(CardActiveReq* req);
  243. protected:
  244. void DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
  245. private:
  246. //ErrorCodeEnum GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore);
  247. ErrorCodeEnum ParseServerAddr(bool isCardStore);
  248. bool CheckCRASessionOrToConnect();
  249. bool CheckCISSessionOrToConnect();
  250. int m_longConnInterval;//长连接时间间隔
  251. int m_handShakeConnInterval;//新心跳时间间隔
  252. CSimpleStringA m_servStr,m_entErrorList;
  253. CAutoArray<CSimpleStringA> m_servStrBArr;
  254. int m_initTimes,m_warnLevel;
  255. int m_ConnectSleepInterval;
  256. HeartBeatConnection* m_pHandShakeConn;
  257. ErrorCodeEnum m_testResult;
  258. CSimpleStringA m_csRunDiskName;
  259. int m_nLodCtrFlag;
  260. CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
  261. CardIssuerStore::CardIssuerStoreService_ClientBase* m_pCISClient;
  262. bool m_bCrossUseJS, m_bSleepMode;
  263. bool m_isCardStore;
  264. };
  265. struct StartTask : public ITaskSp
  266. {
  267. CHeartBeatFSM* fsm;
  268. StartTask(CHeartBeatFSM* f) : fsm(f) {}
  269. void Process()
  270. {
  271. FSMEvent *e = new FSMEvent(USER_EVT_STARTFINISHED);
  272. e->param1 = fsm->Starting();
  273. fsm->PostEventFIFO(e);
  274. }
  275. };
  276. struct HandShakeTask : public ITaskSp
  277. {
  278. CHeartBeatFSM* fsm;
  279. HandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  280. void Process()
  281. {
  282. FSMEvent *e = new FSMEvent(USER_EVT_HANDSHAKEFINISHED);
  283. e->param1 = fsm->DoHandShake();
  284. fsm->PostEventFIFO(e);
  285. }
  286. };
  287. struct LodctrTask : public ITaskSp
  288. {
  289. CHeartBeatFSM* fsm;
  290. LodctrTask(CHeartBeatFSM* f) : fsm(f) {}
  291. void Process()
  292. {
  293. HMODULE hDll = LoadLibrary("loadperf.dll");
  294. if(hDll == NULL)
  295. {
  296. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load loadperf.dll failed %d", GetLastError());
  297. return;
  298. }
  299. LpRestorePerfRegistryFromFile restoreFunc = (LpRestorePerfRegistryFromFile)GetProcAddress(
  300. hDll,
  301. "RestorePerfRegistryFromFileW");
  302. if(restoreFunc == NULL)
  303. {
  304. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
  305. return;
  306. }
  307. DWORD dwRet = restoreFunc(NULL, NULL);
  308. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restoreFunc returned 0x%08x", dwRet);
  309. if(dwRet == 0)
  310. {
  311. fsm->SetLodCtrStatus(1);
  312. }
  313. else
  314. {
  315. fsm->SetLodCtrStatus(2);
  316. }
  317. return;
  318. }
  319. };
  320. struct CardActiveTask : public ITaskSp
  321. {
  322. CHeartBeatFSM* fsm;
  323. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  324. CardActiveTask(CHeartBeatFSM* f) : fsm(f) {}
  325. void Process()
  326. {
  327. FSMEvent *e = new FSMEvent(USER_EVT_CARD_ACTIVE_FINISHED);
  328. e->param1 = fsm->CardActive(ctx);
  329. fsm->PostEventFIFO(e);
  330. }
  331. };
  332. struct ProcessPreOnlineTask : public ITaskSp
  333. {
  334. CHeartBeatFSM* fsm;
  335. CardActiveReq* cardActiveReq;
  336. #ifdef RVC_OS_WIN
  337. ProcessPreOnlineTask(CHeartBeatFSM *f, CardActiveReq* req) : fsm(f)
  338. {
  339. cardActiveReq = req;
  340. }
  341. #else
  342. ProcessPreOnlineTask(CHeartBeatFSM* f, CardActiveReq* req) : fsm(f),cardActiveReq(NULL)
  343. {
  344. if (req != NULL) {
  345. cardActiveReq = (CardActiveReq*)malloc(sizeof(struct CardActiveReq));
  346. if(cardActiveReq != NULL)
  347. memcpy(cardActiveReq, req, sizeof(struct CardActiveReq));
  348. }
  349. }
  350. ~ProcessPreOnlineTask()
  351. {
  352. if (cardActiveReq != nullptr) {
  353. free((void*)cardActiveReq);
  354. cardActiveReq = nullptr;
  355. }
  356. }
  357. #endif
  358. void Process()
  359. {
  360. fsm->ProcessPreOnline(cardActiveReq);
  361. }
  362. };
  363. struct NewHandShakeTask : public ITaskSp
  364. {
  365. CHeartBeatFSM* fsm;
  366. NewHandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  367. void Process()
  368. {
  369. Sleep(3000);//防止虚机还未连接上,导致http心跳报错
  370. fsm->DoNewHandShake();
  371. }
  372. };
  373. class HeartBeatConnection : public SpSecureClient
  374. {
  375. public:
  376. HeartBeatConnection(CEntityBase *pEntity, CHeartBeatFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM), m_TerminalNo("")
  377. {
  378. CSystemStaticInfo sysSInfo;
  379. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  380. m_TerminalNo = sysSInfo.strTerminalID;
  381. }
  382. virtual ~HeartBeatConnection() {}
  383. void SendHandShake();
  384. //type:0,send preonline; 1,result of preonline
  385. //errCSCode:CardStore returned UserErrorCode
  386. void SendCardActive(const int type, const int slot,unsigned long errCode, const char *termNo, const char *account, const int accSize
  387. , const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode=0);
  388. void PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg);
  389. void PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg);
  390. protected:
  391. virtual void OnDisconnect()
  392. {
  393. m_pFSM->SetConnNULL();
  394. this->Close();
  395. }
  396. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  397. //virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)
  398. //{
  399. // //oiltest
  400. //}
  401. private:
  402. CSimpleStringA m_TerminalNo;
  403. CHeartBeatFSM *m_pFSM;
  404. };
  405. #endif //__HEARTBEAT_FSM_H