DiagramDesigner/diagramCommunication/source/baseChannel.cpp

77 lines
1.8 KiB
C++
Raw Normal View History

2025-12-12 17:46:37 +08:00
#include "baseChannel.h"
#include <QDateTime>
#include <QCryptographicHash>
#include <QDebug>
BaseChannel::BaseChannel(const ChannelConfig& config, QObject* parent)
: QObject(parent)
, m_config(config)
, m_reconnectTimer(new QTimer(this))
{
m_reconnectTimer->setSingleShot(true);
QObject::connect(m_reconnectTimer,&QTimer::timeout, this, &BaseChannel::onReconnectTimeout);
qDebug() << "BaseChannel created:" << m_config.channelId;
}
BaseChannel::~BaseChannel()
{
stopReconnectTimer();
qDebug() << "BaseChannel destroyed:" << m_config.channelId;
}
void BaseChannel::setAutoReconnect(bool enable)
{
m_autoReconnect = enable;
if (!enable) {
stopReconnectTimer();
}
}
void BaseChannel::startReconnectTimer()
{
if (m_autoReconnect && m_reconnectCount < m_config.maxRetries) {
int delay = m_config.reconnectInterval * (1 << m_reconnectCount); // 指数退避
m_reconnectTimer->start(qMin(delay, 30000)); // 最大30秒
m_reconnectCount++;
}
}
void BaseChannel::stopReconnectTimer()
{
m_reconnectTimer->stop();
m_reconnectCount = 0;
}
void BaseChannel::reconnect()
{
if (m_autoReconnect) {
disconnect();
QTimer::singleShot(100, this, [this]() {
connect();
});
}
}
void BaseChannel::onReconnectTimeout()
{
if (m_autoReconnect) {
qDebug() << "Reconnecting channel" << m_config.channelId
<< "attempt" << m_reconnectCount << "/" << m_config.maxRetries;
connect();
}
}
QByteArray BaseChannel::generateMessageId() const
{
QString id = QString("%1_%2")
.arg(m_config.channelId)
.arg(QDateTime::currentMSecsSinceEpoch());
return QCryptographicHash::hash(id.toUtf8(), QCryptographicHash::Md5).toHex();
}
qint64 BaseChannel::currentTimestamp() const
{
return QDateTime::currentMSecsSinceEpoch();
}