AlarmFSM.cpp 17 KB

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