diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/PhaseCompAcq/common/HttpRequestController.h b/PhaseCompAcq/common/HttpRequestController.h index 352a769..af945e8 100644 --- a/PhaseCompAcq/common/HttpRequestController.h +++ b/PhaseCompAcq/common/HttpRequestController.h @@ -21,6 +21,7 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getPhaseChannelList(QString deviceId); + QJsonObject phaseMasterHeartBeat(); private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/PhaseCompAcq/common/HttpRequestController.h b/PhaseCompAcq/common/HttpRequestController.h index 352a769..af945e8 100644 --- a/PhaseCompAcq/common/HttpRequestController.h +++ b/PhaseCompAcq/common/HttpRequestController.h @@ -21,6 +21,7 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getPhaseChannelList(QString deviceId); + QJsonObject phaseMasterHeartBeat(); private: HttpRequestUtil * httpUtil; diff --git a/PhaseCompAcq/common/utils/SettingConfig.cpp b/PhaseCompAcq/common/utils/SettingConfig.cpp index 1c15f63..816fbda 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.cpp +++ b/PhaseCompAcq/common/utils/SettingConfig.cpp @@ -23,6 +23,8 @@ SYSTEM = getProperty("client", "system").toString(); WORK_TYPE = getProperty("client", "workMode").toString(); MASTER = getProperty("client", "master").toInt(); + MASTER_HOST = getProperty("client", "masterHost").toString(); + MASTER_PORT = getProperty("client", "masterPort").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); MAX_DATA_SIZE = getProperty("client", "maxDataSize").toUInt(); diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/PhaseCompAcq/common/HttpRequestController.h b/PhaseCompAcq/common/HttpRequestController.h index 352a769..af945e8 100644 --- a/PhaseCompAcq/common/HttpRequestController.h +++ b/PhaseCompAcq/common/HttpRequestController.h @@ -21,6 +21,7 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getPhaseChannelList(QString deviceId); + QJsonObject phaseMasterHeartBeat(); private: HttpRequestUtil * httpUtil; diff --git a/PhaseCompAcq/common/utils/SettingConfig.cpp b/PhaseCompAcq/common/utils/SettingConfig.cpp index 1c15f63..816fbda 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.cpp +++ b/PhaseCompAcq/common/utils/SettingConfig.cpp @@ -23,6 +23,8 @@ SYSTEM = getProperty("client", "system").toString(); WORK_TYPE = getProperty("client", "workMode").toString(); MASTER = getProperty("client", "master").toInt(); + MASTER_HOST = getProperty("client", "masterHost").toString(); + MASTER_PORT = getProperty("client", "masterPort").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); MAX_DATA_SIZE = getProperty("client", "maxDataSize").toUInt(); diff --git a/PhaseCompAcq/common/utils/SettingConfig.h b/PhaseCompAcq/common/utils/SettingConfig.h index 4d13dad..bba7149 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.h +++ b/PhaseCompAcq/common/utils/SettingConfig.h @@ -45,6 +45,8 @@ QString SYSTEM; QString WORK_TYPE; int MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; quint16 SERVER_PORT; quint32 MAX_DATA_SIZE; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/PhaseCompAcq/common/HttpRequestController.h b/PhaseCompAcq/common/HttpRequestController.h index 352a769..af945e8 100644 --- a/PhaseCompAcq/common/HttpRequestController.h +++ b/PhaseCompAcq/common/HttpRequestController.h @@ -21,6 +21,7 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getPhaseChannelList(QString deviceId); + QJsonObject phaseMasterHeartBeat(); private: HttpRequestUtil * httpUtil; diff --git a/PhaseCompAcq/common/utils/SettingConfig.cpp b/PhaseCompAcq/common/utils/SettingConfig.cpp index 1c15f63..816fbda 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.cpp +++ b/PhaseCompAcq/common/utils/SettingConfig.cpp @@ -23,6 +23,8 @@ SYSTEM = getProperty("client", "system").toString(); WORK_TYPE = getProperty("client", "workMode").toString(); MASTER = getProperty("client", "master").toInt(); + MASTER_HOST = getProperty("client", "masterHost").toString(); + MASTER_PORT = getProperty("client", "masterPort").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); MAX_DATA_SIZE = getProperty("client", "maxDataSize").toUInt(); diff --git a/PhaseCompAcq/common/utils/SettingConfig.h b/PhaseCompAcq/common/utils/SettingConfig.h index 4d13dad..bba7149 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.h +++ b/PhaseCompAcq/common/utils/SettingConfig.h @@ -45,6 +45,8 @@ QString SYSTEM; QString WORK_TYPE; int MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; quint16 SERVER_PORT; quint32 MAX_DATA_SIZE; diff --git a/PhaseCompAcq/conf/config.ini b/PhaseCompAcq/conf/config.ini index 8b55919..9a6da96 100644 --- a/PhaseCompAcq/conf/config.ini +++ b/PhaseCompAcq/conf/config.ini @@ -21,6 +21,8 @@ master=1 serverPort=5905 maxDataSize=172800 +masterHost="192.168.20.53" +masterPort=5301 [http] baseUrl="http://192.168.20.135:11410" diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index 10cc8ae..b35441c 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -117,14 +117,6 @@ counterData->milisecond = now.toMSecsSinceEpoch(); this->afterFramePhase(counterData); } - - // 到达拟合计算时间点时 触发 - /* - if (now.time().second() == SettingConfig::getInstance().RESIDUAL_CALC_SEC) - { - this->calcResidualClockData(now.currentSecsSinceEpoch() - SettingConfig::getInstance().RESIDUAL_CALC_SEC); - } - */ } else if (this->dataBuff.size() > COUNTER_FRAME_MIN_LENGTH) { std::cout << QString("clear buffer: %1").arg(this->dataBuff.size()).toStdString() << std::endl; @@ -220,73 +212,3 @@ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(messageArray); } - -// 计算分钟拟合值 暂时不再使用 -void CounterDevice::calcResidualClockData(qlonglong tm) -{ - qDebug() << devCode << " start: " << QDateTime::currentMSecsSinceEpoch(); - QString date = QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd"); - - QJsonArray messageArray; - QString msgLogFilename = "MINUTE_msg_" + devCode + ".log"; - - for (int j = 1; j <= 16; j++) - { - QString channelKey = QString("%1-%2").arg(deviceId).arg(j); - if (ConstCache::getInstance().channelMap.contains(channelKey)) - { - CounterChannel * channelPtr = ConstCache::getInstance().channelMap.value(channelKey); - QList minuteDataList = channelPtr->getHisData().mid(channelPtr->getHisData().size() - 60, 60); - - QVector timeVec; - QVector dataVec; - - for (int k = 0; k < minuteDataList.size(); k++) - { - qlonglong tmData = ((QString) minuteDataList.at(k).at(0)).toLongLong() / 1000; - if (abs(tmData - tm) <= SettingConfig::getInstance().RESIDUAL_CALC_SEC) { - timeVec.append(tmData - tm); - dataVec.append(((QString) minuteDataList.at(k).at(1)).toDouble()); - } - } - - LinearRegression lineReg; - lineReg.xArray = timeVec.data(); - lineReg.yArray = dataVec.data(); - lineReg.calcLineRegParams(timeVec.size()); - double value = lineReg.slope * 0 + lineReg.intercept; - - if (j != this->refChannelNo) - { - // 写入通道的拟合数据日志 - QString chFilename("MINUTE_%1_CH_%2.log"); - chFilename = chFilename.arg(devCode).arg(j, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 %2").arg(QDateTime::fromSecsSinceEpoch(tm).toString("yyyy-MM-dd HH:mm:ss")).arg(QString::number(value, 'f', 12)); - - // 写日志 - QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); - } - - // 生成json对象 - QJsonObject jsonObj; - - QJsonObject dataObj; - dataObj.insert("channelRefNo", this->refChannelNo); - dataObj.insert("dataValue", QString::number(value, 'f', 12)); - dataObj.insert("rawValue", QString::number(value, 'f', 12)); - dataObj.insert("frameId", QDateTime::fromSecsSinceEpoch(tm).toString("HHmmss")); - jsonObj.insert("data", dataObj); - - jsonObj.insert("channelNo", j); - jsonObj.insert("ts", tm * 1000); - jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - jsonObj.insert("master", SettingConfig::getInstance().MASTER); - jsonObj.insert("deviceId", deviceId); - messageArray.append(jsonObj); - } - } - - QLogUtil::writeChannelDataLogByDate(date, msgLogFilename, QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); - - qDebug() << devCode << " end: " << QDateTime::currentMSecsSinceEpoch(); -} diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 7bce7ac..4b47674 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -120,8 +120,11 @@ } } - // 暂停三秒后打开计数器的串口接收数据 - QThread::msleep(1000 * 3); + // 启动服务监听 + HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 打开计数器的串口接收数据 + QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) { CounterDevice * devicePtr = ConstCache::getInstance().deviceMap.value(ConstCache::getInstance().deviceIdLoopA.at(i)); @@ -484,11 +487,6 @@ } } } - - qDebug() << alarmDev; - qDebug() << offlineDev; - qDebug() << alarmChannel; - qDebug() << offlineChannel; } void CounterWindowRT::updateDateAndTime() diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index 245d1fc..cdb43a1 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -17,8 +17,9 @@ #include "CounterSettingForm.h" #include "common/utils/SettingConfig.h" #include "common/utils/TimerCounterUtil.h" -#include "common/HttpRequestController.h" #include "common/utils/QKafkaConsumer.h" +#include "common/HttpRequestController.h" +#include "common/HttpServer.h" QT_BEGIN_NAMESPACE namespace Ui { class CounterWindowRT; } diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index e3b3a9a..ee7cfd3 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -46,7 +46,7 @@ MASTER = getProperty("client", "master").toInt(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); - RESIDUAL_CALC_SEC = getProperty("client", "residualCalcSec").toInt(); + SERVER_HOST = getProperty("client", "serverHost").toString(); DEVICE_ALARM_CODES = getProperty("alarm", "deviceAlarmCodes").toString().split(","); CHANNEL_ALARM_CODES = getProperty("alarm", "channelAlarmCodes").toString().split(","); diff --git a/CounterRealTime/common/utils/SettingConfig.h b/CounterRealTime/common/utils/SettingConfig.h index 5a0fbda..9937fcd 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -8,7 +8,7 @@ class SettingConfig : public QObject { public: - ~SettingConfig() {}; + ~SettingConfig() {} SettingConfig(const SettingConfig&)=delete; SettingConfig& operator=(const SettingConfig&)=delete; @@ -30,34 +30,55 @@ void init(); /******** 以下为需要的各类参数 ********/ + // 波特率 qint32 BAUD_RATE; + // 屏幕尺寸 qint16 WINDOW_WIDTH; qint16 WINDOW_HEIGHT; + // 是否需要kafka相关功能 qint8 NEED_KAFKA; - QString KAFKA_BROKERS; - QString KAFKA_DATA_TOPIC; - QString KAFKA_MSG_TOPIC; - QString KAFKA_STATUS_TOPIC; - QString KAFKA_ALARM_TOPIC; + // 是否需要SASL加密 qint8 NEED_SASL; + // SASL加密用户名和密码 QString SASL_USERNAME; QString SASL_PASSWORD; + // kafka服务节点 + QString KAFKA_BROKERS; + // 发送: 钟差数据传输消息队列 + QString KAFKA_DATA_TOPIC; + // 发送: 计数器工作状态消息队列 + QString KAFKA_STATUS_TOPIC; + // 监听: 设备和通道配置信息消息队列 + QString KAFKA_MSG_TOPIC; + // 监听: 报警信息消息队列 + QString KAFKA_ALARM_TOPIC; + + // QString CLIENT_ID; QString APP_KEY; + // 设备类型 QString DEV_TYPES; + // 所属子系统 QString SYSTEM; + // 工作模式 模拟数据或真实工作 QString WORK_TYPE; + // 主备软件标识 qint8 MASTER; + // 显示计数器数量 qint8 DISPLAY_COUNT; + // 服务监听地址和端口号 quint16 SERVER_PORT; - qint8 RESIDUAL_CALC_SEC; + QString SERVER_HOST; + // 设备报警类型 QStringList DEVICE_ALARM_CODES; + // 通道报警类型 QStringList CHANNEL_ALARM_CODES; + // 样式表硬编码 QStringList HARD_CODE_QSS; QString BASE_URL; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index e8867aa..b6185b1 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -25,7 +25,7 @@ master=1 displayCount=4 serverPort=5905 -residualCalcSec=30 +serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index d0e8a20..e1c7f4f 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -1,10 +1,11 @@ #include "PhaseDevice.h" -#include +#include #include #include #include -#include #include +#include +#include "common/ConstCache.h" PhaseDevice::PhaseDevice(QObject *parent) : QObject(parent) { @@ -172,7 +173,7 @@ { // 存日志 QString chFilename = QString("%1_CH_%2.log").arg(devCode).arg(i, 2, 10, QLatin1Char('0')); - QString channelDataStr = QString("%1 [%2] %3").arg(phaseData->timestamp).arg(phaseData->frameId).arg(phaseData->channelDataStr.at(i-1)); + QString channelDataStr = QString("%1 %2").arg(phaseData->timestamp).arg(phaseData->channelDataStr.at(i-1)); QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); @@ -201,7 +202,17 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用延迟5秒发送相位数据到消息队列 + QTimer::singleShot(5000, this, [=](){ + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } + }); + } else { + kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + } // 每10秒发送一次设备状态信息 if (QDateTime::currentDateTime().time().second() % 10 == 0) { @@ -239,19 +250,19 @@ for (int j = 0; j < 5; j++) { // 计算不同维度的allen方差值 - if (size >= 5 * pow(10, j)) { - channelAllen[i][j] = calAllan(i, pow(10, j), size); + if (size >= 5 * qPow(10, j)) { + channelAllen[i][j] = calAllan(i, qPow(10, j), size); } else { channelAllen[i][j] = 0.0; } // 给结果赋值 [allen方差值 采样数] - result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / pow(10, j))); + result << QString::number(channelAllen[i][j], 'e', 4) << QString::number((int)(size / qPow(10, j))); // 发送给kafka消息队列的内容 QJsonObject dataObj; dataObj.insert("tau", QString::number(qPow(10, j))); dataObj.insert("allen", QString::number(channelAllen[i][j], 'e', 4)); - dataObj.insert("count", QString::number((int)(size / pow(10, j)))); + dataObj.insert("count", QString::number((int)(size / qPow(10, j)))); dataArr.append(dataObj); } performData.insert("data", dataArr); @@ -266,8 +277,11 @@ // 发送到kafka的消息队列中 if (SettingConfig::getInstance().NEED_KAFKA == 1) { - // 1s 10s 100s 1000s 10000s - kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + // 每5秒发送一次稳定度结果 + if (QDateTime::currentDateTime().time().second() % 5 == 0) { + // 1s 10s 100s 1000s 10000s + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } @@ -277,19 +291,19 @@ double sum = 0.0; double allan[2] = {0.0}; double *y = new double[aN - 2 * d]; - double tau_2 = pow(d * tau0, 2); //pow是计算x的y次幂 + double tau_2 = qPow(d * tau0, 2); //pow是计算x的y次幂 for (int i = 0; i < aN - 2 * d; i++) { double vi2 = phaseVector[index][i+2*d]; double vi1 = phaseVector[index][i+d]; double vi = phaseVector[index][i]; - y[i] = pow(vi2 - 2 * vi1 + vi, 2); + y[i] = qPow(vi2 - 2 * vi1 + vi, 2); sum += y[i]; } allan[0] = sum/(2*tau_2*(aN-2*d)); //delta的平方 - allan[1] = sqrt(sum/(2*tau_2*(aN-2*d))); //delta + allan[1] = qSqrt(sum/(2*tau_2*(aN-2*d))); //delta delete[] y; diff --git a/PhaseCompAcq/PhaseWindow.cpp b/PhaseCompAcq/PhaseWindow.cpp index 90db100..73cd115 100644 --- a/PhaseCompAcq/PhaseWindow.cpp +++ b/PhaseCompAcq/PhaseWindow.cpp @@ -74,7 +74,15 @@ // 6. 绘制一个设备的多个通道数据面板 this->generateWidgetForDevice(); + // 7. 启动监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + heartTimer = new QTimer(); + connect(heartTimer, &QTimer::timeout, this, &PhaseWindow::onPhaseMaserHeartHandle); + heartTimer->start(1000); + } } PhaseWindow::~PhaseWindow() @@ -459,3 +467,14 @@ } } } + +void PhaseWindow::onPhaseMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->phaseMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/PhaseCompAcq/PhaseWindow.h b/PhaseCompAcq/PhaseWindow.h index 961e0b1..bf964fa 100644 --- a/PhaseCompAcq/PhaseWindow.h +++ b/PhaseCompAcq/PhaseWindow.h @@ -38,6 +38,7 @@ void on_devSelect_currentIndexChanged(int index); void onPhaseCommandReceived(QJsonObject command); + void onPhaseMaserHeartHandle(); private: int initHttpToken(); @@ -49,6 +50,8 @@ QKafkaConsumer * kafkaConsumer; HttpRequestController * httpReq; + QTimer * heartTimer; + QList deviceList; void generateWidgetForDevice(); diff --git a/PhaseCompAcq/common/ConstCache.h b/PhaseCompAcq/common/ConstCache.h index 0379863..86ad378 100644 --- a/PhaseCompAcq/common/ConstCache.h +++ b/PhaseCompAcq/common/ConstCache.h @@ -11,7 +11,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -20,13 +20,20 @@ return instance; } - QMap deviceTypes; + // 最近的主路应用心跳时间戳 + qulonglong latestHeartTs = 0; + + // 设备列表 从接口返回的 JSON对象形式 QList deviceList; - QMap deviceMap; // key=deviceId - QMap channelMap; // key=channelId value=deviceId-no + + // 存储所有设备的Map key=deviceId + QMap deviceMap; + + // 存储所有通道的Map key=channelId value=deviceId-no + QMap channelMap; private: - ConstCache() {}; + ConstCache() {} }; diff --git a/PhaseCompAcq/common/HttpRequestController.cpp b/PhaseCompAcq/common/HttpRequestController.cpp index 359a0fc..4327e44 100644 --- a/PhaseCompAcq/common/HttpRequestController.cpp +++ b/PhaseCompAcq/common/HttpRequestController.cpp @@ -131,3 +131,32 @@ return resultObj; } + +QJsonObject HttpRequestController::phaseMasterHeartBeat() +{ + QJsonObject resultObj; + + // 获取设备列表的接口地址 + QUrl url = QString("http://%1:%2/").arg(SettingConfig::getInstance().MASTER_HOST).arg(SettingConfig::getInstance().MASTER_PORT); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + +// qDebug() << url; + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if (jsonDocument.isNull() == false) + { + resultObj = jsonDocument.object(); + } else + { + resultObj.insert("code", -1); + } + +// qDebug() << resultObj; + + return resultObj; +} diff --git a/PhaseCompAcq/common/HttpRequestController.h b/PhaseCompAcq/common/HttpRequestController.h index 352a769..af945e8 100644 --- a/PhaseCompAcq/common/HttpRequestController.h +++ b/PhaseCompAcq/common/HttpRequestController.h @@ -21,6 +21,7 @@ QJsonObject getTokenByClientId(QString clientId, QString key); QJsonObject initDeviceList(QString devType, QString system); QJsonObject getPhaseChannelList(QString deviceId); + QJsonObject phaseMasterHeartBeat(); private: HttpRequestUtil * httpUtil; diff --git a/PhaseCompAcq/common/utils/SettingConfig.cpp b/PhaseCompAcq/common/utils/SettingConfig.cpp index 1c15f63..816fbda 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.cpp +++ b/PhaseCompAcq/common/utils/SettingConfig.cpp @@ -23,6 +23,8 @@ SYSTEM = getProperty("client", "system").toString(); WORK_TYPE = getProperty("client", "workMode").toString(); MASTER = getProperty("client", "master").toInt(); + MASTER_HOST = getProperty("client", "masterHost").toString(); + MASTER_PORT = getProperty("client", "masterPort").toInt(); SERVER_PORT = getProperty("client", "serverPort").toInt(); MAX_DATA_SIZE = getProperty("client", "maxDataSize").toUInt(); diff --git a/PhaseCompAcq/common/utils/SettingConfig.h b/PhaseCompAcq/common/utils/SettingConfig.h index 4d13dad..bba7149 100644 --- a/PhaseCompAcq/common/utils/SettingConfig.h +++ b/PhaseCompAcq/common/utils/SettingConfig.h @@ -45,6 +45,8 @@ QString SYSTEM; QString WORK_TYPE; int MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; quint16 SERVER_PORT; quint32 MAX_DATA_SIZE; diff --git a/PhaseCompAcq/conf/config.ini b/PhaseCompAcq/conf/config.ini index 8b55919..9a6da96 100644 --- a/PhaseCompAcq/conf/config.ini +++ b/PhaseCompAcq/conf/config.ini @@ -21,6 +21,8 @@ master=1 serverPort=5905 maxDataSize=172800 +masterHost="192.168.20.53" +masterPort=5301 [http] baseUrl="http://192.168.20.135:11410" diff --git a/PhaseCompAcq/protocol/PhaseProtocolBM.h b/PhaseCompAcq/protocol/PhaseProtocolBM.h index 1d442d5..048a9c2 100644 --- a/PhaseCompAcq/protocol/PhaseProtocolBM.h +++ b/PhaseCompAcq/protocol/PhaseProtocolBM.h @@ -15,7 +15,7 @@ PHASE_MESSURE_CHANNEL * PHASE_MESSURE_SIZE; static const qulonglong CALCULATE_OFFSET = 0X0080000000000000; -static const double CALCULATE_FACTOR = 1.6810E-15 * 1.8; +static const double CALCULATE_FACTOR = 1.6810E-15; class PhaseProtocolBM : public QObject {