AlarmFSM.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. #include "stdafx.h"
  2. #include "AlarmFSM.h"
  3. #include "Event.h"
  4. #include "CommEntityRestful.hpp"
  5. #include "json/json.h"
  6. namespace Task
  7. {
  8. //发送告警
  9. struct SendAlarmTask : public ITaskSp{
  10. AlarmFSM* m_fsm;
  11. explicit SendAlarmTask(AlarmFSM* f) : m_fsm(f) {}
  12. void Process(){
  13. LOG_FUNCTION();
  14. //改为循环处理告警
  15. int logSum=0;
  16. while(true){
  17. if(m_fsm->m_NewUploading_alarm.empty()&&m_fsm->m_unSendAlarm.IsNullOrEmpty()){
  18. if(logSum>=1200){
  19. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("no warn,wait 1 hour");
  20. logSum=0;
  21. }else{
  22. logSum++;
  23. }
  24. Sleep(3000);//无重发和新的告警则等待
  25. continue;
  26. }
  27. logSum=0;
  28. #ifdef RVC_OS_WIN
  29. IHttpFunc* client;
  30. client = create_http(m_fsm->HttpsLogCallBack);
  31. bool isSendSucc=false;//查询是否成功标志
  32. if(SendAlarmTaskImpl(client)){
  33. isSendSucc = true;
  34. }else{
  35. isSendSucc = false;
  36. }
  37. client->Destory();
  38. #else
  39. bool isSendSucc=false;//查询是否成功标志
  40. if(SendAlarmTaskImpl()){
  41. isSendSucc = true;
  42. }else{
  43. isSendSucc = false;
  44. }
  45. #endif
  46. //m_fsm->PostEventFIFO(new SendAlarmEvent(isSendSucc));//返回处理结果
  47. if(isSendSucc){
  48. //成功
  49. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("send alarm statistic m_iRec=%d , m_iThrow=%d , UnSend=%d , m_iSucc=%d , m_iFail=%d",m_fsm->m_iRec,m_fsm->m_iThrow,m_fsm->m_NewUploading_alarm.size(),m_fsm->m_iSucc,m_fsm->m_iFail);
  50. if(!m_fsm->m_NewUploading_alarm.empty()){
  51. Sleep(2000);//赶紧发送
  52. continue;
  53. }else{
  54. Sleep(3000);//等待
  55. continue;
  56. }
  57. }else{
  58. //失败,超过未发送成功的告警时间间隔,丢弃告警信息
  59. CSmallDateTime endTime = CSmallDateTime::GetNow();
  60. if(((DWORD)endTime-(DWORD)m_fsm->m_sendBeginTime)>m_fsm->m_maxResendTime){
  61. m_fsm->m_unSendAlarm="";//置为空
  62. m_fsm->m_iFail = m_fsm->m_iFail+ m_fsm->m_eachSum ;//发送失败
  63. LogWarn(Severity_Low,Error_Exception,WARN_ALARM_SEND_FAIL,CSimpleStringA::Format("throw away alarm num= %d,m_iFail=%d,m_iThrow=%d",m_fsm->m_eachSum,m_fsm->m_iFail,m_fsm->m_iThrow));
  64. m_fsm->m_eachSum =0;//清空批次数量
  65. m_fsm->m_sendBeginTime = CSmallDateTime::GetNow();
  66. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("send alarm statistic m_iRec=%d , m_iThrow=%d , UnSend=%d , m_iSucc=%d , m_iFail=%d",m_fsm->m_iRec,m_fsm->m_iThrow,m_fsm->m_NewUploading_alarm.size(),m_fsm->m_iSucc,m_fsm->m_iFail);
  67. }
  68. Sleep(20*1000);//失败重发等待
  69. continue;
  70. }
  71. }
  72. }
  73. #ifdef RVC_OS_WIN
  74. bool SendAlarmTaskImpl(IHttpFunc* client){
  75. HttpStruct::SendAlarmTaskReq qTempReq;
  76. HttpStruct::SendAlarmTaskRet qTempRet;
  77. if(m_fsm->m_unSendAlarm.IsNullOrEmpty()){
  78. //组装新的json告警信息
  79. string strJson = m_fsm->alarmJson();
  80. if(strJson.empty()){
  81. return true;
  82. }else{
  83. qTempReq.m_reqStr = strJson.c_str();//请求参数
  84. m_fsm->m_unSendAlarm = strJson.c_str();
  85. m_fsm->m_sendBeginTime = CSmallDateTime::GetNow();
  86. }
  87. }else{
  88. //重发新的告警信息
  89. qTempReq.m_reqStr = m_fsm->m_unSendAlarm.GetData();//请求参数
  90. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("alarm retry send");
  91. }
  92. qTempReq.m_url=m_fsm->m_sendUrl.GetData();//访问地址
  93. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("alarm send =%s",qTempReq.m_reqStr.c_str());
  94. PROCESS_LINK_CONTEXT("LR0402107SendAlarmTask")
  95. if(!client->Post(qTempReq, qTempRet, &nextLink)){
  96. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask http req fail,url=%s",qTempReq.m_url.c_str());
  97. return false;//失败
  98. }
  99. Json::Reader reader;
  100. Json::Value rootRet;
  101. if (!reader.parse(qTempRet.m_retStr, rootRet, false))
  102. {
  103. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask parse resp is fail");
  104. return false;//失败
  105. }
  106. bool isSucc = rootRet["success"].asBool();
  107. if(isSucc){
  108. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is succ,m_eachSum=%d",m_fsm->m_eachSum);
  109. m_fsm->m_unSendAlarm="";//置为空
  110. m_fsm->m_iSucc = m_fsm->m_iSucc+ m_fsm->m_eachSum ;//发送成功
  111. m_fsm->m_eachSum = 0;//清空批次数量
  112. return true;//写入成功
  113. }else{
  114. CSimpleStringA errCode = rootRet["code"].asString().c_str();
  115. if(!errCode.IsNullOrEmpty()||errCode == "10101"){
  116. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is false,code = 10101");
  117. m_fsm->m_unSendAlarm="";//置为空
  118. m_fsm->m_iFail = m_fsm->m_iFail+ m_fsm->m_eachSum ;//发送失败
  119. LogWarn(Severity_Low,Error_Exception,WARN_ALARM_PARSE_FAIL,CSimpleStringA::Format("SendAlarmTask [success] is false,code = 10101,throw away alarm num= %d,m_iFail=%d",m_fsm->m_eachSum,m_fsm->m_iFail));
  120. m_fsm->m_eachSum = 0;//清空批次数量
  121. return true;//中文乱码解析失败,默认成功
  122. }else{
  123. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is false,code =%s",errCode);
  124. return false;//写入失败
  125. }
  126. }
  127. }
  128. #else
  129. bool SendAlarmTaskImpl() {
  130. HttpClientResponseResult result;
  131. HttpClientRequestConfig config(HttpRequestMethod::POST, m_fsm->m_sendUrl.GetData(), &SpGetToken);
  132. string reqStr = "";
  133. if(m_fsm->m_unSendAlarm.IsNullOrEmpty()){
  134. //组装新的json告警信息
  135. string strJson = m_fsm->alarmJson();
  136. if(strJson.empty()){
  137. return true;
  138. }else{
  139. reqStr = strJson.c_str();//请求参数
  140. m_fsm->m_unSendAlarm = strJson.c_str();
  141. m_fsm->m_sendBeginTime = CSmallDateTime::GetNow();
  142. }
  143. }else{
  144. //重发新的告警信息
  145. reqStr = m_fsm->m_unSendAlarm.GetData();//请求参数
  146. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("alarm retry send");
  147. }
  148. config.SetJsonBody(reqStr);
  149. RestfulClient client = RestfulClient::getInstance();
  150. PROCESS_LINK_CONTEXT("LR0402107SendAlarmTask");
  151. config.PreDo();
  152. client.Do(&config, &result, &nextLink);
  153. //判断结果
  154. if(result.ResponseOK()){
  155. //解析返回字符串
  156. Json::Reader reader;
  157. Json::Value rootRet;
  158. if (!reader.parse(result.content, rootRet, false))
  159. {
  160. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask parse resp is fail");
  161. return false;//失败
  162. }
  163. bool isSucc = rootRet["success"].asBool();
  164. if(isSucc){
  165. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is succ,m_eachSum=%d",m_fsm->m_eachSum);
  166. m_fsm->m_unSendAlarm="";//置为空
  167. m_fsm->m_iSucc = m_fsm->m_iSucc+ m_fsm->m_eachSum ;//发送成功
  168. m_fsm->m_eachSum = 0;//清空批次数量
  169. return true;//写入成功
  170. }else{
  171. CSimpleStringA errCode = rootRet["code"].asString().c_str();
  172. if(!errCode.IsNullOrEmpty()||errCode == "10101"){
  173. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is false,code = 10101");
  174. m_fsm->m_unSendAlarm="";//置为空
  175. m_fsm->m_iFail = m_fsm->m_iFail+ m_fsm->m_eachSum ;//发送失败
  176. LogWarn(Severity_Low,Error_Exception,WARN_ALARM_PARSE_FAIL,CSimpleStringA::Format("SendAlarmTask [success] is false,code = 10101,throw away alarm num= %d,m_iFail=%d",m_fsm->m_eachSum,m_fsm->m_iFail));
  177. m_fsm->m_eachSum = 0;//清空批次数量
  178. return true;//中文乱码解析失败,默认成功
  179. }else{
  180. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask [success] is false,code =%s",errCode);
  181. return false;//写入失败
  182. }
  183. }
  184. }
  185. else {
  186. std::string errDetail(result.WhatError());
  187. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SendAlarmTask http req fail,error=[%s],url=%s", errDetail.c_str(), m_fsm->m_sendUrl.GetData());
  188. return false;//失败
  189. }
  190. return true;
  191. }
  192. #endif
  193. };
  194. }
  195. AlarmFSM::AlarmFSM()
  196. {
  197. InitializeCriticalSection(&cs);
  198. INIT_LIST_HEAD(&m_uploading_alarm);
  199. INIT_LIST_HEAD(&m_uploaded_alarm);
  200. m_iEachSend=0;//每次连接发送的数量
  201. m_iRec=0;//累计收到的告警数目
  202. m_iSend=0;//累计队列发送总数
  203. m_iThrow=0;//累计队列丢弃总数
  204. m_iFail=0;//累计发送失败总次数
  205. m_iSucc=0;//累计发送成功总次数
  206. m_CenterModel=2;
  207. m_maxResendTime=120;
  208. m_eachSum=0;
  209. m_initAlarm=false;
  210. }
  211. AlarmFSM::~AlarmFSM()
  212. {
  213. DeleteCriticalSection(&cs);
  214. }
  215. void AlarmFSM::OnStateTrans( int iSrcState, int iDstState )
  216. {
  217. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("trans from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  218. }
  219. void AlarmFSM::OnSysVarEvent( const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName )
  220. {
  221. }
  222. ErrorCodeEnum AlarmFSM::OnInit()
  223. {
  224. AddStateHooker(this);
  225. //......
  226. CSmartPointer<IEntityFunction> spFunction = m_pEntity->GetFunction();
  227. CSmartPointer<IConfigInfo> spConfig;
  228. ErrorCodeEnum Error = spFunction->OpenConfig(Config_CenterSetting, spConfig);
  229. if (Error_Succeed == Error)
  230. {
  231. Error = spConfig->ReadConfigValueInt("Alarm", "DealWarningTime", m_nDealWarningTime);
  232. if (Error_Succeed == Error)
  233. {
  234. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get DealWarningTime=%d from CenterSetting.ini", m_nDealWarningTime);
  235. }
  236. else
  237. {
  238. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get DealWarningTime from CenterSetting.ini failed");
  239. }
  240. m_CenterModel = 2;
  241. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init use default value CenterModel=2");
  242. int maxResendTime = 120;
  243. Error = spConfig->ReadConfigValueInt("Alarm", "maxResendTime", maxResendTime);
  244. if(Error==Error_Succeed){
  245. if (maxResendTime > 0) {
  246. m_maxResendTime = maxResendTime;
  247. }
  248. else {
  249. m_maxResendTime = 120;
  250. }
  251. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini maxResendTime=%d", m_maxResendTime);
  252. }else{
  253. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini maxResendTime failed");
  254. }
  255. CSimpleStringA str="";
  256. Error = spConfig->ReadConfigValue("Alarm", "topic", str);
  257. if(Error==Error_Succeed){
  258. m_topic = str;
  259. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini topic=%s",str.GetData());
  260. }else{
  261. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini topic failed");
  262. }
  263. Error = spConfig->ReadConfigValue("Alarm", "sendUrl", str);
  264. if(Error==Error_Succeed){
  265. m_sendUrl = str;
  266. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini sendUrl=%s",str.GetData());
  267. }else{
  268. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini sendUrl failed");
  269. }
  270. Error = spConfig->ReadConfigValue("Alarm", "branchNo", str);
  271. if(Error==Error_Succeed){
  272. m_branchNo = str;
  273. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini branchNo=%s",str.GetData());
  274. }else{
  275. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("init read CenterSetting.ini branchNo failed");
  276. }
  277. } else {
  278. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open CenterSetting.ini failed");
  279. }
  280. if (m_nDealWarningTime == 0)
  281. {
  282. m_nDealWarningTime = 10;
  283. }
  284. if(m_branchNo.IsNullOrEmpty()){
  285. m_branchNo = "000";//默认是000总行分行号
  286. }
  287. return Error_Succeed;
  288. }
  289. ErrorCodeEnum AlarmFSM::OnExit()
  290. {
  291. return Error_Succeed;
  292. }
  293. void AlarmFSM::s0_on_entry()
  294. {
  295. if(!m_initAlarm){
  296. m_initAlarm=true;
  297. LogWarn(Severity_Low,Error_Exception,WARN_ALARM_START_NEW_MODE,CSimpleStringA::Format("init alarm new model,model=%d",m_CenterModel));
  298. }
  299. //新模式
  300. PostEventLIFO(new FSMEvent(USER_EVT_JMP_NEW_ALARM));//跳转新模式发送
  301. }
  302. void AlarmFSM::s0_on_exit()
  303. {
  304. CancelTimer(1);
  305. CancelTimer(2);
  306. }
  307. unsigned int AlarmFSM::s0_on_event( FSMEvent* event )
  308. {
  309. if (event->iEvt == EVT_TIMER)
  310. {
  311. if(event->param1 == 2){
  312. //开始启动调用发送线程
  313. Task::SendAlarmTask* alarmTask = new Task::SendAlarmTask(this);
  314. ErrorCodeEnum rc = m_pEntity->GetFunction()->PostThreadPoolTask(alarmTask);
  315. if(rc!=Error_Succeed){
  316. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s0 create SendAlarmTask is fail,%d",(int)rc);
  317. ScheduleTimer(2, 10*1000);//等待一段时间
  318. }
  319. }
  320. }else if (event->iEvt == USER_EVT_JMP_NEW_ALARM){
  321. //开始启动调用发送线程
  322. Task::SendAlarmTask* alarmTask = new Task::SendAlarmTask(this);
  323. ErrorCodeEnum rc = m_pEntity->GetFunction()->PostThreadPoolTask(alarmTask);
  324. if(rc!=Error_Succeed){
  325. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s0 create SendAlarmTask is fail,%d",(int)rc);
  326. ScheduleTimer(2, 10*1000);//等待一段时间
  327. }
  328. }
  329. return 0;
  330. }
  331. void AlarmFSM::s1_on_entry()
  332. {
  333. }
  334. void AlarmFSM::s1_on_exit()
  335. {
  336. CancelTimer(2);
  337. }
  338. unsigned int AlarmFSM::s1_on_event(FSMEvent* event)
  339. {
  340. return 0;
  341. }
  342. void AlarmFSM::s2_on_entry()
  343. {
  344. }
  345. void AlarmFSM::s2_on_exit()
  346. {
  347. }
  348. unsigned int AlarmFSM::s2_on_event(FSMEvent* event)
  349. {
  350. return 0;
  351. }
  352. void AlarmFSM::s3_on_entry()
  353. {
  354. }
  355. void AlarmFSM::s3_on_exit()
  356. {
  357. }
  358. unsigned int AlarmFSM::s3_on_event(FSMEvent* event)
  359. {
  360. return 0;
  361. }
  362. static time_t NowTime()
  363. {
  364. time_t t_Now = time(0);
  365. struct tm* tm_Now = localtime(&t_Now);
  366. /*tm_Now->tm_hour =0;
  367. tm_Now->tm_min = 0;
  368. tm_Now->tm_sec = 0;*/
  369. return mktime(tm_Now);
  370. }
  371. //增加消息到新告警列表
  372. void AlarmFSM::add_NewAlarm(alarm_t* alarm)
  373. {
  374. EnterCriticalSection(&cs);
  375. if(m_NewUploading_alarm.size()>=UPLOG_MAX_COUNT){
  376. m_iThrow++;
  377. alarm_t* oldAlarm = (alarm_t*)(*m_NewUploading_alarm.begin());//集合首个元素
  378. m_NewUploading_alarm.erase(m_NewUploading_alarm.begin());//集合删除首元素
  379. free(oldAlarm->Description);
  380. oldAlarm->Description=NULL;
  381. free(oldAlarm->EntityName);
  382. oldAlarm->EntityName=NULL;
  383. free(oldAlarm->SN);
  384. oldAlarm->SN=NULL;
  385. free(oldAlarm->warnTime);
  386. oldAlarm->warnTime=NULL;
  387. delete oldAlarm;
  388. oldAlarm=NULL;
  389. }
  390. m_NewUploading_alarm.push_back(alarm);//加入队列
  391. LeaveCriticalSection(&cs);
  392. }
  393. //取出消息从新告警列表
  394. alarm_t* AlarmFSM::removeAlarm()
  395. {//加锁,取出先进的队列日志,注意释放内存空间
  396. alarm_t* dAlarm = NULL;
  397. EnterCriticalSection(&cs);
  398. if(m_NewUploading_alarm.empty()){
  399. //return NULL;
  400. }else{
  401. dAlarm = (alarm_t*)(*m_NewUploading_alarm.begin());//集合首个元素
  402. m_NewUploading_alarm.erase(m_NewUploading_alarm.begin());//集合删除首元素
  403. }
  404. LeaveCriticalSection(&cs);
  405. return dAlarm;//返回
  406. }
  407. void AlarmFSM::HttpsLogCallBack(const char* logtxt)
  408. {
  409. DbgWithLink(LOG_LEVEL_DEBUG,LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("http dbg: %s",logtxt);
  410. }
  411. std::string AlarmFSM::alarmJson()
  412. {
  413. vector<alarm_t*> unSendAlarm;
  414. string jsonStr ="";
  415. EnterCriticalSection(&cs);
  416. alarm_t* dAlarm = NULL;
  417. for(int i = 0 ;i<16;i++){
  418. if(m_NewUploading_alarm.empty()){
  419. break;
  420. }else{
  421. dAlarm = (alarm_t*)(*m_NewUploading_alarm.begin());//集合首个元素
  422. m_NewUploading_alarm.erase(m_NewUploading_alarm.begin());//集合删除首元素
  423. unSendAlarm.push_back(dAlarm);
  424. }
  425. }
  426. LeaveCriticalSection(&cs);
  427. if(unSendAlarm.size()==0){
  428. return jsonStr;//无发送直接返回空
  429. }
  430. Json::Value root;
  431. Json::Value arraylist;//消息列表
  432. Json::FastWriter fw;//写入对象
  433. int i = 0;
  434. CSystemStaticInfo si;
  435. {
  436. m_pEntity->GetFunction()->GetSystemStaticInfo(si);
  437. }
  438. for(auto iter = unSendAlarm.begin(); iter!=unSendAlarm.end(); iter++){
  439. Json::Value rootAlarm;
  440. Json::FastWriter fwAlarm;//写入对象
  441. alarm_t* alarmt = *iter;
  442. m_uuid =CUUID::Create(m_uuid);
  443. rootAlarm["IDKey"] = m_uuid.ToString().GetData();
  444. rootAlarm["BranchNo"] = m_branchNo.GetData();
  445. rootAlarm["TerminalNo"] = si.strTerminalID.GetData();
  446. rootAlarm["EntityName"] = alarmt->EntityName;
  447. rootAlarm["Item"] = CSimpleStringA::Format("%016llx", alarmt->Item).SubString(8,8).GetData();//16进制取后面八位
  448. char Level[2];
  449. sprintf(Level, "%c", alarmt->Level);
  450. rootAlarm["Level"] = CSimpleStringA::Format("%s",Level).GetData();
  451. rootAlarm["LifeID"] = CSimpleStringA::Format("%016llx", alarmt->LifeID).SubString(8,8).GetData();//16进制取后面八位
  452. rootAlarm["SN"] = alarmt->SN;
  453. rootAlarm["UserCode"] = CSimpleStringA::Format("%016llx", alarmt->UserCode).SubString(8,8).GetData();//16进制取后面八位
  454. rootAlarm["WarningTime"] = CSimpleStringA::Format("%s", alarmt->warnTime).GetData();
  455. rootAlarm["Description"] = CSimpleStringA::Format("%s", alarmt->Description).GetData();
  456. //增加终端版本号字段
  457. rootAlarm["VersionNo"] = si.InstallVersion.ToString().GetData();
  458. string alarmJsonStr = fwAlarm.write(rootAlarm);
  459. //DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("alarmJsonStr=%s",alarmJsonStr.c_str());
  460. arraylist[i]=alarmJsonStr.c_str();
  461. i++;
  462. }
  463. root["message_list"] = arraylist;
  464. root["topic"]=m_topic.GetData();
  465. jsonStr = fw.write(root);
  466. m_eachSum = i;
  467. //清理内存
  468. while(true){
  469. if(unSendAlarm.empty()){
  470. break;
  471. }else{
  472. dAlarm = (alarm_t*)(*unSendAlarm.begin());//集合首个元素
  473. unSendAlarm.erase(unSendAlarm.begin());//集合删除首元素
  474. }
  475. free(dAlarm->Description);
  476. dAlarm->Description=NULL;
  477. free(dAlarm->EntityName);
  478. dAlarm->EntityName=NULL;
  479. free(dAlarm->SN);
  480. dAlarm->SN=NULL;
  481. free(dAlarm->warnTime);
  482. dAlarm->warnTime=NULL;
  483. delete dAlarm;
  484. dAlarm=NULL;
  485. }
  486. return jsonStr;
  487. }