HeartBeatFSM.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  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. //TODO: CrossPlaform [Gifur@2025730]
  35. #ifdef RVC_OS_WIN
  36. unsigned long ip;
  37. #else
  38. uint32_t ip;
  39. #endif
  40. char WarningLevel;
  41. char RunState;
  42. char CustomerHandle;
  43. char CallState;
  44. char LocalMaintain;
  45. char RemoteMaintain;
  46. char TermStage;
  47. char PreTermStage;
  48. char NetState;
  49. char PreNetState;
  50. };
  51. // [StructName("xxx")]
  52. struct HandErrListReq
  53. {
  54. int warnLevel;
  55. char reserved1;//用来存放交易控制标志
  56. char reserved2;
  57. char reserved3;
  58. char reserved4;
  59. char errList[512];
  60. };
  61. //[StructName("HANDANS")]
  62. struct HandAns
  63. {
  64. //TODO: CrossPlaform [Gifur@2025730]
  65. #ifdef RVC_OS_WIN
  66. unsigned long EventCode;
  67. #else
  68. uint32_t EventCode;
  69. #endif
  70. char param1[16];
  71. //int count;
  72. };
  73. #ifdef RVC_OS_WIN
  74. struct CardActiveReq
  75. {
  76. unsigned long type;
  77. unsigned long slot;
  78. unsigned long reserved1;
  79. unsigned long reserved2;
  80. char Account[32];
  81. char FromTerminalNo[16];
  82. char TerminalNo[16];
  83. unsigned long EvtCode;
  84. unsigned long ErrCode;
  85. unsigned long findCard;
  86. unsigned long cardPos;
  87. char Param1[16];
  88. char Param2[1024];
  89. char Reserved3[128];
  90. char Reserved4[128];
  91. };
  92. #else
  93. struct CardActiveReq
  94. {
  95. uint32_t type;
  96. uint32_t slot;
  97. uint32_t reserved1;
  98. uint32_t reserved2;
  99. char Account[32];
  100. char FromTerminalNo[16];
  101. char TerminalNo[16];
  102. uint32_t EvtCode;
  103. uint32_t ErrCode;
  104. uint32_t findCard;
  105. uint32_t cardPos;
  106. char Param1[16];
  107. char Param2[1024];
  108. char Reserved3[128];
  109. char Reserved4[128];
  110. };
  111. #endif
  112. #pragma pack()
  113. enum EvtType
  114. {
  115. USER_EVT_TEST = EVT_USER+1,
  116. USER_EVT_QUIT,
  117. USER_EVT_START,
  118. USER_EVT_STARTFINISHED,
  119. USER_EVT_HANDSHAKEFINISHED,
  120. USER_EVT_INSTRUCTION,
  121. USER_EVT_LOST,
  122. USER_EVT_STOP,
  123. USER_EVT_REJECT,
  124. USER_EVT_EXIT,
  125. USER_EVT_CARD_ACTIVE,
  126. USER_EVT_CARD_ACTIVE_FINISHED,
  127. };
  128. struct TerminalInfo
  129. {
  130. char TerminalNo[16];
  131. //TODO: CrossPlaform [Gifur@2025730]
  132. #ifdef RVC_OS_WIN
  133. unsigned long ip;
  134. #else
  135. uint32_t ip;
  136. #endif
  137. char WarningLevel;
  138. char RunState;
  139. char CustomerHandle;
  140. char CallState;
  141. char LocalMaintain;
  142. char RemoteMaintain;
  143. char TermStage;
  144. char PreTermStage;
  145. char NetState;
  146. char PreNetState;
  147. };
  148. // Terminal Performance Information Struct[Josephus in 9:09:47 2016/4/23]
  149. #ifdef RVC_OS_WIN
  150. struct TermianlCounter
  151. {
  152. DWORD serverIP;
  153. unsigned short totalMem; //MB
  154. unsigned short freeMem; //MB
  155. unsigned short procNum;
  156. unsigned short threadNum;
  157. DWORD handleNum;
  158. DWORD freeDisk; //MB
  159. char osStartTime[22];
  160. unsigned short cpuLoad;
  161. };
  162. #else
  163. struct TermianlCounter
  164. {
  165. DWORD serverIP;
  166. uint16_t totalMem; //MB
  167. uint16_t freeMem; //MB
  168. uint16_t procNum;
  169. uint16_t threadNum;
  170. DWORD handleNum;
  171. DWORD freeDisk; //MB
  172. char osStartTime[22];
  173. uint16_t cpuLoad;
  174. };
  175. #endif
  176. namespace HttpStruct
  177. {
  178. //发送心跳接口
  179. struct SendHandShakeReq : CHTTPReq {
  180. string m_reqStr;
  181. string ToJson() {
  182. return m_reqStr;
  183. }
  184. };
  185. struct SendHandShakeRet : CHTTPRet {
  186. string m_retStr;
  187. bool Parse(string strData) {
  188. m_retStr = strData;
  189. return true;
  190. }
  191. };
  192. }
  193. struct CShakeHandVO
  194. {
  195. string terminalNo;
  196. long ip;
  197. string warningLevel;
  198. string runState;
  199. string customerHandle;
  200. string callState;
  201. string localMaintain;
  202. string remoteMaintain;
  203. string termStage;
  204. string preTermStage;
  205. string netState;
  206. string preNetState;
  207. };
  208. struct CShakeHandSystemInfo
  209. {
  210. long serverIP;
  211. long totalMem;
  212. long freeMem;
  213. long procNum;
  214. long threadNum;
  215. long handleNum;
  216. long freeDisk;
  217. string osStartTime;
  218. long cpuLoad;
  219. };
  220. struct CShakeHandErrorVO
  221. {
  222. long warnLevel;
  223. string reserved1;
  224. string errList;
  225. };
  226. struct CHandShakeHttp
  227. { //存储到运行时
  228. CShakeHandVO shakehandvo;
  229. CShakeHandSystemInfo shakeHandSystemInfo;
  230. CShakeHandErrorVO shakeHandErrorVO;
  231. };
  232. enum InstructionType
  233. {
  234. INC_UNKNOWN = 0,
  235. INC_GLOBAL_SETTING_SYNC,
  236. INC_COMM_RECONNECT,
  237. INC_START_REMOTE_CONTROL,
  238. INC_UPDATE_CHECK,
  239. INC_RECOVER_SERVICE,
  240. INC_PAUSE_SERVICE,
  241. INC_AREA_SERVICE_SWITCH,
  242. INC_VERSION_ROLLBACK,
  243. INC_BRIDGE,
  244. INC_VEDIO_CONNECTING,
  245. INC_TRADE_MANAGER_NORMAL,
  246. INC_TRADE_MANAGER_ON,
  247. INC_TRADE_MANAGER_OFF,
  248. INC_DEVICE_LOCK_ON,
  249. INC_DEVICE_UNLOCK,
  250. INC_DEVICE_KICK_OFF,
  251. };
  252. class CHeartBeatEntity;
  253. class CHeartBeatFSM;
  254. class InstructionEvent : public FSMEvent
  255. {
  256. public:
  257. InstructionEvent() : FSMEvent(USER_EVT_INSTRUCTION){}
  258. virtual ~InstructionEvent(){}
  259. SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx;
  260. protected:
  261. private:
  262. };
  263. class CardActiveEvent : public FSMEvent
  264. {
  265. public:
  266. CardActiveEvent() : FSMEvent(USER_EVT_CARD_ACTIVE){}
  267. virtual ~CardActiveEvent(){}
  268. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  269. protected:
  270. private:
  271. };
  272. class HeartBeatConnection;
  273. class CHeartBeatFSM : public FSMImpl<CHeartBeatFSM>
  274. {
  275. public:
  276. enum {s0,s1,s2,s3,s4,s5};
  277. BEGIN_FSM_STATE(CHeartBeatFSM)
  278. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  279. FSM_STATE_ENTRY(s1,"Starting",s1_on_entry,s1_on_exit,s1_on_event)
  280. FSM_STATE_ENTRY(s2,"Connected",s2_on_entry,s2_on_exit,s2_on_event)
  281. FSM_STATE_ENTRY(s3,"Lost",s3_on_entry,s3_on_exit,s3_on_event)
  282. FSM_STATE_ENTRY(s4,"Reject",s4_on_entry,s4_on_exit,s4_on_event)
  283. FSM_STATE_ENTRY(s5,"Failed",s5_on_entry,s5_on_exit,s5_on_event)
  284. END_FSM_STATE()
  285. BEGIN_FSM_RULE(CHeartBeatFSM,s0)
  286. FSM_RULE_ENTRY(s0,s1,USER_EVT_START,0)
  287. FSM_RULE_ENTRY(s1,s2,USER_EVT_STARTFINISHED,0)
  288. FSM_RULE_ENTRY(s1,s0,USER_EVT_STARTFINISHED,1)
  289. FSM_RULE_ENTRY(s2,s0,USER_EVT_STOP,0)
  290. FSM_RULE_ENTRY(s2,s0,USER_EVT_START,0)
  291. FSM_RULE_ENTRY(s4,s0,USER_EVT_STOP,0)
  292. END_FSM_RULE()
  293. CHeartBeatFSM():m_initTimes(0),m_bUseBackup(false),m_testResult(Error_Succeed),
  294. m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
  295. ,m_pCRAClient(NULL),m_pCISClient(NULL)
  296. , m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""), m_strHandShakeUrl(""),m_bAlarmed(false), m_bCrossUseJS(false)
  297. ,m_longConnInterval(20000),m_handShakeConnInterval(20000){}
  298. ~CHeartBeatFSM(){}
  299. virtual ErrorCodeEnum OnInit();
  300. virtual ErrorCodeEnum OnExit();
  301. void s0_on_entry();
  302. void s0_on_exit();
  303. unsigned int s0_on_event(FSMEvent* pEvt);
  304. void s1_on_entry();
  305. void s1_on_exit();
  306. unsigned int s1_on_event(FSMEvent* pEvt);
  307. void s2_on_entry();
  308. void s2_on_exit();
  309. unsigned int s2_on_event(FSMEvent* pEvt);
  310. void s3_on_entry();
  311. void s3_on_exit();
  312. unsigned int s3_on_event(FSMEvent* pEvt);
  313. void s4_on_entry();
  314. void s4_on_exit();
  315. unsigned int s4_on_event(FSMEvent* pEvt);
  316. void s5_on_entry();
  317. void s5_on_exit();
  318. unsigned int s5_on_event(FSMEvent* pEvt);
  319. DWORD m_dwServIP;
  320. CSimpleStringA m_strHandShakeUrl;//心跳地址
  321. int Starting();
  322. int DoHandShake();
  323. int DoNewHandShake();
  324. bool HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk);
  325. string HandShakeJsonStr();
  326. static void HttpsLogCallBack(const char* logtxt);
  327. void SetConnNULL(){}
  328. ErrorCodeEnum SetErrorList(int warmLevel,CSimpleStringA strList);
  329. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  330. int GetWarnLevel(){return m_warnLevel;}
  331. void SetTerminalStageState(CSimpleStringA stage) { m_terminalStage = stage; }
  332. CSimpleStringA GetTerminalStageState() { return m_terminalStage; }
  333. // Terminal Performance Counter component [Josephus in 9:17:13 2016/4/23]
  334. ErrorCodeEnum GetPerformCounter(TermianlCounter& counter);
  335. const CSimpleStringA GetRealIP()
  336. {
  337. return m_csServerIP;
  338. }
  339. const char* GetRunDiskPath()
  340. {
  341. return (LPCTSTR)m_csRunDiskName;
  342. }
  343. void SetLodCtrStatus(int val)
  344. {
  345. m_nLodCtrFlag = val;
  346. }
  347. int CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
  348. void LocalPreOnline(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type);
  349. void LocalPreOnlineJS(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type);
  350. void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode=0);
  351. void ProcessPreOnline(CardActiveReq* req);
  352. void ProcessCardActive(CardActiveReq* req);
  353. protected:
  354. void DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
  355. private:
  356. ErrorCodeEnum GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore);
  357. bool CheckCRASessionOrToConnect();
  358. bool CheckCISSessionOrToConnect();
  359. int m_tmpTestFlag;
  360. int m_longConnInterval;//长连接时间间隔
  361. int m_handShakeConnInterval;//新心跳时间间隔
  362. SOCKET m_ConnSocket;
  363. CSimpleStringA m_servStr,m_servIP,m_servStrB,m_servIPB,m_entErrorList,m_localDeviceNo,m_ILDeviceNo,m_tmpMultiBlob, m_terminalStage;
  364. int m_port,m_portB,m_initTimes,m_warnLevel;
  365. unsigned long m_ulServIP;
  366. HeartBeatConnection* m_pHandShakeConn;
  367. bool m_bUseBackup;
  368. ErrorCodeEnum m_testResult;
  369. CSimpleStringA m_csServerIP, m_csRunDiskName;
  370. int m_nLodCtrFlag;
  371. CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
  372. CardIssuerStore::CardIssuerStoreService_ClientBase* m_pCISClient;
  373. bool m_bCrossUseJS;
  374. bool m_bAlarmed;
  375. bool m_isCardStore;
  376. };
  377. struct StartTask : public ITaskSp
  378. {
  379. CHeartBeatFSM* fsm;
  380. StartTask(CHeartBeatFSM* f) : fsm(f) {}
  381. void Process()
  382. {
  383. FSMEvent *e = new FSMEvent(USER_EVT_STARTFINISHED);
  384. e->param1 = fsm->Starting();
  385. fsm->PostEventFIFO(e);
  386. }
  387. };
  388. struct HandShakeTask : public ITaskSp
  389. {
  390. CHeartBeatFSM* fsm;
  391. HandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  392. void Process()
  393. {
  394. FSMEvent *e = new FSMEvent(USER_EVT_HANDSHAKEFINISHED);
  395. e->param1 = fsm->DoHandShake();
  396. fsm->PostEventFIFO(e);
  397. }
  398. };
  399. struct LodctrTask : public ITaskSp
  400. {
  401. CHeartBeatFSM* fsm;
  402. LodctrTask(CHeartBeatFSM* f) : fsm(f) {}
  403. void Process()
  404. {
  405. HMODULE hDll = LoadLibrary("loadperf.dll");
  406. if(hDll == NULL)
  407. {
  408. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load loadperf.dll failed %d", GetLastError());
  409. return;
  410. }
  411. LpRestorePerfRegistryFromFile restoreFunc = (LpRestorePerfRegistryFromFile)GetProcAddress(
  412. hDll,
  413. "RestorePerfRegistryFromFileW");
  414. if(restoreFunc == NULL)
  415. {
  416. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
  417. return;
  418. }
  419. DWORD dwRet = restoreFunc(NULL, NULL);
  420. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restoreFunc returned 0x%08x", dwRet);
  421. if(dwRet == 0)
  422. {
  423. fsm->SetLodCtrStatus(1);
  424. }
  425. else
  426. {
  427. fsm->SetLodCtrStatus(2);
  428. }
  429. return;
  430. }
  431. };
  432. struct CardActiveTask : public ITaskSp
  433. {
  434. CHeartBeatFSM* fsm;
  435. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  436. CardActiveTask(CHeartBeatFSM* f) : fsm(f) {}
  437. void Process()
  438. {
  439. FSMEvent *e = new FSMEvent(USER_EVT_CARD_ACTIVE_FINISHED);
  440. e->param1 = fsm->CardActive(ctx);
  441. fsm->PostEventFIFO(e);
  442. }
  443. };
  444. struct ProcessPreOnlineTask : public ITaskSp
  445. {
  446. CHeartBeatFSM* fsm;
  447. CardActiveReq* cardActiveReq;
  448. #ifdef RVC_OS_WIN
  449. ProcessPreOnlineTask(CHeartBeatFSM *f, CardActiveReq* req) : fsm(f)
  450. {
  451. cardActiveReq = req;
  452. }
  453. #else
  454. ProcessPreOnlineTask(CHeartBeatFSM* f, CardActiveReq* req) : fsm(f),cardActiveReq(NULL)
  455. {
  456. if (req != NULL) {
  457. cardActiveReq = (CardActiveReq*)malloc(sizeof(struct CardActiveReq));
  458. if(cardActiveReq != NULL)
  459. memcpy(cardActiveReq, req, sizeof(struct CardActiveReq));
  460. }
  461. }
  462. ~ProcessPreOnlineTask()
  463. {
  464. if (cardActiveReq != nullptr) {
  465. free((void*)cardActiveReq);
  466. cardActiveReq = nullptr;
  467. }
  468. }
  469. #endif
  470. void Process()
  471. {
  472. fsm->ProcessPreOnline(cardActiveReq);
  473. }
  474. };
  475. struct NewHandShakeTask : public ITaskSp
  476. {
  477. CHeartBeatFSM* fsm;
  478. NewHandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  479. void Process()
  480. {
  481. fsm->DoNewHandShake();
  482. }
  483. };
  484. class HeartBeatConnection : public SpSecureClient
  485. {
  486. public:
  487. HeartBeatConnection(CEntityBase *pEntity, CHeartBeatFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM), m_TerminalNo("")
  488. {
  489. CSystemStaticInfo sysSInfo;
  490. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  491. m_TerminalNo = sysSInfo.strTerminalID;
  492. }
  493. virtual ~HeartBeatConnection() {}
  494. void SendHandShake();
  495. //type:0,send preonline; 1,result of preonline
  496. //errCSCode:CardStore returned UserErrorCode
  497. void SendCardActive(const int type, const int slot,unsigned long errCode, const char *termNo, const char *account, const int accSize
  498. , const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode=0);
  499. void PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg);
  500. void PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg);
  501. protected:
  502. virtual void OnDisconnect()
  503. {
  504. m_pFSM->SetConnNULL();
  505. this->Close();
  506. }
  507. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  508. //virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)
  509. //{
  510. // //oiltest
  511. //}
  512. private:
  513. CSimpleStringA m_TerminalNo;
  514. CHeartBeatFSM *m_pFSM;
  515. };
  516. #endif //__HEARTBEAT_FSM_H