ACAServer.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include "ACAServer.h"
  2. #include "GlobalInfo.h"
  3. #include "commonDefine.h"
  4. #include "SoundCardData.h"
  5. #include "SystemConfig.h"
  6. #include "ThreadPool.h"
  7. #include <QFile>
  8. #include <QString>
  9. #include <QCoreApplication>
  10. #include <QSettings>
  11. ACAServer::ACAServer()
  12. {
  13. m_logger = spdlog::get("ACAServer");
  14. if(m_logger == nullptr)
  15. {
  16. fmt::print("ACAServer logger is nullptr");
  17. return;
  18. }
  19. connect(&m_fromMQTT, &FromMQTT::signal_recvMessage, this, &ACAServer::do_receiveMQTTMessage);
  20. }
  21. ACAServer::~ACAServer()
  22. {
  23. if(m_threadCompareItemManager != nullptr) {
  24. delete m_threadCompareItemManager;
  25. m_threadCompareItemManager = nullptr;
  26. }
  27. }
  28. /* 初始化基础信息 */
  29. bool ACAServer::initGlobalInfo()
  30. {
  31. /*------------------------------------------------------------------------------------*/
  32. /* 读取配置文件 */
  33. if(!readConfigFile()) {
  34. spdlog::error("读取配置文件失败");
  35. return false;
  36. }
  37. /* 设置MQTT服务器信息 */
  38. GInfo.setMqttInfo(m_mqttIP, m_mqttPort);
  39. /* 连接MQTT */
  40. m_fromMQTT.setIPAndPort(m_mqttIP, m_mqttPort);
  41. m_fromMQTT.addSubcribe(m_webapiTopic, 0); // 订阅WebAPI主题
  42. m_fromMQTT.connectToServer();
  43. /* 等待mqtt回复webapi信息 */
  44. if(!waitForWebAPIReply())
  45. {
  46. return false;
  47. }
  48. /* 设置WebAPI信息 */
  49. m_webAPIID = "cf6b57fa3d9841e22c3c897e6b8e66b8";
  50. GInfo.setWebAPIInfo(m_webAPIUrl, m_webAPIID);
  51. /* 登录webapi */
  52. if(!m_fromWebAPI.initWebApi(m_webAPIUrl, m_webAPIID, m_appType))
  53. {
  54. return false;
  55. }
  56. /*------------------------------------------------------------------------------------*/
  57. /* 获取系统声卡信息 */
  58. if(!SoundCards.InitData())
  59. {
  60. return false;
  61. }
  62. auto soundCardsInfo = SoundCards.getSoundCardInfo();
  63. std::string jsonSoundCards;
  64. SysConfig.setSoundCardInfoToJson(soundCardsInfo, jsonSoundCards);
  65. // SPDLOG_DEBUG("声卡信息: {}", jsonSoundCards);
  66. /* 将声卡信息写入数据库 */
  67. if(!m_fromWebAPI.updateSystemConfig(Config_SoundCardInfo, jsonSoundCards, SysConfig.mapSysConfigDesc[eSystemConfigType::eSCT_SoundCardInfo]))
  68. {
  69. SPDLOG_LOGGER_WARN(m_logger, "更新声卡信息到WebAPI失败");
  70. }
  71. return true;
  72. }
  73. /* 开启服务 */
  74. bool ACAServer::startService()
  75. {
  76. m_threadCompareItemManager = new ThreadCompareItemManager();
  77. if(m_threadCompareItemManager == nullptr)
  78. {
  79. SPDLOG_LOGGER_ERROR(m_logger, "创建对比项管理线程失败");
  80. return false;
  81. }
  82. /* 开启线程 */
  83. CPPTP.add_task(&ThreadCompareItemManager::thread_CompareItemManager, m_threadCompareItemManager);
  84. return true;
  85. }
  86. /* 读取配置文件 */
  87. bool ACAServer::readConfigFile()
  88. {
  89. QString configPath = QCoreApplication::applicationDirPath() + "/config/BaseConfig.ini";
  90. QFile file(configPath);
  91. if(!file.exists()) {
  92. spdlog::error("配置文件 {} 不存在", configPath.toStdString());
  93. return false;
  94. }
  95. QSettings settings(configPath, QSettings::IniFormat);
  96. settings.beginGroup("MQTT");
  97. m_mqttIP = settings.value("MQTT_IP", "").toString();
  98. m_mqttPort = settings.value("MQTT_PORT", 1883).toInt();
  99. settings.endGroup();
  100. return true;
  101. }
  102. /* 等待webapi回复信息 */
  103. bool ACAServer::waitForWebAPIReply()
  104. {
  105. int timeout = 5000; // 等待5秒
  106. int elapsed = 0;
  107. while(!m_isGetWebInfoSuccess.load() && elapsed < timeout)
  108. {
  109. QCoreApplication::processEvents();
  110. std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 每10毫秒检查一次
  111. elapsed += 10;
  112. }
  113. if(!m_isGetWebInfoSuccess.load())
  114. {
  115. SPDLOG_LOGGER_ERROR(m_logger, "等待MQTT消息超时,未能获取WebAPI信息");
  116. return false;
  117. }
  118. return true;
  119. }
  120. /* 处理MQTT消息 */
  121. void ACAServer::do_receiveMQTTMessage(const QMQTT::Message& message)
  122. {
  123. SPDLOG_LOGGER_TRACE(m_logger, "接收到MQTT消息: {}", message.payload().toStdString());
  124. if(message.topic() == m_webapiTopic)
  125. {
  126. /* 处理WebAPI消息 */
  127. QString payload = QString::fromUtf8(message.payload());
  128. try
  129. {
  130. nJson jsonMsg = nJson::parse(payload.toStdString());
  131. m_webAPIUrl = jsonMsg["webaddr"].is_null() ? "" : jsonMsg["webaddr"].get<std::string>().c_str();
  132. m_webAPIID = jsonMsg["serverid"].is_null() ? "" : jsonMsg["serverid"].get<std::string>().c_str();
  133. }nJsonCatchNoReturn
  134. m_isGetWebInfoSuccess.store(true);
  135. SPDLOG_LOGGER_TRACE(m_logger, "WebAPI信息获取成功: URL = {}, ID = {}", m_webAPIUrl.toStdString(), m_webAPIID.toStdString());
  136. }
  137. }