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. PROCESS_LINK_CONTEXT("LR0402503HandShake")
  422. if (!client->Post(qTempReq, qTempRet, &nextLink)) {
  423. 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());
  424. return false;//通讯失败
  425. }
  426. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("qTempRet=%s", qTempRet.m_retStr.c_str());
  427. Json::Reader reader;
  428. Json::Value rootRet;
  429. if (!reader.parse(qTempRet.m_retStr, rootRet, false))
  430. {
  431. 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());
  432. return false;//服务异常
  433. }
  434. bool isSucc = rootRet["success"].asBool();
  435. if (isSucc) {
  436. if (rootRet.isMember("data")) {
  437. if (rootRet["data"].asBool()) {
  438. isHeartBeatOk = true;//心跳正常
  439. return true;//服务正常
  440. }
  441. else {
  442. isHeartBeatOk = false;//心跳不正常
  443. return true;//服务正常
  444. }
  445. }
  446. else {
  447. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp [success] is true,param [data] is lost");
  448. return false;//服务异常
  449. }
  450. }
  451. else {
  452. 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());
  453. return false;//服务异常
  454. }
  455. }
  456. string CHeartBeatFSM::HandShakeJsonStr() {
  457. //LOG_FUNCTION();
  458. string jsonStr = "";
  459. Json::Value root;
  460. Json::FastWriter fw;//写入对象
  461. Json::Value obj1, obj2, obj3;
  462. //写入shakehandvo对象
  463. CSystemStaticInfo sysSInfo;
  464. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  465. CSimpleStringA warningLevel("w"), runState("O"), customerHandle("c"), callState("s"),
  466. localMaintain("l"), remoteMaintain("m"), termStage("U");
  467. //m_pEntity->GetFunction()->GetSysVar("RunState", runState);
  468. m_pEntity->GetFunction()->GetSysVar("CustomerHandle", customerHandle);
  469. m_pEntity->GetFunction()->GetSysVar("CallState", callState);
  470. m_pEntity->GetFunction()->GetSysVar("TerminalStage", termStage);
  471. #ifdef RVC_OS_WIN
  472. char tmp[256];
  473. gethostname(tmp, sizeof(tmp));
  474. hostent* ent = gethostbyname(tmp);
  475. unsigned long ip = 0xffffffff;
  476. if (ent) {
  477. for (int i = 0; ent->h_addr_list[i]; ++i) {
  478. if (ent->h_addrtype == AF_INET) {
  479. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  480. if (in->S_un.S_un_b.s_b1 != 0) {
  481. if (in->S_un.S_un_b.s_b1 == 192)
  482. continue;
  483. ip = (in->S_un.S_un_b.s_b1 << 24) + (in->S_un.S_un_b.s_b2 << 16)
  484. + (in->S_un.S_un_b.s_b3 << 8) + in->S_un.S_un_b.s_b4;
  485. break;
  486. }
  487. }
  488. }
  489. }
  490. #endif //RVC_OS_WIN
  491. obj1["terminalNo"] = sysSInfo.strTerminalID.GetData();
  492. #ifdef RVC_OS_WIN
  493. obj1["ip"] = (unsigned int)ip;
  494. #else
  495. obj1["ip"] = 0;//默认不获取
  496. #endif
  497. obj1["warningLevel"] = warningLevel.GetData();
  498. obj1["runState"] = runState.GetData();
  499. obj1["customerHandle"] = customerHandle.GetData();
  500. obj1["callState"] = callState.GetData();
  501. obj1["localMaintain"] = localMaintain.GetData();
  502. obj1["remoteMaintain"] = remoteMaintain.GetData();
  503. obj1["termStage"] = termStage.GetData();
  504. obj1["preTermStage"] = "";
  505. obj1["netState"] = "";
  506. obj1["preNetState"] = "";
  507. root["shakeHandVO"]=Json::Value(obj1);
  508. //写入shakeHandSystemInfo对象
  509. TermianlCounter counter;
  510. ErrorCodeEnum erroCode = GetPerformCounter(counter);
  511. if (erroCode != Error_Succeed)
  512. {
  513. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Terminal Performance Information failed !!!");
  514. }
  515. //Dbg("dwServIP 0x%x", counter.serverIP);
  516. #ifdef RVC_OS_WIN
  517. const char* diskPath = GetRunDiskPath();
  518. ULARGE_INTEGER uliFreeBytesAvailable;
  519. if (GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  520. {
  521. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  522. }
  523. else
  524. {
  525. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  526. }
  527. #else
  528. //oiltestlinux
  529. counter.freeDisk = 0;
  530. #endif //RVC_OS_WIN
  531. obj2["serverIP"] = (unsigned int)m_dwServIP;
  532. obj2["totalMem"] = (int)counter.totalMem;
  533. obj2["freeMem"] = (int)counter.freeMem;
  534. obj2["procNum"] = (int)counter.procNum;
  535. obj2["threadNum"] = (int)counter.threadNum;;
  536. obj2["handleNum"] = (unsigned int)counter.handleNum;;
  537. obj2["freeDisk"] = (unsigned int)counter.freeDisk;
  538. obj2["osStartTime"] = CSimpleStringA::Format("%s",counter.osStartTime).GetData();
  539. obj2["cpuLoad"] = (int)counter.cpuLoad;
  540. root["shakeHandSystemInfo"]=Json::Value(obj2);
  541. //写入shakeHandErrorVO对象
  542. HandErrListReq errListReq;
  543. errListReq.warnLevel = GetWarnLevel();
  544. errListReq.reserved1 = ' ';
  545. ZeroMemory(errListReq.errList, 512);
  546. obj3["warnLevel"] = errListReq.warnLevel;
  547. string tmp_string(1, errListReq.reserved1);
  548. obj3["reserved1"] = tmp_string.c_str();
  549. obj3["errList"] = "";
  550. root["shakeHandErrorVO"]=Json::Value(obj3);
  551. jsonStr = fw.write(root);
  552. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeJsonStr")("HandShakeJsonStr=%s", jsonStr.c_str());
  553. return jsonStr;
  554. }
  555. void CHeartBeatFSM::HttpsLogCallBack(const char* logtxt)
  556. {
  557. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("http dbg: %s", logtxt);
  558. }
  559. int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
  560. {
  561. LOG_FUNCTION();
  562. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  563. {
  564. 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);
  565. ctx->Answer(Error_Succeed);
  566. }
  567. else
  568. {
  569. if (ctx->Req.account.GetLength() > 6)
  570. 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));
  571. else
  572. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("acc:%s, size:%d", (const char*)ctx->Req.account,ctx->Req.account.GetLength());
  573. ctx->Answer(Error_Unexpect);
  574. }
  575. return 0;
  576. }
  577. void CHeartBeatFSM::DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx)
  578. {
  579. switch(ctx->Req.type)
  580. {
  581. case INC_GLOBAL_SETTING_SYNC:
  582. break;
  583. case INC_COMM_RECONNECT:
  584. break;
  585. case INC_START_REMOTE_CONTROL:
  586. break;
  587. case INC_UPDATE_CHECK:
  588. break;
  589. case INC_RECOVER_SERVICE:
  590. break;
  591. case INC_PAUSE_SERVICE:
  592. break;
  593. case INC_AREA_SERVICE_SWITCH:
  594. break;
  595. default:
  596. break;
  597. }
  598. }
  599. ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
  600. {
  601. m_warnLevel = warmLevel;
  602. m_entErrorList = strList;
  603. return Error_Succeed;
  604. }
  605. void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  606. {
  607. //for simple
  608. pTransactionContext->SendAnswer(m_testResult);
  609. }
  610. void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type)
  611. {
  612. LOG_FUNCTION();
  613. DWORD dwUserCode = 0;
  614. if (!CheckCRASessionOrToConnect())
  615. {
  616. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("to call local preonline, but can't connect to CardReadAdapter.");
  617. return;
  618. }
  619. CardReadAdapterService_PreOnline_Req req;
  620. CardReadAdapterService_PreOnline_Ans ans;
  621. CSimpleStringA errMsgData("");
  622. req.businessData = data;
  623. char buf[16];
  624. ZeroMemory(buf, sizeof(buf));
  625. #ifdef RVC_OS_WIN
  626. itoa(slot, buf, 10);
  627. #else
  628. _itoa(slot, buf, 10);
  629. #endif
  630. CSimpleStringA kaku("kaku#");
  631. req.module = 1;
  632. req.reserved2.Init(2);
  633. req.reserved2[0] = kaku + CSimpleStringA(buf);
  634. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local:%s", (const char*)req.reserved2[0]);
  635. req.reserved2[1] = account;
  636. CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
  637. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
  638. ErrorCodeEnum eErr = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->PreOnline(req, ans, 65000, dwUserCode);
  639. if (eErr != Error_Succeed){
  640. errMsgData = CSimpleStringA::Format("local preonline failed:%d(0x%x),dwUserCode:%d(0x%x)", eErr, eErr, dwUserCode, dwUserCode);
  641. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, errMsgData.GetData());
  642. if (eErr == Error_Duplication)
  643. {
  644. ReceivePreOnlineBack(Error_Duplication, "", 0, 0);
  645. return;
  646. }
  647. else if (eErr == Error_InvalidState)
  648. {
  649. errMsgData = "CardIssuer in use";
  650. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  651. {
  652. if (type == 0) {
  653. m_pHandShakeConn->SendCardActive(1, slot, Error_Duplication, (const char*)termNo, (const char*)account,
  654. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  655. }
  656. else {
  657. m_pHandShakeConn->SendCardActive(11, slot, Error_Duplication, (const char*)termNo, (const char*)account,
  658. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  659. }
  660. }
  661. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use, "CardIssuer in use");
  662. return;
  663. }
  664. else if (eErr == Error_DevNotAvailable)
  665. {
  666. errMsgData = "CardIssuer not available(open failed)";
  667. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  668. {
  669. if (type == 0) {
  670. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  671. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  672. }
  673. else {
  674. m_pHandShakeConn->SendCardActive(11, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  675. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  676. }
  677. }
  678. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_Open_Failed, "CardIssuer not available(open failed)");
  679. return;
  680. }
  681. else if (eErr == Error_TimeOut)
  682. {
  683. errMsgData = "CardIssuer process cost too long";
  684. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  685. {
  686. if (type == 0) {
  687. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  688. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  689. }
  690. else {
  691. m_pHandShakeConn->SendCardActive(11, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  692. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  693. }
  694. }
  695. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA5301")("跨机时卡库处理耗时过长");
  696. LogError(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_ProcessCostTooLong, "CardIssuer process cost too long");
  697. return;
  698. }
  699. }
  700. Sleep(500);
  701. CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
  702. CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
  703. ErrorCodeEnum eErrX = Error_Unexpect;
  704. eErrX = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->QueryCardInfoOnStore(reqX, ansX,12000);
  705. if (eErrX != Error_Succeed)
  706. {
  707. errMsgData = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d",eErrX);
  708. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_QueryCardInfoOnStore_Falied, errMsgData.GetData());
  709. ansX.findCard = ansX.cardPos = 9999;
  710. }
  711. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  712. {
  713. if (type == 0) {
  714. m_pHandShakeConn->SendCardActive(1, slot, eErr, (const char*)termNo, (const char*)account,
  715. account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ansX.findCard, ansX.cardPos, dwUserCode);
  716. }
  717. else {
  718. m_pHandShakeConn->SendCardActive(11, slot, eErr, (const char*)termNo, (const char*)account,
  719. account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ansX.findCard, ansX.cardPos, dwUserCode);
  720. }
  721. }
  722. }
  723. void CHeartBeatFSM::LocalPreOnlineJS(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data, int type)
  724. {
  725. LOG_FUNCTION();
  726. //modify by lwt 20240801 add invoke cardissuerStore interface
  727. DWORD dwUserCode = 0;
  728. if (!CheckCISSessionOrToConnect())
  729. {
  730. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("to call local PreOnlineCrossJS, but can't connect to CardIssuerStore.");
  731. return;
  732. }
  733. CardIssuerStore::CardIssuerStoreService_PreOnlineCrossJS_Req req;
  734. CardIssuerStore::CardIssuerStoreService_PreOnlineCrossJS_Ans ans;
  735. CSimpleStringA errMsgData("");
  736. req.businessData = data;
  737. req.slot = slot;
  738. req.account = account;
  739. CSimpleStringA inParam = CSimpleStringA::Format("PreOnlineCrossJS, CardStore heartbeat invoke PreOnline, slot:%d, accountLen:%d", req.slot, req.account.GetLength());
  740. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
  741. ErrorCodeEnum eErr = (*m_pCISClient)(EntityResource::getLink().upgradeLink())->PreOnlineCrossJS(req, ans, 65000, dwUserCode);
  742. //特殊报错
  743. if (eErr != Error_Succeed) {
  744. errMsgData = CSimpleStringA::Format("local PreOnlineCrossJS failed:%d(0x%x),dwUserCode:%d(0x%x)", eErr, eErr, dwUserCode, dwUserCode);
  745. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, errMsgData.GetData());
  746. if (eErr == Error_InvalidState)
  747. {
  748. errMsgData = "CardIssuer in use";
  749. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  750. {
  751. if (type == 0) {
  752. m_pHandShakeConn->SendCardActive(1, slot, Error_Duplication, (const char*)termNo, (const char*)account,
  753. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  754. }
  755. else {
  756. m_pHandShakeConn->SendCardActive(11, slot, Error_Duplication, (const char*)termNo, (const char*)account,
  757. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  758. }
  759. }
  760. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardStore_CardIssuer_In_Use, "CardIssuer in use");
  761. return;
  762. }
  763. else if (eErr == Error_DevNotAvailable)
  764. {
  765. errMsgData = "CardIssuer not available(open failed)";
  766. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  767. {
  768. if (type == 0) {
  769. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  770. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  771. }
  772. else {
  773. m_pHandShakeConn->SendCardActive(11, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  774. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  775. }
  776. }
  777. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_Open_Failed, "CardIssuer not available(open failed)");
  778. return;
  779. }
  780. else if (eErr == Error_TimeOut)
  781. {
  782. errMsgData = "CardIssuer process cost too long";
  783. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  784. {
  785. if (type == 0) {
  786. m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  787. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  788. }
  789. else {
  790. m_pHandShakeConn->SendCardActive(11, slot, Error_Hardware, (const char*)termNo, (const char*)account,
  791. account.GetLength(), errMsgData.GetData(), errMsgData.GetLength() + 1, 9999, 9999, dwUserCode);
  792. }
  793. }
  794. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode("QLR040220327").setResultCode("RTA5301")("跨机时卡库处理耗时过长");
  795. LogError(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_ProcessCostTooLong, "CardIssuer process cost too long");
  796. return;
  797. }
  798. }
  799. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  800. {
  801. if (type == 0) {
  802. m_pHandShakeConn->SendCardActive(1, slot, eErr, (const char*)termNo, (const char*)account,
  803. account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ans.findCard, ans.cardPos, dwUserCode);
  804. }
  805. else {
  806. m_pHandShakeConn->SendCardActive(11, slot, eErr, (const char*)termNo, (const char*)account,
  807. account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ans.findCard, ans.cardPos, dwUserCode);
  808. }
  809. }
  810. }
  811. void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode)
  812. {
  813. if (!CheckCRASessionOrToConnect())
  814. {
  815. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("while receive preonline result, but can't connect to CardReadAdapter.");
  816. return;
  817. }
  818. CardReadAdapterService_NotifyPreonline_Req req;
  819. CardReadAdapterService_NotifyPreonline_Ans ans;
  820. req.data = data;
  821. req.findCard = findCard;
  822. req.cardPos = cardPos;
  823. req.errCode = errCode;
  824. req.reserved1.Init(1);
  825. req.reserved1[0] = userErrCode;
  826. ErrorCodeEnum eErr = (*m_pCRAClient)(EntityResource::getLink().upgradeLink())->NotifyPreonline(req, ans, 10000);
  827. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NotifyPreonline ret:%d",eErr);
  828. }
  829. ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
  830. {
  831. memset(&counter, 0, sizeof(TermianlCounter));
  832. #ifdef RVC_OS_WIN
  833. //oilyang@20171122 数量太多,暂时去掉
  834. //LOG_FUNCTION();
  835. PDH_STATUS Status;
  836. HQUERY Query = NULL;
  837. //HCOUNTER hcMemoryCount;
  838. HCOUNTER hcHandleCount, hcProcessCount, hcThreadCount;
  839. HCOUNTER hcElapsedTimeCount, hcProcessTimeCount;
  840. DWORD CounterType;
  841. MEMORYSTATUSEX statex;
  842. Status = PdhOpenQuery(NULL, NULL, &Query);
  843. if (Status != ERROR_SUCCESS)
  844. {
  845. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhOpenQuery failed with status 0x%x.", Status);
  846. goto Cleanup;
  847. }
  848. Status = PdhAddCounter(Query, ProcessTimeQuery, NULL, &hcProcessTimeCount);
  849. if (Status != ERROR_SUCCESS)
  850. {
  851. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessTimeQuery failed with status 0x%x.", Status);
  852. goto Cleanup;
  853. }
  854. Status = PdhAddCounter(Query, HandleNumQuery, NULL, &hcHandleCount);
  855. if (Status != ERROR_SUCCESS)
  856. {
  857. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for HandleNumQuery failed with status 0x%x.", Status);
  858. goto Cleanup;
  859. }
  860. Status = PdhAddCounter(Query, ThreadNumQuery, NULL, &hcThreadCount);
  861. if (Status != ERROR_SUCCESS)
  862. {
  863. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ThreadNumQuery failed with status 0x%x.", Status);
  864. goto Cleanup;
  865. }
  866. Status = PdhAddCounter(Query, ProcessNumQuery, NULL, &hcProcessCount);
  867. if (Status != ERROR_SUCCESS)
  868. {
  869. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessNumQuery failed with status 0x%x.", Status);
  870. goto Cleanup;
  871. }
  872. Status = PdhAddCounter(Query, SystemElapsedQuery, NULL, &hcElapsedTimeCount);
  873. if (Status != ERROR_SUCCESS)
  874. {
  875. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for SystemElapsedQuery failed with status 0x%x.", Status);
  876. goto Cleanup;
  877. }
  878. Status = PdhCollectQueryData(Query);
  879. if (Status != ERROR_SUCCESS)
  880. {
  881. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with 0x%x.\n", Status);
  882. goto Cleanup;
  883. }
  884. do
  885. {
  886. Sleep(COUNTER_INTERVAL_MS);
  887. Status = PdhCollectQueryData(Query);
  888. if (Status != ERROR_SUCCESS)
  889. {
  890. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with status 0x%x.", Status);
  891. break;
  892. }
  893. memset(&statex, 0, sizeof(MEMORYSTATUSEX));
  894. statex.dwLength = sizeof(statex);
  895. if (GlobalMemoryStatusEx(&statex))
  896. {
  897. //Dbg("CPUUseRate:%u%%", statex.dwMemoryLoad);
  898. counter.totalMem = (unsigned short)(statex.ullTotalPhys / DIV);
  899. //Dbg("TotalPhysMemory:%I64dMB %d", statex.ullTotalPhys / DIV, counter.totalMem);
  900. counter.freeMem = (unsigned short)(statex.ullAvailPhys / DIV);
  901. //Dbg("AvailableMemory:%I64dMB %d", statex.ullAvailPhys / DIV, counter.freeMem);
  902. }
  903. PDH_FMT_COUNTERVALUE counterValue;
  904. //Status = PdhGetFormattedCounterValue(hcMemoryCount, PDH_FMT_DOUBLE, NULL, &counterValue);
  905. //if (Status == ERROR_SUCCESS)
  906. //{
  907. // Dbg("AvailableMemory:%.20gMB\n", counterValue.doubleValue);
  908. //}
  909. Status = PdhGetFormattedCounterValue(hcProcessTimeCount, PDH_FMT_DOUBLE, &CounterType, &counterValue);
  910. if (Status == ERROR_SUCCESS)
  911. {
  912. counter.cpuLoad = (unsigned short)(counterValue.doubleValue + 0.5);
  913. //Dbg("CPURate:%d %u", (long)counterValue.doubleValue, counter.cpuLoad);
  914. }
  915. Status = PdhGetFormattedCounterValue(hcHandleCount, PDH_FMT_LONG, NULL, &counterValue);
  916. if (Status == ERROR_SUCCESS)
  917. {
  918. counter.handleNum = (unsigned int)(counterValue.longValue);
  919. //Dbg("HandlesNum:%ld %u", counterValue.longValue, counter.handleNum);
  920. }
  921. Status = PdhGetFormattedCounterValue(hcThreadCount, PDH_FMT_LONG, NULL, &counterValue);
  922. if (Status == ERROR_SUCCESS)
  923. {
  924. counter.threadNum = (unsigned short)(counterValue.longValue);
  925. //Dbg("ThreadsNum:%ld %u", counterValue.longValue, counter.threadNum);
  926. }
  927. Status = PdhGetFormattedCounterValue(hcProcessCount, PDH_FMT_LONG, NULL, &counterValue);
  928. if (Status == ERROR_SUCCESS)
  929. {
  930. counter.procNum = (unsigned short)(counterValue.longValue);
  931. //Dbg("ProcessesNum:%ld %u", counterValue.longValue, counter.procNum);
  932. }
  933. Status = PdhGetFormattedCounterValue(hcElapsedTimeCount, PDH_FMT_LARGE, NULL, &counterValue);
  934. if (Status == ERROR_SUCCESS)
  935. {
  936. ULONGLONG ulSinceSeconds = counterValue.largeValue;
  937. ULONG days = 0, hours = 0, minutes = 0, seconds = 0;
  938. days = ULONG(ulSinceSeconds / DAY_DIV);
  939. ulSinceSeconds %= DAY_DIV;
  940. hours = ULONG(ulSinceSeconds / HOURS_DIV);
  941. ulSinceSeconds %= HOURS_DIV;
  942. minutes = ULONG(ulSinceSeconds / MINUS_DIV);
  943. ulSinceSeconds %= MINUS_DIV;
  944. seconds = ULONG(ulSinceSeconds);
  945. //Dbg("SystemElapseTime: %u:%02u:%02u:%02u", days, hours, minutes, seconds);
  946. FILETIME ftCurTime, ftStartTime;
  947. GetSystemTimeAsFileTime(&ftCurTime);
  948. ULARGE_INTEGER uliCurTime;
  949. uliCurTime.HighPart = ftCurTime.dwHighDateTime;
  950. uliCurTime.LowPart = ftCurTime.dwLowDateTime;
  951. uliCurTime.QuadPart -= counterValue.largeValue * 1e7;
  952. ftStartTime.dwHighDateTime = uliCurTime.HighPart;
  953. ftStartTime.dwLowDateTime = uliCurTime.LowPart;
  954. SYSTEMTIME stUTC, stLocal;
  955. FileTimeToSystemTime(&ftStartTime, &stUTC);
  956. SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
  957. sprintf_s(counter.osStartTime, 22, "%d-%02d-%02d %02d:%02d:%02d",
  958. stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  959. //Dbg("OSStartTime: %s", counter.osStartTime);
  960. }
  961. }while(false);
  962. //Status = PdhRemoveCounter(hcMemoryCount);
  963. Status = PdhRemoveCounter(hcHandleCount);
  964. Status = PdhRemoveCounter(hcThreadCount);
  965. Status = PdhRemoveCounter(hcProcessCount);
  966. Status = PdhRemoveCounter(hcElapsedTimeCount);
  967. Cleanup:
  968. if (Query)
  969. {
  970. PdhCloseQuery(Query);
  971. }
  972. if(Status != ERROR_SUCCESS)
  973. {
  974. switch(Status)
  975. {
  976. case PDH_CSTATUS_BAD_COUNTERNAME :
  977. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path could not be parsed or interpreted.");
  978. break;
  979. case PDH_CSTATUS_NO_COUNTER :
  980. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified counter on the computer or in the log file.");
  981. break;
  982. case PDH_CSTATUS_NO_COUNTERNAME :
  983. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path is empty.");
  984. break;
  985. case PDH_CSTATUS_NO_MACHINE :
  986. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The path did not contain a computer name, and function was unable to retrieve local computer name.");
  987. break;
  988. case PDH_CSTATUS_NO_OBJECT :
  989. {
  990. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified object on the computer or in the log file.");
  991. if (!m_nLodCtrFlag || m_nLodCtrFlag == 2)
  992. {
  993. LodctrTask* task = new LodctrTask(this);
  994. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  995. }
  996. }
  997. break;
  998. case PDH_FUNCTION_NOT_FOUND :
  999. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to determine the calculation function to use for this counter.");
  1000. break;
  1001. case PDH_INVALID_ARGUMENT :
  1002. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("One or more arguments are not valid.");
  1003. break;
  1004. case PDH_INVALID_HANDLE :
  1005. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The query handle is not valid.");
  1006. break;
  1007. case PDH_MEMORY_ALLOCATION_FAILURE :
  1008. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to allocate memory required to complete the function.");
  1009. break;
  1010. default :
  1011. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Cannot figure the erroCode(0x%08x)(%d) in GetPerformCounter", Status, GetLastError());
  1012. break;
  1013. }
  1014. return Error_Unexpect;
  1015. }
  1016. return Error_Succeed;
  1017. #else
  1018. return Error_Succeed;
  1019. //oiltestlinux
  1020. #endif //RVC_OS_WIN
  1021. }
  1022. void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  1023. {
  1024. string serviceCode = pRecvPkg->GetServiceCode();
  1025. if (serviceCode.compare("HANDSHK") == 0 || serviceCode.compare("INSTRUC") == 0)
  1026. {
  1027. PkgRcvProcHandAndInstruc(pRecvPkg);
  1028. }
  1029. else if (serviceCode.compare("CARDACT") == 0)
  1030. {
  1031. PkgRcvProcCardActive(pRecvPkg);
  1032. }
  1033. else
  1034. {
  1035. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown service code!");
  1036. }
  1037. };
  1038. void HeartBeatConnection::SendHandShake()
  1039. {
  1040. HandReq req = {0};
  1041. //oiltest
  1042. //strcpy(req.TerminalNo,"75500000002");
  1043. //Dbg("get sysvar");
  1044. //oiltest set default value
  1045. CSimpleStringA warningLevel("w"),runState("O"),customerHandle("c"),callState("s"),
  1046. localMaintain("l"),remoteMaintain("m"),termStage("U");
  1047. //m_pEntity->GetFunction()->GetSysVar("WarningLevel",warningLevel);
  1048. strncpy(req.TerminalNo,m_TerminalNo.GetData(),m_TerminalNo.GetLength());
  1049. //m_pEntity->GetFunction()->GetSysVar("RunState",runState);
  1050. m_pEntity->GetFunction()->GetSysVar("CustomerHandle",customerHandle);
  1051. m_pEntity->GetFunction()->GetSysVar("CallState",callState);
  1052. //m_pEntity->GetFunction()->GetSysVar("LocalMaintain",localMaintain);
  1053. //m_pEntity->GetFunction()->GetSysVar("RemoteMaintain",remoteMaintain);
  1054. m_pEntity->GetFunction()->GetSysVar("TerminalStage",termStage);
  1055. //Dbg("ts[%s]",(LPCTSTR)termStage);
  1056. //oiltest byteorder
  1057. #ifdef RVC_OS_WIN
  1058. char tmp[256];
  1059. gethostname(tmp, sizeof(tmp));
  1060. hostent *ent = gethostbyname(tmp);
  1061. unsigned long ip = 0xffffffff;
  1062. if (ent) {
  1063. for (int i = 0; ent->h_addr_list[i]; ++i) {
  1064. if (ent->h_addrtype == AF_INET) {
  1065. struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1066. if (in->S_un.S_un_b.s_b1 != 0) {
  1067. if (in->S_un.S_un_b.s_b1 == 192)
  1068. continue;
  1069. ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1070. +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1071. break;
  1072. }
  1073. }
  1074. }
  1075. }
  1076. req.ip = ip;
  1077. #else
  1078. //oiltest
  1079. req.ip = 0x0;
  1080. #endif //RVC_OS_WIN
  1081. req.WarningLevel = warningLevel[0];
  1082. req.RunState = runState[0];
  1083. req.CustomerHandle = customerHandle[0];
  1084. req.CallState = callState[0];
  1085. req.LocalMaintain = localMaintain[0];
  1086. req.RemoteMaintain = remoteMaintain[0];
  1087. req.TermStage = termStage[0];
  1088. CSmartPointer<IPackage> pkt = CreateNewPackage("HANDSHK");
  1089. pkt->AddStruct("FNTSTAT", false, false, (LPBYTE)&req, sizeof(HandReq));
  1090. HandErrListReq errListReq;
  1091. errListReq.warnLevel = m_pFSM->GetWarnLevel();
  1092. errListReq.reserved1 = ' ';
  1093. ZeroMemory(errListReq.errList, 512);
  1094. pkt->AddStruct("ENTSTAT", false, false, (LPBYTE)&errListReq, sizeof(HandErrListReq));
  1095. // [Josephus in 9:38:25 2016/4/23]
  1096. TermianlCounter counter;
  1097. ErrorCodeEnum erroCode = m_pFSM->GetPerformCounter(counter);
  1098. if(erroCode != Error_Succeed)
  1099. {
  1100. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Terminal Performance Information failed !!!");
  1101. }
  1102. else
  1103. {
  1104. //oilyang@20171122 数量太多,暂时去掉
  1105. //Dbg("Get Terminal Performance Information suc");
  1106. }
  1107. //const char* szIP = m_pFSM->GetRealIP();
  1108. //memset(tmp, 0, sizeof(tmp));
  1109. //strcpy_s(tmp, 256, szIP);
  1110. //Dbg("Calling gethostbyname with %s %s", tmp, szIP);
  1111. //ent = gethostbyname(tmp);
  1112. //ip = 0xffffffff;
  1113. //if (ent == NULL)
  1114. //{
  1115. // DWORD dwError = WSAGetLastError();
  1116. // if (dwError != 0)
  1117. // {
  1118. // if (dwError == WSAHOST_NOT_FOUND)
  1119. // {
  1120. // Dbg("Host not found");
  1121. // } else if (dwError == WSANO_DATA)
  1122. // {
  1123. // Dbg("No data record found");
  1124. // } else
  1125. // {
  1126. // Dbg("Function failed with error: %ld", dwError);
  1127. // }
  1128. // }
  1129. // counter.serverIP = 0xffffffff;
  1130. //}
  1131. //else
  1132. //{
  1133. // //unsigned long ulIP = ((struct in_addr*)ent->h_addr)->S_un.S_addr;
  1134. // for (int i = 0; ent->h_addr_list[i]; ++i)
  1135. // {
  1136. // if (ent->h_addrtype == AF_INET)
  1137. // {
  1138. // struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1139. // if (in->S_un.S_un_b.s_b1 != 0)
  1140. // {
  1141. // if (in->S_un.S_un_b.s_b1 == 192)
  1142. // continue;
  1143. // ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1144. // +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1145. // // test for ip with S_addr [Josephus in 11:15:43 2016/4/22]
  1146. // unsigned long ulIP = in->S_un.S_addr;
  1147. // unsigned long ul2IP = inet_addr(tmp);
  1148. // Dbg("joseph-test2: ip=0x%x, ulIp=0x%x, ul2IP=0x%x", ip, ulIP, ul2IP);
  1149. // break;
  1150. // }
  1151. // }
  1152. // }
  1153. //}
  1154. counter.serverIP = m_pFSM->m_dwServIP;
  1155. //Dbg("dwServIP 0x%x", counter.serverIP);
  1156. #ifdef RVC_OS_WIN
  1157. const char* diskPath = m_pFSM->GetRunDiskPath();
  1158. ULARGE_INTEGER uliFreeBytesAvailable;
  1159. if(GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  1160. {
  1161. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  1162. //Dbg("FreeDisk:%.2fMB, %u", uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0, counter.freeDisk);
  1163. }
  1164. else
  1165. {
  1166. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  1167. }
  1168. #else
  1169. //oiltestlinux
  1170. counter.freeDisk = 0;
  1171. #endif //RVC_OS_WIN
  1172. pkt->AddStruct("CNTSTAT", false, false, (LPBYTE)&counter, sizeof(TermianlCounter));
  1173. SendPackage(pkt);
  1174. //delete pkt;
  1175. }
  1176. 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)
  1177. {
  1178. CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d,errCSCode:%d",
  1179. type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize, errCSCode);
  1180. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
  1181. //发起跨机调用包
  1182. if (type == 0||type==10)
  1183. {
  1184. CardActiveReq req = { 0 };
  1185. CSystemStaticInfo sysSInfo;
  1186. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1187. req.type = type;
  1188. req.slot = slot;
  1189. #ifdef RVC_OS_WIN
  1190. strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
  1191. strncpy_s(req.Account, account, accSize);
  1192. strncpy_s(req.TerminalNo, termNo, strlen(termNo));
  1193. strncpy_s(req.Param2, data, dataSize);
  1194. #else
  1195. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1196. strcpy_s(req.Account, accSize, account);
  1197. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1198. strcpy_s(req.Param2, dataSize, data);
  1199. #endif //RVC_OS_WIN
  1200. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1201. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1202. SendPackage(pkt);
  1203. }
  1204. //发送跨机调用返回包
  1205. else if (type == 1 || type == 11)
  1206. {
  1207. CardActiveReq req = { 0 };
  1208. CSystemStaticInfo sysSInfo;
  1209. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1210. req.type = type;
  1211. req.ErrCode = errCode;
  1212. req.findCard = findCard;
  1213. req.cardPos = cardPos;
  1214. req.reserved1 = errCSCode;
  1215. #ifdef RVC_OS_WIN
  1216. strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
  1217. strncpy_s(req.Account, account, accSize);
  1218. strncpy_s(req.TerminalNo, termNo, strlen(termNo));
  1219. strncpy_s(req.Param2, data, dataSize);
  1220. #else
  1221. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1222. strcpy_s(req.Account, accSize, account);
  1223. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1224. strcpy_s(req.Param2, dataSize, data);
  1225. #endif //RVC_OS_WIN
  1226. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1227. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1228. SendPackage(pkt);
  1229. }
  1230. }
  1231. void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
  1232. {
  1233. int nLen = pRecvPkg->GetStructLen("FNTHAND");
  1234. if (nLen > 0) {
  1235. Dbg("nLen %d", nLen);
  1236. BYTE *pBuf = new BYTE[nLen+1];
  1237. memset(pBuf, 0, nLen+1);
  1238. int nArrayNum = 0;
  1239. if (pRecvPkg->GetStructData("FNTHAND", pBuf, &nLen, &nArrayNum)) {
  1240. Dbg("%s,%d,%d", pBuf, nLen, nArrayNum);
  1241. HandAns* pAns = (HandAns*)pBuf;
  1242. Dbg("hand recv %d events", nArrayNum);
  1243. for (int i = 0; i < nArrayNum; ++i)
  1244. {
  1245. bool bKnownEvent = true;
  1246. DWORD userEvtCode = 0;
  1247. unsigned long ulTmp = (pAns + i)->EventCode;
  1248. Dbg("event %d,param1 %s", ulTmp, (pAns + i)->param1);
  1249. switch (ulTmp)
  1250. {
  1251. case INC_GLOBAL_SETTING_SYNC:
  1252. userEvtCode = LOG_EVT_INC_GLOBAL_SETTING_SYNC;
  1253. break;
  1254. case INC_COMM_RECONNECT:
  1255. userEvtCode = LOG_EVT_INC_COMM_RECONNECT;
  1256. break;
  1257. case INC_START_REMOTE_CONTROL:
  1258. userEvtCode = LOG_EVT_INC_START_REMOTE_CONTROL;
  1259. break;
  1260. case INC_UPDATE_CHECK:
  1261. userEvtCode = LOG_EVT_INC_UPDATE_CHECK;
  1262. break;
  1263. case INC_RECOVER_SERVICE:
  1264. userEvtCode = LOG_EVT_INC_RECOVER_SERVICE;
  1265. break;
  1266. case INC_PAUSE_SERVICE:
  1267. userEvtCode = LOG_EVT_INC_PAUSE_SERVICE;
  1268. break;
  1269. case INC_AREA_SERVICE_SWITCH:
  1270. userEvtCode = LOG_EVT_INC_AREA_SERVICE_SWITCH;
  1271. break;
  1272. case INC_VERSION_ROLLBACK:
  1273. userEvtCode = LOG_EVT_INC_VERSION_ROLLBACK;
  1274. break;
  1275. case INC_BRIDGE:
  1276. userEvtCode = LOG_EVT_INC_BRIDGE;
  1277. break;
  1278. case INC_VEDIO_CONNECTING:
  1279. userEvtCode = LOG_EVT_INC_VEDIO_CONNECTING;
  1280. break;
  1281. case INC_TRADE_MANAGER_NORMAL:
  1282. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_NORMAL;
  1283. break;
  1284. case INC_TRADE_MANAGER_ON:
  1285. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_ON;
  1286. break;
  1287. case INC_TRADE_MANAGER_OFF:
  1288. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_OFF;
  1289. break;
  1290. case INC_DEVICE_LOCK_ON:
  1291. userEvtCode = LOG_EVT_INC_DEVICE_LOCK_ON;
  1292. break;
  1293. case INC_DEVICE_UNLOCK:
  1294. userEvtCode = LOG_EVT_INC_DEVICE_UNLOCK;
  1295. break;
  1296. case INC_DEVICE_KICK_OFF:
  1297. userEvtCode = LOG_EVT_INC_DEVICE_KICK_OFF;
  1298. break;
  1299. default:
  1300. bKnownEvent = false;
  1301. Dbg("unknown ins %d", ulTmp);
  1302. break;
  1303. }
  1304. if (bKnownEvent)
  1305. {
  1306. LogEvent(Severity_Middle, userEvtCode, (pAns + i)->param1);
  1307. }
  1308. }
  1309. }
  1310. else {
  1311. Dbg("invalid handshakeans packet!");
  1312. //OnDisconnect();
  1313. }
  1314. delete pBuf;
  1315. }
  1316. }
  1317. void CHeartBeatFSM::ProcessCardActive(CardActiveReq* req)
  1318. {
  1319. ProcessPreOnlineTask* ppTask = new ProcessPreOnlineTask(this, req);
  1320. GetEntityBase()->GetFunction()->PostThreadPoolTask(ppTask);
  1321. }
  1322. void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
  1323. {
  1324. if (req->type == 0 || req->type == 10) {
  1325. if (m_bCrossUseJS) {
  1326. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("心跳调用卡库跨机JS接口");
  1327. LocalPreOnlineJS(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2, req->type);
  1328. }
  1329. else {
  1330. LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2, req->type);
  1331. }
  1332. }
  1333. else if (req->type == 1) {
  1334. ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos, req->reserved1);
  1335. }
  1336. #ifdef RVC_OS_WIN
  1337. delete req;
  1338. #endif
  1339. }
  1340. void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
  1341. {
  1342. LOG_FUNCTION();
  1343. int nLen = pRecvPkg->GetStructLen("INSREQX");
  1344. if (nLen > 0) {
  1345. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen %d", nLen);
  1346. BYTE *pBuf = new BYTE[nLen+1];
  1347. memset(pBuf, 0, nLen+1);
  1348. int nArrayNum = 0;
  1349. if (pRecvPkg->GetStructData("INSREQX", pBuf, &nLen, &nArrayNum)) {
  1350. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d,%d", pBuf, nLen, nArrayNum);
  1351. CardActiveReq* pAns = (CardActiveReq*)pBuf;
  1352. if (nArrayNum > 0)
  1353. {
  1354. CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, errorCode:%d,userErrCode:%d, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
  1355. pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, pAns->ErrCode, pAns->reserved1, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
  1356. if (pAns->ErrCode == Error_Succeed)
  1357. LogWarn(Severity_Low, Error_Succeed, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1358. else
  1359. LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1360. m_pFSM->ProcessCardActive(pAns);
  1361. }
  1362. }
  1363. else {
  1364. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid insreqx packet!");
  1365. }
  1366. #ifdef RVC_OS_WIN
  1367. //delete pBuf;
  1368. #else
  1369. delete pBuf;
  1370. #endif
  1371. }
  1372. }
  1373. ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore)
  1374. {
  1375. //卡库用新地址
  1376. if(isCardStore)
  1377. {
  1378. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"ServerNew",m_servStr);
  1379. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ServerNew=%s", m_servStr);
  1380. if (m_servStr.IsNullOrEmpty()) {
  1381. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的ServerNew配置,请检查集中配置");
  1382. return Error_Param;
  1383. }
  1384. if (!m_servStr.IsNullOrEmpty())
  1385. {
  1386. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1387. if (aaServ.GetCount() >= 2)
  1388. {
  1389. m_servIP = aaServ[0];
  1390. m_port = atoi(aaServ[1]);
  1391. }
  1392. else
  1393. {
  1394. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1395. return Error_Param;
  1396. }
  1397. }
  1398. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d",(LPCTSTR)m_servIP,m_port);
  1399. }
  1400. else
  1401. {
  1402. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server",m_servStr);
  1403. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server_Backup",m_servStrB);
  1404. if (!m_servStr.IsNullOrEmpty())
  1405. {
  1406. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1407. if (aaServ.GetCount() >= 2)
  1408. {
  1409. m_servIP = aaServ[0];
  1410. m_port = atoi(aaServ[1]);
  1411. }
  1412. else
  1413. {
  1414. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1415. return Error_Param;
  1416. }
  1417. }
  1418. if (!m_servStrB.IsNullOrEmpty())
  1419. {
  1420. CAutoArray<CSimpleStringA> aaServB = m_servStrB.Split(' ');
  1421. if (aaServB.GetCount() >= 2)
  1422. {
  1423. m_servIPB = aaServB[0];
  1424. m_portB = atoi(aaServB[1]);
  1425. }
  1426. else
  1427. {
  1428. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no backup(%s).",(LPCSTR)m_servStrB);
  1429. m_servIPB = m_servIP;
  1430. m_portB = m_port;
  1431. }
  1432. }
  1433. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d;%s,%d",(LPCTSTR)m_servIP,m_port,(LPCTSTR)m_servIPB,m_portB);
  1434. }
  1435. return Error_Succeed;
  1436. }
  1437. bool CHeartBeatFSM::CheckCRASessionOrToConnect()
  1438. {
  1439. if (m_pCRAClient != NULL && !m_pCRAClient->QuerySessionClosed())
  1440. return true;
  1441. else
  1442. {
  1443. ErrorCodeEnum eErr = Error_Unexpect;
  1444. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1445. if (m_pCRAClient != NULL) {
  1446. eErr = m_pCRAClient->Connect();
  1447. if (eErr != Error_Succeed)
  1448. {
  1449. CSimpleStringA errMsg = CSimpleStringA::Format("connect to CardReadAdapter failed:%d(0x%x)", eErr, eErr);
  1450. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
  1451. return false;
  1452. }
  1453. else
  1454. {
  1455. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to CardReadAdapter suc.");
  1456. return true;
  1457. }
  1458. }
  1459. else
  1460. return false;
  1461. }
  1462. }
  1463. bool CHeartBeatFSM::CheckCISSessionOrToConnect()
  1464. {
  1465. if (m_pCISClient != NULL && !m_pCISClient->QuerySessionClosed())
  1466. return true;
  1467. else
  1468. {
  1469. ErrorCodeEnum eErr = Error_Unexpect;
  1470. m_pCISClient = new CardIssuerStore::CardIssuerStoreService_ClientBase(GetEntityBase());
  1471. if (m_pCISClient != NULL) {
  1472. eErr = m_pCISClient->Connect();
  1473. if (eErr != Error_Succeed)
  1474. {
  1475. CSimpleStringA errMsg = CSimpleStringA::Format("connect to CardIssuerStore failed:%d(0x%x)", eErr, eErr);
  1476. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
  1477. return false;
  1478. }
  1479. else
  1480. {
  1481. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to CardIssuerStore succ.");
  1482. return true;
  1483. }
  1484. }
  1485. else {
  1486. return false;
  1487. }
  1488. }
  1489. }