#include "ACAServer.h" #include "GlobalInfo.h" #include "commonDefine.h" #include "SoundCardData.h" #include "SystemConfig.h" #include "ThreadPool.h" #include "ThreadManager.h" #include "ThreadAlarmManager.h" #include #include #include #include ACAServer::ACAServer() { m_logger = spdlog::get("ACAServer"); if(m_logger == nullptr) { fmt::print("ACAServer logger is nullptr"); return; } connect(&m_fromMQTT, &FromMQTT::signal_recvMessage, this, &ACAServer::do_receiveMQTTMessage); } ACAServer::~ACAServer() { // if(m_threadCompareItemManager != nullptr) { // delete m_threadCompareItemManager; // m_threadCompareItemManager = nullptr; // } } /* 初始化基础信息 */ bool ACAServer::initGlobalInfo() { /*------------------------------------------------------------------------------------*/ /* 读取配置文件 */ if(!readConfigFile()) { spdlog::error("读取配置文件失败"); return false; } /* 设置MQTT服务器信息 */ GInfo.setMqttInfo(m_mqttIP, m_mqttPort); /* 连接MQTT */ m_fromMQTT.setIPAndPort(m_mqttIP, m_mqttPort); m_fromMQTT.addSubcribe(m_webapiTopic, 0); // 订阅WebAPI主题 m_fromMQTT.connectToServer(); /* 等待mqtt回复webapi信息 */ if(!waitForWebAPIReply()) { return false; } /* 设置WebAPI信息 */ m_webAPIID = "cf6b57fa3d9841e22c3c897e6b8e66b8"; GInfo.setWebAPIInfo(m_webAPIUrl, m_webAPIID); /* 登录webapi */ if(!m_fromWebAPI.initWebApi(m_webAPIUrl, m_webAPIID, m_appType)) { return false; } /*------------------------------------------------------------------------------------*/ /* 获取系统声卡信息 */ if(!SoundCards.InitData()) { return false; } auto soundCardsInfo = SoundCards.getSoundCardInfo(); std::string jsonSoundCards; SysConfig.setSoundCardInfoToJson(soundCardsInfo, jsonSoundCards); // SPDLOG_DEBUG("声卡信息: {}", jsonSoundCards); /* 将声卡信息写入数据库 */ if(!m_fromWebAPI.updateSystemConfig(Config_SoundCardInfo, jsonSoundCards, SysConfig.mapSysConfigDesc[eSystemConfigType::eSCT_SoundCardInfo])) { SPDLOG_LOGGER_WARN(m_logger, "更新声卡信息到WebAPI失败"); } /*------------------------------------------------------------------------------------*/ /* 初始化全局参数信息 */ GInfo.initGlobalInfo(); /*------------------------------------------------------------------------------------*/ SPDLOG_LOGGER_INFO(m_logger, "========================================================================================="); /* 打印一些基础参数 */ SPDLOG_LOGGER_INFO(m_logger, "MQTT服务器地址: {}, 端口: {}", m_mqttIP.toStdString(), m_mqttPort); SPDLOG_LOGGER_INFO(m_logger, "WebAPI地址: {}, ID: {}", m_webAPIUrl.toStdString(), m_webAPIID.toStdString()); SPDLOG_LOGGER_INFO(m_logger, "录音参数: "); SPDLOG_LOGGER_INFO(m_logger, " 采样率: {}, 通道数: {}, 位深: {}", GInfo.m_sampleRate, GInfo.m_numChannels, GInfo.m_bitsPerSample); SPDLOG_LOGGER_INFO(m_logger, "========================================================================================="); return true; } /* 开启服务 */ bool ACAServer::startService() { // m_threadCompareItemManager = new ThreadCompareItemManager(); // if(m_threadCompareItemManager == nullptr) // { // SPDLOG_LOGGER_ERROR(m_logger, "创建对比项管理线程失败"); // return false; // } /* 开启对比项管理线程 */ CPPTP.add_task(&ThreadCompareItemManager::thread_CompareItemManager, &CompareItemManager); /* 开启录音通道检查线程 */ CPPTP.add_task(&ACAServer::thread_deleteRecordThread, this); /* 开启处理报警信息的线程 */ CPPTP.add_task(&ThreadAlarmManager::thread_task, &AlarmManager); return true; } /* 读取配置文件 */ bool ACAServer::readConfigFile() { QString configPath = QCoreApplication::applicationDirPath() + "/config/BaseConfig.ini"; QFile file(configPath); if(!file.exists()) { spdlog::error("配置文件 {} 不存在", configPath.toStdString()); return false; } QSettings settings(configPath, QSettings::IniFormat); settings.beginGroup("MQTT"); m_mqttIP = settings.value("MQTT_IP", "").toString(); m_mqttPort = settings.value("MQTT_PORT", 1883).toInt(); settings.endGroup(); settings.beginGroup("Audio"); int sampleRate = settings.value("SampleRate", 48000).toInt(); int channelCount = settings.value("ChannelCount", 1).toInt(); int bitDepth = settings.value("BitDepth", 16).toInt(); settings.endGroup(); GInfo.m_sampleRate = sampleRate; GInfo.m_numChannels = channelCount; GInfo.m_bitsPerSample = bitDepth; return true; } /* 等待webapi回复信息 */ bool ACAServer::waitForWebAPIReply() { int timeout = 5000; // 等待5秒 int elapsed = 0; while(!m_isGetWebInfoSuccess.load() && elapsed < timeout) { QCoreApplication::processEvents(); std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 每10毫秒检查一次 elapsed += 10; } if(!m_isGetWebInfoSuccess.load()) { SPDLOG_LOGGER_ERROR(m_logger, "等待MQTT消息超时,未能获取WebAPI信息"); return false; } return true; } /* 线程函数,定时删除录音线程的实例 */ void ACAServer::thread_deleteRecordThread() { while(m_isRunning) { std::this_thread::sleep_for(std::chrono::seconds(5)); /* 销毁录音线程 */ ThreadMan.destroyeRecordThread(); } } /* 处理MQTT消息 */ void ACAServer::do_receiveMQTTMessage(const QMQTT::Message& message) { SPDLOG_LOGGER_TRACE(m_logger, "接收到MQTT消息: {}", message.payload().toStdString()); if(message.topic() == m_webapiTopic) { /* 处理WebAPI消息 */ QString payload = QString::fromUtf8(message.payload()); try { nJson jsonMsg = nJson::parse(payload.toStdString()); m_webAPIUrl = jsonMsg["webaddr"].is_null() ? "" : jsonMsg["webaddr"].get().c_str(); m_webAPIID = jsonMsg["serverid"].is_null() ? "" : jsonMsg["serverid"].get().c_str(); }nJsonCatchNoReturn m_isGetWebInfoSuccess.store(true); SPDLOG_LOGGER_TRACE(m_logger, "WebAPI信息获取成功: URL = {}, ID = {}", m_webAPIUrl.toStdString(), m_webAPIID.toStdString()); } }