|
|
@@ -17,6 +17,9 @@ MQTTBase::MQTTBase(QObject* parent) : QObject(parent)
|
|
|
// exit(-1);
|
|
|
// }
|
|
|
|
|
|
+ // m_client.setKeepAlive(2); // 设置心跳时间为5秒
|
|
|
+ m_reconnectTimer.setSingleShot(false);
|
|
|
+
|
|
|
/* 连接信号和槽 */
|
|
|
connect(&m_client,SIGNAL(connected()),this,SLOT(do_connected()));
|
|
|
connect(&m_client,SIGNAL(disconnected()),this,SLOT(do_disconnect()));
|
|
|
@@ -25,6 +28,7 @@ MQTTBase::MQTTBase(QObject* parent) : QObject(parent)
|
|
|
|
|
|
connect(&m_client,SIGNAL(received(QMQTT::Message)),this,SLOT(do_received(QMQTT::Message)));
|
|
|
connect(&m_client, &QMQTT::Client::received, this, &MQTTBase::signal_recvMessage);
|
|
|
+ connect(&m_reconnectTimer, &QTimer::timeout, this, &MQTTBase::do_timeoutReconnect);
|
|
|
}
|
|
|
|
|
|
/* 设置地址 */
|
|
|
@@ -45,7 +49,7 @@ void MQTTBase::addSubcribe(const QString& topic, int qos)
|
|
|
SPDLOG_ERROR("QoS值不合法:{}", qos);
|
|
|
return;
|
|
|
}
|
|
|
- if(m_isConnected)
|
|
|
+ if(m_client.connectionState() == QMQTT::ConnectionState::STATE_CONNECTED)
|
|
|
{
|
|
|
/* 已连接到MQTT,之前添加的主题已经订阅,现在添加的也直接添加订阅 */
|
|
|
m_client.subscribe(topic, qos);
|
|
|
@@ -60,12 +64,23 @@ void MQTTBase::addSubcribe(const QString& topic, int qos)
|
|
|
/* 设置自动重连 */
|
|
|
void MQTTBase::setAutoReconnect(bool isAuto)
|
|
|
{
|
|
|
+ m_isAutoReconnect = isAuto;
|
|
|
m_client.setAutoReconnect(isAuto);
|
|
|
}
|
|
|
|
|
|
/* 连接到服务器 */
|
|
|
void MQTTBase::connectToServer()
|
|
|
{
|
|
|
+ if(m_client.connectionState() == QMQTT::ConnectionState::STATE_CONNECTED)
|
|
|
+ {
|
|
|
+ SPDLOG_INFO("MQTT已经连接到服务器,无需重复连接");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else if(m_client.connectionState() == QMQTT::ConnectionState::STATE_CONNECTING)
|
|
|
+ {
|
|
|
+ SPDLOG_INFO("MQTT正在连接到服务器,请稍后");
|
|
|
+ return;
|
|
|
+ }
|
|
|
m_client.connectToHost();
|
|
|
}
|
|
|
|
|
|
@@ -78,7 +93,7 @@ QMQTT::ConnectionState MQTTBase::connectState()
|
|
|
/* 发送消息 */
|
|
|
bool MQTTBase::sendMessage(const QString& topic, const QByteArray& message, int qos)
|
|
|
{
|
|
|
- if(m_isConnected == false)
|
|
|
+ if(m_client.connectionState() != QMQTT::ConnectionState::STATE_CONNECTED)
|
|
|
{
|
|
|
SPDLOG_ERROR("MQTT未连接到服务器,发送消息失败");
|
|
|
return false;
|
|
|
@@ -97,7 +112,7 @@ bool MQTTBase::sendMessage(const QString& topic, const QByteArray& message, int
|
|
|
/* 发送消息,设置消息保留 */
|
|
|
bool MQTTBase::sendMessage(const QString& topic, const QByteArray& message, int qos, bool retain)
|
|
|
{
|
|
|
- if(m_isConnected == false)
|
|
|
+ if(m_client.connectionState() != QMQTT::ConnectionState::STATE_CONNECTED)
|
|
|
{
|
|
|
SPDLOG_ERROR("MQTT未连接到服务器,发送消息失败");
|
|
|
return false;
|
|
|
@@ -123,7 +138,10 @@ bool MQTTBase::sendMessage(const QString& topic, const QByteArray& message, int
|
|
|
void MQTTBase::do_connected()
|
|
|
{
|
|
|
SPDLOG_INFO("MQTT IP:{} ,Port:{} 连接成功!", m_mqttIP.toStdString(), m_mqttPort);
|
|
|
- m_isConnected = true;
|
|
|
+ if(m_reconnectTimer.isActive())
|
|
|
+ {
|
|
|
+ m_reconnectTimer.stop();
|
|
|
+ }
|
|
|
/* 订阅所有的主题 */
|
|
|
for(auto& it : m_mapTopic.keys())
|
|
|
{
|
|
|
@@ -136,12 +154,29 @@ void MQTTBase::do_connected()
|
|
|
void MQTTBase::do_disconnect()
|
|
|
{
|
|
|
SPDLOG_INFO("MQTT 断开连接!");
|
|
|
+ if(m_isAutoReconnect)
|
|
|
+ {
|
|
|
+ SPDLOG_INFO("MQTT 自动重连已开启,正在尝试重新连接...");
|
|
|
+ if(m_reconnectTimer.isActive())
|
|
|
+ {
|
|
|
+ m_reconnectTimer.stop();
|
|
|
+ }
|
|
|
+ m_reconnectTimer.start(6000);
|
|
|
+ connectToServer();
|
|
|
+ }
|
|
|
+ emit signal_disconnected();
|
|
|
+ // m_isConnected = false;
|
|
|
}
|
|
|
|
|
|
/* 错误 */
|
|
|
void MQTTBase::do_error(const QMQTT::ClientError error)
|
|
|
{
|
|
|
SPDLOG_ERROR("MQTT 错误:{}", (int)error);
|
|
|
+ // if(m_isAutoReconnect)
|
|
|
+ // {
|
|
|
+ // SPDLOG_INFO("MQTT 自动重连已开启,正在尝试重新连接...");
|
|
|
+ // m_client.connectToHost();
|
|
|
+ // }
|
|
|
}
|
|
|
|
|
|
/* 订阅成功 */
|
|
|
@@ -157,3 +192,10 @@ void MQTTBase::do_received(const QMQTT::Message& message)
|
|
|
recvMessage(message);
|
|
|
}
|
|
|
|
|
|
+/* 超时重连 */
|
|
|
+void MQTTBase::do_timeoutReconnect()
|
|
|
+{
|
|
|
+ SPDLOG_INFO("MQTT 超时重连...");
|
|
|
+ connectToServer();
|
|
|
+}
|
|
|
+
|