HeartBeatFSM.h 13 KB

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