ThreadCompareItemManager.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. #include "ThreadCompareItemManager.h"
  2. #include "GlobalInfo.h"
  3. #include "SystemConfig.h"
  4. #include "CompareItemThread.h"
  5. #include "ThreadPool.h"
  6. #include "FromMQTT.h"
  7. #include "commonDefine.h"
  8. /* 给对比项套一层壳,这个函数就是新的线程,在里面new出新的对比项实例,防止Qt报线程归属权错误
  9. 在函数中将对比项实例插入到线程管理器中 */
  10. void ThreadCompareItemManager::thread_compareItem(CalculateThreadInfo_t threadInfo)
  11. {
  12. auto pThread = new CompareItemThread(threadInfo);
  13. if(pThread == nullptr)
  14. {
  15. SPDLOG_ERROR("ThreadCompareItemManager: 创建对比项线程失败");
  16. return;
  17. }
  18. CompareItemManager.addCompareItemThread(pThread);
  19. /* 启动线程,就会一直阻塞在这里了 */
  20. pThread->thread_task();
  21. }
  22. ThreadCompareItemManager::ThreadCompareItemManager()
  23. {
  24. }
  25. ThreadCompareItemManager::~ThreadCompareItemManager()
  26. {
  27. }
  28. /* 线程函数 */
  29. void ThreadCompareItemManager::thread_CompareItemManager()
  30. {
  31. m_logger = spdlog::get("CompareItemManager");
  32. if(m_logger == nullptr)
  33. {
  34. fmt::print("ThreadCompareItemManager: CompareItemManager Logger not found.\n");
  35. return;
  36. }
  37. /* 创建定时器和事件循环 */
  38. m_pEventLoop = new QEventLoop();
  39. m_pTimer = new QTimer();
  40. // m_pTimer->setInterval(10000);
  41. m_pTimer->setTimerType(Qt::PreciseTimer);
  42. m_pTimer->setSingleShot(false); // 设置为非单次定时器
  43. /* 这里要设置直接连接,才会在子线程中调用槽函数 */
  44. connect(m_pTimer, &QTimer::timeout, this, &ThreadCompareItemManager::do_task, Qt::DirectConnection);
  45. /* 初始化webapi */
  46. m_webAPIUrl = GInfo.webAPIUrl();
  47. m_webAPIID = GInfo.webAPIID();
  48. m_webAPIAppType = GInfo.webApiAppType();
  49. if(!m_fromWebAPI.initWebApi(m_webAPIUrl, m_webAPIID, m_webAPIAppType))
  50. {
  51. SPDLOG_LOGGER_ERROR(m_logger, "ThreadCompareItemManager: 初始化WebAPI失败");
  52. return;
  53. }
  54. /* 获取MQTT发布订阅 */
  55. m_pubTopic = GInfo.mqttPubTopicCompareItem();
  56. initMQTT();
  57. /* 获取基础配置,目前只获取一次 */
  58. updateBaseSettings();
  59. SPDLOG_LOGGER_INFO(m_logger, "开启对比项管理线程");
  60. m_pTimer->start(2000);
  61. /* 连接mqtt服务 */
  62. m_pFromMQTT->connectToServer();
  63. m_pEventLoop->exec();
  64. SPDLOG_LOGGER_INFO(m_logger, "ThreadCompareItemManager: 线程结束");
  65. }
  66. /* 通过对比项ID和通道ID获取声卡通道信息 */
  67. OneSoundCardPCMInfo_t ThreadCompareItemManager::getSoundCardRoadInfo(int compareItemID, int roadNum)
  68. {
  69. std::lock_guard<std::mutex> lock(m_mutexCompareItemThreads);
  70. auto it = m_mapThreads.find(compareItemID);
  71. if(it == m_mapThreads.end())
  72. {
  73. SPDLOG_LOGGER_WARN(m_logger, "对比项线程不存在,ID: {}", compareItemID);
  74. return OneSoundCardPCMInfo_t();
  75. }
  76. auto compareInfo = it.value()->getThreadInfo().compareItemInfo;
  77. OneSoundCardPCMInfo_t roadInfo;
  78. for(const auto& road : compareInfo.mapRoad)
  79. {
  80. if(road.nCompareRoadNum == roadNum)
  81. {
  82. roadInfo = road.scRoadInfo;
  83. break;
  84. }
  85. }
  86. return roadInfo;
  87. }
  88. /* 任务函数 */
  89. void ThreadCompareItemManager::do_task()
  90. {
  91. /* 如果定时间隔小于10秒,则设置成10秒,一开始小是为了线程开启后立马执行一次 */
  92. if(m_pTimer->interval() < 2000)
  93. {
  94. m_pTimer->setInterval(2000);
  95. }
  96. /* 判断MQTT是否连接成功,未连接则再次连接 */
  97. if(m_pFromMQTT->connectState() != QMQTT::ConnectionState::STATE_CONNECTED)
  98. {
  99. SPDLOG_LOGGER_WARN(m_logger, "MQTT未连接,尝试重新连接");
  100. m_pFromMQTT->connectToServer();
  101. }
  102. /* ------------------------------------------------------------------
  103. * 处理对比项信息
  104. * ------------------------------------------------------------------ */
  105. processCompareItemInfo();
  106. /* ------------------------------------------------------------------
  107. * 更新检测时段
  108. * ------------------------------------------------------------------ */
  109. processDetectPeriodInfo();
  110. /* ------------------------------------------------------------------
  111. * 更新对比项信息到MQTT
  112. * ------------------------------------------------------------------ */
  113. updateCompareItemInfoToMQTT();
  114. }
  115. /* 添加对比项实例 */
  116. void ThreadCompareItemManager::addCompareItemThread(CompareItemThread* pThread)
  117. {
  118. if(pThread == nullptr)
  119. {
  120. SPDLOG_LOGGER_ERROR(m_logger, "添加对比项线程失败,线程指针为空");
  121. return;
  122. }
  123. std::lock_guard<std::mutex> lock(m_mutexCompareItemThreads);
  124. int compareItemID = pThread->getThreadInfo().compareItemInfo.nID;
  125. if(m_mapThreads.contains(compareItemID))
  126. {
  127. SPDLOG_LOGGER_WARN(m_logger, "对比项线程已存在,ID: {}", compareItemID);
  128. return; // 对比项线程已存在
  129. }
  130. m_mapThreads.insert(compareItemID, pThread);
  131. SPDLOG_LOGGER_INFO(m_logger, "添加对比项线程成功,ID: {}", compareItemID);
  132. }
  133. /* 更新基础设置信息,如数据库设置,噪音参数等 */
  134. bool ThreadCompareItemManager::updateBaseSettings()
  135. {
  136. /* 更新基础数据 */
  137. QMap<std::string, std::string> baseSettings;
  138. if(!m_fromWebAPI.getSystemConfig(baseSettings))
  139. {
  140. SPDLOG_LOGGER_ERROR(m_logger, "获取系统配置失败");
  141. return false;
  142. }
  143. /* 将获取到的配置转换成结构体 */
  144. SysConfig.parseConfigFromDatabase(baseSettings);
  145. /* 检测时段单独获取 */
  146. QMap<int, DetectPeriodConfig_t> mapDetectConfig;
  147. if(!m_fromWebAPI.getDetectPeriodConfig(mapDetectConfig))
  148. {
  149. SPDLOG_ERROR("获取对比项检测时段配置失败");
  150. return false;
  151. }
  152. SysConfig.setDetectPeriodConfig(mapDetectConfig);
  153. return true;
  154. }
  155. /* 对比项信息处理函数 */
  156. void ThreadCompareItemManager::processCompareItemInfo()
  157. {
  158. /* 获取对比项信息 */
  159. QList<CompareItemInfo_t> listNewItems;
  160. if(!m_fromWebAPI.getCompareItemInfo(listNewItems))
  161. {
  162. SPDLOG_LOGGER_DEBUG(m_logger, "ThreadCompareItemManager: 获取对比项失败");
  163. return;
  164. }
  165. checkCompareItemInfo(listNewItems, m_listCreateItems, m_listDeleteItems);
  166. SPDLOG_LOGGER_DEBUG(m_logger, "要退出的对比项个数: {}, 要创建的对比项个数: {}",
  167. m_listDeleteItems.size(), m_listCreateItems.size());
  168. /* 先删除已消失的对比项信息 */
  169. processDeleteCompareItemThreads(m_listDeleteItems);
  170. /* 更新需要更新的线程 */
  171. // updateRunningThreads(m_listUpdateItems);
  172. /* 再创建新的对比项线程 */
  173. createNewCompareItemThreads(m_listCreateItems);
  174. SPDLOG_LOGGER_DEBUG(m_logger, "当前对比项个数: {}", m_mapNowCompareItem.size());
  175. }
  176. /**
  177. * @brief 处理对比项信息,新获取的和已有的对比,会在这里更新 m_mapNowCompareItem 内容
  178. *
  179. * @param createList 创建列表
  180. * @param updateList 更新列表,根据对比项ID进行更新信息,没有更新列表了,对比项有更新就删除重建
  181. * @param deleteList 删除列表
  182. */
  183. void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& newList, QList<CompareItemInfo_t>& createList, QList<int>& deleteList)
  184. {
  185. createList.clear();
  186. // updateList.clear();
  187. deleteList.clear();
  188. m_mapNowCompareItem.clear();
  189. // QMap<int, CompareItemInfo_t> mapNowItems;
  190. /* 先从对比项线程中获取对比项信息 */
  191. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); ++it)
  192. {
  193. BaseCalculateThread* pThread = it.value();
  194. if(pThread == nullptr)
  195. {
  196. continue;
  197. }
  198. /* 获取对比项信息 */
  199. CompareItemInfo_t itemInfo = pThread->getThreadInfo().compareItemInfo;
  200. m_mapNowCompareItem.insert(itemInfo.nID, itemInfo);
  201. }
  202. /* 遍历新获取的对比项信息,找出需要新增的对比项和需要更新的对比项 */
  203. for(const CompareItemInfo_t& item : newList)
  204. {
  205. if(!m_mapNowCompareItem.contains(item.nID))
  206. {
  207. /* 判断这个是否被启用 */
  208. if(item.isEnable == false)
  209. {
  210. continue;
  211. }
  212. /* 新对比项,添加到创建列表 */
  213. createList.append(item);
  214. } else
  215. {
  216. /* 已有对比项,检查是否需要更新 */
  217. const CompareItemInfo_t& existingItem = m_mapNowCompareItem.value(item.nID);
  218. /* 先对比基础信息 */
  219. if(!existingItem.isEqualBase(item))
  220. {
  221. /* 基础信息不同,需要更新,也可能是被禁用了导致的不同 */
  222. if(item.isEnable == false)
  223. {
  224. /* 如果新对比项被禁用,则需要删除 */
  225. deleteList.append(item.nID);
  226. continue;
  227. }
  228. // updateList.append(item);
  229. deleteList.append(item.nID); // 先删除再创建
  230. createList.append(item); // 添加到创建列表
  231. continue;
  232. }
  233. /* 在对比对比项通道信息 */
  234. if(!existingItem.isEqualRoads(item))
  235. {
  236. /* 通道信息不同,需要更新 */
  237. // updateList.append(item);
  238. deleteList.append(item.nID); // 先删除再创建
  239. createList.append(item); // 添加到创建列表
  240. continue;
  241. }
  242. }
  243. }
  244. /* 遍历当前对比项信息,找出需要删除的对比项 */
  245. for(auto it : m_mapNowCompareItem)
  246. {
  247. bool isFound = false;
  248. for(const CompareItemInfo_t& newItem : newList)
  249. {
  250. if(it.nID == newItem.nID)
  251. {
  252. /* 找到对应的对比项,跳过 */
  253. isFound = true;
  254. break;
  255. }
  256. }
  257. if(!isFound)
  258. {
  259. /* 当前对比项不在新获取的对比项中,说明需要删除 */
  260. deleteList.append(it.nID);
  261. }
  262. }
  263. }
  264. /**
  265. * @brief 处理需要删除的对比项线程
  266. * 1、先处理已经停止的线程,理论上不会有这个内容了,在上次循环中已经处理过了
  267. * 2、再将这次列表中的对比项ID对应的线程设置为停止状态,待到下次循环再删除已经停止完成的线程
  268. *
  269. * @param deleteList
  270. */
  271. void ThreadCompareItemManager::processDeleteCompareItemThreads(const QList<int>& deleteList)
  272. {
  273. /* 先处理已经停止运行的线程,是上次循环停止的线程 */
  274. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end();)
  275. {
  276. BaseCalculateThread* pThread = it.value();
  277. if(pThread == nullptr)
  278. {
  279. SPDLOG_LOGGER_WARN(m_logger, "对比项线程指针为空,即将删除该线程指针");
  280. it = m_mapThreads.erase(it);
  281. continue;
  282. }
  283. if(pThread->getThreadInfo().threadState == EThreadState::State_Stopped)
  284. {
  285. /* 线程已经停止,直接删除 */
  286. SPDLOG_LOGGER_INFO(m_logger, "对比项线程 {} 已经停止,准备删除", pThread->getThreadInfo().compareItemInfo.strName.toStdString());
  287. delete pThread;
  288. it = m_mapThreads.erase(it);
  289. continue;
  290. }
  291. ++it;
  292. }
  293. /* 停止本次需要停止的线程 */
  294. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); )
  295. {
  296. int compareItemID = it.value()->getThreadInfo().compareItemInfo.nID;
  297. if(deleteList.contains(compareItemID))
  298. {
  299. std::string compareItemName = it.value()->getThreadInfo().compareItemInfo.strName.toStdString();
  300. /* 设置线程停止标志,阻塞等待线程停止,然后再删除 */
  301. it.value()->thread_stop_block();
  302. delete it.value();
  303. it.value() = nullptr; // 设置为nullptr,防止悬空指针
  304. it = m_mapThreads.erase(it); // 从列表中删除
  305. SPDLOG_LOGGER_INFO(m_logger, "对比项线程 {} 已删除", compareItemName);
  306. }else {
  307. ++it;
  308. }
  309. }
  310. }
  311. /* 更新正在运行的线程信息 */
  312. void ThreadCompareItemManager::updateRunningThreads(const QList<CompareItemInfo_t>& updateList)
  313. {
  314. if(updateList.isEmpty())
  315. {
  316. return;
  317. }
  318. for(const CompareItemInfo_t& item : updateList)
  319. {
  320. auto it = m_mapThreads.find(item.nID);
  321. if(it == m_mapThreads.end())
  322. {
  323. SPDLOG_LOGGER_WARN(m_logger, "对比项线程 {} 不存在,无法更新信息", item.strName.toStdString());
  324. continue;
  325. }
  326. BaseCalculateThread* pThread = it.value();
  327. if(pThread == nullptr)
  328. {
  329. continue;
  330. }
  331. CalculateThreadInfo_t threadInfo;
  332. threadInfo.compareItemInfo = item;
  333. pThread->updateThreadInfo(threadInfo);
  334. }
  335. }
  336. /* 创建新的线程 */
  337. bool ThreadCompareItemManager::createNewCompareItemThreads(const QList<CompareItemInfo_t>& createList)
  338. {
  339. if(createList.isEmpty())
  340. {
  341. // SPDLOG_LOGGER_DEBUG(m_logger, "没有新的对比项需要创建");
  342. return true;
  343. }
  344. for(auto& it : createList)
  345. {
  346. /* 创建新的对比项线程 */
  347. CalculateThreadInfo_t threadInfo;
  348. threadInfo.compareItemInfo = it;
  349. threadInfo.threadType = EThreadType::Type_CompareItem;
  350. threadInfo.threadState = EThreadState::State_Inited;
  351. CPPTP.add_task(&ThreadCompareItemManager::thread_compareItem, threadInfo);
  352. /* 创建线程对象 */
  353. // CompareItemThread* pThread = new CompareItemThread(threadInfo);
  354. // if(pThread == nullptr)
  355. // {
  356. // SPDLOG_LOGGER_ERROR(m_logger, "创建对比项线程 {} 失败", it.strName.toStdString());
  357. // return false;
  358. // }
  359. /* 启动线程 */
  360. // CPPTP.add_task(&CompareItemThread::threadTask, pThread);
  361. /* 添加到线程列表中 */
  362. // m_mapThreads.insert(it.nID, pThread);
  363. }
  364. return true;
  365. }
  366. /* 处理检测时段信息 */
  367. void ThreadCompareItemManager::processDetectPeriodInfo()
  368. {
  369. /* 获取计划信息 */
  370. QMap<int, DetectPeriodConfig_t> mapNewDetectConfig;
  371. if(!m_fromWebAPI.getDetectPeriodConfig(mapNewDetectConfig))
  372. {
  373. SPDLOG_LOGGER_ERROR(m_logger, "获取检测时段配置失败");
  374. return;
  375. }
  376. QMap<int, DetectPeriodConfig_t> mapUpdateDetectConfig;
  377. checkDetectPeriodInfo(m_mapDetectPeriod, mapNewDetectConfig, mapUpdateDetectConfig);
  378. /* 更新检测时段 */
  379. for(const auto& it : mapUpdateDetectConfig)
  380. {
  381. auto threadIt = m_mapThreads.find(it.nID);
  382. if(threadIt != m_mapThreads.end())
  383. {
  384. /* 找到对应的对比项线程,更新检测时段 */
  385. CompareItemThread* pThread = dynamic_cast<CompareItemThread*>(threadIt.value());
  386. if(pThread != nullptr)
  387. {
  388. pThread->setDetectPeriod(it);
  389. SPDLOG_LOGGER_TRACE(m_logger, "更新对比项 {} 的检测时段", pThread->getThreadInfo().compareItemInfo.strName.toStdString());
  390. }
  391. }
  392. }
  393. /* 更新当前检测时段信息 */
  394. m_mapDetectPeriod = mapNewDetectConfig;
  395. }
  396. /* 检查获取出更新的对比项信息 */
  397. void ThreadCompareItemManager::checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t>& nowDetectInfo, QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList)
  398. {
  399. for(const auto& it : newDetectInfo)
  400. {
  401. int compareItemID = it.nID;
  402. bool isFound = false;
  403. for(const auto& existingItem : nowDetectInfo)
  404. {
  405. if(existingItem.nID == compareItemID)
  406. {
  407. isFound = true;
  408. /* 已经存在的对比项,检查是否需要更新 */
  409. if(existingItem == it)
  410. {
  411. /* 对比项信息相同,不需要更新 */
  412. continue;
  413. } else
  414. {
  415. /* 对比项信息不同,需要更新 */
  416. updateList.insert(compareItemID, it);
  417. }
  418. return;
  419. }
  420. }
  421. if(isFound == false)
  422. {
  423. /* 新对比项,添加到更新列表 */
  424. updateList.insert(compareItemID, it);
  425. }
  426. }
  427. }
  428. /* 更新对比项信息到MQTT */
  429. void ThreadCompareItemManager::updateCompareItemInfoToMQTT()
  430. {
  431. QMap<int, CompareItemInfo_t> newMap;
  432. /* 获取当前的对比项信息 */
  433. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); ++it)
  434. {
  435. BaseCalculateThread* pThread = it.value();
  436. if(pThread == nullptr)
  437. {
  438. continue;
  439. }
  440. /* 获取对比项信息 */
  441. CompareItemInfo_t itemInfo = pThread->getThreadInfo().compareItemInfo;
  442. newMap.insert(itemInfo.nID, itemInfo);
  443. }
  444. /* 和之前的对比,对比项是否有更新,有更新则发送 */
  445. bool isUpdated = false;
  446. if(newMap.size() != m_mapMQTTItemInfo.size())
  447. {
  448. isUpdated = true;
  449. } else
  450. {
  451. /* 进一步对比相信信息 */
  452. for(const auto& newItem : newMap)
  453. {
  454. auto nowIt = m_mapMQTTItemInfo.find(newItem.nID);
  455. if(nowIt == m_mapMQTTItemInfo.end())
  456. {
  457. isUpdated = true;
  458. break;
  459. }
  460. /* 比较对比项通道数量和对比项名称 */
  461. if(nowIt.value().strName != newItem.strName || nowIt.value().mapRoad.size() != newItem.mapRoad.size())
  462. {
  463. isUpdated = true;
  464. break;
  465. }
  466. /* 挨个比较对比项通道信息 */
  467. for(const auto& road : newItem.mapRoad)
  468. {
  469. auto roadIt = nowIt.value().mapRoad.find(road.nCompareRoadNum);
  470. if(roadIt == nowIt.value().mapRoad.end() || roadIt.value().strCompareRoadName != road.strCompareRoadName)
  471. {
  472. isUpdated = true;
  473. break;
  474. }
  475. }
  476. }
  477. }
  478. if(isUpdated)
  479. {
  480. sendCompareItemInfoToMQTT(newMap);
  481. m_mapMQTTItemInfo = newMap;
  482. }
  483. }
  484. /* 发送到MQTT */
  485. void ThreadCompareItemManager::sendCompareItemInfoToMQTT(const QMap<int, CompareItemInfo_t>& mapCompareItem)
  486. {
  487. /* 生成发送的json文件 */
  488. nJson jsonArray = nJson::array();
  489. for(const auto& it : mapCompareItem)
  490. {
  491. /* 判断这个对比项是否启用,不启用就跳过 */
  492. if(it.isEnable == false)
  493. {
  494. continue;
  495. }
  496. nJson jsonItem;
  497. /* 对比项ID */
  498. jsonItem["compareItem_id"] = it.nID;
  499. /* 对比项名称 */
  500. jsonItem["compareItem_name"] = it.strName.toStdString();
  501. nJson josnItemRoads = nJson::array();
  502. for(const auto& road : it.mapRoad)
  503. {
  504. nJson jsonRoad;
  505. /* 对比项通道编号和名称 */
  506. jsonRoad["road_num"] = road.nCompareRoadNum;
  507. jsonRoad["road_name"] = road.strCompareRoadName.toStdString();
  508. /* 通道使用的声卡编号 */
  509. // jsonRoad["sound_card_num"] = road.scRoadInfo.nSoundCardNum;
  510. // jsonRoad["sound_card_road_num"] = road.scRoadInfo.roadInfo.nRoadNum;
  511. josnItemRoads.push_back(jsonRoad);
  512. }
  513. jsonItem["compareItem_roads"] = josnItemRoads;
  514. // /* 静音条件 */
  515. // jsonItem["silence_switch"] = it.paramMute.isEnable;
  516. // jsonItem["silence_threshold"] = it.paramMute.threshold.nThreshold;
  517. // jsonItem["silence_duration"] = it.paramMute.nLen;
  518. // jsonItem["silence_sensitivity"] = it.paramMute.nSensitivity;
  519. // /* 过载条件 */
  520. // jsonItem["overload_switch"] = it.paramOverload.isEnable;
  521. // jsonItem["overload_threshold"] = it.paramOverload.threshold.nThreshold;
  522. // jsonItem["overload_duration"] = it.paramOverload.nLen;
  523. // jsonItem["overload_sensitivity"] = it.paramOverload.nSensitivity;
  524. // /* 反相条件 */
  525. // jsonItem["reverse_switch"] = it.paramPhase.isEnable;
  526. // jsonItem["reverse_threshold"] = it.paramPhase.threshold.dThreshold;
  527. // jsonItem["reverse_duration"] = it.paramPhase.nLen;
  528. // jsonItem["reverse_sensitivity"] = it.paramPhase.nSensitivity;
  529. jsonArray.push_back(jsonItem);
  530. }
  531. /* 发送到MQTT */
  532. if(m_pFromMQTT->connectState() == QMQTT::ConnectionState::STATE_CONNECTED)
  533. {
  534. QByteArray jsonData = QByteArray::fromStdString(jsonArray.dump());
  535. if(!m_pFromMQTT->sendMessage(m_pubTopic, jsonData, 0, true))
  536. {
  537. SPDLOG_LOGGER_WARN(m_logger, "ThreadCompareItemManager: 发送对比项信息到MQTT失败");
  538. }else
  539. {
  540. SPDLOG_LOGGER_TRACE(m_logger, "ThreadCompareItemManager: 发送对比项信息到MQTT成功");
  541. }
  542. } else
  543. {
  544. SPDLOG_LOGGER_WARN(m_logger, "m_pFromMQTT 未连接到服务器,无法发送");
  545. }
  546. }
  547. /* 初始化MQTT */
  548. void ThreadCompareItemManager::initMQTT()
  549. {
  550. if(m_pFromMQTT == nullptr)
  551. {
  552. m_pFromMQTT = new FromMQTT();
  553. if(m_pFromMQTT == nullptr)
  554. {
  555. SPDLOG_LOGGER_ERROR(m_logger, "创建MQTT对象失败");
  556. return;
  557. }
  558. }
  559. /* 登陆MQTT */
  560. m_pFromMQTT->setIPAndPort(GInfo.mqttIP(), GInfo.mqttPort());
  561. // m_pFromMQTT->addSubcribe("LH_WEBINFO");
  562. m_pFromMQTT->setAutoReconnect(true);
  563. // m_pFromMQTT->connectToServer();
  564. // connect(m_pFromMQTT, &FromMQTT::signal_recvMessage, [this](const QMQTT::Message& message) {
  565. // SPDLOG_LOGGER_WARN(m_logger, "--------------------- 接收到MQTT消息: {}", message.topic().toStdString());
  566. // SPDLOG_LOGGER_WARN(m_logger, "消息内容: {}", message.payload().toStdString());
  567. // });
  568. SPDLOG_LOGGER_INFO(m_logger, "☆ 连接MQTT服务器: {}:{}, 对比项信息订阅主题: {}", GInfo.mqttIP().toStdString(), GInfo.mqttPort(), m_pubTopic.toStdString());
  569. }