ThreadCompareItemManager.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  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->threadTask();
  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. /* 添加对比项实例 */
  67. void ThreadCompareItemManager::addCompareItemThread(CompareItemThread* pThread)
  68. {
  69. if(pThread == nullptr)
  70. {
  71. SPDLOG_LOGGER_ERROR(m_logger, "添加对比项线程失败,线程指针为空");
  72. return;
  73. }
  74. std::lock_guard<std::mutex> lock(m_mutexCompareItemThreads);
  75. int compareItemID = pThread->getThreadInfo().compareItemInfo.nID;
  76. if(m_mapThreads.contains(compareItemID))
  77. {
  78. SPDLOG_LOGGER_WARN(m_logger, "对比项线程已存在,ID: {}", compareItemID);
  79. return; // 对比项线程已存在
  80. }
  81. m_mapThreads.insert(compareItemID, pThread);
  82. SPDLOG_LOGGER_INFO(m_logger, "添加对比项线程成功,ID: {}", compareItemID);
  83. }
  84. /* 通过对比项ID和通道ID获取声卡通道信息 */
  85. SoundCardRoadInfo_t ThreadCompareItemManager::getSoundCardRoadInfo(int compareItemID, int roadNum)
  86. {
  87. std::lock_guard<std::mutex> lock(m_mutexCompareItemThreads);
  88. auto it = m_mapThreads.find(compareItemID);
  89. if(it == m_mapThreads.end())
  90. {
  91. SPDLOG_LOGGER_WARN(m_logger, "对比项线程不存在,ID: {}", compareItemID);
  92. return SoundCardRoadInfo_t();
  93. }
  94. auto compareInfo = it.value()->getThreadInfo().compareItemInfo;
  95. SoundCardRoadInfo_t roadInfo;
  96. for(const auto& road : compareInfo.mapRoad)
  97. {
  98. if(road.nCompareRoadNum == roadNum)
  99. {
  100. roadInfo = road.scRoadInfo;
  101. break;
  102. }
  103. }
  104. return roadInfo;
  105. }
  106. /* 任务函数 */
  107. void ThreadCompareItemManager::do_task()
  108. {
  109. /* 如果定时间隔小于10秒,则设置成10秒,一开始小是为了线程开启后立马执行一次 */
  110. if(m_pTimer->interval() < 10000)
  111. {
  112. m_pTimer->setInterval(10000);
  113. }
  114. /* 判断MQTT是否连接成功,未连接则再次连接 */
  115. if(m_pFromMQTT->connectState() != QMQTT::ConnectionState::STATE_CONNECTED)
  116. {
  117. SPDLOG_LOGGER_WARN(m_logger, "MQTT未连接,尝试重新连接");
  118. m_pFromMQTT->connectToServer();
  119. }
  120. /* ------------------------------------------------------------------
  121. * 处理对比项信息
  122. * ------------------------------------------------------------------ */
  123. processCompareItemInfo();
  124. /* ------------------------------------------------------------------
  125. * 更新检测时段
  126. * ------------------------------------------------------------------ */
  127. processDetectPeriodInfo();
  128. /* ------------------------------------------------------------------
  129. * 更新对比项信息到MQTT
  130. * ------------------------------------------------------------------ */
  131. updateCompareItemInfoToMQTT();
  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_listUpdateItems, m_listDeleteItems);
  166. SPDLOG_LOGGER_DEBUG(m_logger, "要退出的对比项个数: {}, 要更新的对比项个数: {}, 要创建的对比项个数: {}",
  167. m_listDeleteItems.size(), m_listUpdateItems.size(), m_listCreateItems.size());
  168. /* 先删除已消失的对比项信息 */
  169. processDeleteCompareItemThreads(m_listDeleteItems);
  170. /* 更新需要更新的线程 */
  171. updateRunningThreads(m_listUpdateItems);
  172. /* 再创建新的对比项线程 */
  173. createNewCompareItemThreads(m_listCreateItems);
  174. }
  175. /**
  176. * @brief 处理对比项信息,新获取的和已有的对比,会在这里更新 m_mapNowCompareItem 内容
  177. *
  178. * @param createList 创建列表
  179. * @param updateList 更新列表,根据对比项ID进行更新信息
  180. * @param deleteList 删除列表
  181. */
  182. void ThreadCompareItemManager::checkCompareItemInfo(QList<CompareItemInfo_t>& newList, QList<CompareItemInfo_t>& createList, QList<CompareItemInfo_t>& updateList, QList<int>& deleteList)
  183. {
  184. createList.clear();
  185. updateList.clear();
  186. deleteList.clear();
  187. m_mapNowCompareItem.clear();
  188. // QMap<int, CompareItemInfo_t> mapNowItems;
  189. /* 先从对比项线程中获取对比项信息 */
  190. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); ++it)
  191. {
  192. BaseCalculateThread* pThread = it.value();
  193. if(pThread == nullptr)
  194. {
  195. continue;
  196. }
  197. /* 获取对比项信息 */
  198. CompareItemInfo_t itemInfo = pThread->getThreadInfo().compareItemInfo;
  199. m_mapNowCompareItem.insert(itemInfo.nID, itemInfo);
  200. }
  201. /* 遍历新获取的对比项信息,找出需要新增的对比项和需要更新的对比项 */
  202. for(const CompareItemInfo_t& item : newList)
  203. {
  204. if(!m_mapNowCompareItem.contains(item.nID))
  205. {
  206. /* 判断这个是否被启用 */
  207. if(item.isEnable == false)
  208. {
  209. continue;
  210. }
  211. /* 新对比项,添加到创建列表 */
  212. createList.append(item);
  213. } else
  214. {
  215. /* 已有对比项,检查是否需要更新 */
  216. const CompareItemInfo_t& existingItem = m_mapNowCompareItem.value(item.nID);
  217. /* 先对比基础信息 */
  218. if(!existingItem.isEqualBase(item))
  219. {
  220. /* 基础信息不同,需要更新,也可能是被禁用了导致的不同 */
  221. if(item.isEnable == false)
  222. {
  223. /* 如果新对比项被禁用,则需要删除 */
  224. deleteList.append(item.nID);
  225. continue;
  226. }
  227. updateList.append(item);
  228. continue;
  229. }
  230. /* 在对比对比项通道信息 */
  231. if(!existingItem.isEqualRoads(item))
  232. {
  233. /* 通道信息不同,需要更新 */
  234. updateList.append(item);
  235. continue;
  236. }
  237. }
  238. }
  239. /* 遍历当前对比项信息,找出需要删除的对比项 */
  240. for(auto it : m_mapNowCompareItem)
  241. {
  242. bool isFound = false;
  243. for(const CompareItemInfo_t& newItem : newList)
  244. {
  245. if(it.nID == newItem.nID)
  246. {
  247. /* 找到对应的对比项,跳过 */
  248. isFound = true;
  249. break;
  250. }
  251. }
  252. if(!isFound)
  253. {
  254. /* 当前对比项不在新获取的对比项中,说明需要删除 */
  255. deleteList.append(it.nID);
  256. }
  257. }
  258. }
  259. /**
  260. * @brief 处理需要删除的对比项线程
  261. * 1、先处理已经停止的线程
  262. * 2、再将这次列表中的对比项ID对应的线程设置为停止状态,待到下次循环再删除已经停止完成的线程
  263. *
  264. * @param deleteList
  265. */
  266. void ThreadCompareItemManager::processDeleteCompareItemThreads(const QList<int>& deleteList)
  267. {
  268. /* 先处理已经停止运行的线程 */
  269. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end();)
  270. {
  271. BaseCalculateThread* pThread = it.value();
  272. if(pThread == nullptr)
  273. {
  274. SPDLOG_LOGGER_WARN(m_logger, "对比项线程指针为空,即将删除该线程指针");
  275. it = m_mapThreads.erase(it);
  276. continue;
  277. }
  278. if(pThread->getThreadInfo().threadState == EThreadState::State_Stopped)
  279. {
  280. /* 线程已经停止,直接删除 */
  281. SPDLOG_LOGGER_INFO(m_logger, "对比项线程 {} 已经停止,准备删除", pThread->getThreadInfo().compareItemInfo.strName.toStdString());
  282. delete pThread;
  283. it = m_mapThreads.erase(it);
  284. continue;
  285. }
  286. ++it;
  287. }
  288. /* 停止本次需要停止的线程 */
  289. for(auto it : m_mapThreads)
  290. {
  291. int compareItemID = it->getThreadInfo().compareItemInfo.nID;
  292. if(deleteList.contains(compareItemID))
  293. {
  294. /* 设置线程停止标志 */
  295. it->stopThread();
  296. SPDLOG_LOGGER_INFO(m_logger, "对比项线程 {} 设置为停止状态", it->getThreadInfo().compareItemInfo.strName.toStdString());
  297. }
  298. }
  299. }
  300. /* 更新正在运行的线程信息 */
  301. void ThreadCompareItemManager::updateRunningThreads(const QList<CompareItemInfo_t>& updateList)
  302. {
  303. if(updateList.isEmpty())
  304. {
  305. return;
  306. }
  307. for(const CompareItemInfo_t& item : updateList)
  308. {
  309. auto it = m_mapThreads.find(item.nID);
  310. if(it == m_mapThreads.end())
  311. {
  312. SPDLOG_LOGGER_WARN(m_logger, "对比项线程 {} 不存在,无法更新信息", item.strName.toStdString());
  313. continue;
  314. }
  315. BaseCalculateThread* pThread = it.value();
  316. if(pThread == nullptr)
  317. {
  318. continue;
  319. }
  320. CalculateThreadInfo_t threadInfo;
  321. threadInfo.compareItemInfo = item;
  322. pThread->updateThreadInfo(threadInfo);
  323. }
  324. }
  325. /* 创建新的线程 */
  326. bool ThreadCompareItemManager::createNewCompareItemThreads(const QList<CompareItemInfo_t>& createList)
  327. {
  328. if(createList.isEmpty())
  329. {
  330. SPDLOG_LOGGER_DEBUG(m_logger, "没有新的对比项需要创建");
  331. return true;
  332. }
  333. for(auto& it : createList)
  334. {
  335. /* 创建新的对比项线程 */
  336. CalculateThreadInfo_t threadInfo;
  337. threadInfo.compareItemInfo = it;
  338. threadInfo.threadType = EThreadType::Type_CompareItem;
  339. threadInfo.threadState = EThreadState::State_Inited;
  340. CPPTP.add_task(&ThreadCompareItemManager::thread_compareItem, threadInfo);
  341. /* 创建线程对象 */
  342. // CompareItemThread* pThread = new CompareItemThread(threadInfo);
  343. // if(pThread == nullptr)
  344. // {
  345. // SPDLOG_LOGGER_ERROR(m_logger, "创建对比项线程 {} 失败", it.strName.toStdString());
  346. // return false;
  347. // }
  348. /* 启动线程 */
  349. // CPPTP.add_task(&CompareItemThread::threadTask, pThread);
  350. /* 添加到线程列表中 */
  351. // m_mapThreads.insert(it.nID, pThread);
  352. }
  353. return true;
  354. }
  355. /* 处理检测时段信息 */
  356. void ThreadCompareItemManager::processDetectPeriodInfo()
  357. {
  358. /* 获取计划信息 */
  359. QMap<int, DetectPeriodConfig_t> mapNewDetectConfig;
  360. if(!m_fromWebAPI.getDetectPeriodConfig(mapNewDetectConfig))
  361. {
  362. SPDLOG_LOGGER_ERROR(m_logger, "获取检测时段配置失败");
  363. return;
  364. }
  365. QMap<int, DetectPeriodConfig_t> mapUpdateDetectConfig;
  366. checkDetectPeriodInfo(mapNewDetectConfig, mapUpdateDetectConfig);
  367. /* 更新检测时段 */
  368. for(const auto& it : mapUpdateDetectConfig)
  369. {
  370. auto threadIt = m_mapThreads.find(it.nID);
  371. if(threadIt != m_mapThreads.end())
  372. {
  373. /* 找到对应的对比项线程,更新检测时段 */
  374. CompareItemThread* pThread = dynamic_cast<CompareItemThread*>(threadIt.value());
  375. if(pThread != nullptr)
  376. {
  377. pThread->setDetectPeriod(it);
  378. SPDLOG_LOGGER_TRACE(m_logger, "更新对比项 {} 的检测时段", pThread->getThreadInfo().compareItemInfo.strName.toStdString());
  379. }
  380. }
  381. }
  382. }
  383. /* 检查获取出更新的对比项信息 */
  384. void ThreadCompareItemManager::checkDetectPeriodInfo(QMap<int, DetectPeriodConfig_t> newDetectInfo, QMap<int, DetectPeriodConfig_t>& updateList)
  385. {
  386. for(const auto& it : newDetectInfo)
  387. {
  388. int compareItemID = it.nID;
  389. for(const auto& existingItem : m_mapDetectPeriod)
  390. {
  391. if(existingItem.nID == compareItemID)
  392. {
  393. /* 已经存在的对比项,检查是否需要更新 */
  394. if(existingItem == it)
  395. {
  396. /* 对比项信息相同,不需要更新 */
  397. continue;
  398. } else
  399. {
  400. /* 对比项信息不同,需要更新 */
  401. updateList.insert(compareItemID, it);
  402. }
  403. return;
  404. }
  405. }
  406. }
  407. }
  408. /* 更新对比项信息到MQTT */
  409. void ThreadCompareItemManager::updateCompareItemInfoToMQTT()
  410. {
  411. QMap<int, CompareItemInfo_t> newMap;
  412. /* 获取当前的对比项信息 */
  413. for(auto it = m_mapThreads.begin(); it != m_mapThreads.end(); ++it)
  414. {
  415. BaseCalculateThread* pThread = it.value();
  416. if(pThread == nullptr)
  417. {
  418. continue;
  419. }
  420. /* 获取对比项信息 */
  421. CompareItemInfo_t itemInfo = pThread->getThreadInfo().compareItemInfo;
  422. newMap.insert(itemInfo.nID, itemInfo);
  423. }
  424. /* 和之前的对比,对比项是否有更新,有更新则发送 */
  425. bool isUpdated = false;
  426. if(newMap.size() != m_mapMQTTItemInfo.size())
  427. {
  428. isUpdated = true;
  429. } else
  430. {
  431. /* 进一步对比相信信息 */
  432. for(const auto& newItem : newMap)
  433. {
  434. auto nowIt = m_mapMQTTItemInfo.find(newItem.nID);
  435. if(nowIt == m_mapMQTTItemInfo.end())
  436. {
  437. isUpdated = true;
  438. break;
  439. }
  440. /* 比较对比项通道数量和对比项名称 */
  441. if(nowIt.value().strName != newItem.strName || nowIt.value().mapRoad.size() != newItem.mapRoad.size())
  442. {
  443. isUpdated = true;
  444. break;
  445. }
  446. /* 挨个比较对比项通道信息 */
  447. for(const auto& road : newItem.mapRoad)
  448. {
  449. auto roadIt = nowIt.value().mapRoad.find(road.nCompareRoadNum);
  450. if(roadIt == nowIt.value().mapRoad.end() || roadIt.value().strCompareRoadName != road.strCompareRoadName)
  451. {
  452. isUpdated = true;
  453. break;
  454. }
  455. }
  456. }
  457. }
  458. if(isUpdated)
  459. {
  460. sendCompareItemInfoToMQTT(newMap);
  461. m_mapMQTTItemInfo = newMap;
  462. }
  463. }
  464. /* 发送到MQTT */
  465. void ThreadCompareItemManager::sendCompareItemInfoToMQTT(const QMap<int, CompareItemInfo_t>& mapCompareItem)
  466. {
  467. /* 生成发送的json文件 */
  468. nJson jsonArray = nJson::array();
  469. for(const auto& it : mapCompareItem)
  470. {
  471. /* 判断这个对比项是否启用,不启用就跳过 */
  472. if(it.isEnable == false)
  473. {
  474. continue;
  475. }
  476. nJson jsonItem;
  477. /* 对比项ID */
  478. jsonItem["compareItem_id"] = it.nID;
  479. /* 对比项名称 */
  480. jsonItem["compareItem_name"] = it.strName.toStdString();
  481. nJson josnItemRoads = nJson::array();
  482. for(const auto& road : it.mapRoad)
  483. {
  484. nJson jsonRoad;
  485. /* 对比项通道编号和名称 */
  486. jsonRoad["road_num"] = road.nCompareRoadNum;
  487. jsonRoad["road_name"] = road.strCompareRoadName.toStdString();
  488. /* 通道使用的声卡编号 */
  489. // jsonRoad["sound_card_num"] = road.scRoadInfo.nSoundCardNum;
  490. // jsonRoad["sound_card_road_num"] = road.scRoadInfo.roadInfo.nRoadNum;
  491. josnItemRoads.push_back(jsonRoad);
  492. }
  493. jsonItem["compareItem_roads"] = josnItemRoads;
  494. // /* 静音条件 */
  495. // jsonItem["silence_switch"] = it.paramMute.isEnable;
  496. // jsonItem["silence_threshold"] = it.paramMute.threshold.nThreshold;
  497. // jsonItem["silence_duration"] = it.paramMute.nLen;
  498. // jsonItem["silence_sensitivity"] = it.paramMute.nSensitivity;
  499. // /* 过载条件 */
  500. // jsonItem["overload_switch"] = it.paramOverload.isEnable;
  501. // jsonItem["overload_threshold"] = it.paramOverload.threshold.nThreshold;
  502. // jsonItem["overload_duration"] = it.paramOverload.nLen;
  503. // jsonItem["overload_sensitivity"] = it.paramOverload.nSensitivity;
  504. // /* 反相条件 */
  505. // jsonItem["reverse_switch"] = it.paramPhase.isEnable;
  506. // jsonItem["reverse_threshold"] = it.paramPhase.threshold.dThreshold;
  507. // jsonItem["reverse_duration"] = it.paramPhase.nLen;
  508. // jsonItem["reverse_sensitivity"] = it.paramPhase.nSensitivity;
  509. jsonArray.push_back(jsonItem);
  510. }
  511. /* 发送到MQTT */
  512. if(m_pFromMQTT->connectState() == QMQTT::ConnectionState::STATE_CONNECTED)
  513. {
  514. QByteArray jsonData = QByteArray::fromStdString(jsonArray.dump());
  515. if(!m_pFromMQTT->sendMessage(m_pubTopic, jsonData, 0, true))
  516. {
  517. SPDLOG_LOGGER_WARN(m_logger, "ThreadCompareItemManager: 发送对比项信息到MQTT失败");
  518. }else
  519. {
  520. SPDLOG_LOGGER_TRACE(m_logger, "ThreadCompareItemManager: 发送对比项信息到MQTT成功");
  521. }
  522. } else
  523. {
  524. SPDLOG_LOGGER_WARN(m_logger, "m_pFromMQTT 未连接到服务器,无法发送");
  525. }
  526. }
  527. /* 初始化MQTT */
  528. void ThreadCompareItemManager::initMQTT()
  529. {
  530. if(m_pFromMQTT == nullptr)
  531. {
  532. m_pFromMQTT = new FromMQTT();
  533. if(m_pFromMQTT == nullptr)
  534. {
  535. SPDLOG_LOGGER_ERROR(m_logger, "创建MQTT对象失败");
  536. return;
  537. }
  538. }
  539. /* 登陆MQTT */
  540. m_pFromMQTT->setIPAndPort(GInfo.mqttIP(), GInfo.mqttPort());
  541. // m_pFromMQTT->addSubcribe("LH_WEBINFO");
  542. m_pFromMQTT->setAutoReconnect(true);
  543. // m_pFromMQTT->connectToServer();
  544. // connect(m_pFromMQTT, &FromMQTT::signal_recvMessage, [this](const QMQTT::Message& message) {
  545. // SPDLOG_LOGGER_WARN(m_logger, "--------------------- 接收到MQTT消息: {}", message.topic().toStdString());
  546. // SPDLOG_LOGGER_WARN(m_logger, "消息内容: {}", message.payload().toStdString());
  547. // });
  548. SPDLOG_LOGGER_INFO(m_logger, "☆ 连接MQTT服务器: {}:{}, 对比项信息订阅主题: {}", GInfo.mqttIP().toStdString(), GInfo.mqttPort(), m_pubTopic.toStdString());
  549. }