HeartBeatFSM.cpp 68 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008
  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include "HeartBeatFSM.h"
  4. #include "HeartBeat_UserErrorCode.h"
  5. #include <regex>
  6. #ifdef RVC_OS_WIN
  7. #pragma comment (lib, "Ws2_32.lib")
  8. #pragma comment (lib, "Mswsock.lib")
  9. #pragma comment (lib, "AdvApi32.lib")
  10. #pragma comment(lib, "pdh.lib")
  11. #else
  12. #include "json/json.h"
  13. #endif //RVC_OS_WIN
  14. using namespace CardIssuer;
  15. using namespace PinPad;
  16. using namespace CardReadAdapter;
  17. using namespace IDCertificate;
  18. #include "EventCode.h"
  19. #include "DeviceCrossHelper.h"
  20. const int DEFAULT_BUFLEN = 2048;
  21. const int MAX_SEND_FAILED_TIMES = 5;
  22. const int MAX_INIT_TIMES = 5;
  23. //#define DEFAULT_PORT "408"
  24. // Termainal Performance Counter Component [Josephus in 9:31:27 2016/4/23]
  25. CONST ULONG COUNTER_INTERVAL_MS = 1000;
  26. const char * AvailMemoryQuery = "\\Memory\\Available MBytes";
  27. const char * HandleNumQuery = "\\Process(_Total)\\Handle Count";
  28. const char * ThreadNumQuery = "\\Process(_Total)\\Thread Count";
  29. const char * ProcessNumQuery = "\\System\\Processes";
  30. const char * SystemElapsedQuery = "\\System\\System Up Time";
  31. const char * ProcessTimeQuery = "\\Processor Information(_Total)\\% Processor Time";
  32. #define DIV (1024 * 1024)
  33. #define DAY_DIV (24 * 60 * 60)
  34. #define HOURS_DIV (60 * 60)
  35. #define MINUS_DIV (60)
  36. // End Performance Component [Josephus in 9:32:05 2016/4/23]
  37. ErrorCodeEnum CHeartBeatFSM::OnInit()
  38. {
  39. LOG_FUNCTION();
  40. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","S");
  41. ErrorCodeEnum Error;
  42. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  43. CSmartPointer<IConfigInfo> spConfig;
  44. CSystemStaticInfo sysInfo;
  45. Error = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  46. if(Error == Error_Succeed) {
  47. m_bJBMachine = !sysInfo.strMachineType.Compare("RVC.IL", true);
  48. m_localDeviceNo = sysInfo.strTerminalID;
  49. }
  50. Error = spEntityFunction->OpenConfig(Config_CenterSetting, spConfig);
  51. if (Error != Error_Succeed) {
  52. LOG_TRACE("open cfg file failed!");
  53. //logwarn oiltest
  54. return Error_DevLoadFileFailed;
  55. }
  56. m_tmpTestFlag = 0;
  57. m_isCardStore = !sysInfo.strMachineType.Compare("RVC.CardStore", true);
  58. ErrorCodeEnum rc = GetServerAddr(spConfig, m_isCardStore);
  59. if(Error_Succeed != rc)
  60. return rc;
  61. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(),"TestFlag",m_tmpTestFlag);
  62. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "LongConnInterval", m_longConnInterval);
  63. if (m_longConnInterval < 20000) {
  64. m_longConnInterval = 20000;//默认20s
  65. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("LongConnInterval<20000ms ,use default 20s", m_longConnInterval);
  66. }
  67. int intervalTemp = 0;
  68. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "HandShakeConnInterval", intervalTemp);
  69. if (intervalTemp == 0) {
  70. //未配置
  71. m_handShakeConnInterval = 20000;
  72. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_handShakeConnInterval is not configured ,use default 20s", m_handShakeConnInterval);
  73. }
  74. else {
  75. //已配置
  76. if (intervalTemp < 10000) {
  77. m_handShakeConnInterval = 10000;
  78. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_handShakeConnInterval %d ms<10000ms ,use default 10s", intervalTemp);
  79. }
  80. else {
  81. m_handShakeConnInterval = intervalTemp;
  82. }
  83. }
  84. //网络字节序
  85. //由于双活改造,改成固定ip,分行服务有处理
  86. m_servIP = "99.1.100.215";
  87. m_dwServIP = inet_addr(m_servIP);
  88. m_csServerIP = m_servIP;
  89. CSimpleStringA csRunDiskName("C:\\");
  90. Error = GetEntityBase()->GetFunction()->GetPath("Run", csRunDiskName);
  91. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPath of run is %s 0x%x", (LPCTSTR)csRunDiskName, Error);
  92. CAutoArray<CSimpleStringA> arrays = csRunDiskName.Split('\\');
  93. if(arrays.GetCount() > 0)
  94. {
  95. m_csRunDiskName = arrays[0] + "\\";
  96. Dbg("m_csRunDiskName is %s", (LPCTSTR)m_csRunDiskName);
  97. }
  98. else
  99. {
  100. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Split rundisk file string(%s) failed", (LPCTSTR)csRunDiskName);
  101. return Error_Unexpect;
  102. }
  103. CSimpleStringA temp="";
  104. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), "HandShakeUrl", temp);
  105. m_strHandShakeUrl = temp;
  106. //有心跳地址才启动心跳新线程
  107. if (!m_strHandShakeUrl.IsNullOrEmpty()) {
  108. NewHandShakeTask* task = new NewHandShakeTask(this);
  109. Error = this->GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  110. if (rc != Error_Succeed)
  111. {
  112. LogError(Severity_Middle, rc, 0, CSimpleStringA::Format("NewHandShakeTask Thread is fail,%d", (int)rc).GetData());
  113. m_testResult = Error_InvalidState;//启动心跳线程失败
  114. return Error_Exception;
  115. }
  116. else {
  117. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_TASK_START,
  118. CSimpleStringA::Format("NewHandShakeTask task start,HandShakeConnInterval= %d ms, LongConnInterval = %d ms, url=%s", m_handShakeConnInterval,m_longConnInterval,m_strHandShakeUrl.GetData()));
  119. }
  120. }
  121. else {
  122. //提醒无心跳地址,旧心跳时间默认设置为20s
  123. m_longConnInterval = 20000;//设置为20s
  124. LogWarn(Severity_Low, Error_Exception, LOG_EVT_HEARTBEAT_TASK_NOT_START,"NewHandShakeTask task not start,HandShakeUrl is temp,LongConnInterval use default 20s");
  125. }
  126. return Error_Succeed;
  127. }
  128. ErrorCodeEnum CHeartBeatFSM::OnExit()
  129. {
  130. return Error_NotImpl;
  131. }
  132. //Init(Stop)
  133. void CHeartBeatFSM::s0_on_entry()
  134. {
  135. //LOG_FUNCTION();
  136. {
  137. //check if can start to work(handshake...)
  138. //1.check if AccessAuthorization have finished
  139. //2.check if network connected
  140. //3.check if framework on Exitting or Terminating
  141. //all of above have checked,start to work
  142. if (m_pHandShakeConn != NULL)
  143. {
  144. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("init connection.");
  145. m_pHandShakeConn->Close();
  146. m_pHandShakeConn->DecRefCount();
  147. m_pHandShakeConn = NULL;
  148. }
  149. FSMEvent *e = new FSMEvent(USER_EVT_START);
  150. PostEventFIFO(e);
  151. m_initTimes++;
  152. if (m_initTimes > 1)
  153. Sleep(30000);
  154. if (m_initTimes > MAX_INIT_TIMES)
  155. {
  156. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have try to init x times,give up!");
  157. //logwarn oiltest
  158. m_initTimes = 0;
  159. }
  160. }
  161. }
  162. void CHeartBeatFSM::s0_on_exit()
  163. {
  164. }
  165. unsigned int CHeartBeatFSM::s0_on_event(FSMEvent* pEvt)
  166. {
  167. switch(pEvt->iEvt)
  168. {
  169. case USER_EVT_START:
  170. {
  171. StartTask* task = new StartTask(this);
  172. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  173. pEvt->SetHandled();
  174. }
  175. return 0;
  176. default:
  177. break;
  178. }
  179. return 0;
  180. }
  181. //Starting
  182. void CHeartBeatFSM::s1_on_entry()
  183. {
  184. //LOG_FUNCTION();
  185. }
  186. void CHeartBeatFSM::s1_on_exit()
  187. {
  188. }
  189. unsigned int CHeartBeatFSM::s1_on_event(FSMEvent* pEvt)
  190. {
  191. switch(pEvt->iEvt)
  192. {
  193. case USER_EVT_STARTFINISHED:
  194. pEvt->SetHandled();
  195. if (pEvt->param1 == 0)
  196. {
  197. HandShakeTask* task = new HandShakeTask(this);
  198. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  199. pEvt->SetHandled();
  200. return 0;
  201. }
  202. else
  203. {
  204. // SetFlag for MobileDial entity. [Josephus in 11:40:29 2016/8/16]
  205. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","D");
  206. return 1;
  207. }
  208. break;
  209. default:
  210. break;
  211. }
  212. return 0;
  213. }
  214. //Connnected
  215. void CHeartBeatFSM::s2_on_entry()
  216. {
  217. LOG_FUNCTION();
  218. m_initTimes = 0;
  219. m_testResult = Error_Succeed;
  220. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_CONNECTED, "Branch heartbeat service connected.");
  221. LogWarn(Severity_Low, Error_Unexpect, LOG_EVT_HEARTBEAT_CONNECTED, "Branch heartbeat service connected.");
  222. }
  223. void CHeartBeatFSM::s2_on_exit()
  224. {
  225. }
  226. unsigned int CHeartBeatFSM::s2_on_event(FSMEvent* pEvt)
  227. {
  228. switch(pEvt->iEvt)
  229. {
  230. case USER_EVT_INSTRUCTION:
  231. {
  232. InstructionEvent *pIE = dynamic_cast<InstructionEvent*>(pEvt);
  233. pEvt->SetHandled();
  234. DoInstruction(pIE->ctx);
  235. }
  236. break;
  237. case USER_EVT_HANDSHAKEFINISHED:
  238. pEvt->SetHandled();
  239. break;
  240. case USER_EVT_STOP:
  241. pEvt->SetHandled();
  242. break;
  243. case USER_EVT_START:
  244. pEvt->SetHandled();
  245. break;
  246. case USER_EVT_CARD_ACTIVE:
  247. {
  248. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 card active.");
  249. pEvt->SetHandled();
  250. CardActiveEvent *pcae = dynamic_cast<CardActiveEvent*>(pEvt);
  251. CardActiveTask *pTask = new CardActiveTask(this);
  252. pTask->ctx = pcae->ctx;
  253. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  254. }
  255. break;
  256. case USER_EVT_CARD_ACTIVE_FINISHED:
  257. pEvt->SetHandled();
  258. break;
  259. case USER_EVT_CROSS_TERM_CALL:
  260. {
  261. pEvt->SetHandled();
  262. CrossTermCallEvent* pCTCE = dynamic_cast<CrossTermCallEvent*>(pEvt);
  263. CrossTermCallTask *pTask = new CrossTermCallTask(this);
  264. pTask->ctx = pCTCE->ctx;
  265. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 cross call,type %x.",pCTCE->ctx->Req.type);
  266. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  267. }
  268. break;
  269. case USER_EVT_CROSS_TERM_CALL_FINISHED:
  270. pEvt->SetHandled();
  271. break;
  272. case USER_EVT_ILCallToRVC:
  273. {
  274. pEvt->SetHandled();
  275. ILCallToRVCEvent* pCTCE = dynamic_cast<ILCallToRVCEvent*>(pEvt);
  276. ILCallToRVCTask *pTask = new ILCallToRVCTask(this);
  277. pTask->ctx = pCTCE->ctx;
  278. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  279. }
  280. break;
  281. case USER_EVT_CallResultToIL:
  282. {
  283. pEvt->SetHandled();
  284. CallResultToILEvent* pCTCE = dynamic_cast<CallResultToILEvent*>(pEvt);
  285. CallResultToILTask *pTask = new CallResultToILTask(this);
  286. pTask->ctx = pCTCE->ctx;
  287. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  288. }
  289. break;
  290. default:
  291. break;
  292. }
  293. return 0;
  294. }
  295. //Lost
  296. void CHeartBeatFSM::s3_on_entry()
  297. {
  298. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","L");
  299. }
  300. void CHeartBeatFSM::s3_on_exit()
  301. {
  302. }
  303. unsigned int CHeartBeatFSM::s3_on_event(FSMEvent* pEvt)
  304. {
  305. return 0;
  306. }
  307. //Reject
  308. void CHeartBeatFSM::s4_on_entry()
  309. {
  310. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","R");
  311. FSMEvent *pStopEvt = new FSMEvent(USER_EVT_STOP);
  312. PostEventFIFO(pStopEvt);
  313. }
  314. void CHeartBeatFSM::s4_on_exit()
  315. {
  316. }
  317. unsigned int CHeartBeatFSM::s4_on_event(FSMEvent* pEvt)
  318. {
  319. switch(pEvt->iEvt)
  320. {
  321. case USER_EVT_STOP:
  322. pEvt->SetHandled();
  323. break;
  324. default:
  325. break;
  326. }
  327. return 0;
  328. }
  329. //Failed
  330. void CHeartBeatFSM::s5_on_entry()
  331. {
  332. m_testResult = Error_InvalidState;
  333. }
  334. void CHeartBeatFSM::s5_on_exit()
  335. {
  336. }
  337. unsigned int CHeartBeatFSM::s5_on_event(FSMEvent* pEvt)
  338. {
  339. return 0;
  340. }
  341. int CHeartBeatFSM::Starting()
  342. {
  343. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HeartBeat start to connect.");
  344. if (!m_pHandShakeConn)
  345. {
  346. //HeartBeatConnection* pHandShakeConn;
  347. m_pHandShakeConn = new HeartBeatConnection(m_pEntity, this);
  348. if (m_pHandShakeConn != NULL)
  349. {
  350. bool bConn = false;
  351. if(m_isCardStore)
  352. {
  353. bConn = m_pHandShakeConn->Connect(m_servIP, m_port, 3);
  354. }
  355. else
  356. {
  357. bConn = m_pHandShakeConn->ConnectFromCentralSetting();
  358. }
  359. if (!bConn)
  360. {
  361. m_pHandShakeConn->Close();
  362. //delete m_pHandShakeConn;//oiltest
  363. m_pHandShakeConn->DecRefCount();
  364. m_pHandShakeConn = NULL;
  365. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot connect to server.");
  366. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_UN_CONNECTED, "Branch heartbeat service unconnected.");
  367. LogWarn(Severity_Middle, Error_Unexpect, LOG_EVT_HEARTBEAT_UN_CONNECTED, "Branch heartbeat service unconnected.");
  368. return 1;
  369. }
  370. }
  371. }
  372. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HeartBeat connected.");
  373. return 0;
  374. }
  375. int CHeartBeatFSM::DoHandShake()
  376. {
  377. if (m_pHandShakeConn) {
  378. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start handshake");
  379. //oiltest sp_var_client_set has no write privilege!
  380. //GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","C");
  381. while (1)
  382. {
  383. if (!m_pHandShakeConn || !m_pHandShakeConn->IsConnectionOK())
  384. {
  385. FSMEvent *e = new FSMEvent(USER_EVT_START);
  386. PostEventFIFO(e);
  387. break;
  388. }
  389. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState", "C");
  390. m_pHandShakeConn->SendHandShake();
  391. if(m_pHandShakeConn->IsConnectionOK() && !m_bAlarmed)
  392. {
  393. 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])");
  394. if(regex_match(m_servIP.GetData(), reg))
  395. {
  396. CSimpleStringA msg = CSimpleStringA::Format("Branch server IP: %s, backup ip: %s", m_servIP.GetData(), m_servIPB.GetData());
  397. LogWarn(Severity_Low, Error_Succeed, LOG_EVT_CONNECT_BRANCH, msg);
  398. }
  399. else
  400. {
  401. CSimpleStringA msg = CSimpleStringA::Format("Center server url: %s", m_servIP.GetData());
  402. LogWarn(Severity_Low, Error_Succeed, LOG_EVT_CONNECT_CENTER, msg);
  403. }
  404. m_bAlarmed = true;
  405. }
  406. Sleep(m_longConnInterval);//修改成可配置的时间间隔
  407. //Sleep(20000);//oiltest
  408. if (m_tmpTestFlag)
  409. {
  410. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("send spshell.exe restart event.");
  411. LogEvent(Severity_Middle, Event_Req_Framework_Restart, "spshell.exe restart");
  412. }
  413. }
  414. }
  415. return 0;
  416. }
  417. int CHeartBeatFSM::DoNewHandShake() {
  418. int warnSum = 0;
  419. while (true)
  420. {
  421. if (warnSum == 50) {
  422. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp send 50 times");
  423. warnSum = 0;
  424. }
  425. IHttpFunc* client;
  426. client = create_http(HttpsLogCallBack);
  427. //发送心跳http请求
  428. bool isHeartBeatOk=false;
  429. bool bRet = HandShakeHttp(client, isHeartBeatOk);
  430. if (bRet) {
  431. if (!isHeartBeatOk) {
  432. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp isHeartBeatOk=false");
  433. }
  434. }
  435. client->Destory();
  436. Sleep(m_handShakeConnInterval);//改为参数配置
  437. warnSum++;
  438. }
  439. return 0;
  440. }
  441. bool CHeartBeatFSM::HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk) {
  442. HttpStruct::SendHandShakeReq qTempReq;
  443. HttpStruct::SendHandShakeRet qTempRet;
  444. CSystemStaticInfo info;
  445. qTempReq.m_reqStr = HandShakeJsonStr();//请求参数
  446. qTempReq.m_url = m_strHandShakeUrl.GetData();//访问地址
  447. qTempReq.m_timeOut = 60;//设置传送超时时间为60s
  448. //qTempReq.m_printDbg = true;
  449. if (!client->Post(qTempReq, qTempRet)) {
  450. 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());
  451. return false;//通讯失败
  452. }
  453. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("qTempRet=%s", qTempRet.m_retStr.c_str());
  454. Json::Reader reader;
  455. Json::Value rootRet;
  456. if (!reader.parse(qTempRet.m_retStr, rootRet, false))
  457. {
  458. 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());
  459. return false;//服务异常
  460. }
  461. bool isSucc = rootRet["success"].asBool();
  462. if (isSucc) {
  463. if (rootRet.isMember("data")) {
  464. if (rootRet["data"].asBool()) {
  465. isHeartBeatOk = true;//心跳正常
  466. return true;//服务正常
  467. }
  468. else {
  469. isHeartBeatOk = false;//心跳不正常
  470. return true;//服务正常
  471. }
  472. }
  473. else {
  474. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeHttp")("HandShakeHttp [success] is true,param [data] is lost");
  475. return false;//服务异常
  476. }
  477. }
  478. else {
  479. 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());
  480. return false;//服务异常
  481. }
  482. }
  483. string CHeartBeatFSM::HandShakeJsonStr() {
  484. //LOG_FUNCTION();
  485. string jsonStr = "";
  486. Json::Value root;
  487. Json::FastWriter fw;//写入对象
  488. Json::Value obj1, obj2, obj3;
  489. //写入shakehandvo对象
  490. CSystemStaticInfo sysSInfo;
  491. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  492. CSimpleStringA warningLevel("w"), runState("r"), customerHandle("c"), callState("s"),
  493. localMaintain("l"), remoteMaintain("m"), termStage("U");
  494. m_pEntity->GetFunction()->GetSysVar("RunState", runState);
  495. m_pEntity->GetFunction()->GetSysVar("CustomerHandle", customerHandle);
  496. m_pEntity->GetFunction()->GetSysVar("CallState", callState);
  497. m_pEntity->GetFunction()->GetSysVar("TerminalStage", termStage);
  498. #ifdef RVC_OS_WIN
  499. char tmp[256];
  500. gethostname(tmp, sizeof(tmp));
  501. hostent* ent = gethostbyname(tmp);
  502. unsigned long ip = 0xffffffff;
  503. if (ent) {
  504. for (int i = 0; ent->h_addr_list[i]; ++i) {
  505. if (ent->h_addrtype == AF_INET) {
  506. struct in_addr* in = (struct in_addr*)ent->h_addr_list[i];
  507. if (in->S_un.S_un_b.s_b1 != 0) {
  508. if (in->S_un.S_un_b.s_b1 == 192)
  509. continue;
  510. ip = (in->S_un.S_un_b.s_b1 << 24) + (in->S_un.S_un_b.s_b2 << 16)
  511. + (in->S_un.S_un_b.s_b3 << 8) + in->S_un.S_un_b.s_b4;
  512. break;
  513. }
  514. }
  515. }
  516. }
  517. #endif //RVC_OS_WIN
  518. obj1["terminalNo"] = sysSInfo.strTerminalID.GetData();
  519. obj1["ip"] = 0;//默认不获取
  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 = GetTradeManagerState();
  568. ZeroMemory(errListReq.errList, 512);
  569. strncpy(errListReq.errList, GetEntityErrorList(), GetEntityErrorList().GetLength());
  570. obj3["warnLevel"] = errListReq.warnLevel;
  571. string tmp_string(1, errListReq.reserved1);
  572. obj3["reserved1"] = tmp_string.c_str();
  573. obj3["errList"] = CSimpleStringA::Format("%s", errListReq.errList).GetData();
  574. root["shakeHandErrorVO"]=Json::Value(obj3);
  575. jsonStr = fw.write(root);
  576. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HandShakeJsonStr")("HandShakeJsonStr=%s", jsonStr.c_str());
  577. return jsonStr;
  578. }
  579. void CHeartBeatFSM::HttpsLogCallBack(const char* logtxt)
  580. {
  581. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("http dbg: %s", logtxt);
  582. }
  583. int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
  584. {
  585. LOG_FUNCTION();
  586. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  587. {
  588. 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);
  589. ctx->Answer(Error_Succeed);
  590. }
  591. else
  592. {
  593. if (ctx->Req.account.GetLength() > 6)
  594. 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));
  595. else
  596. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("acc:%s, size:%d", (const char*)ctx->Req.account,ctx->Req.account.GetLength());
  597. ctx->Answer(Error_Unexpect);
  598. }
  599. return 0;
  600. }
  601. void CHeartBeatFSM::DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx)
  602. {
  603. switch(ctx->Req.type)
  604. {
  605. case INC_GLOBAL_SETTING_SYNC:
  606. break;
  607. case INC_COMM_RECONNECT:
  608. break;
  609. case INC_START_REMOTE_CONTROL:
  610. break;
  611. case INC_UPDATE_CHECK:
  612. break;
  613. case INC_RECOVER_SERVICE:
  614. break;
  615. case INC_PAUSE_SERVICE:
  616. break;
  617. case INC_AREA_SERVICE_SWITCH:
  618. break;
  619. default:
  620. break;
  621. }
  622. }
  623. ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
  624. {
  625. m_warnLevel = warmLevel;
  626. m_entErrorList = strList;
  627. Dbg("strList[%s]",(LPCTSTR)strList);
  628. return Error_Succeed;
  629. }
  630. void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  631. {
  632. //for simple
  633. pTransactionContext->SendAnswer(m_testResult);
  634. }
  635. void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data)
  636. {
  637. LOG_FUNCTION();
  638. CardReadAdapterService_ClientBase *pCardReadAdapterClient = NULL;
  639. ErrorCodeEnum eErr = Error_Unexpect;
  640. pCardReadAdapterClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  641. eErr = pCardReadAdapterClient->Connect();
  642. if (eErr != Error_Succeed)
  643. {
  644. CSimpleStringA errMsg = CSimpleStringA::Format("LocalPreOnline, pGuiConsoleClient is null or connect CardReadAdapter failed:%d(0x%x)", eErr, eErr);
  645. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
  646. pCardReadAdapterClient->SafeDelete();
  647. return;
  648. }
  649. CardReadAdapterService_PreOnline_Req req;
  650. CardReadAdapterService_PreOnline_Ans ans;
  651. CSimpleStringA outParam("");
  652. req.businessData = data;
  653. char buf[16];
  654. ZeroMemory(buf, sizeof(buf));
  655. _itoa(slot, buf, 10);
  656. CSimpleStringA kaku("kaku#");
  657. req.module = 1;
  658. req.reserved2.Init(2);
  659. req.reserved2[0] = kaku + CSimpleStringA(buf);
  660. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local:%s", (const char*)req.reserved2[0]);
  661. req.reserved2[1] = account;
  662. CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
  663. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
  664. eErr = pCardReadAdapterClient->PreOnline(req, ans, 65000);
  665. if (eErr != Error_Succeed) {
  666. outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x)", eErr, eErr);
  667. if (eErr == Error_Duplication)
  668. {
  669. ReceivePreOnlineBack(Error_Duplication, "", 0, 0);
  670. pCardReadAdapterClient->GetFunction()->CloseSession();
  671. return;
  672. }
  673. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, outParam.GetData());
  674. }
  675. Sleep(500);
  676. CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
  677. CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
  678. ErrorCodeEnum eErrX = Error_Unexpect;
  679. eErrX = pCardReadAdapterClient->QueryCardInfoOnStore(reqX, ansX,12000);
  680. if (eErrX != Error_Succeed)
  681. {
  682. outParam = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d",eErrX);
  683. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_QueryCardInfoOnStore_Falied, outParam.GetData());
  684. ansX.findCard = ansX.cardPos = 9999;
  685. }
  686. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  687. {
  688. m_pHandShakeConn->SendCardActive(1,slot,eErr, (const char*)termNo, (const char*)account,
  689. account.GetLength(), (const char*)ans.result, ans.result.GetLength(),ansX.findCard,ansX.cardPos);
  690. }
  691. pCardReadAdapterClient->GetFunction()->CloseSession();
  692. }
  693. void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos)
  694. {
  695. LOG_FUNCTION();
  696. CardIssuerService_ClientBase *pCardIssuerClient = NULL;
  697. ErrorCodeEnum eErr = Error_Unexpect;
  698. pCardIssuerClient = new CardIssuerService_ClientBase(GetEntityBase());
  699. eErr = pCardIssuerClient->Connect();
  700. if (eErr != Error_Succeed)
  701. {
  702. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("pGuiConsoleClient is null or connect to cardissuer failed.%d", eErr);
  703. pCardIssuerClient->SafeDelete();
  704. return;
  705. }
  706. CardIssuerService_NotifyPreonline_Req req;
  707. CardIssuerService_NotifyPreonline_Ans ans;
  708. req.data = data;
  709. req.findCard = findCard;
  710. req.cardPos = cardPos;
  711. req.errCode = errCode;
  712. eErr = pCardIssuerClient->NotifyPreonline(req, ans, 10000);
  713. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NotifyPreonline ret:%d",eErr);
  714. pCardIssuerClient->GetFunction()->CloseSession();
  715. }
  716. int CHeartBeatFSM::CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
  717. {
  718. int ret = 0;
  719. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cross term call,type:%x, entity: 0x%x",ctx->Req.type, ctx->Req.nEntityID);
  720. switch (ctx->Req.nEntityID)
  721. {
  722. case 0x206:
  723. case 0x201:
  724. case 0x218:
  725. case 0x21B:
  726. ret = ProcessCrossCallToHBService(ctx->Req.type,ctx);
  727. break;
  728. default:
  729. break;
  730. }
  731. return ret;
  732. }
  733. int CHeartBeatFSM::ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
  734. {
  735. LOG_FUNCTION();
  736. ctx->Answer(Error_Succeed);
  737. return SendToHeartBeatService(ctx->Req,ctx->Ans);
  738. }
  739. void CHeartBeatFSM::DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize)
  740. {
  741. if (GetTerminalStageState().Compare("A"))
  742. {
  743. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Terminal havn't been auth suc,forbid cross call.");
  744. return;
  745. }
  746. LocalProcessCrossCallTask *pTask = new LocalProcessCrossCallTask(this, reqInfo, nBufSize);
  747. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  748. }
  749. int CHeartBeatFSM::LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize)
  750. {
  751. LOG_FUNCTION();
  752. if(reqInfo == NULL) {
  753. return -1;
  754. }
  755. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("entity sn:%x,is RVC.IL:%d,bTwoWay:%d", reqInfo->nEntityID, m_bJBMachine, reqInfo->bTwoWay);
  756. if(m_bJBMachine) { //简版心跳逻辑,那么接收到的应该是回收包
  757. switch(reqInfo->nEntityID) //实体ID
  758. {
  759. case 0x201:
  760. {
  761. ErrorCodeEnum ec = Error_Succeed;
  762. IDCertService_ClientBase* pClient = new IDCertService_ClientBase(GetEntityBase());
  763. ec = pClient->Connect();
  764. if (ec == Error_Succeed) {
  765. IDCertService_CrossTermInvokeInfo_Info info;
  766. info.type = reqInfo->CallType;
  767. info.nEntityID = reqInfo->nEntityID;
  768. info.result = reqInfo->ErrorCode;
  769. SpBuffer spbuf2;
  770. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  771. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  772. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  773. if (bBuf) {
  774. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
  775. if (xSize > 0)
  776. info.paramX = spbuf2.ToBlob();
  777. }
  778. ec = pClient->CrossTermInvokeInfo(info);
  779. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
  780. }
  781. else {
  782. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
  783. }
  784. }
  785. break;
  786. case 0x206://pinpad
  787. {
  788. ErrorCodeEnum ec = Error_Succeed;
  789. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(GetEntityBase());
  790. ec = pClient->Connect();
  791. if (ec == Error_Succeed) {
  792. PinPadService_CrossTermInvokeInfo_Info info;
  793. info.type = reqInfo->CallType;
  794. info.nEntityID = reqInfo->nEntityID;
  795. info.result = reqInfo->ErrorCode;
  796. SpBuffer spbuf2;
  797. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  798. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  799. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  800. if (bBuf) {
  801. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
  802. if (xSize > 0)
  803. info.paramX = spbuf2.ToBlob();
  804. }
  805. ec = pClient->CrossTermInvokeInfo(info);
  806. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
  807. }
  808. else {
  809. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
  810. }
  811. }
  812. break;
  813. case 0x218:
  814. {
  815. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Scanner set");
  816. ErrorCodeEnum ec = Error_Succeed;
  817. ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
  818. ec = pClient->Connect();
  819. if(ec == Error_Succeed) {
  820. ScannerService_CrossTermInvokeInfo_Info info;
  821. info.type = reqInfo->CallType;
  822. info.nEntityID = reqInfo->nEntityID;
  823. info.result = reqInfo->ErrorCode;
  824. SpBuffer spbuf2;
  825. int size = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  826. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX) , size);
  827. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), size);
  828. if(bBuf) {
  829. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
  830. if(size > 0) {
  831. info.paramX = spbuf2.ToBlob();
  832. }
  833. }
  834. ec = pClient->CrossTermInvokeInfo(info);
  835. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
  836. } else {
  837. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
  838. }
  839. }
  840. break;
  841. case 0x21B:
  842. {
  843. ErrorCodeEnum ec = Error_Succeed;
  844. CardReadAdapterService_ClientBase* pClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  845. ec = pClient->Connect();
  846. if (ec == Error_Succeed) {
  847. CardReadAdapterService_CrossTermInvokeInfo_Info info;
  848. info.type = reqInfo->CallType;
  849. info.nEntityID = reqInfo->nEntityID;
  850. info.result = reqInfo->ErrorCode;
  851. SpBuffer spbuf2;
  852. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  853. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  854. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  855. if (bBuf) {
  856. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
  857. if (xSize > 0)
  858. info.paramX = spbuf2.ToBlob();
  859. }
  860. ec = pClient->CrossTermInvokeInfo(info);
  861. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
  862. }
  863. else {
  864. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
  865. }
  866. }
  867. break;
  868. case 0x999:
  869. {
  870. if (reqInfo->numOfBlobInParamX == 1)
  871. {
  872. NotifyIECallResult resultNote;
  873. resultNote.ans_context = reqInfo->StrParamX;
  874. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context.SubString(0, 512));
  875. resultNote.error = reqInfo->ErrorCode;
  876. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, reqInfo->lensOfBlobInParamX[0]);
  877. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
  878. }
  879. else
  880. {//oiltest 需要改成按照序号组包
  881. m_tmpMultiBlob += reqInfo->StrParamX;
  882. if (reqInfo->blobSN == reqInfo->numOfBlobInParamX-1)
  883. {
  884. NotifyIECallResult resultNote;
  885. resultNote.ans_context = m_tmpMultiBlob;
  886. if (resultNote.ans_context.GetLength() > 512)
  887. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest substr %s", (const char*)resultNote.ans_context.SubString(0, 512));
  888. else
  889. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context);
  890. if (resultNote.ans_context.GetLength() > 100)
  891. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest the last 100 str %s", (const char*)resultNote.ans_context.SubString(resultNote.ans_context.GetLength()-100, 100));
  892. resultNote.error = reqInfo->ErrorCode;
  893. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, resultNote.ans_context.GetLength());
  894. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
  895. m_tmpMultiBlob = "";
  896. }
  897. }
  898. }
  899. break;
  900. default:
  901. break;
  902. }
  903. } else { //常规机型,连接适配器
  904. switch(reqInfo->nEntityID) //实体ID
  905. {
  906. case 0x201:
  907. {
  908. ErrorCodeEnum ec = Error_Succeed;
  909. if (m_pIDClient == NULL)
  910. {
  911. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat IDCertService_ClientBase client");
  912. m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
  913. }
  914. if (m_pIDClient != NULL)
  915. {
  916. if (m_pIDClient->QuerySessionClosed())
  917. {
  918. m_pIDClient->SafeDelete();
  919. m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
  920. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to IDCertificate...");
  921. if (m_pIDClient != NULL)
  922. ec = m_pIDClient->Connect();
  923. }
  924. }
  925. if (ec == Error_Succeed) {
  926. IDCertService_CrossTermCall_Req reqX;
  927. IDCertService_CrossTermCall_Ans ansX;
  928. reqX.type = reqInfo->CallType;
  929. //这个应该不用存储
  930. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  931. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  932. SpBuffer spbuf2;
  933. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  934. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  935. if (bBuf) {
  936. reqX.paramX = spbuf2.ToBlob();
  937. }
  938. ec = m_pIDClient->CrossTermCall(reqX, ansX, 20000);
  939. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
  940. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  941. {
  942. HeartBeatService_CrossTermCall_Req reqY;
  943. HeartBeatService_CrossTermCall_Ans ansY;
  944. reqY.type = reqInfo->CallType;
  945. reqY.nEntityID = reqInfo->nEntityID;
  946. //做返回
  947. ansY.retCode = ec;
  948. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  949. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  950. reqY.paramX = ansX.retParamX;
  951. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  952. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
  953. SendToHeartBeatService(reqY, ansY);
  954. }
  955. }
  956. else {
  957. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
  958. m_pIDClient->SafeDelete();
  959. m_pIDClient = NULL;
  960. }
  961. }
  962. break;
  963. case 0x206://pinpad
  964. {
  965. ErrorCodeEnum ec = Error_Succeed;
  966. if (m_pPinPadClient == NULL)
  967. {
  968. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat PinPadService_ClientBase client");
  969. m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
  970. }
  971. if (m_pPinPadClient != NULL)
  972. {
  973. if (m_pPinPadClient->QuerySessionClosed())
  974. {
  975. m_pPinPadClient->SafeDelete();
  976. m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
  977. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to PinPad...");
  978. if (m_pPinPadClient != NULL)
  979. ec = m_pPinPadClient->Connect();
  980. }
  981. }
  982. if (ec == Error_Succeed) {
  983. PinPadService_CrossTermCall_Req reqX;
  984. PinPadService_CrossTermCall_Ans ansX;
  985. reqX.type = reqInfo->CallType;
  986. //这个应该不用存储
  987. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  988. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  989. SpBuffer spbuf2;
  990. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  991. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  992. if (bBuf) {
  993. reqX.paramX = spbuf2.ToBlob();
  994. }
  995. ec = m_pPinPadClient->CrossTermCall(reqX, ansX, 20000);
  996. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
  997. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  998. {
  999. HeartBeatService_CrossTermCall_Req reqY;
  1000. HeartBeatService_CrossTermCall_Ans ansY;
  1001. reqY.type = reqInfo->CallType;
  1002. reqY.nEntityID = reqInfo->nEntityID;
  1003. //做返回
  1004. ansY.retCode = ec;
  1005. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  1006. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  1007. reqY.paramX = ansX.retParamX;
  1008. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  1009. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
  1010. SendToHeartBeatService(reqY, ansY);
  1011. }
  1012. }
  1013. else {
  1014. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
  1015. }
  1016. }
  1017. break;
  1018. case 0x218: // 高拍仪功能集
  1019. {
  1020. ErrorCodeEnum ec = Error_Succeed;
  1021. ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
  1022. ec = pClient->Connect();
  1023. if(ec == Error_Succeed) {
  1024. ScannerService_CrossTermCall_Req reqX;
  1025. ScannerService_CrossTermCall_Ans ansX;
  1026. reqX.type = reqInfo->CallType;
  1027. //这个应该不用存储
  1028. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  1029. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  1030. SpBuffer spbuf2;
  1031. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX) );
  1032. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1 );
  1033. if(bBuf) {
  1034. reqX.paramX = spbuf2.ToBlob();
  1035. }
  1036. ec = pClient->CrossTermCall(reqX, ansX, 20000);
  1037. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x",ec);
  1038. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  1039. {
  1040. HeartBeatService_CrossTermCall_Req reqY;
  1041. HeartBeatService_CrossTermCall_Ans ansY;
  1042. reqY.type = reqInfo->CallType;
  1043. reqY.nEntityID = reqInfo->nEntityID;
  1044. //做返回
  1045. ansY.retCode = ec;
  1046. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  1047. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  1048. reqY.paramX = ansY.retParamX;
  1049. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d", ec);
  1050. SendToHeartBeatService(reqY, ansY);
  1051. }
  1052. } else {
  1053. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
  1054. }
  1055. }
  1056. break;
  1057. case 0x21B:
  1058. {
  1059. ErrorCodeEnum ec = Error_Succeed;
  1060. if (m_pCRAClient == NULL)
  1061. {
  1062. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat CardReadAdapterService_ClientBase client");
  1063. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1064. }
  1065. if (m_pCRAClient != NULL)
  1066. {
  1067. if (m_pCRAClient->QuerySessionClosed())
  1068. {
  1069. m_pCRAClient = NULL;
  1070. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1071. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to CardReadAdapter");
  1072. ec = m_pCRAClient->Connect();
  1073. }
  1074. }
  1075. if (ec == Error_Succeed) {
  1076. CardReadAdapterService_CrossTermCall_Req reqX;
  1077. CardReadAdapterService_CrossTermCall_Ans ansX;
  1078. reqX.type = reqInfo->CallType;
  1079. //这个应该不用存储
  1080. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  1081. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  1082. SpBuffer spbuf2;
  1083. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  1084. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  1085. if (bBuf) {
  1086. reqX.paramX = spbuf2.ToBlob();
  1087. }
  1088. ec = m_pCRAClient->CrossTermCall(reqX, ansX, 20000);
  1089. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
  1090. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  1091. {
  1092. HeartBeatService_CrossTermCall_Req reqY;
  1093. HeartBeatService_CrossTermCall_Ans ansY;
  1094. reqY.type = reqInfo->CallType;
  1095. reqY.nEntityID = reqInfo->nEntityID;
  1096. //做返回
  1097. ansY.retCode = ec;
  1098. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  1099. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  1100. reqY.paramX = ansX.retParamX;
  1101. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  1102. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,X len:%d", ec, reqY.paramX.m_iLength);
  1103. SendToHeartBeatService(reqY, ansY);
  1104. }
  1105. }
  1106. else {
  1107. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
  1108. }
  1109. }
  1110. break;
  1111. case 0x999:
  1112. {
  1113. m_ILDeviceNo = reqInfo->FromTerminalNo;
  1114. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("save il TerminalNo:%s",(const char*)m_ILDeviceNo);
  1115. NotifyIEToCall note;
  1116. note.context = reqInfo->StrParamX;
  1117. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oiltest %s",(const char*)note.context);
  1118. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("note IE to call:%d", reqInfo->lensOfBlobInParamX[0]);
  1119. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIEToCall), SP_MSG_SIG_OF(NotifyIEToCall), note);
  1120. }
  1121. break;
  1122. default:
  1123. break;
  1124. }
  1125. }
  1126. }
  1127. ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
  1128. {
  1129. memset(&counter, 0, sizeof(TermianlCounter));//oiltmp@20210611
  1130. #ifdef RVC_OS_WIN
  1131. //oilyang@20171122 数量太多,暂时去掉
  1132. //LOG_FUNCTION();
  1133. PDH_STATUS Status;
  1134. HQUERY Query = NULL;
  1135. //HCOUNTER hcMemoryCount;
  1136. HCOUNTER hcHandleCount, hcProcessCount, hcThreadCount;
  1137. HCOUNTER hcElapsedTimeCount, hcProcessTimeCount;
  1138. DWORD CounterType;
  1139. MEMORYSTATUSEX statex;
  1140. Status = PdhOpenQuery(NULL, NULL, &Query);
  1141. if (Status != ERROR_SUCCESS)
  1142. {
  1143. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhOpenQuery failed with status 0x%x.", Status);
  1144. goto Cleanup;
  1145. }
  1146. Status = PdhAddCounter(Query, ProcessTimeQuery, NULL, &hcProcessTimeCount);
  1147. if (Status != ERROR_SUCCESS)
  1148. {
  1149. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessTimeQuery failed with status 0x%x.", Status);
  1150. goto Cleanup;
  1151. }
  1152. Status = PdhAddCounter(Query, HandleNumQuery, NULL, &hcHandleCount);
  1153. if (Status != ERROR_SUCCESS)
  1154. {
  1155. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for HandleNumQuery failed with status 0x%x.", Status);
  1156. goto Cleanup;
  1157. }
  1158. Status = PdhAddCounter(Query, ThreadNumQuery, NULL, &hcThreadCount);
  1159. if (Status != ERROR_SUCCESS)
  1160. {
  1161. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ThreadNumQuery failed with status 0x%x.", Status);
  1162. goto Cleanup;
  1163. }
  1164. Status = PdhAddCounter(Query, ProcessNumQuery, NULL, &hcProcessCount);
  1165. if (Status != ERROR_SUCCESS)
  1166. {
  1167. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for ProcessNumQuery failed with status 0x%x.", Status);
  1168. goto Cleanup;
  1169. }
  1170. Status = PdhAddCounter(Query, SystemElapsedQuery, NULL, &hcElapsedTimeCount);
  1171. if (Status != ERROR_SUCCESS)
  1172. {
  1173. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhAddCounter for SystemElapsedQuery failed with status 0x%x.", Status);
  1174. goto Cleanup;
  1175. }
  1176. Status = PdhCollectQueryData(Query);
  1177. if (Status != ERROR_SUCCESS)
  1178. {
  1179. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with 0x%x.\n", Status);
  1180. goto Cleanup;
  1181. }
  1182. do
  1183. {
  1184. Sleep(COUNTER_INTERVAL_MS);
  1185. Status = PdhCollectQueryData(Query);
  1186. if (Status != ERROR_SUCCESS)
  1187. {
  1188. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("PdhCollectQueryData failed with status 0x%x.", Status);
  1189. break;
  1190. }
  1191. memset(&statex, 0, sizeof(MEMORYSTATUSEX));
  1192. statex.dwLength = sizeof(statex);
  1193. if (GlobalMemoryStatusEx(&statex))
  1194. {
  1195. //Dbg("CPUUseRate:%u%%", statex.dwMemoryLoad);
  1196. counter.totalMem = (unsigned short)(statex.ullTotalPhys / DIV);
  1197. //Dbg("TotalPhysMemory:%I64dMB %d", statex.ullTotalPhys / DIV, counter.totalMem);
  1198. counter.freeMem = (unsigned short)(statex.ullAvailPhys / DIV);
  1199. //Dbg("AvailableMemory:%I64dMB %d", statex.ullAvailPhys / DIV, counter.freeMem);
  1200. }
  1201. PDH_FMT_COUNTERVALUE counterValue;
  1202. //Status = PdhGetFormattedCounterValue(hcMemoryCount, PDH_FMT_DOUBLE, NULL, &counterValue);
  1203. //if (Status == ERROR_SUCCESS)
  1204. //{
  1205. // Dbg("AvailableMemory:%.20gMB\n", counterValue.doubleValue);
  1206. //}
  1207. Status = PdhGetFormattedCounterValue(hcProcessTimeCount, PDH_FMT_DOUBLE, &CounterType, &counterValue);
  1208. if (Status == ERROR_SUCCESS)
  1209. {
  1210. counter.cpuLoad = (unsigned short)(counterValue.doubleValue + 0.5);
  1211. //Dbg("CPURate:%d %u", (long)counterValue.doubleValue, counter.cpuLoad);
  1212. }
  1213. Status = PdhGetFormattedCounterValue(hcHandleCount, PDH_FMT_LONG, NULL, &counterValue);
  1214. if (Status == ERROR_SUCCESS)
  1215. {
  1216. counter.handleNum = (unsigned int)(counterValue.longValue);
  1217. //Dbg("HandlesNum:%ld %u", counterValue.longValue, counter.handleNum);
  1218. }
  1219. Status = PdhGetFormattedCounterValue(hcThreadCount, PDH_FMT_LONG, NULL, &counterValue);
  1220. if (Status == ERROR_SUCCESS)
  1221. {
  1222. counter.threadNum = (unsigned short)(counterValue.longValue);
  1223. //Dbg("ThreadsNum:%ld %u", counterValue.longValue, counter.threadNum);
  1224. }
  1225. Status = PdhGetFormattedCounterValue(hcProcessCount, PDH_FMT_LONG, NULL, &counterValue);
  1226. if (Status == ERROR_SUCCESS)
  1227. {
  1228. counter.procNum = (unsigned short)(counterValue.longValue);
  1229. //Dbg("ProcessesNum:%ld %u", counterValue.longValue, counter.procNum);
  1230. }
  1231. Status = PdhGetFormattedCounterValue(hcElapsedTimeCount, PDH_FMT_LARGE, NULL, &counterValue);
  1232. if (Status == ERROR_SUCCESS)
  1233. {
  1234. ULONGLONG ulSinceSeconds = counterValue.largeValue;
  1235. ULONG days = 0, hours = 0, minutes = 0, seconds = 0;
  1236. days = ULONG(ulSinceSeconds / DAY_DIV);
  1237. ulSinceSeconds %= DAY_DIV;
  1238. hours = ULONG(ulSinceSeconds / HOURS_DIV);
  1239. ulSinceSeconds %= HOURS_DIV;
  1240. minutes = ULONG(ulSinceSeconds / MINUS_DIV);
  1241. ulSinceSeconds %= MINUS_DIV;
  1242. seconds = ULONG(ulSinceSeconds);
  1243. //Dbg("SystemElapseTime: %u:%02u:%02u:%02u", days, hours, minutes, seconds);
  1244. FILETIME ftCurTime, ftStartTime;
  1245. GetSystemTimeAsFileTime(&ftCurTime);
  1246. ULARGE_INTEGER uliCurTime;
  1247. uliCurTime.HighPart = ftCurTime.dwHighDateTime;
  1248. uliCurTime.LowPart = ftCurTime.dwLowDateTime;
  1249. uliCurTime.QuadPart -= counterValue.largeValue * 1e7;
  1250. ftStartTime.dwHighDateTime = uliCurTime.HighPart;
  1251. ftStartTime.dwLowDateTime = uliCurTime.LowPart;
  1252. SYSTEMTIME stUTC, stLocal;
  1253. FileTimeToSystemTime(&ftStartTime, &stUTC);
  1254. SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
  1255. sprintf_s(counter.osStartTime, 22, "%d-%02d-%02d %02d:%02d:%02d",
  1256. stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  1257. //Dbg("OSStartTime: %s", counter.osStartTime);
  1258. }
  1259. }while(false);
  1260. //Status = PdhRemoveCounter(hcMemoryCount);
  1261. Status = PdhRemoveCounter(hcHandleCount);
  1262. Status = PdhRemoveCounter(hcThreadCount);
  1263. Status = PdhRemoveCounter(hcProcessCount);
  1264. Status = PdhRemoveCounter(hcElapsedTimeCount);
  1265. Cleanup:
  1266. if (Query)
  1267. {
  1268. PdhCloseQuery(Query);
  1269. }
  1270. if(Status != ERROR_SUCCESS)
  1271. {
  1272. switch(Status)
  1273. {
  1274. case PDH_CSTATUS_BAD_COUNTERNAME :
  1275. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path could not be parsed or interpreted.");
  1276. break;
  1277. case PDH_CSTATUS_NO_COUNTER :
  1278. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified counter on the computer or in the log file.");
  1279. break;
  1280. case PDH_CSTATUS_NO_COUNTERNAME :
  1281. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The counter path is empty.");
  1282. break;
  1283. case PDH_CSTATUS_NO_MACHINE :
  1284. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The path did not contain a computer name, and function was unable to retrieve local computer name.");
  1285. break;
  1286. case PDH_CSTATUS_NO_OBJECT :
  1287. {
  1288. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to find the specified object on the computer or in the log file.");
  1289. //CSystemStaticInfo sysInfo;
  1290. //if(GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo) == Error_Succeed)
  1291. //{
  1292. // if(!sysInfo.strMachineType.Compare("RVC.PAD", true))
  1293. // {
  1294. // Dbg("Pad MachineType, abort lodctr operation.");
  1295. // break;
  1296. // }
  1297. //}
  1298. if(!m_nLodCtrFlag || m_nLodCtrFlag == 2)
  1299. {
  1300. LodctrTask* task = new LodctrTask(this);
  1301. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1302. }
  1303. }
  1304. break;
  1305. case PDH_FUNCTION_NOT_FOUND :
  1306. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to determine the calculation function to use for this counter.");
  1307. break;
  1308. case PDH_INVALID_ARGUMENT :
  1309. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("One or more arguments are not valid.");
  1310. break;
  1311. case PDH_INVALID_HANDLE :
  1312. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("The query handle is not valid.");
  1313. break;
  1314. case PDH_MEMORY_ALLOCATION_FAILURE :
  1315. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unable to allocate memory required to complete the function.");
  1316. break;
  1317. default :
  1318. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Cannot figure the erroCode(0x%08x)(%d) in GetPerformCounter", Status, GetLastError());
  1319. break;
  1320. }
  1321. return Error_Unexpect;
  1322. }
  1323. return Error_Succeed;
  1324. #else
  1325. return Error_Succeed;
  1326. //oiltestlinux
  1327. #endif //RVC_OS_WIN
  1328. }
  1329. int CHeartBeatFSM::SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
  1330. {
  1331. LOG_FUNCTION();
  1332. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1333. {
  1334. m_pHandShakeConn->SendCrossCallToService(req,ans);
  1335. }
  1336. return 0;
  1337. }
  1338. void CHeartBeatFSM::ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
  1339. {
  1340. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1341. {
  1342. CSimpleStringA csTerm("");
  1343. GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
  1344. m_pHandShakeConn->SendILCallToService(ctx->Info.req_context,0,true, m_localDeviceNo,csTerm);
  1345. }
  1346. }
  1347. void CHeartBeatFSM::CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
  1348. {
  1349. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1350. {
  1351. m_pHandShakeConn->SendILCallToService(ctx->Info.ans_context, ctx->Info.error, false, m_localDeviceNo,m_ILDeviceNo);
  1352. }
  1353. }
  1354. void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  1355. {
  1356. string serviceCode = pRecvPkg->GetServiceCode();
  1357. if (serviceCode.compare("HANDSHK") == 0 || serviceCode.compare("INSTRUC") == 0)
  1358. {
  1359. PkgRcvProcHandAndInstruc(pRecvPkg);
  1360. }
  1361. else if (serviceCode.compare("CARDACT") == 0)
  1362. {
  1363. PkgRcvProcCardActive(pRecvPkg);
  1364. }
  1365. else if (serviceCode.compare("CRSSACT") == 0)
  1366. {
  1367. PkgRcvProcCrossCall(pRecvPkg);
  1368. }
  1369. else
  1370. {
  1371. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown service code!");
  1372. }
  1373. };
  1374. void HeartBeatConnection::SendHandShake()
  1375. {
  1376. HandReq req = {0};
  1377. //oiltest
  1378. //strcpy(req.TerminalNo,"75500000002");
  1379. //Dbg("get sysvar");
  1380. //oiltest set default value
  1381. CSimpleStringA warningLevel("w"),runState("r"),customerHandle("c"),callState("s"),
  1382. localMaintain("l"),remoteMaintain("m"),termStage("U");
  1383. //m_pEntity->GetFunction()->GetSysVar("WarningLevel",warningLevel);
  1384. strncpy(req.TerminalNo,m_TerminalNo.GetData(),m_TerminalNo.GetLength());
  1385. m_pEntity->GetFunction()->GetSysVar("RunState",runState);
  1386. m_pEntity->GetFunction()->GetSysVar("CustomerHandle",customerHandle);
  1387. m_pEntity->GetFunction()->GetSysVar("CallState",callState);
  1388. //m_pEntity->GetFunction()->GetSysVar("LocalMaintain",localMaintain);
  1389. //m_pEntity->GetFunction()->GetSysVar("RemoteMaintain",remoteMaintain);
  1390. m_pEntity->GetFunction()->GetSysVar("TerminalStage",termStage);
  1391. //Dbg("ts[%s]",(LPCTSTR)termStage);
  1392. //oiltest byteorder
  1393. #ifdef RVC_OS_WIN
  1394. char tmp[256];
  1395. gethostname(tmp, sizeof(tmp));
  1396. hostent *ent = gethostbyname(tmp);
  1397. unsigned long ip = 0xffffffff;
  1398. if (ent) {
  1399. for (int i = 0; ent->h_addr_list[i]; ++i) {
  1400. if (ent->h_addrtype == AF_INET) {
  1401. struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1402. if (in->S_un.S_un_b.s_b1 != 0) {
  1403. if (in->S_un.S_un_b.s_b1 == 192)
  1404. continue;
  1405. ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1406. +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1407. break;
  1408. }
  1409. }
  1410. }
  1411. }
  1412. req.ip = ip;
  1413. #else
  1414. //oiltest
  1415. req.ip = 0x0;
  1416. #endif //RVC_OS_WIN
  1417. req.WarningLevel = warningLevel[0];
  1418. req.RunState = runState[0];
  1419. req.CustomerHandle = customerHandle[0];
  1420. req.CallState = callState[0];
  1421. req.LocalMaintain = localMaintain[0];
  1422. req.RemoteMaintain = remoteMaintain[0];
  1423. req.TermStage = termStage[0];
  1424. CSmartPointer<IPackage> pkt = CreateNewPackage("HANDSHK");
  1425. pkt->AddStruct("FNTSTAT", false, false, (LPBYTE)&req, sizeof(HandReq));
  1426. HandErrListReq errListReq;
  1427. errListReq.warnLevel = m_pFSM->GetWarnLevel();
  1428. errListReq.reserved1 = m_pFSM->GetTradeManagerState();
  1429. ZeroMemory(errListReq.errList, 512);
  1430. strncpy(errListReq.errList,m_pFSM->GetEntityErrorList(),m_pFSM->GetEntityErrorList().GetLength());
  1431. pkt->AddStruct("ENTSTAT", false, false, (LPBYTE)&errListReq, sizeof(HandErrListReq));
  1432. // [Josephus in 9:38:25 2016/4/23]
  1433. TermianlCounter counter;
  1434. ErrorCodeEnum erroCode = m_pFSM->GetPerformCounter(counter);
  1435. if(erroCode != Error_Succeed)
  1436. {
  1437. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get Terminal Performance Information failed !!!");
  1438. }
  1439. else
  1440. {
  1441. //oilyang@20171122 数量太多,暂时去掉
  1442. //Dbg("Get Terminal Performance Information suc");
  1443. }
  1444. //const char* szIP = m_pFSM->GetRealIP();
  1445. //memset(tmp, 0, sizeof(tmp));
  1446. //strcpy_s(tmp, 256, szIP);
  1447. //Dbg("Calling gethostbyname with %s %s", tmp, szIP);
  1448. //ent = gethostbyname(tmp);
  1449. //ip = 0xffffffff;
  1450. //if (ent == NULL)
  1451. //{
  1452. // DWORD dwError = WSAGetLastError();
  1453. // if (dwError != 0)
  1454. // {
  1455. // if (dwError == WSAHOST_NOT_FOUND)
  1456. // {
  1457. // Dbg("Host not found");
  1458. // } else if (dwError == WSANO_DATA)
  1459. // {
  1460. // Dbg("No data record found");
  1461. // } else
  1462. // {
  1463. // Dbg("Function failed with error: %ld", dwError);
  1464. // }
  1465. // }
  1466. // counter.serverIP = 0xffffffff;
  1467. //}
  1468. //else
  1469. //{
  1470. // //unsigned long ulIP = ((struct in_addr*)ent->h_addr)->S_un.S_addr;
  1471. // for (int i = 0; ent->h_addr_list[i]; ++i)
  1472. // {
  1473. // if (ent->h_addrtype == AF_INET)
  1474. // {
  1475. // struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1476. // if (in->S_un.S_un_b.s_b1 != 0)
  1477. // {
  1478. // if (in->S_un.S_un_b.s_b1 == 192)
  1479. // continue;
  1480. // ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1481. // +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1482. // // test for ip with S_addr [Josephus in 11:15:43 2016/4/22]
  1483. // unsigned long ulIP = in->S_un.S_addr;
  1484. // unsigned long ul2IP = inet_addr(tmp);
  1485. // Dbg("joseph-test2: ip=0x%x, ulIp=0x%x, ul2IP=0x%x", ip, ulIP, ul2IP);
  1486. // break;
  1487. // }
  1488. // }
  1489. // }
  1490. //}
  1491. counter.serverIP = m_pFSM->m_dwServIP;
  1492. //Dbg("dwServIP 0x%x", counter.serverIP);
  1493. #ifdef RVC_OS_WIN
  1494. const char* diskPath = m_pFSM->GetRunDiskPath();
  1495. ULARGE_INTEGER uliFreeBytesAvailable;
  1496. if(GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  1497. {
  1498. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  1499. //Dbg("FreeDisk:%.2fMB, %u", uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0, counter.freeDisk);
  1500. }
  1501. else
  1502. {
  1503. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  1504. }
  1505. #else
  1506. //oiltestlinux
  1507. counter.freeDisk = 0;
  1508. #endif //RVC_OS_WIN
  1509. pkt->AddStruct("CNTSTAT", false, false, (LPBYTE)&counter, sizeof(TermianlCounter));
  1510. SendPackage(pkt);
  1511. //delete pkt;
  1512. }
  1513. 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)
  1514. {
  1515. CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d",
  1516. type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize);
  1517. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
  1518. //发起跨机调用包
  1519. if (type == 0)
  1520. {
  1521. CardActiveReq req = { 0 };
  1522. CSystemStaticInfo sysSInfo;
  1523. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1524. req.type = 0;
  1525. req.slot = slot;
  1526. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1527. strcpy_s(req.Account, accSize, account);
  1528. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1529. strcpy_s(req.Param2, dataSize, data);
  1530. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1531. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1532. SendPackage(pkt);
  1533. }
  1534. //发送跨机调用返回包
  1535. else if (type == 1)
  1536. {
  1537. CardActiveReq req = { 0 };
  1538. CSystemStaticInfo sysSInfo;
  1539. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1540. req.type = 1;
  1541. req.ErrCode = errCode;
  1542. req.findCard = findCard;
  1543. req.cardPos = cardPos;
  1544. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1545. strcpy_s(req.Account, accSize, account);
  1546. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1547. strcpy_s(req.Param2, dataSize, data);
  1548. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1549. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1550. SendPackage(pkt);
  1551. }
  1552. }
  1553. void HeartBeatConnection::SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
  1554. {
  1555. LOG_FUNCTION();
  1556. Dbg("from term %s to term %s for entity %x,twoway:%d", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, req.nEntityID, req.isTwoWay);
  1557. if (req.paramX.m_iLength > 0)
  1558. {
  1559. //char *pBuf = new char[64 * 1024];
  1560. //ZeroMemory(pBuf, 64 * 1024);
  1561. //HexBuf2StrBuf((PBYTE)req.paramX.m_pData, &pBuf, req.paramX.m_iLength);
  1562. //CSimpleStringA xStr(pBuf);
  1563. //int i = 0;
  1564. //for (; i < req.paramX.m_iLength / 900; i++)
  1565. //{
  1566. // Dbg("%s", xStr.SubString(i * 900, 900));
  1567. //}
  1568. //Dbg("%s", xStr.SubString(i * 900, req.paramX.m_iLength - i * 900));
  1569. }
  1570. int count = req.paramX.m_iLength / (50 * 1000);
  1571. int size = sizeof(CrossCallReq)*(count + 1) + req.paramX.m_iLength + count;
  1572. char* pBuf = new char[size];
  1573. ZeroMemory(pBuf, size);
  1574. CrossCallReq* pReqX = (CrossCallReq*)pBuf;
  1575. for (int i = 0; i < count+1; i++)
  1576. {
  1577. pReqX[i].CallType = req.type;
  1578. pReqX[i].bTwoWay = req.isTwoWay;
  1579. pReqX[i].nEntityID = req.nEntityID;
  1580. pReqX[i].ErrorCode = ans.retCode;
  1581. pReqX[i].lensOfBlobInParamX[0] = req.paramX.m_iLength;
  1582. pReqX[i].numOfBlobInParamX = count+1;
  1583. strcpy_s(pReqX[i].FromTerminalNo, sizeof(pReqX[i].FromTerminalNo),req.fromTerminalNo);
  1584. strcpy_s(pReqX[i].ToTerminalNo, sizeof(pReqX[i].ToTerminalNo), req.toTerminalNo);
  1585. strcpy_s(pReqX[i].StrParam1, sizeof(pReqX[i].StrParam1), req.param1);
  1586. strcpy_s(pReqX[i].StrParam2, sizeof(pReqX[i].StrParam2), req.param2);
  1587. if (i == count)
  1588. memcpy_s(pReqX[i].StrParamX, (req.paramX.m_iLength-50*1000*i), (char*)req.paramX.m_pData+50*1000*i, req.paramX.m_iLength - 50 * 1000 * i);
  1589. else
  1590. memcpy_s(pReqX[i].StrParamX, 50*1000, (char*)req.paramX.m_pData + 50 * 1000 *i, 50 * 1000);
  1591. }
  1592. //memcpy_s(pReqX->StrParamX,req.paramY.GetLength(),req.paramX, req.paramX.GetLength());
  1593. Dbg("from %s to %s,struct X size:%d, len:%d,struct count:%d", pReqX->FromTerminalNo, pReqX->ToTerminalNo, size, req.paramX.m_iLength,count);
  1594. CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
  1595. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, size,count+1);
  1596. SendPackage(pkt);
  1597. delete [] pBuf;
  1598. }
  1599. void HeartBeatConnection::SendILCallToService(CSimpleStringA csContent, int err, bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo)
  1600. {
  1601. LOG_FUNCTION();
  1602. int count = csContent.GetLength() / (50 * 1000);
  1603. Dbg("count %d,size of content %d",count,csContent.GetLength());
  1604. if (csContent.GetLength() > 32)
  1605. Dbg("the last 32 str %s", (const char*)csContent.SubString(csContent.GetLength()-32,32));
  1606. for (int i = 0; i < count + 1; i++)
  1607. {
  1608. int size;
  1609. if (i == count)
  1610. {
  1611. size = sizeof(CrossCallReq) + csContent.GetLength() - 50*1000*i + 1;
  1612. }
  1613. else
  1614. size = sizeof(CrossCallReq) + 50 * 1000 + 1;
  1615. char* pBuf = new char[size];
  1616. ZeroMemory(pBuf, size);
  1617. Dbg("sz %d", size);
  1618. CrossCallReq* pReqX = (CrossCallReq*)pBuf;
  1619. pReqX->CallType = 999;
  1620. pReqX->bTwoWay = false;
  1621. pReqX->nEntityID = 0x999;
  1622. pReqX->blobSN = i;
  1623. pReqX->lensOfBlobInParamX[0] = csContent.GetLength();//no use 实际用到的时候需要修改这里
  1624. pReqX->numOfBlobInParamX = count + 1;
  1625. if (bFromIL)
  1626. {
  1627. pReqX->ErrorCode = 0;
  1628. }
  1629. else
  1630. {
  1631. pReqX->ErrorCode = err;
  1632. }
  1633. strcpy_s(pReqX->FromTerminalNo,sizeof(pReqX->FromTerminalNo), fromDevNo);
  1634. strcpy_s(pReqX->ToTerminalNo, sizeof(pReqX->ToTerminalNo), toDevNo);
  1635. CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
  1636. if (i == count)
  1637. {
  1638. memcpy_s(pReqX->StrParamX, csContent.GetLength() - 50 * 1000 * i, (const char*)csContent+50 * 1000 * i, csContent.GetLength() - 50 * 1000 * i);
  1639. Dbg("to add the %d packet from %d",i, csContent.GetLength() - 50 * 1000 * i);
  1640. Dbg("[%d],%d%d%d", strlen(pReqX->StrParamX), pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2],pReqX->StrParamX[strlen(pReqX->StrParamX)-1]);
  1641. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
  1642. Dbg("p len:%d", sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
  1643. SendPackage(pkt);
  1644. Dbg("the last of %d",i);
  1645. }
  1646. else
  1647. {
  1648. memcpy_s(pReqX->StrParamX, 50 * 1000, (const char*)csContent + 50 * 1000 * i, 50 * 1000);
  1649. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq)+50*1000);
  1650. Dbg("p len %d:%d,last 3:%d,%d,%d",i, sizeof(CrossCallReq) + 50 * 1000, pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2], pReqX->StrParamX[strlen(pReqX->StrParamX) - 1]);
  1651. SendPackage(pkt);
  1652. Dbg("the %d packet",i);
  1653. }
  1654. delete[] pBuf;
  1655. }
  1656. }
  1657. void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
  1658. {
  1659. int nLen = pRecvPkg->GetStructLen("FNTHAND");
  1660. if (nLen > 0) {
  1661. Dbg("nLen %d", nLen);
  1662. BYTE *pBuf = new BYTE[nLen+1];
  1663. memset(pBuf, 0, nLen+1);
  1664. int nArrayNum = 0;
  1665. if (pRecvPkg->GetStructData("FNTHAND", pBuf, &nLen, &nArrayNum)) {
  1666. Dbg("%s,%d,%d", pBuf, nLen, nArrayNum);
  1667. HandAns* pAns = (HandAns*)pBuf;
  1668. Dbg("hand recv %d events", nArrayNum);
  1669. for (int i = 0; i < nArrayNum; ++i)
  1670. {
  1671. bool bKnownEvent = true;
  1672. DWORD userEvtCode = 0;
  1673. unsigned long ulTmp = (pAns + i)->EventCode;
  1674. Dbg("event %d,param1 %s", ulTmp, (pAns + i)->param1);
  1675. switch (ulTmp)
  1676. {
  1677. case INC_GLOBAL_SETTING_SYNC:
  1678. userEvtCode = LOG_EVT_INC_GLOBAL_SETTING_SYNC;
  1679. break;
  1680. case INC_COMM_RECONNECT:
  1681. userEvtCode = LOG_EVT_INC_COMM_RECONNECT;
  1682. break;
  1683. case INC_START_REMOTE_CONTROL:
  1684. userEvtCode = LOG_EVT_INC_START_REMOTE_CONTROL;
  1685. break;
  1686. case INC_UPDATE_CHECK:
  1687. userEvtCode = LOG_EVT_INC_UPDATE_CHECK;
  1688. break;
  1689. case INC_RECOVER_SERVICE:
  1690. userEvtCode = LOG_EVT_INC_RECOVER_SERVICE;
  1691. break;
  1692. case INC_PAUSE_SERVICE:
  1693. userEvtCode = LOG_EVT_INC_PAUSE_SERVICE;
  1694. break;
  1695. case INC_AREA_SERVICE_SWITCH:
  1696. userEvtCode = LOG_EVT_INC_AREA_SERVICE_SWITCH;
  1697. break;
  1698. case INC_VERSION_ROLLBACK:
  1699. userEvtCode = LOG_EVT_INC_VERSION_ROLLBACK;
  1700. break;
  1701. case INC_BRIDGE:
  1702. userEvtCode = LOG_EVT_INC_BRIDGE;
  1703. break;
  1704. case INC_VEDIO_CONNECTING:
  1705. userEvtCode = LOG_EVT_INC_VEDIO_CONNECTING;
  1706. break;
  1707. case INC_TRADE_MANAGER_NORMAL:
  1708. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_NORMAL;
  1709. break;
  1710. case INC_TRADE_MANAGER_ON:
  1711. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_ON;
  1712. break;
  1713. case INC_TRADE_MANAGER_OFF:
  1714. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_OFF;
  1715. break;
  1716. case INC_DEVICE_LOCK_ON:
  1717. userEvtCode = LOG_EVT_INC_DEVICE_LOCK_ON;
  1718. break;
  1719. case INC_DEVICE_UNLOCK:
  1720. userEvtCode = LOG_EVT_INC_DEVICE_UNLOCK;
  1721. break;
  1722. case INC_DEVICE_KICK_OFF:
  1723. userEvtCode = LOG_EVT_INC_DEVICE_KICK_OFF;
  1724. break;
  1725. default:
  1726. bKnownEvent = false;
  1727. Dbg("unknown ins %d", ulTmp);
  1728. break;
  1729. }
  1730. if (bKnownEvent)
  1731. {
  1732. LogEvent(Severity_Middle, userEvtCode, (pAns + i)->param1);
  1733. }
  1734. }
  1735. }
  1736. else {
  1737. Dbg("invalid handshakeans packet!");
  1738. //OnDisconnect();
  1739. }
  1740. delete pBuf;
  1741. }
  1742. }
  1743. void CHeartBeatFSM::ProcessCardActive(CardActiveReq* req)
  1744. {
  1745. ProcessPreOnlineTask* ppTask = new ProcessPreOnlineTask(this, req);
  1746. GetEntityBase()->GetFunction()->PostThreadPoolTask(ppTask);
  1747. }
  1748. void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
  1749. {
  1750. if (req->type == 0)
  1751. LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2);
  1752. else if (req->type == 1)
  1753. ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos);
  1754. }
  1755. void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
  1756. {
  1757. LOG_FUNCTION();
  1758. int nLen = pRecvPkg->GetStructLen("INSREQX");
  1759. if (nLen > 0) {
  1760. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen %d", nLen);
  1761. BYTE *pBuf = new BYTE[nLen+1];
  1762. memset(pBuf, 0, nLen+1);
  1763. int nArrayNum = 0;
  1764. if (pRecvPkg->GetStructData("INSREQX", pBuf, &nLen, &nArrayNum)) {
  1765. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d,%d", pBuf, nLen, nArrayNum);
  1766. CardActiveReq* pAns = (CardActiveReq*)pBuf;
  1767. if (nArrayNum > 0)
  1768. {
  1769. CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
  1770. pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
  1771. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1772. m_pFSM->ProcessCardActive(pAns);
  1773. }
  1774. }
  1775. else {
  1776. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid insreqx packet!");
  1777. }
  1778. delete pBuf;
  1779. }
  1780. }
  1781. void HeartBeatConnection::PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg)
  1782. {
  1783. LOG_FUNCTION();
  1784. int nLen = pRecvPkg->GetStructLen("CRSSREQ");
  1785. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen: %d", nLen);
  1786. if (nLen > 0) {
  1787. BYTE *pBuf = new BYTE[nLen+1];
  1788. ZeroMemory(pBuf,nLen+1);
  1789. int nArrayNum = 0;
  1790. if (pRecvPkg->GetStructData("CRSSREQ", pBuf, &nLen, &nArrayNum)) {
  1791. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,array num:%d,last 3:%d,%d,%d", nLen, nArrayNum,pBuf[nLen-3], pBuf[nLen - 2], pBuf[nLen - 1]);
  1792. CrossCallReq* pAnsArray = (CrossCallReq*)pBuf;
  1793. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%x", ((CrossCallReq*)pBuf)->nEntityID);
  1794. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("num %x", ((CrossCallReq*)pBuf)->numOfBlobInParamX);
  1795. int tmpXLen = 0;
  1796. for (int i = 0; i < nArrayNum; ++i)
  1797. {
  1798. tmpXLen += strlen(pAnsArray[i].StrParamX);
  1799. }
  1800. tmpXLen += (sizeof(CrossCallReq)*nArrayNum);
  1801. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("tmpXLen:%d", tmpXLen);
  1802. BYTE *pAnsBuf = new BYTE[tmpXLen + 1];
  1803. ZeroMemory(pAnsBuf, tmpXLen + 1);
  1804. memcpy_s(pAnsBuf, tmpXLen+1, pBuf, tmpXLen);
  1805. CrossCallReq* pAns = (CrossCallReq*)pAnsBuf;
  1806. pAns->Appendix1 = pAnsArray->Appendix1;
  1807. pAns->Appendix2 = pAnsArray->Appendix2;
  1808. pAns->bTwoWay = pAnsArray->bTwoWay;
  1809. pAns->CallType = pAnsArray->CallType;
  1810. pAns->ErrorCode = pAnsArray->ErrorCode;
  1811. pAns->nEntityID = pAnsArray->nEntityID;
  1812. pAns->numOfBlobInParamX = pAnsArray->numOfBlobInParamX;
  1813. for (int i = 0; i < sizeof(pAns->lensOfBlobInParamX); i++)
  1814. pAns->lensOfBlobInParamX[i] = pAnsArray->lensOfBlobInParamX[i];
  1815. strcpy_s(pAns->FromTerminalNo, sizeof(pAns->FromTerminalNo), pAnsArray->FromTerminalNo);
  1816. strcpy_s(pAns->StrParam1, sizeof(pAns->StrParam1), pAnsArray->StrParam1);
  1817. strcpy_s(pAns->StrParam2, sizeof(pAns->StrParam2), pAnsArray->StrParam2);
  1818. strcpy_s(pAns->ToTerminalNo, sizeof(pAns->ToTerminalNo), pAnsArray->ToTerminalNo);
  1819. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%x",pAns->nEntityID);
  1820. for (int i = 0, start = 0; i < nArrayNum; ++i)
  1821. {
  1822. strcpy_s(pAns->StrParamX + start, tmpXLen - start, pAnsArray[i].StrParamX);
  1823. start += strlen(pAnsArray[i].StrParamX);
  1824. }
  1825. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("type:%x,from %s,to %s", pAns->CallType, pAns->FromTerminalNo, pAns->ToTerminalNo);
  1826. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nEntityID: %x", pAns->nEntityID);
  1827. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("appendix1: %d", pAns->Appendix1);
  1828. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("bTwoWay:[%d]", pAns->bTwoWay);
  1829. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("blobSN:[%d]", pAns->blobSN);
  1830. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param2:[%s]", pAns->StrParam2);
  1831. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param3:[%d]", pAns->Appendix2);//oiltest
  1832. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ErrorCode:[%x]", pAns->ErrorCode);//oiltest
  1833. m_pFSM->DoLocalProcessCrossCallTask(pAns, nLen);
  1834. }
  1835. else {
  1836. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid CRSSREQ packet!");
  1837. }
  1838. delete pBuf;
  1839. }
  1840. }
  1841. ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore)
  1842. {
  1843. //卡库用新地址
  1844. if(isCardStore)
  1845. {
  1846. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"ServerNew",m_servStr);
  1847. if (!m_servStr.IsNullOrEmpty())
  1848. {
  1849. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1850. if (aaServ.GetCount() >= 2)
  1851. {
  1852. m_servIP = aaServ[0];
  1853. m_port = atoi(aaServ[1]);
  1854. }
  1855. else
  1856. {
  1857. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1858. return Error_Param;
  1859. }
  1860. }
  1861. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d",(LPCTSTR)m_servIP,m_port);
  1862. }
  1863. else
  1864. {
  1865. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server",m_servStr);
  1866. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server_Backup",m_servStrB);
  1867. if (!m_servStr.IsNullOrEmpty())
  1868. {
  1869. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  1870. if (aaServ.GetCount() >= 2)
  1871. {
  1872. m_servIP = aaServ[0];
  1873. m_port = atoi(aaServ[1]);
  1874. }
  1875. else
  1876. {
  1877. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  1878. return Error_Param;
  1879. }
  1880. }
  1881. if (!m_servStrB.IsNullOrEmpty())
  1882. {
  1883. CAutoArray<CSimpleStringA> aaServB = m_servStrB.Split(' ');
  1884. if (aaServB.GetCount() >= 2)
  1885. {
  1886. m_servIPB = aaServB[0];
  1887. m_portB = atoi(aaServB[1]);
  1888. }
  1889. else
  1890. {
  1891. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("no backup(%s).",(LPCSTR)m_servStrB);
  1892. m_servIPB = m_servIP;
  1893. m_portB = m_port;
  1894. }
  1895. }
  1896. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s,%d;%s,%d",(LPCTSTR)m_servIP,m_port,(LPCTSTR)m_servIPB,m_portB);
  1897. }
  1898. return Error_Succeed;
  1899. }