AlarmFSM.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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("ALARMANS")]
  26. struct AlarmReply
  27. {
  28. int ResultCode;
  29. };
  30. //[StructName("ALARMSTATEANS")]
  31. struct AlarmStateReply
  32. {
  33. int ResultCode;
  34. };
  35. #pragma pack()
  36. enum AlarmCtlCode
  37. {
  38. Finish = 0, //完成
  39. Error = 1, //错误
  40. };
  41. struct AlarmAnsEvent : public FSMEvent
  42. {
  43. AlarmAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_UPLOAD_ANS)
  44. {
  45. memcpy(&m_reply, pBuf, sizeof(AlarmReply));
  46. }
  47. virtual ~AlarmAnsEvent() {}
  48. AlarmReply m_reply;
  49. };
  50. struct AlarmStateAnsEvent : public FSMEvent
  51. {
  52. AlarmStateAnsEvent(BYTE *pBuf, int nLen) : FSMEvent(USER_EVT_ALARMSTATE_ANS)
  53. {
  54. memcpy(&m_reply, pBuf, sizeof(AlarmStateReply));
  55. }
  56. virtual ~AlarmStateAnsEvent() {}
  57. AlarmStateReply m_reply;
  58. };
  59. struct SendAlarmEvent:public FSMEvent
  60. {
  61. bool isSucc;//是否写入成功
  62. SendAlarmEvent(bool isSendSucc)
  63. : FSMEvent(USER_EVT_SEND_ALARM), isSucc(isSendSucc)
  64. {}
  65. };
  66. namespace HttpStruct
  67. {
  68. //发送文件hash列表接口
  69. struct SendAlarmTaskReq : CHTTPReq {
  70. string m_reqStr;
  71. string ToJson() {
  72. return m_reqStr;
  73. }
  74. };
  75. struct SendAlarmTaskRet : CHTTPRet {
  76. string m_retStr;
  77. bool Parse(string strData) {
  78. m_retStr=strData;
  79. return true;
  80. }
  81. };
  82. }
  83. class AlarmConnection;
  84. class AlarmFSM : public FSMImpl<AlarmFSM>, public IFSMStateHooker, public ISysVarListener
  85. {
  86. public:
  87. enum {s0,s1,s2,s3};
  88. BEGIN_FSM_STATE(AlarmFSM)
  89. FSM_STATE_ENTRY(s0,"Starting",s0_on_entry,s0_on_exit,s0_on_event)
  90. FSM_STATE_ENTRY(s1, "AlarmUp", s1_on_entry, s1_on_exit, s1_on_event)
  91. FSM_STATE_ENTRY(s2, "AlarmStateUp", s2_on_entry, s2_on_exit, s2_on_event)
  92. FSM_STATE_ENTRY(s3, "Release", s3_on_entry, s3_on_exit, s3_on_event)
  93. END_FSM_STATE()
  94. BEGIN_FSM_RULE(AlarmFSM,s0)
  95. FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_JMP_ALARMUP)
  96. //FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_JMP_ALARMSTATEUP)
  97. //FSM_RULE_ENTRY_ANY(s1, s3, USER_EVT_JMP_RELEASE)
  98. FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_JMP_START)
  99. //FSM_RULE_ENTRY_ANY(s1, s0, EVT_TIMER)
  100. //FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_JMP_RELEASE)
  101. //FSM_RULE_ENTRY_ANY(s2, s0, EVT_TIMER)
  102. //FSM_RULE_ENTRY_ANY(s3, s0, EVT_TIMER)
  103. //FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_DISCONNECT)
  104. END_FSM_RULE()
  105. AlarmFSM();
  106. ~AlarmFSM();
  107. virtual void OnStateTrans(int iSrcState, int iDstState);
  108. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName);
  109. virtual ErrorCodeEnum OnInit();
  110. virtual ErrorCodeEnum OnExit();
  111. void s0_on_entry();
  112. void s0_on_exit();
  113. unsigned int s0_on_event(FSMEvent* event);
  114. void s1_on_entry();
  115. void s1_on_exit();
  116. unsigned int s1_on_event(FSMEvent* event);
  117. void s2_on_entry();
  118. void s2_on_exit();
  119. unsigned int s2_on_event(FSMEvent* event);
  120. void s3_on_entry();
  121. void s3_on_exit();
  122. unsigned int s3_on_event(FSMEvent* event);
  123. //增加告警新接口
  124. void add_NewAlarm(alarm_t*alarm);
  125. //增加告警取出消息新接口
  126. alarm_t* removeAlarm();
  127. int m_iEachSend;//每次发送数量
  128. long m_iRec;//累计收到的告警数目
  129. long m_iSend;//累计队列发送总数,新模式丢失这个数据统计
  130. long m_iThrow;//累计队列丢弃总数
  131. long m_iFail;//累计发送失败总次数
  132. long m_iSucc;//累计发送成功总次数
  133. vector<alarm_t*> m_NewUploading_alarm;//新的告警记录列表
  134. //modify by lwt
  135. CSimpleStringA m_unSendAlarm;//未发送出去的告警信息(json格式)
  136. int m_CenterModel;//集中配置模式 0:分行模式 2:总行模式
  137. CSimpleStringA m_topic;//总行kafka topic
  138. CSimpleStringA m_sendUrl;//总行告警url服务地址
  139. CSimpleStringA m_branchNo;//终端告警分行服务信息
  140. CSmallDateTime m_sendBeginTime;//告警每次发送开始时间
  141. int m_maxResendTime;//告警最大重发时间间隔(秒)
  142. int m_eachSum;//每批次条数
  143. CUUID m_uuid;//告警的UUID
  144. bool m_initAlarm;//初次化告警标志位
  145. static void HttpsLogCallBack(const char* logtxt);
  146. string alarmJson();
  147. private:
  148. private:
  149. CRITICAL_SECTION cs;
  150. struct list_head m_uploading_alarm;
  151. struct list_head m_uploaded_alarm;
  152. CSimpleStringA m_terminalNo;
  153. int m_nDealWarningTime;
  154. };
  155. #endif //RVC_MOD_ALARM_FSM_H_