HeartBeatFSM.cpp 52 KB

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