HeartBeatFSM.cpp 53 KB

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