HeartBeatFSM.cpp 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434
  1. #include "stdafx.h"
  2. #include "HeartBeatFSM.h"
  3. #include "HeartBeat_UserErrorCode.h"
  4. #include <regex>
  5. #include "json/json.h"
  6. #include <string.h>
  7. using namespace CardReadAdapter;
  8. #include "EventCode.h"
  9. #include "DeviceCrossHelper.h"
  10. const int DEFAULT_BUFLEN = 2048;
  11. const int MAX_SEND_FAILED_TIMES = 5;
  12. const int MAX_INIT_TIMES = 5;
  13. //#define DEFAULT_PORT "408"
  14. // Termainal Performance Counter Component [Josephus in 9:31:27 2016/4/23]
  15. CONST ULONG COUNTER_INTERVAL_MS = 1000;
  16. const char * AvailMemoryQuery = "\\Memory\\Available MBytes";
  17. const char * HandleNumQuery = "\\Process(_Total)\\Handle Count";
  18. const char * ThreadNumQuery = "\\Process(_Total)\\Thread Count";
  19. const char * ProcessNumQuery = "\\System\\Processes";
  20. const char * SystemElapsedQuery = "\\System\\System Up Time";
  21. const char * ProcessTimeQuery = "\\Processor Information(_Total)\\% Processor Time";
  22. #define DIV (1024 * 1024)
  23. #define DAY_DIV (24 * 60 * 60)
  24. #define HOURS_DIV (60 * 60)
  25. #define MINUS_DIV (60)
  26. // End Performance Component [Josephus in 9:32:05 2016/4/23]
  27. ErrorCodeEnum CHeartBeatFSM::OnInit()
  28. {
  29. LOG_FUNCTION();
  30. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","S");
  31. ErrorCodeEnum Error;
  32. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  33. CSmartPointer<IConfigInfo> spConfig;
  34. CSystemStaticInfo sysInfo;
  35. Error = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  36. if(Error == Error_Succeed) {
  37. m_bJBMachine = !sysInfo.strMachineType.Compare("RVC.IL", true);
  38. m_localDeviceNo = sysInfo.strTerminalID;
  39. }
  40. Error = spEntityFunction->OpenConfig(Config_CenterSetting, spConfig);
  41. if (Error != Error_Succeed) {
  42. LogWarn(Severity_Middle, Error_NotConfig, LOG_EVT_HEARTBEAT_LACK_CENSETTINGS, "打开集中配置失败,请检查集中配置是否存在!");
  43. return Error_DevLoadFileFailed;
  44. }
  45. m_tmpTestFlag = 0;
  46. m_isCardStore = !sysInfo.strMachineType.Compare("RVC.CardStore", true);
  47. ErrorCodeEnum rc = GetServerAddr(spConfig, m_isCardStore);
  48. if (Error_Succeed != rc) {
  49. LogWarn(Severity_Middle, Error_NotConfig, LOG_EVT_HEARTBEAT_LACK_CENSETTINGS, "找不到对应的配置,请检查集中配置是否存在!");
  50. return rc;
  51. }
  52. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(),"TestFlag",m_tmpTestFlag);
  53. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "LongConnInterval", m_longConnInterval);
  54. if (m_longConnInterval < 20000) {
  55. m_longConnInterval = 20000;//默认20s
  56. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("LongConnInterval<20000ms ,use default 20s", m_longConnInterval);
  57. }
  58. int intervalTemp = 0;
  59. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "HandShakeConnInterval", intervalTemp);
  60. if (intervalTemp == 0) {
  61. //未配置
  62. m_handShakeConnInterval = 20000;
  63. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_handShakeConnInterval is not configured ,use default 20s", m_handShakeConnInterval);
  64. }
  65. else {
  66. //已配置
  67. if (intervalTemp < 10000) {
  68. m_handShakeConnInterval = 10000;
  69. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_handShakeConnInterval %d ms<10000ms ,use default 10s", intervalTemp);
  70. }
  71. else {
  72. m_handShakeConnInterval = intervalTemp;
  73. }
  74. }
  75. //网络字节序
  76. //由于双活改造,改成固定ip,分行服务有处理
  77. //m_servIP = "99.1.100.215";
  78. m_dwServIP = inet_addr("99.1.100.215");
  79. //m_csServerIP = m_servIP;
  80. CSimpleStringA csRunDiskName("C:\\");
  81. Error = GetEntityBase()->GetFunction()->GetPath("Run", csRunDiskName);
  82. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath of run is %s 0x%x", (LPCTSTR)csRunDiskName, Error);
  83. CAutoArray<CSimpleStringA> arrays = csRunDiskName.Split('\\');
  84. if(arrays.GetCount() > 0)
  85. {
  86. m_csRunDiskName = arrays[0] + "\\";
  87. }
  88. else
  89. {
  90. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Split rundisk file string(%s) failed", (LPCTSTR)csRunDiskName);
  91. return Error_Unexpect;
  92. }
  93. CSimpleStringA temp="";
  94. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "HandShakeUrl", temp);
  95. m_strHandShakeUrl = temp;
  96. //有心跳地址才启动心跳新线程
  97. if (!m_strHandShakeUrl.IsNullOrEmpty()) {
  98. NewHandShakeTask* task = new NewHandShakeTask(this);
  99. Error = this->GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  100. if (rc != Error_Succeed)
  101. {
  102. LogError(Severity_Middle, rc, 0, CSimpleStringA::Format("NewHandShakeTask Thread is fail,%d", (int)rc).GetData());
  103. m_testResult = Error_InvalidState;//启动心跳线程失败
  104. return Error_Exception;
  105. }
  106. else {
  107. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_TASK_START,
  108. CSimpleStringA::Format("NewHandShakeTask task start,HandShakeConnInterval= %d ms, LongConnInterval = %d ms, url=%s", m_handShakeConnInterval,m_longConnInterval,m_strHandShakeUrl.GetData()));
  109. }
  110. }
  111. else {
  112. //提醒无心跳地址,旧心跳时间默认设置为20s
  113. m_longConnInterval = 20000;//设置为20s
  114. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_TASK_NOT_START,"NewHandShakeTask task not start,HandShakeUrl is temp,LongConnInterval use default 20s");
  115. }
  116. return Error_Succeed;
  117. }
  118. ErrorCodeEnum CHeartBeatFSM::OnExit()
  119. {
  120. return Error_NotImpl;
  121. }
  122. //Init(Stop)
  123. void CHeartBeatFSM::s0_on_entry()
  124. {
  125. //LOG_FUNCTION();
  126. {
  127. //check if can start to work(handshake...)
  128. //1.check if AccessAuthorization have finished
  129. //2.check if network connected
  130. //3.check if framework on Exitting or Terminating
  131. //all of above have checked,start to work
  132. if (m_pHandShakeConn != NULL)
  133. {
  134. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("init connection.");
  135. m_pHandShakeConn->Close();
  136. m_pHandShakeConn->DecRefCount();
  137. m_pHandShakeConn = NULL;
  138. }
  139. FSMEvent *e = new FSMEvent(USER_EVT_START);
  140. PostEventFIFO(e);
  141. m_initTimes++;
  142. if (m_initTimes > 1)
  143. Sleep(30000);
  144. if (m_initTimes > MAX_INIT_TIMES)
  145. {
  146. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have try to init x times,give up!");
  147. //logwarn oiltest
  148. m_initTimes = 0;
  149. }
  150. }
  151. }
  152. void CHeartBeatFSM::s0_on_exit()
  153. {
  154. }
  155. unsigned int CHeartBeatFSM::s0_on_event(FSMEvent* pEvt)
  156. {
  157. switch(pEvt->iEvt)
  158. {
  159. case USER_EVT_START:
  160. {
  161. StartTask* task = new StartTask(this);
  162. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  163. pEvt->SetHandled();
  164. }
  165. return 0;
  166. default:
  167. break;
  168. }
  169. return 0;
  170. }
  171. //Starting
  172. void CHeartBeatFSM::s1_on_entry()
  173. {
  174. //LOG_FUNCTION();
  175. }
  176. void CHeartBeatFSM::s1_on_exit()
  177. {
  178. }
  179. unsigned int CHeartBeatFSM::s1_on_event(FSMEvent* pEvt)
  180. {
  181. switch(pEvt->iEvt)
  182. {
  183. case USER_EVT_STARTFINISHED:
  184. pEvt->SetHandled();
  185. if (pEvt->param1 == 0)
  186. {
  187. HandShakeTask* task = new HandShakeTask(this);
  188. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  189. pEvt->SetHandled();
  190. return 0;
  191. }
  192. else
  193. {
  194. // SetFlag for MobileDial entity. [Josephus in 11:40:29 2016/8/16]
  195. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","D");
  196. return 1;
  197. }
  198. break;
  199. default:
  200. break;
  201. }
  202. return 0;
  203. }
  204. //Connnected
  205. void CHeartBeatFSM::s2_on_entry()
  206. {
  207. LOG_FUNCTION();
  208. m_initTimes = 0;
  209. m_testResult = Error_Succeed;
  210. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_CONNECTED, "Branch heartbeat service connected.");
  211. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_HEARTBEAT_CONNECTED, "Branch heartbeat service connected.");
  212. }
  213. void CHeartBeatFSM::s2_on_exit()
  214. {
  215. }
  216. unsigned int CHeartBeatFSM::s2_on_event(FSMEvent* pEvt)
  217. {
  218. switch(pEvt->iEvt)
  219. {
  220. case USER_EVT_INSTRUCTION:
  221. {
  222. InstructionEvent *pIE = dynamic_cast<InstructionEvent*>(pEvt);
  223. pEvt->SetHandled();
  224. DoInstruction(pIE->ctx);
  225. }
  226. break;
  227. case USER_EVT_HANDSHAKEFINISHED:
  228. pEvt->SetHandled();
  229. break;
  230. case USER_EVT_STOP:
  231. pEvt->SetHandled();
  232. break;
  233. case USER_EVT_START:
  234. pEvt->SetHandled();
  235. break;
  236. case USER_EVT_CARD_ACTIVE:
  237. {
  238. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 card active.");
  239. pEvt->SetHandled();
  240. CardActiveEvent *pcae = dynamic_cast<CardActiveEvent*>(pEvt);
  241. CardActiveTask *pTask = new CardActiveTask(this);
  242. pTask->ctx = pcae->ctx;
  243. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  244. }
  245. break;
  246. case USER_EVT_CARD_ACTIVE_FINISHED:
  247. pEvt->SetHandled();
  248. break;
  249. default:
  250. break;
  251. }
  252. return 0;
  253. }
  254. //Lost
  255. void CHeartBeatFSM::s3_on_entry()
  256. {
  257. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","L");
  258. }
  259. void CHeartBeatFSM::s3_on_exit()
  260. {
  261. }
  262. unsigned int CHeartBeatFSM::s3_on_event(FSMEvent* pEvt)
  263. {
  264. return 0;
  265. }
  266. //Reject
  267. void CHeartBeatFSM::s4_on_entry()
  268. {
  269. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","R");
  270. FSMEvent *pStopEvt = new FSMEvent(USER_EVT_STOP);
  271. PostEventFIFO(pStopEvt);
  272. }
  273. void CHeartBeatFSM::s4_on_exit()
  274. {
  275. }
  276. unsigned int CHeartBeatFSM::s4_on_event(FSMEvent* pEvt)
  277. {
  278. switch(pEvt->iEvt)
  279. {
  280. case USER_EVT_STOP:
  281. pEvt->SetHandled();
  282. break;
  283. default:
  284. break;
  285. }
  286. return 0;
  287. }
  288. //Failed
  289. void CHeartBeatFSM::s5_on_entry()
  290. {
  291. m_testResult = Error_InvalidState;
  292. }
  293. void CHeartBeatFSM::s5_on_exit()
  294. {
  295. }
  296. unsigned int CHeartBeatFSM::s5_on_event(FSMEvent* pEvt)
  297. {
  298. return 0;
  299. }
  300. int CHeartBeatFSM::Starting()
  301. {
  302. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HeartBeat start to connect.");
  303. if (!m_pHandShakeConn)
  304. {
  305. //HeartBeatConnection* pHandShakeConn;
  306. m_pHandShakeConn = new HeartBeatConnection(m_pEntity, this);
  307. if (m_pHandShakeConn != NULL)
  308. {
  309. bool bConn = false;
  310. if(m_isCardStore)
  311. {
  312. bConn = m_pHandShakeConn->Connect(m_servIP, m_port, 3);
  313. }
  314. else
  315. {
  316. bConn = m_pHandShakeConn->ConnectFromCentralSetting();
  317. }
  318. if (!bConn)
  319. {
  320. m_pHandShakeConn->Close();
  321. //delete m_pHandShakeConn;//oiltest
  322. m_pHandShakeConn->DecRefCount();
  323. m_pHandShakeConn = NULL;
  324. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot connect to server.");
  325. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_UN_CONNECTED, "Branch heartbeat service unconnected.");
  326. LogWarn(Severity_Middle, Error_Unexpect, LOG_EVT_HEARTBEAT_UN_CONNECTED, "Branch heartbeat service unconnected.");
  327. return 1;
  328. }
  329. }
  330. }
  331. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HeartBeat connected.");
  332. return 0;
  333. }
  334. int CHeartBeatFSM::DoHandShake()
  335. {
  336. if (m_pHandShakeConn) {
  337. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start handshake");
  338. //oiltest sp_var_client_set has no write privilege!
  339. //GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","C");
  340. while (1)
  341. {
  342. if (!m_pHandShakeConn || !m_pHandShakeConn->IsConnectionOK())
  343. {
  344. FSMEvent *e = new FSMEvent(USER_EVT_START);
  345. PostEventFIFO(e);
  346. break;
  347. }
  348. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState", "C");
  349. m_pHandShakeConn->SendHandShake();
  350. if(m_pHandShakeConn->IsConnectionOK() && !m_bAlarmed)
  351. {
  352. regex reg("((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])");
  353. if(regex_match(m_servIP.GetData(), reg))
  354. {
  355. CSimpleStringA msg = CSimpleStringA::Format("Branch server IP: %s, backup ip: %s", m_servIP.GetData(), m_servIPB.GetData());
  356. LogWarn(Severity_Low, Error_Succeed, LOG_EVT_CONNECT_BRANCH, msg);
  357. }
  358. else
  359. {
  360. CSimpleStringA msg = CSimpleStringA::Format("Center server url: %s", m_servIP.GetData());
  361. LogWarn(Severity_Low, Error_Succeed, LOG_EVT_CONNECT_CENTER, msg);
  362. }
  363. m_bAlarmed = true;
  364. }
  365. Sleep(m_longConnInterval);//修改成可配置的时间间隔
  366. //Sleep(20000);//oiltest
  367. if (m_tmpTestFlag)
  368. {
  369. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("send spshell.exe restart event.");
  370. LogEvent(Severity_Middle, Event_Req_Framework_Restart, "spshell.exe restart");
  371. }
  372. }
  373. }
  374. return 0;
  375. }
  376. int CHeartBeatFSM::DoNewHandShake() {
  377. LOG_FUNCTION();
  378. int warnSum = 0;
  379. while (true)
  380. {
  381. if (warnSum == 50) {
  382. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp send 50 times");
  383. warnSum = 0;
  384. }
  385. IHttpFunc* client;
  386. client = create_http(HttpsLogCallBack);
  387. //发送心跳http请求
  388. bool isHeartBeatOk=false;
  389. bool bRet = HandShakeHttp(client, isHeartBeatOk);
  390. if (bRet) {
  391. if (!isHeartBeatOk) {
  392. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp isHeartBeatOk=false");
  393. }
  394. }
  395. client->Destory();
  396. Sleep(m_handShakeConnInterval);//改为参数配置
  397. warnSum++;
  398. }
  399. return 0;
  400. }
  401. bool CHeartBeatFSM::HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk) {
  402. HttpStruct::SendHandShakeReq qTempReq;
  403. HttpStruct::SendHandShakeRet qTempRet;
  404. CSystemStaticInfo info;
  405. qTempReq.m_reqStr = HandShakeJsonStr();//请求参数
  406. qTempReq.m_url = m_strHandShakeUrl.GetData();//访问地址
  407. qTempReq.m_timeOut = 60;//设置传送超时时间为60s
  408. //qTempReq.m_printDbg = true;
  409. if (!client->Post(qTempReq, qTempRet)) {
  410. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_HTTP_ERROR, CSimpleStringA::Format("HandShakeHttp http req fail,url=%s, err=%s", qTempReq.m_url.c_str(), qTempRet.m_errMsg.c_str()).GetData());
  411. return false;//通讯失败
  412. }
  413. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("qTempRet=%s", qTempRet.m_retStr.c_str());
  414. Json::Reader reader;
  415. Json::Value rootRet;
  416. if (!reader.parse(qTempRet.m_retStr, rootRet, false))
  417. {
  418. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_HTTP_ERROR, CSimpleStringA::Format("HandShakeHttp parse resp is fail,url=%s", qTempReq.m_url.c_str()).GetData());
  419. return false;//服务异常
  420. }
  421. bool isSucc = rootRet["success"].asBool();
  422. if (isSucc) {
  423. if (rootRet.isMember("data")) {
  424. if (rootRet["data"].asBool()) {
  425. isHeartBeatOk = true;//心跳正常
  426. return true;//服务正常
  427. }
  428. else {
  429. isHeartBeatOk = false;//心跳不正常
  430. return true;//服务正常
  431. }
  432. }
  433. else {
  434. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp [success] is true,param [data] is lost");
  435. return false;//服务异常
  436. }
  437. }
  438. else {
  439. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp [success] is false,errCode=%s,errStr=%s", qTempRet.m_userCode.c_str(),qTempRet.m_errMsg.c_str());
  440. return false;//服务异常
  441. }
  442. }
  443. string CHeartBeatFSM::HandShakeJsonStr() {
  444. //LOG_FUNCTION();
  445. string jsonStr = "";
  446. Json::Value root;
  447. Json::FastWriter fw;//写入对象
  448. Json::Value obj1, obj2, obj3;
  449. //写入shakehandvo对象
  450. CSystemStaticInfo sysSInfo;
  451. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  452. CSimpleStringA warningLevel("w"), runState("r"), customerHandle("c"), callState("s"),
  453. localMaintain("l"), remoteMaintain("m"), termStage("U");
  454. m_pEntity->GetFunction()->GetSysVar("RunState", runState);
  455. m_pEntity->GetFunction()->GetSysVar("CustomerHandle", customerHandle);
  456. m_pEntity->GetFunction()->GetSysVar("CallState", callState);
  457. m_pEntity->GetFunction()->GetSysVar("TerminalStage", termStage);
  458. #ifdef RVC_OS_WIN
  459. char tmp[256];
  460. gethostname(tmp, sizeof(tmp));
  461. hostent* ent = gethostbyname(tmp);
  462. unsigned long ip = 0xffffffff;
  463. if (ent) {
  464. for (int i = 0; ent->h_addr_list[i]; ++i) {
  465. if (ent->h_addrtype == AF_INET) {
  466. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  467. if (in->S_un.S_un_b.s_b1 != 0) {
  468. if (in->S_un.S_un_b.s_b1 == 192)
  469. continue;
  470. ip = (in->S_un.S_un_b.s_b1 << 24) + (in->S_un.S_un_b.s_b2 << 16)
  471. + (in->S_un.S_un_b.s_b3 << 8) + in->S_un.S_un_b.s_b4;
  472. break;
  473. }
  474. }
  475. }
  476. }
  477. #endif //RVC_OS_WIN
  478. obj1["terminalNo"] = sysSInfo.strTerminalID.GetData();
  479. #ifdef RVC_OS_WIN
  480. obj1["ip"] = (unsigned int)ip;
  481. #else
  482. obj1["ip"] = 0;//默认不获取
  483. #endif
  484. obj1["warningLevel"] = warningLevel.GetData();
  485. obj1["runState"] = runState.GetData();
  486. obj1["customerHandle"] = customerHandle.GetData();
  487. obj1["callState"] = callState.GetData();
  488. obj1["localMaintain"] = localMaintain.GetData();
  489. obj1["remoteMaintain"] = remoteMaintain.GetData();
  490. obj1["termStage"] = termStage.GetData();
  491. obj1["preTermStage"] = "";
  492. obj1["netState"] = "";
  493. obj1["preNetState"] = "";
  494. root["shakeHandVO"]=Json::Value(obj1);
  495. //写入shakeHandSystemInfo对象
  496. TermianlCounter counter;
  497. ErrorCodeEnum erroCode = GetPerformCounter(counter);
  498. if (erroCode != Error_Succeed)
  499. {
  500. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Terminal Performance Information failed !!!");
  501. }
  502. //Dbg("dwServIP 0x%x", counter.serverIP);
  503. #ifdef RVC_OS_WIN
  504. const char* diskPath = GetRunDiskPath();
  505. ULARGE_INTEGER uliFreeBytesAvailable;
  506. if (GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  507. {
  508. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  509. }
  510. else
  511. {
  512. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  513. }
  514. #else
  515. //oiltestlinux
  516. counter.freeDisk = 0;
  517. #endif //RVC_OS_WIN
  518. obj2["serverIP"] = (unsigned int)m_dwServIP;
  519. obj2["totalMem"] = (int)counter.totalMem;
  520. obj2["freeMem"] = (int)counter.freeMem;
  521. obj2["procNum"] = (int)counter.procNum;
  522. obj2["threadNum"] = (int)counter.threadNum;;
  523. obj2["handleNum"] = (unsigned int)counter.handleNum;;
  524. obj2["freeDisk"] = (unsigned int)counter.freeDisk;
  525. obj2["osStartTime"] = CSimpleStringA::Format("%s",counter.osStartTime).GetData();
  526. obj2["cpuLoad"] = (int)counter.cpuLoad;
  527. root["shakeHandSystemInfo"]=Json::Value(obj2);
  528. //写入shakeHandErrorVO对象
  529. HandErrListReq errListReq;
  530. errListReq.warnLevel = GetWarnLevel();
  531. errListReq.reserved1 = ' ';
  532. ZeroMemory(errListReq.errList, 512);
  533. obj3["warnLevel"] = errListReq.warnLevel;
  534. string tmp_string(1, errListReq.reserved1);
  535. obj3["reserved1"] = tmp_string.c_str();
  536. obj3["errList"] = "";
  537. root["shakeHandErrorVO"]=Json::Value(obj3);
  538. jsonStr = fw.write(root);
  539. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeJsonStr")("HandShakeJsonStr=%s", jsonStr.c_str());
  540. return jsonStr;
  541. }
  542. void CHeartBeatFSM::HttpsLogCallBack(const char* logtxt)
  543. {
  544. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("http dbg: %s", logtxt);
  545. }
  546. int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
  547. {
  548. LOG_FUNCTION();
  549. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  550. {
  551. m_pHandShakeConn->SendCardActive(0,ctx->Req.slot, 0,(const char*)ctx->Req.term,(const char*)ctx->Req.account, ctx->Req.account.GetLength(), (const char*)ctx->Req.data, ctx->Req.data.GetLength(),0,0);
  552. ctx->Answer(Error_Succeed);
  553. }
  554. else
  555. {
  556. if (ctx->Req.account.GetLength() > 6)
  557. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("acc:%s****%s,no connection.", (const char*)ctx->Req.account.SubString(0, 6), (const char*)ctx->Req.account.SubString(ctx->Req.account.GetLength() - 4, 4));
  558. else
  559. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("acc:%s, size:%d", (const char*)ctx->Req.account,ctx->Req.account.GetLength());
  560. ctx->Answer(Error_Unexpect);
  561. }
  562. return 0;
  563. }
  564. void CHeartBeatFSM::DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx)
  565. {
  566. switch(ctx->Req.type)
  567. {
  568. case INC_GLOBAL_SETTING_SYNC:
  569. break;
  570. case INC_COMM_RECONNECT:
  571. break;
  572. case INC_START_REMOTE_CONTROL:
  573. break;
  574. case INC_UPDATE_CHECK:
  575. break;
  576. case INC_RECOVER_SERVICE:
  577. break;
  578. case INC_PAUSE_SERVICE:
  579. break;
  580. case INC_AREA_SERVICE_SWITCH:
  581. break;
  582. default:
  583. break;
  584. }
  585. }
  586. ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
  587. {
  588. m_warnLevel = warmLevel;
  589. m_entErrorList = strList;
  590. return Error_Succeed;
  591. }
  592. void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  593. {
  594. //for simple
  595. pTransactionContext->SendAnswer(m_testResult);
  596. }
  597. void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data)
  598. {
  599. LOG_FUNCTION();
  600. DWORD dwUserCode = 0;
  601. if (!CheckCRASessionOrToConnect())
  602. {
  603. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("to call local preonline, but can't connect to CardReadAdapter.");
  604. return;
  605. }
  606. CardReadAdapterService_PreOnline_Req req;
  607. CardReadAdapterService_PreOnline_Ans ans;
  608. CSimpleStringA errMsgData("");
  609. req.businessData = data;
  610. char buf[16];
  611. ZeroMemory(buf, sizeof(buf));
  612. #ifdef RVC_OS_WIN
  613. itoa(slot, buf, 10);
  614. #else
  615. _itoa(slot, buf, 10);
  616. #endif
  617. CSimpleStringA kaku("kaku#");
  618. req.module = 1;
  619. req.reserved2.Init(2);
  620. req.reserved2[0] = kaku + CSimpleStringA(buf);
  621. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local:%s", (const char*)req.reserved2[0]);
  622. req.reserved2[1] = account;
  623. CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
  624. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
  625. ErrorCodeEnum eErr = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 65000, dwUserCode);
  626. if (eErr != Error_Succeed){
  627. errMsgData = CSimpleStringA::Format("local preonline failed:%d(0x%x),dwUserCode:%d(0x%x)", eErr, eErr, dwUserCode, dwUserCode);
  628. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, errMsgData.GetData());
  629. if (eErr == Error_Duplication)
  630. {
  631. ReceivePreOnlineBack(Error_Duplication, "", 0, 0);
  632. return;
  633. }
  634. else if (eErr == Error_InvalidState)
  635. {
  636. errMsgData = "CardIssuer in use";
  637. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  638. {
  639. m_pHandShakeConn->SendCardActive(1, slot, Error_Duplication, (const char*)termNo, (const char*)account,
  640. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  641. }
  642. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use, "CardIssuer in use");
  643. return;
  644. }
  645. else if (eErr == Error_DevNotAvailable)
  646. {
  647. errMsgData = "CardIssuer not available(open failed)";
  648. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  649. {
  650. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  651. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  652. }
  653. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_Open_Failed, "CardIssuer not available(open failed)");
  654. return;
  655. }
  656. else if (eErr == Error_TimeOut)
  657. {
  658. errMsgData = "CardIssuer process cost too long";
  659. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  660. {
  661. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  662. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  663. }
  664. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA230W")("跨机时卡库处理耗时过长");
  665. LogError(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_ProcessCostTooLong, "CardIssuer process cost too long");
  666. return;
  667. }
  668. }
  669. Sleep(500);
  670. CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
  671. CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
  672. ErrorCodeEnum eErrX = Error_Unexpect;
  673. eErrX = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->QueryCardInfoOnStore(reqX, ansX,12000);
  674. if (eErrX != Error_Succeed)
  675. {
  676. errMsgData = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d",eErrX);
  677. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_QueryCardInfoOnStore_Falied, errMsgData.GetData());
  678. ansX.findCard = ansX.cardPos = 9999;
  679. }
  680. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  681. {
  682. m_pHandShakeConn->SendCardActive(1, slot, eErr, (const char*)termNo, (const char*)account,
  683. account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ansX.findCard, ansX.cardPos, dwUserCode);
  684. }
  685. }
  686. void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode)
  687. {
  688. if (!CheckCRASessionOrToConnect())
  689. {
  690. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("while receive preonline result, but can't connect to CardReadAdapter.");
  691. return;
  692. }
  693. CardReadAdapterService_NotifyPreonline_Req req;
  694. CardReadAdapterService_NotifyPreonline_Ans ans;
  695. req.data = data;
  696. req.findCard = findCard;
  697. req.cardPos = cardPos;
  698. req.errCode = errCode;
  699. req.reserved1.Init(1);
  700. req.reserved1[0] = userErrCode;
  701. ErrorCodeEnum eErr = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->NotifyPreonline(req, ans, 10000);
  702. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NotifyPreonline ret:%d",eErr);
  703. }
  704. ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
  705. {
  706. memset(&counter, 0, sizeof(TermianlCounter));
  707. #ifdef RVC_OS_WIN
  708. //oilyang@20171122 数量太多,暂时去掉
  709. //LOG_FUNCTION();
  710. PDH_STATUS Status;
  711. HQUERY Query = NULL;
  712. //HCOUNTER hcMemoryCount;
  713. HCOUNTER hcHandleCount, hcProcessCount, hcThreadCount;
  714. HCOUNTER hcElapsedTimeCount, hcProcessTimeCount;
  715. DWORD CounterType;
  716. MEMORYSTATUSEX statex;
  717. Status = PdhOpenQuery(NULL, NULL, &Query);
  718. if (Status != ERROR_SUCCESS)
  719. {
  720. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhOpenQuery failed with status 0x%x.", Status);
  721. goto Cleanup;
  722. }
  723. Status = PdhAddCounter(Query, ProcessTimeQuery, NULL, &hcProcessTimeCount);
  724. if (Status != ERROR_SUCCESS)
  725. {
  726. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessTimeQuery failed with status 0x%x.", Status);
  727. goto Cleanup;
  728. }
  729. Status = PdhAddCounter(Query, HandleNumQuery, NULL, &hcHandleCount);
  730. if (Status != ERROR_SUCCESS)
  731. {
  732. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for HandleNumQuery failed with status 0x%x.", Status);
  733. goto Cleanup;
  734. }
  735. Status = PdhAddCounter(Query, ThreadNumQuery, NULL, &hcThreadCount);
  736. if (Status != ERROR_SUCCESS)
  737. {
  738. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ThreadNumQuery failed with status 0x%x.", Status);
  739. goto Cleanup;
  740. }
  741. Status = PdhAddCounter(Query, ProcessNumQuery, NULL, &hcProcessCount);
  742. if (Status != ERROR_SUCCESS)
  743. {
  744. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessNumQuery failed with status 0x%x.", Status);
  745. goto Cleanup;
  746. }
  747. Status = PdhAddCounter(Query, SystemElapsedQuery, NULL, &hcElapsedTimeCount);
  748. if (Status != ERROR_SUCCESS)
  749. {
  750. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for SystemElapsedQuery failed with status 0x%x.", Status);
  751. goto Cleanup;
  752. }
  753. Status = PdhCollectQueryData(Query);
  754. if (Status != ERROR_SUCCESS)
  755. {
  756. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with 0x%x.\n", Status);
  757. goto Cleanup;
  758. }
  759. do
  760. {
  761. Sleep(COUNTER_INTERVAL_MS);
  762. Status = PdhCollectQueryData(Query);
  763. if (Status != ERROR_SUCCESS)
  764. {
  765. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with status 0x%x.", Status);
  766. break;
  767. }
  768. memset(&statex, 0, sizeof(MEMORYSTATUSEX));
  769. statex.dwLength = sizeof(statex);
  770. if (GlobalMemoryStatusEx(&statex))
  771. {
  772. //Dbg("CPUUseRate:%u%%", statex.dwMemoryLoad);
  773. counter.totalMem = (unsigned short)(statex.ullTotalPhys / DIV);
  774. //Dbg("TotalPhysMemory:%I64dMB %d", statex.ullTotalPhys / DIV, counter.totalMem);
  775. counter.freeMem = (unsigned short)(statex.ullAvailPhys / DIV);
  776. //Dbg("AvailableMemory:%I64dMB %d", statex.ullAvailPhys / DIV, counter.freeMem);
  777. }
  778. PDH_FMT_COUNTERVALUE counterValue;
  779. //Status = PdhGetFormattedCounterValue(hcMemoryCount, PDH_FMT_DOUBLE, NULL, &counterValue);
  780. //if (Status == ERROR_SUCCESS)
  781. //{
  782. // Dbg("AvailableMemory:%.20gMB\n", counterValue.doubleValue);
  783. //}
  784. Status = PdhGetFormattedCounterValue(hcProcessTimeCount, PDH_FMT_DOUBLE, &CounterType, &counterValue);
  785. if (Status == ERROR_SUCCESS)
  786. {
  787. counter.cpuLoad = (unsigned short)(counterValue.doubleValue + 0.5);
  788. //Dbg("CPURate:%d %u", (long)counterValue.doubleValue, counter.cpuLoad);
  789. }
  790. Status = PdhGetFormattedCounterValue(hcHandleCount, PDH_FMT_LONG, NULL, &counterValue);
  791. if (Status == ERROR_SUCCESS)
  792. {
  793. counter.handleNum = (unsigned int)(counterValue.longValue);
  794. //Dbg("HandlesNum:%ld %u", counterValue.longValue, counter.handleNum);
  795. }
  796. Status = PdhGetFormattedCounterValue(hcThreadCount, PDH_FMT_LONG, NULL, &counterValue);
  797. if (Status == ERROR_SUCCESS)
  798. {
  799. counter.threadNum = (unsigned short)(counterValue.longValue);
  800. //Dbg("ThreadsNum:%ld %u", counterValue.longValue, counter.threadNum);
  801. }
  802. Status = PdhGetFormattedCounterValue(hcProcessCount, PDH_FMT_LONG, NULL, &counterValue);
  803. if (Status == ERROR_SUCCESS)
  804. {
  805. counter.procNum = (unsigned short)(counterValue.longValue);
  806. //Dbg("ProcessesNum:%ld %u", counterValue.longValue, counter.procNum);
  807. }
  808. Status = PdhGetFormattedCounterValue(hcElapsedTimeCount, PDH_FMT_LARGE, NULL, &counterValue);
  809. if (Status == ERROR_SUCCESS)
  810. {
  811. ULONGLONG ulSinceSeconds = counterValue.largeValue;
  812. ULONG days = 0, hours = 0, minutes = 0, seconds = 0;
  813. days = ULONG(ulSinceSeconds / DAY_DIV);
  814. ulSinceSeconds %= DAY_DIV;
  815. hours = ULONG(ulSinceSeconds / HOURS_DIV);
  816. ulSinceSeconds %= HOURS_DIV;
  817. minutes = ULONG(ulSinceSeconds / MINUS_DIV);
  818. ulSinceSeconds %= MINUS_DIV;
  819. seconds = ULONG(ulSinceSeconds);
  820. //Dbg("SystemElapseTime: %u:%02u:%02u:%02u", days, hours, minutes, seconds);
  821. FILETIME ftCurTime, ftStartTime;
  822. GetSystemTimeAsFileTime(&ftCurTime);
  823. ULARGE_INTEGER uliCurTime;
  824. uliCurTime.HighPart = ftCurTime.dwHighDateTime;
  825. uliCurTime.LowPart = ftCurTime.dwLowDateTime;
  826. uliCurTime.QuadPart -= counterValue.largeValue * 1e7;
  827. ftStartTime.dwHighDateTime = uliCurTime.HighPart;
  828. ftStartTime.dwLowDateTime = uliCurTime.LowPart;
  829. SYSTEMTIME stUTC, stLocal;
  830. FileTimeToSystemTime(&ftStartTime, &stUTC);
  831. SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
  832. sprintf_s(counter.osStartTime, 22, "%d-%02d-%02d %02d:%02d:%02d",
  833. stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  834. //Dbg("OSStartTime: %s", counter.osStartTime);
  835. }
  836. }while(false);
  837. //Status = PdhRemoveCounter(hcMemoryCount);
  838. Status = PdhRemoveCounter(hcHandleCount);
  839. Status = PdhRemoveCounter(hcThreadCount);
  840. Status = PdhRemoveCounter(hcProcessCount);
  841. Status = PdhRemoveCounter(hcElapsedTimeCount);
  842. Cleanup:
  843. if (Query)
  844. {
  845. PdhCloseQuery(Query);
  846. }
  847. if(Status != ERROR_SUCCESS)
  848. {
  849. switch(Status)
  850. {
  851. case PDH_CSTATUS_BAD_COUNTERNAME :
  852. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path could not be parsed or interpreted.");
  853. break;
  854. case PDH_CSTATUS_NO_COUNTER :
  855. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified counter on the computer or in the log file.");
  856. break;
  857. case PDH_CSTATUS_NO_COUNTERNAME :
  858. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path is empty.");
  859. break;
  860. case PDH_CSTATUS_NO_MACHINE :
  861. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The path did not contain a computer name, and function was unable to retrieve local computer name.");
  862. break;
  863. case PDH_CSTATUS_NO_OBJECT :
  864. {
  865. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified object on the computer or in the log file.");
  866. //CSystemStaticInfo sysInfo;
  867. //if(GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo) == Error_Succeed)
  868. //{
  869. // if(!sysInfo.strMachineType.Compare("RVC.PAD", true))
  870. // {
  871. // Dbg("Pad MachineType, abort lodctr operation.");
  872. // break;
  873. // }
  874. //}
  875. if(!m_nLodCtrFlag || m_nLodCtrFlag == 2)
  876. {
  877. LodctrTask* task = new LodctrTask(this);
  878. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  879. }
  880. }
  881. break;
  882. case PDH_FUNCTION_NOT_FOUND :
  883. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to determine the calculation function to use for this counter.");
  884. break;
  885. case PDH_INVALID_ARGUMENT :
  886. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("One or more arguments are not valid.");
  887. break;
  888. case PDH_INVALID_HANDLE :
  889. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The query handle is not valid.");
  890. break;
  891. case PDH_MEMORY_ALLOCATION_FAILURE :
  892. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to allocate memory required to complete the function.");
  893. break;
  894. default :
  895. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Cannot figure the erroCode(0x%08x)(%d) in GetPerformCounter", Status, GetLastError());
  896. break;
  897. }
  898. return Error_Unexpect;
  899. }
  900. return Error_Succeed;
  901. #else
  902. return Error_Succeed;
  903. //oiltestlinux
  904. #endif //RVC_OS_WIN
  905. }
  906. void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  907. {
  908. string serviceCode = pRecvPkg->GetServiceCode();
  909. if (serviceCode.compare("HANDSHK") == 0 || serviceCode.compare("INSTRUC") == 0)
  910. {
  911. PkgRcvProcHandAndInstruc(pRecvPkg);
  912. }
  913. else if (serviceCode.compare("CARDACT") == 0)
  914. {
  915. PkgRcvProcCardActive(pRecvPkg);
  916. }
  917. else
  918. {
  919. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown service code!");
  920. }
  921. };
  922. void HeartBeatConnection::SendHandShake()
  923. {
  924. HandReq req = {0};
  925. //oiltest
  926. //strcpy(req.TerminalNo,"75500000002");
  927. //Dbg("get sysvar");
  928. //oiltest set default value
  929. CSimpleStringA warningLevel("w"),runState("r"),customerHandle("c"),callState("s"),
  930. localMaintain("l"),remoteMaintain("m"),termStage("U");
  931. //m_pEntity->GetFunction()->GetSysVar("WarningLevel",warningLevel);
  932. strncpy(req.TerminalNo,m_TerminalNo.GetData(),m_TerminalNo.GetLength());
  933. m_pEntity->GetFunction()->GetSysVar("RunState",runState);
  934. m_pEntity->GetFunction()->GetSysVar("CustomerHandle",customerHandle);
  935. m_pEntity->GetFunction()->GetSysVar("CallState",callState);
  936. //m_pEntity->GetFunction()->GetSysVar("LocalMaintain",localMaintain);
  937. //m_pEntity->GetFunction()->GetSysVar("RemoteMaintain",remoteMaintain);
  938. m_pEntity->GetFunction()->GetSysVar("TerminalStage",termStage);
  939. //Dbg("ts[%s]",(LPCTSTR)termStage);
  940. //oiltest byteorder
  941. #ifdef RVC_OS_WIN
  942. char tmp[256];
  943. gethostname(tmp, sizeof(tmp));
  944. hostent *ent = gethostbyname(tmp);
  945. unsigned long ip = 0xffffffff;
  946. if (ent) {
  947. for (int i = 0; ent->h_addr_list[i]; ++i) {
  948. if (ent->h_addrtype == AF_INET) {
  949. struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  950. if (in->S_un.S_un_b.s_b1 != 0) {
  951. if (in->S_un.S_un_b.s_b1 == 192)
  952. continue;
  953. ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  954. +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  955. break;
  956. }
  957. }
  958. }
  959. }
  960. req.ip = ip;
  961. #else
  962. //oiltest
  963. req.ip = 0x0;
  964. #endif //RVC_OS_WIN
  965. req.WarningLevel = warningLevel[0];
  966. req.RunState = runState[0];
  967. req.CustomerHandle = customerHandle[0];
  968. req.CallState = callState[0];
  969. req.LocalMaintain = localMaintain[0];
  970. req.RemoteMaintain = remoteMaintain[0];
  971. req.TermStage = termStage[0];
  972. CSmartPointer<IPackage> pkt = CreateNewPackage("HANDSHK");
  973. pkt->AddStruct("FNTSTAT", false, false, (LPBYTE)&req, sizeof(HandReq));
  974. HandErrListReq errListReq;
  975. errListReq.warnLevel = m_pFSM->GetWarnLevel();
  976. errListReq.reserved1 = ' ';
  977. ZeroMemory(errListReq.errList, 512);
  978. pkt->AddStruct("ENTSTAT", false, false, (LPBYTE)&errListReq, sizeof(HandErrListReq));
  979. // [Josephus in 9:38:25 2016/4/23]
  980. TermianlCounter counter;
  981. ErrorCodeEnum erroCode = m_pFSM->GetPerformCounter(counter);
  982. if(erroCode != Error_Succeed)
  983. {
  984. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Terminal Performance Information failed !!!");
  985. }
  986. else
  987. {
  988. //oilyang@20171122 数量太多,暂时去掉
  989. //Dbg("Get Terminal Performance Information suc");
  990. }
  991. //const char* szIP = m_pFSM->GetRealIP();
  992. //memset(tmp, 0, sizeof(tmp));
  993. //strcpy_s(tmp, 256, szIP);
  994. //Dbg("Calling gethostbyname with %s %s", tmp, szIP);
  995. //ent = gethostbyname(tmp);
  996. //ip = 0xffffffff;
  997. //if (ent == NULL)
  998. //{
  999. // DWORD dwError = WSAGetLastError();
  1000. // if (dwError != 0)
  1001. // {
  1002. // if (dwError == WSAHOST_NOT_FOUND)
  1003. // {
  1004. // Dbg("Host not found");
  1005. // } else if (dwError == WSANO_DATA)
  1006. // {
  1007. // Dbg("No data record found");
  1008. // } else
  1009. // {
  1010. // Dbg("Function failed with error: %ld", dwError);
  1011. // }
  1012. // }
  1013. // counter.serverIP = 0xffffffff;
  1014. //}
  1015. //else
  1016. //{
  1017. // //unsigned long ulIP = ((struct in_addr*)ent->h_addr)->S_un.S_addr;
  1018. // for (int i = 0; ent->h_addr_list[i]; ++i)
  1019. // {
  1020. // if (ent->h_addrtype == AF_INET)
  1021. // {
  1022. // struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1023. // if (in->S_un.S_un_b.s_b1 != 0)
  1024. // {
  1025. // if (in->S_un.S_un_b.s_b1 == 192)
  1026. // continue;
  1027. // ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1028. // +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1029. // // test for ip with S_addr [Josephus in 11:15:43 2016/4/22]
  1030. // unsigned long ulIP = in->S_un.S_addr;
  1031. // unsigned long ul2IP = inet_addr(tmp);
  1032. // Dbg("joseph-test2: ip=0x%x, ulIp=0x%x, ul2IP=0x%x", ip, ulIP, ul2IP);
  1033. // break;
  1034. // }
  1035. // }
  1036. // }
  1037. //}
  1038. counter.serverIP = m_pFSM->m_dwServIP;
  1039. //Dbg("dwServIP 0x%x", counter.serverIP);
  1040. #ifdef RVC_OS_WIN
  1041. const char* diskPath = m_pFSM->GetRunDiskPath();
  1042. ULARGE_INTEGER uliFreeBytesAvailable;
  1043. if(GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  1044. {
  1045. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  1046. //Dbg("FreeDisk:%.2fMB, %u", uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0, counter.freeDisk);
  1047. }
  1048. else
  1049. {
  1050. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  1051. }
  1052. #else
  1053. //oiltestlinux
  1054. counter.freeDisk = 0;
  1055. #endif //RVC_OS_WIN
  1056. pkt->AddStruct("CNTSTAT", false, false, (LPBYTE)&counter, sizeof(TermianlCounter));
  1057. SendPackage(pkt);
  1058. //delete pkt;
  1059. }
  1060. void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned long errCode,const char *termNo, const char *account, const int accSize, const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode)
  1061. {
  1062. CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d,errCSCode:%d",
  1063. type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize, errCSCode);
  1064. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
  1065. //发起跨机调用包
  1066. if (type == 0)
  1067. {
  1068. CardActiveReq req = { 0 };
  1069. CSystemStaticInfo sysSInfo;
  1070. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1071. req.type = 0;
  1072. req.slot = slot;
  1073. #ifdef RVC_OS_WIN
  1074. strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
  1075. strncpy_s(req.Account, account, accSize);
  1076. strncpy_s(req.TerminalNo, termNo, strlen(termNo));
  1077. strncpy_s(req.Param2, data, dataSize);
  1078. #else
  1079. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1080. strcpy_s(req.Account, accSize, account);
  1081. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1082. strcpy_s(req.Param2, dataSize, data);
  1083. #endif //RVC_OS_WIN
  1084. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1085. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1086. SendPackage(pkt);
  1087. }
  1088. //发送跨机调用返回包
  1089. else if (type == 1)
  1090. {
  1091. CardActiveReq req = { 0 };
  1092. CSystemStaticInfo sysSInfo;
  1093. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1094. req.type = 1;
  1095. req.ErrCode = errCode;
  1096. req.findCard = findCard;
  1097. req.cardPos = cardPos;
  1098. req.reserved1 = errCSCode;
  1099. #ifdef RVC_OS_WIN
  1100. strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
  1101. strncpy_s(req.Account, account, accSize);
  1102. strncpy_s(req.TerminalNo, termNo, strlen(termNo));
  1103. strncpy_s(req.Param2, data, dataSize);
  1104. #else
  1105. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1106. strcpy_s(req.Account, accSize, account);
  1107. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1108. strcpy_s(req.Param2, dataSize, data);
  1109. #endif //RVC_OS_WIN
  1110. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1111. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1112. SendPackage(pkt);
  1113. }
  1114. }
  1115. void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
  1116. {
  1117. int nLen = pRecvPkg->GetStructLen("FNTHAND");
  1118. if (nLen > 0) {
  1119. Dbg("nLen %d", nLen);
  1120. BYTE *pBuf = new BYTE[nLen+1];
  1121. memset(pBuf, 0, nLen+1);
  1122. int nArrayNum = 0;
  1123. if (pRecvPkg->GetStructData("FNTHAND", pBuf, &nLen, &nArrayNum)) {
  1124. Dbg("%s,%d,%d", pBuf, nLen, nArrayNum);
  1125. HandAns* pAns = (HandAns*)pBuf;
  1126. Dbg("hand recv %d events", nArrayNum);
  1127. for (int i = 0; i < nArrayNum; ++i)
  1128. {
  1129. bool bKnownEvent = true;
  1130. DWORD userEvtCode = 0;
  1131. unsigned long ulTmp = (pAns + i)->EventCode;
  1132. Dbg("event %d,param1 %s", ulTmp, (pAns + i)->param1);
  1133. switch (ulTmp)
  1134. {
  1135. case INC_GLOBAL_SETTING_SYNC:
  1136. userEvtCode = LOG_EVT_INC_GLOBAL_SETTING_SYNC;
  1137. break;
  1138. case INC_COMM_RECONNECT:
  1139. userEvtCode = LOG_EVT_INC_COMM_RECONNECT;
  1140. break;
  1141. case INC_START_REMOTE_CONTROL:
  1142. userEvtCode = LOG_EVT_INC_START_REMOTE_CONTROL;
  1143. break;
  1144. case INC_UPDATE_CHECK:
  1145. userEvtCode = LOG_EVT_INC_UPDATE_CHECK;
  1146. break;
  1147. case INC_RECOVER_SERVICE:
  1148. userEvtCode = LOG_EVT_INC_RECOVER_SERVICE;
  1149. break;
  1150. case INC_PAUSE_SERVICE:
  1151. userEvtCode = LOG_EVT_INC_PAUSE_SERVICE;
  1152. break;
  1153. case INC_AREA_SERVICE_SWITCH:
  1154. userEvtCode = LOG_EVT_INC_AREA_SERVICE_SWITCH;
  1155. break;
  1156. case INC_VERSION_ROLLBACK:
  1157. userEvtCode = LOG_EVT_INC_VERSION_ROLLBACK;
  1158. break;
  1159. case INC_BRIDGE:
  1160. userEvtCode = LOG_EVT_INC_BRIDGE;
  1161. break;
  1162. case INC_VEDIO_CONNECTING:
  1163. userEvtCode = LOG_EVT_INC_VEDIO_CONNECTING;
  1164. break;
  1165. case INC_TRADE_MANAGER_NORMAL:
  1166. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_NORMAL;
  1167. break;
  1168. case INC_TRADE_MANAGER_ON:
  1169. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_ON;
  1170. break;
  1171. case INC_TRADE_MANAGER_OFF:
  1172. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_OFF;
  1173. break;
  1174. case INC_DEVICE_LOCK_ON:
  1175. userEvtCode = LOG_EVT_INC_DEVICE_LOCK_ON;
  1176. break;
  1177. case INC_DEVICE_UNLOCK:
  1178. userEvtCode = LOG_EVT_INC_DEVICE_UNLOCK;
  1179. break;
  1180. case INC_DEVICE_KICK_OFF:
  1181. userEvtCode = LOG_EVT_INC_DEVICE_KICK_OFF;
  1182. break;
  1183. default:
  1184. bKnownEvent = false;
  1185. Dbg("unknown ins %d", ulTmp);
  1186. break;
  1187. }
  1188. if (bKnownEvent)
  1189. {
  1190. LogEvent(Severity_Middle, userEvtCode, (pAns + i)->param1);
  1191. }
  1192. }
  1193. }
  1194. else {
  1195. Dbg("invalid handshakeans packet!");
  1196. //OnDisconnect();
  1197. }
  1198. delete pBuf;
  1199. }
  1200. }
  1201. void CHeartBeatFSM::ProcessCardActive(CardActiveReq* req)
  1202. {
  1203. ProcessPreOnlineTask* ppTask = new ProcessPreOnlineTask(this, req);
  1204. GetEntityBase()->GetFunction()->PostThreadPoolTask(ppTask);
  1205. }
  1206. void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
  1207. {
  1208. if (req->type == 0)
  1209. LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2);
  1210. else if (req->type == 1)
  1211. ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos, req->reserved1);
  1212. #ifdef RVC_OS_WIN
  1213. delete req;
  1214. #endif
  1215. }
  1216. void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
  1217. {
  1218. LOG_FUNCTION();
  1219. int nLen = pRecvPkg->GetStructLen("INSREQX");
  1220. if (nLen > 0) {
  1221. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen %d", nLen);
  1222. BYTE *pBuf = new BYTE[nLen+1];
  1223. memset(pBuf, 0, nLen+1);
  1224. int nArrayNum = 0;
  1225. if (pRecvPkg->GetStructData("INSREQX", pBuf, &nLen, &nArrayNum)) {
  1226. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d,%d", pBuf, nLen, nArrayNum);
  1227. CardActiveReq* pAns = (CardActiveReq*)pBuf;
  1228. if (nArrayNum > 0)
  1229. {
  1230. CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, errorCode:%d,userErrCode:%d, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
  1231. pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, pAns->ErrCode, pAns->reserved1, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
  1232. if (pAns->ErrCode == Error_Succeed)
  1233. LogWarn(Severity_Low, Error_Succeed, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1234. else
  1235. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1236. m_pFSM->ProcessCardActive(pAns);
  1237. }
  1238. }
  1239. else {
  1240. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid insreqx packet!");
  1241. }
  1242. #ifdef RVC_OS_WIN
  1243. //delete pBuf;
  1244. #else
  1245. delete pBuf;
  1246. #endif
  1247. }
  1248. }
  1249. ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore)
  1250. {
  1251. //卡库用新地址
  1252. if(isCardStore)
  1253. {
  1254. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"ServerNew",m_servStr);
  1255. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ServerNew=%s", m_servStr);
  1256. if (m_servStr.IsNullOrEmpty()) {
  1257. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的ServerNew配置,请检查集中配置");
  1258. return Error_Param;
  1259. }
  1260. if (!m_servStr.IsNullOrEmpty())
  1261. {
  1262. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1263. if (aaServ.GetCount() >= 2)
  1264. {
  1265. m_servIP = aaServ[0];
  1266. m_port = atoi(aaServ[1]);
  1267. }
  1268. else
  1269. {
  1270. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1271. return Error_Param;
  1272. }
  1273. }
  1274. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d",(LPCTSTR)m_servIP,m_port);
  1275. }
  1276. else
  1277. {
  1278. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server",m_servStr);
  1279. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server_Backup",m_servStrB);
  1280. if (!m_servStr.IsNullOrEmpty())
  1281. {
  1282. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1283. if (aaServ.GetCount() >= 2)
  1284. {
  1285. m_servIP = aaServ[0];
  1286. m_port = atoi(aaServ[1]);
  1287. }
  1288. else
  1289. {
  1290. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1291. return Error_Param;
  1292. }
  1293. }
  1294. if (!m_servStrB.IsNullOrEmpty())
  1295. {
  1296. CAutoArray<CSimpleStringA> aaServB = m_servStrB.Split(' ');
  1297. if (aaServB.GetCount() >= 2)
  1298. {
  1299. m_servIPB = aaServB[0];
  1300. m_portB = atoi(aaServB[1]);
  1301. }
  1302. else
  1303. {
  1304. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no backup(%s).",(LPCSTR)m_servStrB);
  1305. m_servIPB = m_servIP;
  1306. m_portB = m_port;
  1307. }
  1308. }
  1309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d;%s,%d",(LPCTSTR)m_servIP,m_port,(LPCTSTR)m_servIPB,m_portB);
  1310. }
  1311. return Error_Succeed;
  1312. }
  1313. bool CHeartBeatFSM::CheckCRASessionOrToConnect()
  1314. {
  1315. if (m_pCRAClient != NULL && !m_pCRAClient->QuerySessionClosed())
  1316. return true;
  1317. else
  1318. {
  1319. ErrorCodeEnum eErr = Error_Unexpect;
  1320. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1321. if (m_pCRAClient != NULL) {
  1322. eErr = m_pCRAClient->Connect();
  1323. if (eErr != Error_Succeed)
  1324. {
  1325. CSimpleStringA errMsg = CSimpleStringA::Format("connect to CardReadAdapter failed:%d(0x%x)", eErr, eErr);
  1326. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
  1327. return false;
  1328. }
  1329. else
  1330. {
  1331. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to CardReadAdapter suc.");
  1332. return true;
  1333. }
  1334. }
  1335. else
  1336. return false;
  1337. }
  1338. }