diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + 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 b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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 b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/common/utils/TimerCounterUtil.h b/CounterRealTime/common/utils/TimerCounterUtil.h index 2bdfd2f..6aa645a 100644 --- a/CounterRealTime/common/utils/TimerCounterUtil.h +++ b/CounterRealTime/common/utils/TimerCounterUtil.h @@ -8,7 +8,7 @@ { public: - ~TimerCounterUtil() {}; + ~TimerCounterUtil() {} TimerCounterUtil(const TimerCounterUtil&)=delete; TimerCounterUtil& operator=(const TimerCounterUtil&)=delete; @@ -18,12 +18,14 @@ } QTimer * clockCounter; // 界面刷新时间定时器 - QTimer * alamrCounter; // 请求报警定时器 + // QTimer * alamrCounter; // 请求报警定时器 + QTimer * heartCounter; // 心跳定时器 private: TimerCounterUtil() { clockCounter = new QTimer(); + heartCounter = new QTimer(); } }; diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/common/utils/TimerCounterUtil.h b/CounterRealTime/common/utils/TimerCounterUtil.h index 2bdfd2f..6aa645a 100644 --- a/CounterRealTime/common/utils/TimerCounterUtil.h +++ b/CounterRealTime/common/utils/TimerCounterUtil.h @@ -8,7 +8,7 @@ { public: - ~TimerCounterUtil() {}; + ~TimerCounterUtil() {} TimerCounterUtil(const TimerCounterUtil&)=delete; TimerCounterUtil& operator=(const TimerCounterUtil&)=delete; @@ -18,12 +18,14 @@ } QTimer * clockCounter; // 界面刷新时间定时器 - QTimer * alamrCounter; // 请求报警定时器 + // QTimer * alamrCounter; // 请求报警定时器 + QTimer * heartCounter; // 心跳定时器 private: TimerCounterUtil() { clockCounter = new QTimer(); + heartCounter = new QTimer(); } }; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index b6185b1..a6eae2f 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -23,9 +23,10 @@ system="clock" workMode="mock" master=1 +masterHost=192.168.20.52 +masterPort=5201 displayCount=4 serverPort=5905 -serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/common/utils/TimerCounterUtil.h b/CounterRealTime/common/utils/TimerCounterUtil.h index 2bdfd2f..6aa645a 100644 --- a/CounterRealTime/common/utils/TimerCounterUtil.h +++ b/CounterRealTime/common/utils/TimerCounterUtil.h @@ -8,7 +8,7 @@ { public: - ~TimerCounterUtil() {}; + ~TimerCounterUtil() {} TimerCounterUtil(const TimerCounterUtil&)=delete; TimerCounterUtil& operator=(const TimerCounterUtil&)=delete; @@ -18,12 +18,14 @@ } QTimer * clockCounter; // 界面刷新时间定时器 - QTimer * alamrCounter; // 请求报警定时器 + // QTimer * alamrCounter; // 请求报警定时器 + QTimer * heartCounter; // 心跳定时器 private: TimerCounterUtil() { clockCounter = new QTimer(); + heartCounter = new QTimer(); } }; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index b6185b1..a6eae2f 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -23,9 +23,10 @@ system="clock" workMode="mock" master=1 +masterHost=192.168.20.52 +masterPort=5201 displayCount=4 serverPort=5905 -serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index e1c7f4f..d62e913 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -204,12 +204,10 @@ { 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))); - } - }); + // 备路应用在主路不正常时才发送相位数据到消息队列 + 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))); } @@ -280,7 +278,14 @@ // 每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))); + // 备路应用在主路不正常时才发送稳定度计算结果 + if (SettingConfig::getInstance().MASTER == 0) { + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } + } else { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } } diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/common/utils/TimerCounterUtil.h b/CounterRealTime/common/utils/TimerCounterUtil.h index 2bdfd2f..6aa645a 100644 --- a/CounterRealTime/common/utils/TimerCounterUtil.h +++ b/CounterRealTime/common/utils/TimerCounterUtil.h @@ -8,7 +8,7 @@ { public: - ~TimerCounterUtil() {}; + ~TimerCounterUtil() {} TimerCounterUtil(const TimerCounterUtil&)=delete; TimerCounterUtil& operator=(const TimerCounterUtil&)=delete; @@ -18,12 +18,14 @@ } QTimer * clockCounter; // 界面刷新时间定时器 - QTimer * alamrCounter; // 请求报警定时器 + // QTimer * alamrCounter; // 请求报警定时器 + QTimer * heartCounter; // 心跳定时器 private: TimerCounterUtil() { clockCounter = new QTimer(); + heartCounter = new QTimer(); } }; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index b6185b1..a6eae2f 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -23,9 +23,10 @@ system="clock" workMode="mock" master=1 +masterHost=192.168.20.52 +masterPort=5201 displayCount=4 serverPort=5905 -serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index e1c7f4f..d62e913 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -204,12 +204,10 @@ { 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))); - } - }); + // 备路应用在主路不正常时才发送相位数据到消息队列 + 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))); } @@ -280,7 +278,14 @@ // 每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))); + // 备路应用在主路不正常时才发送稳定度计算结果 + if (SettingConfig::getInstance().MASTER == 0) { + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } + } else { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } } diff --git a/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp b/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp index 2f1a041..4f0746a 100644 --- a/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp +++ b/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp @@ -15,7 +15,7 @@ dataObj.insert("frameId", this->frameId); jsonObj.insert("channelNo", (i + 1)); - jsonObj.insert("ts", (this->milisecond / 1000) * 1000); + jsonObj.insert("ts", this->milisecond); jsonObj.insert("data", dataObj); return jsonObj; @@ -34,7 +34,7 @@ dataObj.insert("channelActive", channelActiveArray); dataObj.insert("devStatus", "1"); - jsonObj.insert("ts", (this->milisecond / 1000) * 1000); + jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", "0201"); jsonObj.insert("data", dataObj); diff --git a/CounterRealTime/CounterDevice.cpp b/CounterRealTime/CounterDevice.cpp index b35441c..10ecc0d 100644 --- a/CounterRealTime/CounterDevice.cpp +++ b/CounterRealTime/CounterDevice.cpp @@ -199,7 +199,15 @@ if (SettingConfig::getInstance().NEED_KAFKA == 1) { - kafkaUtil.produceMessage(QString(QJsonDocument(messageArray).toJson(QJsonDocument::Compact))); + if (SettingConfig::getInstance().MASTER == 0) + { + // 备路应用在主路不正常时才发送时差数据到消息队列 + 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) { diff --git a/CounterRealTime/CounterWindowRT.cpp b/CounterRealTime/CounterWindowRT.cpp index 4b47674..d2fe9ed 100644 --- a/CounterRealTime/CounterWindowRT.cpp +++ b/CounterRealTime/CounterWindowRT.cpp @@ -123,6 +123,12 @@ // 启动服务监听 HttpServer::instance().run(QHostAddress::Any, SettingConfig::getInstance().SERVER_PORT); + // 8. 备路应用定时向主路应用请求以判定主路应用的状态 + if (SettingConfig::getInstance().MASTER == 0) { + connect(TimerCounterUtil::getInstance().heartCounter, &QTimer::timeout, this, &CounterWindowRT::onCounterMaserHeartHandle); + TimerCounterUtil::getInstance().heartCounter->start(1000); + } + // 打开计数器的串口接收数据 QThread::msleep(1000); for (int i = 0; i < ConstCache::getInstance().deviceIdLoopA.size(); i++) @@ -698,3 +704,14 @@ } } } + +void CounterWindowRT::onCounterMaserHeartHandle() +{ + QJsonObject heartRet = httpReq->counterMasterHeartBeat(); + if (heartRet.value("code") == 200) { + QMutex mutex; + mutex.lock(); + ConstCache::getInstance().latestHeartTs = QDateTime::currentDateTime().currentSecsSinceEpoch(); + mutex.unlock(); + } +} diff --git a/CounterRealTime/CounterWindowRT.h b/CounterRealTime/CounterWindowRT.h index cdb43a1..12cc365 100644 --- a/CounterRealTime/CounterWindowRT.h +++ b/CounterRealTime/CounterWindowRT.h @@ -79,5 +79,7 @@ void onKafkaMessageReceived(QJsonObject message); void onAlarmMessageReceived(QJsonObject alarmMsg); + + void onCounterMaserHeartHandle(); }; #endif // COUNTERWINDOWRT_H diff --git a/CounterRealTime/common/ConstCache.h b/CounterRealTime/common/ConstCache.h index 0f542dd..25a97d4 100644 --- a/CounterRealTime/common/ConstCache.h +++ b/CounterRealTime/common/ConstCache.h @@ -15,7 +15,7 @@ { Q_OBJECT public: - ~ConstCache() {}; + ~ConstCache() {} ConstCache(const ConstCache&)=delete; ConstCache& operator=(const ConstCache&)=delete; @@ -36,8 +36,10 @@ QMap qssConstMap; + qulonglong latestHeartTs; + private: - ConstCache() {}; + ConstCache() {} }; diff --git a/CounterRealTime/common/HttpRequestController.cpp b/CounterRealTime/common/HttpRequestController.cpp index 9ac4497..3d6d9a3 100644 --- a/CounterRealTime/common/HttpRequestController.cpp +++ b/CounterRealTime/common/HttpRequestController.cpp @@ -237,3 +237,32 @@ return resultObj; } + +QJsonObject HttpRequestController::counterMasterHeartBeat() +{ + 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/common/HttpRequestController.h b/CounterRealTime/common/HttpRequestController.h index c84ad21..7e415de 100644 --- a/CounterRealTime/common/HttpRequestController.h +++ b/CounterRealTime/common/HttpRequestController.h @@ -27,6 +27,8 @@ int getSysClockAlarmCount(); QJsonObject getSysClockAlarmList(int limit); + QJsonObject counterMasterHeartBeat(); + private: HttpRequestUtil * httpUtil; diff --git a/CounterRealTime/common/utils/SettingConfig.cpp b/CounterRealTime/common/utils/SettingConfig.cpp index ee7cfd3..eb99b6d 100644 --- a/CounterRealTime/common/utils/SettingConfig.cpp +++ b/CounterRealTime/common/utils/SettingConfig.cpp @@ -44,9 +44,10 @@ 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(); DISPLAY_COUNT = getProperty("client", "displayCount", "4").toInt(); SERVER_PORT = getProperty("client", "serverPort").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 9937fcd..6027552 100644 --- a/CounterRealTime/common/utils/SettingConfig.h +++ b/CounterRealTime/common/utils/SettingConfig.h @@ -67,11 +67,12 @@ QString WORK_TYPE; // 主备软件标识 qint8 MASTER; + QString MASTER_HOST; + quint16 MASTER_PORT; // 显示计数器数量 qint8 DISPLAY_COUNT; - // 服务监听地址和端口号 + // 服务监听端口号 quint16 SERVER_PORT; - QString SERVER_HOST; // 设备报警类型 QStringList DEVICE_ALARM_CODES; diff --git a/CounterRealTime/common/utils/TimerCounterUtil.h b/CounterRealTime/common/utils/TimerCounterUtil.h index 2bdfd2f..6aa645a 100644 --- a/CounterRealTime/common/utils/TimerCounterUtil.h +++ b/CounterRealTime/common/utils/TimerCounterUtil.h @@ -8,7 +8,7 @@ { public: - ~TimerCounterUtil() {}; + ~TimerCounterUtil() {} TimerCounterUtil(const TimerCounterUtil&)=delete; TimerCounterUtil& operator=(const TimerCounterUtil&)=delete; @@ -18,12 +18,14 @@ } QTimer * clockCounter; // 界面刷新时间定时器 - QTimer * alamrCounter; // 请求报警定时器 + // QTimer * alamrCounter; // 请求报警定时器 + QTimer * heartCounter; // 心跳定时器 private: TimerCounterUtil() { clockCounter = new QTimer(); + heartCounter = new QTimer(); } }; diff --git a/CounterRealTime/conf/config.ini b/CounterRealTime/conf/config.ini index b6185b1..a6eae2f 100644 --- a/CounterRealTime/conf/config.ini +++ b/CounterRealTime/conf/config.ini @@ -23,9 +23,10 @@ system="clock" workMode="mock" master=1 +masterHost=192.168.20.52 +masterPort=5201 displayCount=4 serverPort=5905 -serverHost="127.0.0.1" [alarm] deviceAlarmCodes="DEVICE_OFFLINE,DEVICE_ALARM" diff --git a/PhaseCompAcq/PhaseDevice.cpp b/PhaseCompAcq/PhaseDevice.cpp index e1c7f4f..d62e913 100644 --- a/PhaseCompAcq/PhaseDevice.cpp +++ b/PhaseCompAcq/PhaseDevice.cpp @@ -204,12 +204,10 @@ { 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))); - } - }); + // 备路应用在主路不正常时才发送相位数据到消息队列 + 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))); } @@ -280,7 +278,14 @@ // 每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))); + // 备路应用在主路不正常时才发送稳定度计算结果 + if (SettingConfig::getInstance().MASTER == 0) { + if (QDateTime::currentDateTime().toSecsSinceEpoch() - ConstCache::getInstance().latestHeartTs > 5) { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } + } else { + kafkaUtil.produceMessage(SettingConfig::getInstance().KAFKA_PERFORM_TOPIC, QString(QJsonDocument(performArray).toJson(QJsonDocument::Compact))); + } } } } diff --git a/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp b/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp index 2f1a041..4f0746a 100644 --- a/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp +++ b/PhaseCompAcq/protocol/dto/PhaseDataDto.cpp @@ -15,7 +15,7 @@ dataObj.insert("frameId", this->frameId); jsonObj.insert("channelNo", (i + 1)); - jsonObj.insert("ts", (this->milisecond / 1000) * 1000); + jsonObj.insert("ts", this->milisecond); jsonObj.insert("data", dataObj); return jsonObj; @@ -34,7 +34,7 @@ dataObj.insert("channelActive", channelActiveArray); dataObj.insert("devStatus", "1"); - jsonObj.insert("ts", (this->milisecond / 1000) * 1000); + jsonObj.insert("ts", this->milisecond); jsonObj.insert("frameType", "0201"); jsonObj.insert("data", dataObj); diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index 55d7cd6..26983b2 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -3,7 +3,7 @@ #定义了ordered表示子项目按照添加的顺序来编译 #CONFIG += ordered -#SUBDIRS += CounterAcq #计数器数据采集 +SUBDIRS += CounterAcq #计数器数据采集 #SUBDIRS += CounterAcqBM #6906计数器数据采集 SUBDIRS += CounterRealTime SUBDIRS += PhaseCompAcq #比相仪数据采集