HeartBeatFSM.cpp 44 KB

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