|
@@ -1,11 +1,16 @@
|
|
|
#include "CompareItemThread.h"
|
|
|
|
|
|
+#include "FromMQTT.h"
|
|
|
+#include "GlobalInfo.h"
|
|
|
#include "ThreadManager.h"
|
|
|
#include "CalculateDBThread.h"
|
|
|
#include "NoiseDetectThread.h"
|
|
|
#include "CompareDoubleThread.h"
|
|
|
#include "ThreadPool.h"
|
|
|
+#include "commonDefine.h"
|
|
|
#include "spdlog.h"
|
|
|
+#include <qt5/QtCore/qchar.h>
|
|
|
+#include <qt5/QtCore/qglobal.h>
|
|
|
|
|
|
|
|
|
CompareItemThread::CompareItemThread(CalculateThreadInfo_t& threadInfo)
|
|
@@ -87,7 +92,7 @@ void CompareItemThread::task()
|
|
|
|
|
|
/* 清除标志位 */
|
|
|
clearUpdateFlags();
|
|
|
- SPDLOG_LOGGER_WARN(m_logger, "{} 发送对比项数据到MQTT中", m_logBase);
|
|
|
+ // SPDLOG_LOGGER_WARN(m_logger, "{} 发送对比项数据到MQTT中", m_logBase);
|
|
|
}
|
|
|
/* 清理数据 */
|
|
|
clearData();
|
|
@@ -157,6 +162,35 @@ bool CompareItemThread::initData()
|
|
|
m_mapAlarmPhaseLast.insert({road.nCompareRoadNum, AlarmInfo_t()});
|
|
|
}
|
|
|
|
|
|
+ /* 登陆MQTT */
|
|
|
+ m_pubTopic = QString("%1/%2").arg(GInfo.mqttPubTopicDB()).arg(QString::number(m_threadInfo.compareItemInfo.nID));
|
|
|
+ m_pFromMQTT = new FromMQTT;
|
|
|
+ m_pFromMQTT->setIPAndPort(GInfo.mqttIP(), GInfo.mqttPort());
|
|
|
+ m_pFromMQTT->connectToServer();
|
|
|
+ /* 等待连接成功 */
|
|
|
+ auto startTime = std::chrono::steady_clock::now(); // 记录开始时间
|
|
|
+ while(true)
|
|
|
+ {
|
|
|
+ if(m_pFromMQTT->connectState() == QMQTT::ConnectionState::STATE_CONNECTED)
|
|
|
+ {
|
|
|
+ break; // 连接成功
|
|
|
+ }
|
|
|
+ /* 超过10秒还没有连接成功,返回失败 */
|
|
|
+ if(std::chrono::steady_clock::now() - startTime > std::chrono::seconds(10))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 连接MQTT服务器超时", m_logBase);
|
|
|
+ if(m_pFromMQTT != nullptr)
|
|
|
+ {
|
|
|
+ delete m_pFromMQTT; // 删除MQTT对象
|
|
|
+ m_pFromMQTT = nullptr; // 设置为nullptr
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
+ }
|
|
|
+
|
|
|
+ SPDLOG_LOGGER_INFO(m_logger, "☆ {} 音量包订阅主题: {}", m_logBase, m_pubTopic.toStdString());
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -183,6 +217,12 @@ void CompareItemThread::clearData()
|
|
|
SPDLOG_LOGGER_ERROR(m_logger, "{} 移除录音通道 {}:{} 失败", m_logBase, roadInfo.strSoundCardName.toStdString(), roadInfo.roadInfo.nRoadNum);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if(m_pFromMQTT != nullptr)
|
|
|
+ {
|
|
|
+ delete m_pFromMQTT; // 删除MQTT对象
|
|
|
+ m_pFromMQTT = nullptr; // 设置为nullptr
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
@@ -476,9 +516,20 @@ void CompareItemThread::processAlarmData()
|
|
|
void CompareItemThread::sendResultData()
|
|
|
{
|
|
|
/* 生成json数据 */
|
|
|
-
|
|
|
+ QByteArray jsonData;
|
|
|
+ if(!generateMQTTJsonData(m_compareResult, jsonData))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_WARN(m_logger, "{} 生成音量包 JSON数据失败", m_logBase);
|
|
|
+ return;
|
|
|
+ }
|
|
|
/* 发送到mqtt中 */
|
|
|
-
|
|
|
+ int errorCode = 0;
|
|
|
+ if(!m_pFromMQTT->sendMessage(m_pubTopic, jsonData, 0, errorCode))
|
|
|
+ {
|
|
|
+ SPDLOG_LOGGER_ERROR(m_logger, "{} 发送音量包数据到 {} 失败,错误代码: {}", m_logBase, m_pubTopic.toStdString(), errorCode);
|
|
|
+ }else {
|
|
|
+ SPDLOG_LOGGER_DEBUG(m_logger, "{} 发送音量包数据到 {} 成功", m_logBase, m_pubTopic.toStdString());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* 清除标志更新位 */
|
|
@@ -490,4 +541,57 @@ void CompareItemThread::clearUpdateFlags()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* 生成发送至MQTT的JSON数据 */
|
|
|
+bool CompareItemThread::generateMQTTJsonData(const CompareResult_t& compareResult, QByteArray& jsonData)
|
|
|
+{
|
|
|
+ try
|
|
|
+ {
|
|
|
+ /* 生成基础信息 */
|
|
|
+ nJson json0;
|
|
|
+ json0["compareItem_id"] = compareResult.compareItemID;
|
|
|
+ json0["compareItem_name"] = compareResult.compareItemName.c_str();
|
|
|
+ json0["date_time"] = compareResult.dateTime.toString("yyyy-MM-dd hh:mm:ss").toStdString();
|
|
|
+ json0["is_client_alarm"] = compareResult.isClientAlarm;
|
|
|
+
|
|
|
+ for(const auto& roadVolume : compareResult.mapRoadVolumes)
|
|
|
+ {
|
|
|
+ nJson json1;
|
|
|
+ json1["soundCard_id"] = roadVolume.second.roadInfo.scRoadInfo.strSoundCardID.toStdString(); /* 声卡id和声卡通道id */
|
|
|
+ json1["soundCard_road_id"] = roadVolume.second.roadInfo.scRoadInfo.roadInfo.nRoadNum;
|
|
|
+ /* 对比项通道编号和名称 */
|
|
|
+ json1["item_road_num"] = roadVolume.second.roadInfo.nCompareRoadNum;
|
|
|
+ json1["item_road_name"] = roadVolume.second.roadInfo.strCompareRoadName.toStdString();
|
|
|
+ json1["similarity"] = roadVolume.second.similarity;
|
|
|
+ json1["is_silence"] = roadVolume.second.isSilence;
|
|
|
+ json1["is_overload"] = roadVolume.second.isOverload;
|
|
|
+ json1["is_reversed"] = roadVolume.second.isReversed;
|
|
|
+ json1["is_noise"] = roadVolume.second.isNoise;
|
|
|
+ json1["is_noise_warning"] = roadVolume.second.isNoiseWarning;
|
|
|
+ json1["is_consistency"] = roadVolume.second.isConsistency;
|
|
|
+ json1["is_not_consistency_warning"] = roadVolume.second.isNotConsistencyWarning;
|
|
|
+ json1["left_real_time_db"] = roadVolume.second.leftRealTimeDB;
|
|
|
+ json1["right_real_time_db"] = roadVolume.second.rightRealTimeDB;
|
|
|
+ /* 添加音量包信息 */
|
|
|
+ for(const auto& db : roadVolume.second.vecleftDB)
|
|
|
+ {
|
|
|
+ json1["left_db_array"].push_back(db);
|
|
|
+ }
|
|
|
+ for(const auto& db : roadVolume.second.vecrightDB)
|
|
|
+ {
|
|
|
+ json1["right_db_array"].push_back(db);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 添加到基础信息中 */
|
|
|
+ json0["road_volumes"].push_back(json1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 转换为字符串 */
|
|
|
+ jsonData.clear();
|
|
|
+ jsonData = QByteArray::fromStdString(json0.dump());
|
|
|
+
|
|
|
+ }nJsonCatch
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
|