|
@@ -7,63 +7,32 @@
|
|
|
#include "../global.h"
|
|
|
#include "../logger.h"
|
|
|
|
|
|
-MqttClient *MqttClient::instance = nullptr;
|
|
|
-
|
|
|
-MqttClient::MqttClient(QObject *parent) : QObject(parent), mqClient(new QMqttClient(this)) {
|
|
|
+MqttClient::MqttClient(QObject *parent) : QObject(parent), _mqClient(new QMqttClient(this)) {
|
|
|
// 连接信号和槽
|
|
|
- connect(mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
|
|
|
- // TODO: connect(mqClient, &QMqttClient::disconnected, this, &MqttClient::onDisconnected);
|
|
|
- connect(mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
|
|
|
- connect(mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
|
|
|
- connect(mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
|
|
|
- connect(mqClient, &QMqttClient::errorChanged, this, [this](QMqttClient::ClientError error) {
|
|
|
- Logger::getInstance().error(QString("MQTT client occured error: %1").arg(error));
|
|
|
- });
|
|
|
-}
|
|
|
-
|
|
|
-// 单例模式
|
|
|
-MqttClient *MqttClient::getInstance() {
|
|
|
- if (instance == nullptr) {
|
|
|
- instance = new MqttClient();
|
|
|
- }
|
|
|
- return instance;
|
|
|
-}
|
|
|
-
|
|
|
-MqttClient *MqttClient::createNewInstance() { return new MqttClient(); }
|
|
|
-void MqttClient::connectToMqttBroker() {
|
|
|
- mqClient->setHostname("114.55.233.194");
|
|
|
- mqClient->setPort(1883);
|
|
|
- mqClient->setKeepAlive(20);
|
|
|
-
|
|
|
- // // 设置账号和密码
|
|
|
- mqClient->setUsername("hxgc");
|
|
|
- mqClient->setPassword("hxgc123456");
|
|
|
-
|
|
|
- // 设置客户端 ID
|
|
|
- mqClient->setClientId("pc");
|
|
|
- mqClient->connectToHost();
|
|
|
+ connect(_mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
|
|
|
+ connect(_mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
|
|
|
+ connect(_mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
|
|
|
+ connect(_mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
|
|
|
}
|
|
|
|
|
|
void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username,
|
|
|
- const QString &password, const QString &clientId,
|
|
|
- const QStringList &topicsToSubscribe) {
|
|
|
- mqClient->setHostname(hostname);
|
|
|
- mqClient->setPort(port);
|
|
|
- mqClient->setKeepAlive(20);
|
|
|
+ const QString &password, const QString &clientId) {
|
|
|
+ _mqClient->setHostname(hostname);
|
|
|
+ _mqClient->setPort(port);
|
|
|
+ _mqClient->setKeepAlive(20);
|
|
|
|
|
|
// 设置账号和密码
|
|
|
- mqClient->setUsername(username);
|
|
|
- mqClient->setPassword(password);
|
|
|
+ _mqClient->setUsername(username);
|
|
|
+ _mqClient->setPassword(password);
|
|
|
|
|
|
// 设置客户端 ID
|
|
|
- mqClient->setClientId(clientId);
|
|
|
- mqClient->connectToHost();
|
|
|
+ _mqClient->setClientId(clientId);
|
|
|
+ _mqClient->connectToHost();
|
|
|
// 保存要订阅的主题列表
|
|
|
- m_subscribeTopics = topicsToSubscribe;
|
|
|
+ // m_subscribeTopics = topicsToSubscribe;
|
|
|
}
|
|
|
void MqttClient::onConnected() {
|
|
|
Logger::getInstance().debug("MQTT conncted");
|
|
|
- m_connectRetryCount = 0;
|
|
|
subscribeToTopics(m_subscribeTopics);
|
|
|
}
|
|
|
|
|
@@ -74,17 +43,19 @@ void MqttClient::subscribeToTopics(const QStringList &topics) {
|
|
|
}
|
|
|
|
|
|
void MqttClient::disconnectFromMqttBroker() {
|
|
|
- Logger::getInstance().info("MQTT client disconnecting from broker" + mqClient->state());
|
|
|
- if (mqClient->state() == QMqttClient::Connected) {
|
|
|
- mqClient->disconnectFromHost();
|
|
|
+ Logger::getInstance().info("MQTT client disconnecting from broker" + _mqClient->state());
|
|
|
+ if (_mqClient->state() == QMqttClient::Connected) {
|
|
|
+ _mqClient->disconnectFromHost();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void MqttClient::subscribeToTopic(const QString &topic) { mqClient->subscribe(topic); }
|
|
|
+bool MqttClient::isConnected() const { return _mqClient->state() == QMqttClient::Connected; }
|
|
|
+
|
|
|
+QMqttSubscription *MqttClient::subscribeToTopic(const QString &topic) { return _mqClient->subscribe(topic); }
|
|
|
|
|
|
void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg) {
|
|
|
- if (mqClient->state() == QMqttClient::Connected) {
|
|
|
- auto pub = mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
|
|
|
+ if (_mqClient->state() == QMqttClient::Connected) {
|
|
|
+ auto pub = _mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
|
|
|
if (pub == -1)
|
|
|
Logger::getInstance().error(
|
|
|
QString("MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
|
|
@@ -111,31 +82,20 @@ void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicNa
|
|
|
void MqttClient::onStateChanged(QMqttClient::ClientState state) {
|
|
|
switch (state) {
|
|
|
case QMqttClient::ClientState::Disconnected:
|
|
|
- m_connectRetryCount++;
|
|
|
- if (m_connectRetryCount < 3) {
|
|
|
- Logger::getInstance().info(QString("Mqtt reconnecting... (%1)").arg(m_connectRetryCount));
|
|
|
- connectToMqttBroker();
|
|
|
- } else {
|
|
|
- Logger::getInstance().error("Mqtt reconnect failed after 3 attempts");
|
|
|
- QMessageBox::warning(nullptr, "提示", "mqtt连接已断开,请重新登录");
|
|
|
- emit disConnected();
|
|
|
- }
|
|
|
+ Logger::getInstance().info("mqtt disconnected");
|
|
|
break;
|
|
|
case QMqttClient::ClientState::Connecting:
|
|
|
- qDebug() << "MQTT 客户端状态: 正在连接";
|
|
|
+ Logger::getInstance().info("mqtt connecting");
|
|
|
break;
|
|
|
case QMqttClient::ClientState::Connected:
|
|
|
- m_connectRetryCount = 0; // 重置连接重试计数
|
|
|
- qDebug() << "MQTT 客户端状态: 已连接";
|
|
|
- emit connected();
|
|
|
+ Logger::getInstance().info("mqtt connected");
|
|
|
break;
|
|
|
default:
|
|
|
- Logger::getInstance().info("Mqtt unkown state: " + QString::number(state));
|
|
|
+ Logger::getInstance().info("mqtt other state" + state);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void MqttClient::onError(QMqttClient::ClientError error) {
|
|
|
- qDebug() << "MQTT 错误: " << error;
|
|
|
- Logger::getInstance().error(QString("MQTT client error: %1").arg(error));
|
|
|
-}
|
|
|
+ Logger::getInstance().error(QString("MQTT client error: %1").arg(static_cast<int>(error)));
|
|
|
+}
|