HeartBeatFSM.h 12 KB

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