AlarmFSM.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. #ifndef RVC_MOD_ALARM_FSM_H_
  2. #define RVC_MOD_ALARM_FSM_H_
  3. #include "SpBase.h"
  4. #include "SpFSM.h"
  5. #include "SpSecureClient.h"
  6. #include "Alarm.h"
  7. #include "IHttpFunc.h"
  8. #define USER_EVT_JMP_ALARMUP EVT_USER+1
  9. #define USER_EVT_JMP_ALARMSTATEUP EVT_USER+2
  10. #define USER_EVT_JMP_RELEASE EVT_USER+3
  11. #define USER_EVT_DISCONNECT EVT_USER+4
  12. #define USER_EVT_UPLOAD_ANS EVT_USER+5
  13. #define USER_EVT_ALARMSTATE_ANS EVT_USER+6
  14. #define USER_EVT_DISCONNECT_FAIL EVT_USER+7
  15. #define USER_EVT_DISCONNECT_SUCC EVT_USER+8
  16. #define USER_EVT_JMP_START EVT_USER+9
  17. #define USER_EVT_JMP_NEW_ALARM EVT_USER+10
  18. #define USER_EVT_SEND_ALARM EVT_USER+11
  19. #define WARN_ALARM_START_NEW_MODE 0x10700001 //启动新模式告警
  20. #define WARN_ALARM_START_OLD_MODE 0x10700002 //启动旧模式告警
  21. #define WARN_ALARM_SEND_FAIL 0x10700003 //长时间发送失败丢弃告警
  22. #define WARN_ALARM_PARSE_FAIL 0x10700004 //解析失败发送失败丢失告警
  23. #pragma pack(1)
  24. const int UPLOG_MAX_COUNT = 500;//队列长度
  25. //[StructName("ALARMUPLOAD")]
  26. struct AlarmUpload
  27. {
  28. char TerminalNo[16];
  29. char EntityName[32];
  30. char SN[20];
  31. #ifdef RVC_OS_WIN
  32. unsigned long LifeID;
  33. unsigned long Item;
  34. unsigned long UserCode;
  35. #else
  36. uint32_t LifeID;
  37. uint32_t Item;
  38. uint32_t UserCode;
  39. #endif
  40. char Level;
  41. char Description[512];
  42. };
  43. //[StructName("ALARMANS")]
  44. struct AlarmReply
  45. {
  46. int ResultCode;
  47. };
  48. // [StructName("ALARMSTATE")]
  49. struct AlarmStateUpload
  50. {
  51. char TerminalNo[16];
  52. #ifdef RVC_OS_WIN
  53. unsigned __int64 SN;
  54. #else
  55. unsigned long long SN;
  56. #endif
  57. unsigned long LifeID;
  58. unsigned long Item;
  59. char Level;
  60. char Description[512];
  61. };
  62. //[StructName("ALARMSTATEANS")]
  63. struct AlarmStateReply
  64. {
  65. int ResultCode;
  66. };
  67. #pragma pack()
  68. enum AlarmCtlCode
  69. {
  70. Finish = 0, //完成
  71. Error = 1, //错误
  72. };
  73. struct AlarmAnsEvent : public FSMEvent
  74. {
  75. AlarmAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_UPLOAD_ANS)
  76. {
  77. memcpy(&m_reply, pBuf, sizeof(AlarmReply));
  78. }
  79. virtual ~AlarmAnsEvent() {}
  80. AlarmReply m_reply;
  81. };
  82. struct AlarmStateAnsEvent : public FSMEvent
  83. {
  84. AlarmStateAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_ALARMSTATE_ANS)
  85. {
  86. memcpy(&m_reply, pBuf, sizeof(AlarmStateReply));
  87. }
  88. virtual ~AlarmStateAnsEvent() {}
  89. AlarmStateReply m_reply;
  90. };
  91. struct SendAlarmEvent:public FSMEvent
  92. {
  93. bool isSucc;//是否写入成功
  94. SendAlarmEvent(bool isSendSucc)
  95. : FSMEvent(USER_EVT_SEND_ALARM), isSucc(isSendSucc)
  96. {}
  97. };
  98. namespace HttpStruct
  99. {
  100. //发送文件hash列表接口
  101. struct SendAlarmTaskReq : CHTTPReq {
  102. string m_reqStr;
  103. string ToJson() {
  104. return m_reqStr;
  105. }
  106. };
  107. struct SendAlarmTaskRet : CHTTPRet {
  108. string m_retStr;
  109. bool Parse(string strData) {
  110. m_retStr=strData;
  111. return true;
  112. }
  113. };
  114. }
  115. class AlarmConnection;
  116. class AlarmFSM : public FSMImpl<AlarmFSM>, public IFSMStateHooker, public ISysVarListener
  117. {
  118. public:
  119. enum {s0,s1,s2,s3};
  120. BEGIN_FSM_STATE(AlarmFSM)
  121. FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event)
  122. FSM_STATE_ENTRY(s1, "AlarmUp", s1_on_entry, s1_on_exit, s1_on_event)
  123. FSM_STATE_ENTRY(s2, "AlarmStateUp", s2_on_entry, s2_on_exit, s2_on_event)
  124. FSM_STATE_ENTRY(s3, "Release", s3_on_entry, s3_on_exit, s3_on_event)
  125. END_FSM_STATE()
  126. BEGIN_FSM_RULE(AlarmFSM,s0)
  127. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_ALARMUP)
  128. //FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ALARMSTATEUP)
  129. //FSM_RULE_ENTRY_ANY(s1, s3, USER_EVT_JMP_RELEASE)
  130. FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_JMP_START)
  131. //FSM_RULE_ENTRY_ANY(s1, s0, EVT_TIMER)
  132. //FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_RELEASE)
  133. //FSM_RULE_ENTRY_ANY(s2, s0, EVT_TIMER)
  134. //FSM_RULE_ENTRY_ANY(s3, s0, EVT_TIMER)
  135. //FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_DISCONNECT)
  136. END_FSM_RULE()
  137. AlarmFSM();
  138. ~AlarmFSM();
  139. virtual void OnStateTrans(int iSrcState, int iDstState);
  140. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  141. virtual ErrorCodeEnum OnInit();
  142. virtual ErrorCodeEnum OnExit();
  143. void s0_on_entry();
  144. void s0_on_exit();
  145. unsigned int s0_on_event(FSMEvent* event);
  146. void s1_on_entry();
  147. void s1_on_exit();
  148. unsigned int s1_on_event(FSMEvent* event);
  149. void s2_on_entry();
  150. void s2_on_exit();
  151. unsigned int s2_on_event(FSMEvent* event);
  152. void s3_on_entry();
  153. void s3_on_exit();
  154. unsigned int s3_on_event(FSMEvent* event);
  155. //增加告警
  156. void add_alarm(alarm_t*alarm);
  157. //设置告警状态
  158. void set_alarm_state(const CUUID nLogID,DWORD LifeId,const SeverityLevelEnum eLevel,
  159. DWORD Item,const char *pszMessage);
  160. //增加历史告警
  161. void add_UploadedAlarm(alarm_t*alarm);
  162. bool is_UploadedAlarm_empty();
  163. //是否是已上传告警
  164. bool find_UploadedAlarm(alarm_t*alarm);
  165. bool update_UploadedAlarm(alarmUpgraded_t*alarm);
  166. //告警状态标志位
  167. BOOL m_b_alarmstate;
  168. //增加告警新接口
  169. void add_NewAlarm(alarm_t*alarm);
  170. //增加告警取出消息新接口
  171. alarm_t* removeAlarm();
  172. void closeClientConn();
  173. bool SendAlarm();
  174. int m_iEachSend;//每次发送数量
  175. long m_iRec;//累计收到的告警数目
  176. long m_iSend;//累计队列发送总数,新模式丢失这个数据统计
  177. long m_iThrow;//累计队列丢弃总数
  178. long m_iFail;//累计发送失败总次数
  179. long m_iSucc;//累计发送成功总次数
  180. vector<alarm_t*> m_NewUploading_alarm;//新的告警记录列表
  181. //modify by lwt
  182. CSimpleStringA m_unSendAlarm;//未发送出去的告警信息(json格式)
  183. int m_CenterModel;//集中配置模式 0:分行模式 1:总行模式
  184. CSimpleStringA m_topic;//总行kafka topic
  185. CSimpleStringA m_sendUrl;//总行告警url服务地址
  186. CSimpleStringA m_branchNo;//终端告警分行服务信息
  187. CSmallDateTime m_sendBeginTime;//告警每次发送开始时间
  188. int m_maxResendTime;//告警最大重发时间间隔(秒)
  189. int m_eachSum;//每批次条数
  190. CUUID m_uuid;//告警的UUID
  191. bool m_initAlarm;//初次化告警标志位
  192. static void HttpsLogCallBack(const char* logtxt);
  193. string alarmJson();
  194. #ifdef RVC_OS_WIN
  195. #else
  196. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len);
  197. #endif
  198. private:
  199. //获取告警数量
  200. bool is_alarm_empty();
  201. private:
  202. CRITICAL_SECTION cs;
  203. AlarmConnection *m_pConnection;
  204. struct list_head m_uploading_alarm;
  205. struct list_head m_uploaded_alarm;
  206. alarm_state_t m_uploading_alarmstate;
  207. CSimpleStringA m_terminalNo;
  208. int m_nDealWarningTime;
  209. };
  210. class AlarmConnection : public SpSecureClient
  211. {
  212. public:
  213. AlarmConnection(CEntityBase *pEntity, AlarmFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM) {}
  214. virtual ~AlarmConnection() {}
  215. void SendAlarm(alarm_t*alarm)
  216. {
  217. AlarmUpload alarmup = {0};
  218. CSystemStaticInfo si;
  219. {
  220. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  221. }
  222. strcpy(alarmup.TerminalNo, si.strTerminalID);
  223. strcpy(alarmup.EntityName, alarm->EntityName);
  224. strcpy(alarmup.SN,alarm->SN);
  225. alarmup.LifeID = alarm->LifeID;
  226. alarmup.Item = alarm->Item;
  227. alarmup.UserCode = alarm->UserCode;
  228. alarmup.Level = alarm->Level;
  229. strcpy(alarmup.Description, alarm->Description);
  230. CSmartPointer<IPackage> pkt = CreateNewPackage("WARNING");
  231. pkt->AddStruct("WARNING", false, false, (LPBYTE)&alarmup, sizeof(AlarmUpload));
  232. //SendPackage(pkt);
  233. if (SendPackage(pkt) == "")
  234. {
  235. //Dbg("send fail");
  236. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SendAlarm")("send fail");
  237. m_pFSM->m_iFail++;//失败计数
  238. //发送失败,断开连接
  239. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT_FAIL));//失败,等下次发送
  240. }else{
  241. //Dbg("send succ");
  242. }
  243. }
  244. void SendAlarmState(alarm_state_t*alarmstate)
  245. {
  246. AlarmStateUpload alarmstate0 = {0};
  247. CSystemStaticInfo si;
  248. {
  249. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  250. }
  251. strcpy(&alarmstate0.TerminalNo[0], si.strTerminalID);
  252. alarmstate0.SN = alarmstate->SN;
  253. alarmstate0.LifeID = alarmstate->LifeID;
  254. alarmstate0.Level = alarmstate->Level;
  255. alarmstate0.Item = alarmstate->Item;
  256. strcpy(&alarmstate0.Description[0], alarmstate->Description);
  257. CSmartPointer<IPackage> pkt = CreateNewPackage("STATE");
  258. pkt->AddStruct("STATE", false, false, (LPBYTE)&alarmstate, sizeof(AlarmUpload));
  259. SendPackage(pkt);
  260. }
  261. protected:
  262. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg) {
  263. string serviceCode = pRecvPkg->GetServiceCode();
  264. if (serviceCode == "WARNING")
  265. {
  266. //Dbg("rece ans 1");
  267. DWORD dwSysCode, dwUserCode;
  268. string strErrMsg;
  269. ErrorCodeEnum rc = Error_Succeed;
  270. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  271. {
  272. rc = (ErrorCodeEnum)dwSysCode;
  273. LogWarn(Severity_Low, rc, dwUserCode, CSimpleStringA::Format("create packet Fail!, %s", strErrMsg.c_str()));
  274. //跳出连接
  275. OnDisconnect();
  276. }else{
  277. //Dbg("rece ans 2");
  278. int nLen = pRecvPkg->GetStructLen("WANS");
  279. if (nLen > 0)
  280. {
  281. BYTE *pBuf = new BYTE[nLen];
  282. memset(pBuf, 0, nLen);
  283. int nArrayNum = 0;
  284. if (pRecvPkg->GetStructData("WANS", pBuf, &nLen, &nArrayNum))
  285. {
  286. //Dbg("rece ans 3");
  287. FSMEvent *evt = new AlarmAnsEvent(pBuf, nLen);
  288. AlarmAnsEvent *ans = (AlarmAnsEvent *)evt;
  289. if (ans->m_reply.ResultCode == Finish)
  290. {
  291. //Dbg("send finish!");
  292. m_pFSM->m_iSucc++;//成功计数
  293. }
  294. else if (ans->m_reply.ResultCode == Error)
  295. {
  296. m_pFSM->m_iFail++;//失败计数
  297. //Dbg("send error!");
  298. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer WARNING")("send error!");
  299. }
  300. delete evt;
  301. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_UPLOAD_ANS));//继续发送
  302. }
  303. else
  304. {
  305. //Dbg("create invalid alarm upans packet!");
  306. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer WARNING")("create invalid alarm upans packet!");
  307. OnDisconnect();
  308. //跳出连接
  309. }
  310. delete pBuf;
  311. }
  312. }
  313. }
  314. else if (serviceCode == "STATE")
  315. {
  316. int nLen = pRecvPkg->GetStructLen("SANS");
  317. if (nLen > 0)
  318. {
  319. BYTE *pBuf = new BYTE[nLen];
  320. memset(pBuf, 0, nLen);
  321. int nArrayNum = 0;
  322. if (pRecvPkg->GetStructData("SANS", pBuf, &nLen, &nArrayNum))
  323. {
  324. FSMEvent *evt = new AlarmStateAnsEvent(pBuf, nLen);
  325. AlarmStateAnsEvent *ans = (AlarmStateAnsEvent *)evt;
  326. if (ans->m_reply.ResultCode == Finish)
  327. {
  328. //Dbg("alarmstate upload finish!");
  329. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer STATE")("alarmstate upload finish!");
  330. }
  331. else if (ans->m_reply.ResultCode == Error)
  332. {
  333. //Dbg("alarmstate upload error!");
  334. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer STATE")("alarmstate upload error!");
  335. }
  336. delete evt;
  337. }
  338. else
  339. {
  340. //Dbg("create invalid alarmstate upans packet!");
  341. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer STATE")("create invalid alarmstate upans packet!");
  342. OnDisconnect();
  343. }
  344. delete pBuf;
  345. }
  346. }
  347. else
  348. {
  349. //Dbg("unknown service code!");
  350. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnPkgAnswer")("unknown service code!");
  351. OnDisconnect();
  352. //跳出连接
  353. }
  354. }
  355. virtual void OnDisconnect()
  356. {
  357. m_pFSM->m_iFail++;//失败计数
  358. m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_DISCONNECT_FAIL));
  359. }
  360. virtual void OnReceivePackage(IPackage *pRecvPkg)
  361. {
  362. //string serviceCode = pRecvPkg->GetServiceCode();
  363. //if (serviceCode == "WARNING")
  364. //{
  365. // Dbg("rece ans 1");
  366. // DWORD dwSysCode, dwUserCode;
  367. // string strErrMsg;
  368. // ErrorCodeEnum rc = Error_Succeed;
  369. // if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, strErrMsg))
  370. // {
  371. // rc = (ErrorCodeEnum)dwSysCode;
  372. // LogWarn(Severity_Low, rc, dwUserCode, CSimpleStringA::Format("create packet Fail!, %s", strErrMsg.c_str()));
  373. // //跳出连接
  374. // OnDisconnect();
  375. // }else{
  376. // Dbg("rece ans 2");
  377. // int nLen = pRecvPkg->GetStructLen("WANS");
  378. // if (nLen > 0)
  379. // {
  380. // BYTE *pBuf = new BYTE[nLen];
  381. // memset(pBuf, 0, nLen);
  382. // int nArrayNum = 0;
  383. // if (pRecvPkg->GetStructData("WANS", pBuf, &nLen, &nArrayNum))
  384. // {
  385. // Dbg("rece ans 3");
  386. // FSMEvent *evt = new AlarmAnsEvent(pBuf, nLen);
  387. // AlarmAnsEvent *ans = (AlarmAnsEvent *)evt;
  388. // if (ans->m_reply.ResultCode == Finish)
  389. // {
  390. // Dbg("alarm upload finish!");
  391. // }
  392. // else if (ans->m_reply.ResultCode == Error)
  393. // {
  394. // Dbg("alarm upload error!");
  395. // }
  396. // delete evt;
  397. // m_pFSM->PostEventFIFO(new FSMEvent(USER_EVT_UPLOAD_ANS));//继续发送
  398. // }
  399. // else
  400. // {
  401. // Dbg("create invalid alarm upans packet!");
  402. // OnDisconnect();
  403. // //跳出连接
  404. // }
  405. // delete pBuf;
  406. // }
  407. // }
  408. //}
  409. //else if (serviceCode == "STATE")
  410. //{
  411. // int nLen = pRecvPkg->GetStructLen("SANS");
  412. // if (nLen > 0)
  413. // {
  414. // BYTE *pBuf = new BYTE[nLen];
  415. // memset(pBuf, 0, nLen);
  416. // int nArrayNum = 0;
  417. // if (pRecvPkg->GetStructData("SANS", pBuf, &nLen, &nArrayNum))
  418. // {
  419. // FSMEvent *evt = new AlarmStateAnsEvent(pBuf, nLen);
  420. // AlarmStateAnsEvent *ans = (AlarmStateAnsEvent *)evt;
  421. // if (ans->m_reply.ResultCode == Finish)
  422. // {
  423. // Dbg("alarmstate upload finish!");
  424. // }
  425. // else if (ans->m_reply.ResultCode == Error)
  426. // {
  427. // Dbg("alarmstate upload error!");
  428. // }
  429. // delete evt;
  430. // }
  431. // else
  432. // {
  433. // Dbg("create invalid alarmstate upans packet!");
  434. // OnDisconnect();
  435. // }
  436. // delete pBuf;
  437. // }
  438. //}
  439. //else
  440. //{
  441. // Dbg("unknown service code!");
  442. // OnDisconnect();
  443. // //跳出连接
  444. //}
  445. }
  446. private:
  447. AlarmFSM *m_pFSM;
  448. };
  449. #endif //RVC_MOD_ALARM_FSM_H_