HeartBeatFSM.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  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 <tchar.h>
  10. #include <conio.h>
  11. #include <pdh.h>
  12. #include <pdhmsg.h>
  13. #include <Loadperf.h>
  14. #else
  15. //oiltestlinux
  16. #endif //RVC_OS_WIN
  17. //#pragma comment(lib, "Loadperf.lib")
  18. #include "SpFSM.h"
  19. #include "HeartBeat_def_g.h"
  20. #include "HeartBeat_msg_g.h"
  21. using namespace HeartBeat;
  22. #include "SpSecureClient.h"
  23. #include "EventCode.h"
  24. #include "CardIssuer_client_g.h"
  25. //using namespace CardIssuer;
  26. #include "PinPad_client_g.h"
  27. //using namespace PinPad;
  28. #include "CardReadAdapter_client_g.h"
  29. //using namespace CardReadAdapter;
  30. #include "IDCertificate_client_g.h"
  31. //using namespace IDCertificate;
  32. #include "ScannerSet_client_g.h"
  33. using namespace ScannerSet;
  34. typedef DWORD (__stdcall *LpRestorePerfRegistryFromFile)(LPCWSTR szFileName, LPCWSTR szLangId);
  35. #pragma pack(1)
  36. // [StructName("FNTSTAT")]
  37. struct HandReq
  38. {
  39. char TerminalNo[16];
  40. uint32_t ip;
  41. char WarningLevel;
  42. char RunState;
  43. char CustomerHandle;
  44. char CallState;
  45. char LocalMaintain;
  46. char RemoteMaintain;
  47. char TermStage;
  48. char PreTermStage;
  49. char NetState;
  50. char PreNetState;
  51. };
  52. // [StructName("xxx")]
  53. struct HandErrListReq
  54. {
  55. int warnLevel;
  56. char reserved1;//用来存放交易控制标志
  57. char reserved2;
  58. char reserved3;
  59. char reserved4;
  60. char errList[512];
  61. };
  62. //[StructName("HANDANS")]
  63. struct HandAns
  64. {
  65. uint32_t EventCode;
  66. char param1[16];
  67. //int count;
  68. };
  69. struct CardActiveReq
  70. {
  71. uint32_t type;
  72. uint32_t slot;
  73. uint32_t reserved1;
  74. uint32_t reserved2;
  75. char Account[32];
  76. char FromTerminalNo[16];
  77. char TerminalNo[16];
  78. uint32_t EvtCode;
  79. uint32_t ErrCode;
  80. uint32_t findCard;
  81. uint32_t cardPos;
  82. char Param1[16];
  83. char Param2[1024];
  84. char Reserved3[128];
  85. char Reserved4[128];
  86. };
  87. struct CrossCallReq
  88. {
  89. uint32_t CallType;//跨机调用类型,同def文件的method id,实体内唯一
  90. bool bTwoWay;//true :two way call; false: one way call
  91. char FromTerminalNo[16];
  92. char ToTerminalNo[16];
  93. uint32_t nEntityID;
  94. uint32_t Appendix1;
  95. uint32_t Appendix2;
  96. //返回包时用于标注错误
  97. uint32_t ErrorCode;
  98. //oilyang@20190118
  99. uint32_t blobSN;//拆包时用于标注序号
  100. //本来以为StrParamX足够大,用这个值来划分blob,结果一个blob就塞满了
  101. //故numOfBlobInParamX用于标注拆包数量(结构个数)
  102. uint32_t numOfBlobInParamX;
  103. uint32_t lensOfBlobInParamX[16];//多个blob塞到StrParamX用于标注每一个的长度
  104. char StrParam1[128];
  105. char StrParam2[1024];
  106. char StrParamX[0];//用于传递图片信息
  107. };
  108. #pragma pack()
  109. enum EvtType
  110. {
  111. USER_EVT_TEST = EVT_USER+1,
  112. USER_EVT_QUIT,
  113. USER_EVT_START,
  114. USER_EVT_STARTFINISHED,
  115. USER_EVT_HANDSHAKEFINISHED,
  116. USER_EVT_INSTRUCTION,
  117. USER_EVT_LOST,
  118. USER_EVT_STOP,
  119. USER_EVT_REJECT,
  120. USER_EVT_EXIT,
  121. USER_EVT_CARD_ACTIVE,
  122. USER_EVT_CARD_ACTIVE_FINISHED,
  123. USER_EVT_CROSS_TERM_CALL,
  124. USER_EVT_CROSS_TERM_CALL_FINISHED,
  125. USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED,
  126. USER_EVT_ILCallToRVC,
  127. USER_EVT_CallResultToIL,
  128. };
  129. struct TerminalInfo
  130. {
  131. char TerminalNo[16];
  132. uint32_t ip;
  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. struct TermianlCounter
  146. {
  147. DWORD serverIP;
  148. uint16_t totalMem; //MB
  149. uint16_t freeMem; //MB
  150. uint16_t procNum;
  151. uint16_t threadNum;
  152. DWORD handleNum;
  153. DWORD freeDisk; //MB
  154. char osStartTime[22];
  155. uint16_t cpuLoad;
  156. };
  157. enum InstructionType
  158. {
  159. INC_UNKNOWN = 0,
  160. INC_GLOBAL_SETTING_SYNC,
  161. INC_COMM_RECONNECT,
  162. INC_START_REMOTE_CONTROL,
  163. INC_UPDATE_CHECK,
  164. INC_RECOVER_SERVICE,
  165. INC_PAUSE_SERVICE,
  166. INC_AREA_SERVICE_SWITCH,
  167. INC_VERSION_ROLLBACK,
  168. INC_BRIDGE,
  169. INC_VEDIO_CONNECTING,
  170. INC_TRADE_MANAGER_NORMAL,
  171. INC_TRADE_MANAGER_ON,
  172. INC_TRADE_MANAGER_OFF,
  173. INC_DEVICE_LOCK_ON,
  174. INC_DEVICE_UNLOCK,
  175. INC_DEVICE_KICK_OFF,
  176. };
  177. class CHeartBeatEntity;
  178. class CHeartBeatFSM;
  179. class InstructionEvent : public FSMEvent
  180. {
  181. public:
  182. InstructionEvent() : FSMEvent(USER_EVT_INSTRUCTION){}
  183. virtual ~InstructionEvent(){}
  184. SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx;
  185. protected:
  186. private:
  187. };
  188. class CardActiveEvent : public FSMEvent
  189. {
  190. public:
  191. CardActiveEvent() : FSMEvent(USER_EVT_CARD_ACTIVE){}
  192. virtual ~CardActiveEvent(){}
  193. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  194. protected:
  195. private:
  196. };
  197. class CrossTermCallEvent : public FSMEvent
  198. {
  199. public:
  200. CrossTermCallEvent() : FSMEvent(USER_EVT_CROSS_TERM_CALL) {}
  201. virtual ~CrossTermCallEvent() {}
  202. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  203. protected:
  204. private:
  205. };
  206. class ILCallToRVCEvent : public FSMEvent
  207. {
  208. public:
  209. ILCallToRVCEvent() : FSMEvent(USER_EVT_ILCallToRVC) {}
  210. virtual ~ILCallToRVCEvent() {}
  211. SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
  212. };
  213. class CallResultToILEvent : public FSMEvent
  214. {
  215. public:
  216. CallResultToILEvent() : FSMEvent(USER_EVT_CallResultToIL) {}
  217. virtual ~CallResultToILEvent() {}
  218. SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
  219. };
  220. class HeartBeatConnection;
  221. class CHeartBeatFSM : public FSMImpl<CHeartBeatFSM>
  222. {
  223. public:
  224. enum {s0,s1,s2,s3,s4,s5};
  225. BEGIN_FSM_STATE(CHeartBeatFSM)
  226. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  227. FSM_STATE_ENTRY(s1,"Starting",s1_on_entry,s1_on_exit,s1_on_event)
  228. FSM_STATE_ENTRY(s2,"Connected",s2_on_entry,s2_on_exit,s2_on_event)
  229. FSM_STATE_ENTRY(s3,"Lost",s3_on_entry,s3_on_exit,s3_on_event)
  230. FSM_STATE_ENTRY(s4,"Reject",s4_on_entry,s4_on_exit,s4_on_event)
  231. FSM_STATE_ENTRY(s5,"Failed",s5_on_entry,s5_on_exit,s5_on_event)
  232. END_FSM_STATE()
  233. BEGIN_FSM_RULE(CHeartBeatFSM,s0)
  234. FSM_RULE_ENTRY(s0,s1,USER_EVT_START,0)
  235. FSM_RULE_ENTRY(s1,s2,USER_EVT_STARTFINISHED,0)
  236. FSM_RULE_ENTRY(s1,s0,USER_EVT_STARTFINISHED,1)
  237. FSM_RULE_ENTRY(s2,s0,USER_EVT_STOP,0)
  238. FSM_RULE_ENTRY(s2,s0,USER_EVT_START,0)
  239. FSM_RULE_ENTRY(s4,s0,USER_EVT_STOP,0)
  240. END_FSM_RULE()
  241. CHeartBeatFSM():m_initTimes(0),m_bUseBackup(false),m_testResult(Error_Succeed),
  242. m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
  243. , m_tradeState(99),m_bJBMachine(false), m_pCRAClient(NULL), m_pIDClient(NULL) , m_pPinPadClient(NULL)
  244. , m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""){}
  245. ~CHeartBeatFSM(){}
  246. virtual ErrorCodeEnum OnInit();
  247. virtual ErrorCodeEnum OnExit();
  248. void s0_on_entry();
  249. void s0_on_exit();
  250. unsigned int s0_on_event(FSMEvent* pEvt);
  251. void s1_on_entry();
  252. void s1_on_exit();
  253. unsigned int s1_on_event(FSMEvent* pEvt);
  254. void s2_on_entry();
  255. void s2_on_exit();
  256. unsigned int s2_on_event(FSMEvent* pEvt);
  257. void s3_on_entry();
  258. void s3_on_exit();
  259. unsigned int s3_on_event(FSMEvent* pEvt);
  260. void s4_on_entry();
  261. void s4_on_exit();
  262. unsigned int s4_on_event(FSMEvent* pEvt);
  263. void s5_on_entry();
  264. void s5_on_exit();
  265. unsigned int s5_on_event(FSMEvent* pEvt);
  266. DWORD m_dwServIP;
  267. int Starting();
  268. int DoHandShake();
  269. void SetConnNULL(){}
  270. ErrorCodeEnum SetErrorList(int warmLevel,CSimpleStringA strList);
  271. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  272. int GetWarnLevel(){return m_warnLevel;}
  273. void SetTradeManagerState(int tState){ m_tradeState = tState; }
  274. void SetTerminalStageState(CSimpleStringA stage) { m_terminalStage = stage; }
  275. CSimpleStringA GetTerminalStageState() { return m_terminalStage; }
  276. int GetTradeManagerState(){ return m_tradeState; }
  277. CSimpleString GetEntityErrorList(){return m_entErrorList;}
  278. // Terminal Performance Counter component [Josephus in 9:17:13 2016/4/23]
  279. ErrorCodeEnum GetPerformCounter(TermianlCounter& counter);
  280. const CSimpleStringA GetRealIP()
  281. {
  282. return m_csServerIP;
  283. }
  284. const char* GetRunDiskPath()
  285. {
  286. return (LPCTSTR)m_csRunDiskName;
  287. }
  288. void SetLodCtrStatus(int val)
  289. {
  290. m_nLodCtrFlag = val;
  291. }
  292. int CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
  293. void LocalPreOnline(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data);
  294. void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos);
  295. int CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
  296. int ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
  297. int SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);
  298. void DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize);
  299. int LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize);
  300. void ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx);
  301. void CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx);
  302. void ProcessPreOnline(CardActiveReq* req);
  303. void ProcessCardActive(CardActiveReq* req);
  304. protected:
  305. void DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
  306. private:
  307. int m_tmpTestFlag;
  308. SOCKET m_ConnSocket;
  309. CSimpleStringA m_servStr,m_servIP,m_servStrB,m_servIPB,m_entErrorList,m_localDeviceNo,m_ILDeviceNo,m_tmpMultiBlob, m_terminalStage;
  310. int m_port,m_portB,m_initTimes,m_warnLevel,m_tradeState;
  311. unsigned long m_ulServIP;
  312. HeartBeatConnection* m_pHandShakeConn;
  313. bool m_bUseBackup;
  314. ErrorCodeEnum m_testResult;
  315. CSimpleStringA m_csServerIP, m_csRunDiskName;
  316. int m_nLodCtrFlag;
  317. bool m_bJBMachine;
  318. CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
  319. IDCertificate::IDCertService_ClientBase *m_pIDClient;
  320. PinPad::PinPadService_ClientBase *m_pPinPadClient;
  321. };
  322. struct StartTask : public ITaskSp
  323. {
  324. CHeartBeatFSM* fsm;
  325. StartTask(CHeartBeatFSM* f) : fsm(f) {}
  326. void Process()
  327. {
  328. FSMEvent *e = new FSMEvent(USER_EVT_STARTFINISHED);
  329. e->param1 = fsm->Starting();
  330. fsm->PostEventFIFO(e);
  331. }
  332. };
  333. struct HandShakeTask : public ITaskSp
  334. {
  335. CHeartBeatFSM* fsm;
  336. HandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  337. void Process()
  338. {
  339. FSMEvent *e = new FSMEvent(USER_EVT_HANDSHAKEFINISHED);
  340. e->param1 = fsm->DoHandShake();
  341. fsm->PostEventFIFO(e);
  342. }
  343. };
  344. struct LodctrTask : public ITaskSp
  345. {
  346. CHeartBeatFSM* fsm;
  347. LodctrTask(CHeartBeatFSM* f) : fsm(f) {}
  348. void Process()
  349. {
  350. HMODULE hDll = LoadLibrary("loadperf.dll");
  351. if(hDll == NULL)
  352. {
  353. Dbg("Load loadperf.dll failed %d", GetLastError());
  354. return;
  355. }
  356. LpRestorePerfRegistryFromFile restoreFunc = (LpRestorePerfRegistryFromFile)GetProcAddress(
  357. hDll,
  358. "RestorePerfRegistryFromFileW");
  359. if(restoreFunc == NULL)
  360. {
  361. Dbg("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
  362. return;
  363. }
  364. DWORD dwRet = restoreFunc(NULL, NULL);
  365. Dbg("restoreFunc returned 0x%08x", dwRet);
  366. if(dwRet == 0)
  367. {
  368. fsm->SetLodCtrStatus(1);
  369. }
  370. else
  371. {
  372. fsm->SetLodCtrStatus(2);
  373. }
  374. return;
  375. }
  376. };
  377. struct CardActiveTask : public ITaskSp
  378. {
  379. CHeartBeatFSM* fsm;
  380. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  381. CardActiveTask(CHeartBeatFSM* f) : fsm(f) {}
  382. void Process()
  383. {
  384. FSMEvent *e = new FSMEvent(USER_EVT_CARD_ACTIVE_FINISHED);
  385. e->param1 = fsm->CardActive(ctx);
  386. fsm->PostEventFIFO(e);
  387. }
  388. };
  389. struct CrossTermCallTask : public ITaskSp
  390. {
  391. CHeartBeatFSM* fsm;
  392. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  393. CrossTermCallTask(CHeartBeatFSM* f) : fsm(f) {}
  394. void Process()
  395. {
  396. FSMEvent *e = new FSMEvent(USER_EVT_CROSS_TERM_CALL_FINISHED);
  397. e->param1 = fsm->CrossTermCall(ctx);
  398. fsm->PostEventFIFO(e);
  399. }
  400. };
  401. struct ILCallToRVCTask : public ITaskSp
  402. {
  403. CHeartBeatFSM* fsm;
  404. SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
  405. ILCallToRVCTask(CHeartBeatFSM* f) : fsm(f) {}
  406. void Process()
  407. {
  408. fsm->ILCallToRVC(ctx);
  409. }
  410. };
  411. struct CallResultToILTask : public ITaskSp
  412. {
  413. CHeartBeatFSM* fsm;
  414. SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
  415. CallResultToILTask(CHeartBeatFSM* f) : fsm(f) {}
  416. void Process()
  417. {
  418. fsm->CallResultToIL(ctx);
  419. }
  420. };
  421. struct LocalProcessCrossCallTask : public ITaskSp
  422. {
  423. CHeartBeatFSM* fsm;
  424. CrossCallReq *xreqInfo;
  425. int xnBufSize;
  426. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  427. LocalProcessCrossCallTask(CHeartBeatFSM* f, CrossCallReq *reqInfo, const int nBufSize) : fsm(f),xnBufSize(nBufSize)
  428. {
  429. BYTE *pBuf = new BYTE[nBufSize + 1];
  430. ZeroMemory(pBuf, nBufSize + 1);
  431. memcpy(pBuf, reqInfo, nBufSize);
  432. xreqInfo = (CrossCallReq*)pBuf;
  433. Dbg("id:%x",xreqInfo->nEntityID);
  434. }
  435. ~LocalProcessCrossCallTask()
  436. {
  437. if (xreqInfo) {
  438. delete[] (BYTE*)xreqInfo;
  439. }
  440. }
  441. void Process()
  442. {
  443. FSMEvent *e = new FSMEvent(USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED);
  444. e->param1 = fsm->LocalProcessCrossCall(xreqInfo,xnBufSize);
  445. fsm->PostEventFIFO(e);
  446. }
  447. };
  448. struct ProcessPreOnlineTask : public ITaskSp
  449. {
  450. CHeartBeatFSM* fsm;
  451. CardActiveReq* cardActiveReq;
  452. ProcessPreOnlineTask(CHeartBeatFSM* f, CardActiveReq* req) : fsm(f),cardActiveReq(NULL)
  453. {
  454. if (req != NULL) {
  455. cardActiveReq = (CardActiveReq*)malloc(sizeof(struct CardActiveReq));
  456. if(cardActiveReq != NULL)
  457. memcpy(cardActiveReq, req, sizeof(struct CardActiveReq));
  458. }
  459. }
  460. ~ProcessPreOnlineTask()
  461. {
  462. if (cardActiveReq != nullptr) {
  463. free((void*)cardActiveReq);
  464. cardActiveReq = nullptr;
  465. }
  466. }
  467. void Process()
  468. {
  469. fsm->ProcessPreOnline(cardActiveReq);
  470. }
  471. };
  472. class HeartBeatConnection : public SpSecureClient
  473. {
  474. public:
  475. HeartBeatConnection(CEntityBase *pEntity, CHeartBeatFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM), m_TerminalNo("")
  476. {
  477. CSystemStaticInfo sysSInfo;
  478. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  479. m_TerminalNo = sysSInfo.strTerminalID;
  480. }
  481. virtual ~HeartBeatConnection() {}
  482. void SendHandShake();
  483. //type:0,send preonline; 1,result of preonline
  484. void SendCardActive(const int type, const int slot,unsigned long errCode, const char *termNo, const char *account, const int accSize
  485. , const char *data, const int dataSize,int findCard,int cardPos);
  486. void SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);
  487. void SendILCallToService(CSimpleStringA csContent,int err,bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo);
  488. void PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg);
  489. void PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg);
  490. void PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg);
  491. protected:
  492. virtual void OnDisconnect()
  493. {
  494. m_pFSM->SetConnNULL();
  495. this->Close();
  496. }
  497. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  498. //virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)
  499. //{
  500. // //oiltest
  501. //}
  502. private:
  503. CSimpleStringA m_TerminalNo;
  504. CHeartBeatFSM *m_pFSM;
  505. };
  506. #endif //__HEARTBEAT_FSM_H