mqttclient.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "mqttclient.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include "../logger.h"
  5. #include <QMessageBox>
  6. MqttClient *MqttClient::instance = nullptr;
  7. MqttClient::MqttClient(QObject *parent)
  8. : QObject(parent), mqClient(new QMqttClient(this))
  9. {
  10. // 连接信号和槽
  11. connect(mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
  12. // connect(mqClient, &QMqttClient::disconnected, this, &MqttClient::onDisconnected);
  13. connect(mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
  14. connect(mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
  15. connect(mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
  16. connect(mqClient, &QMqttClient::errorChanged, this, [this](QMqttClient::ClientError error)
  17. { Logger::getInstance().error(QString("MQTT error: %1").arg(error)); });
  18. connect(mqClient, &QMqttClient::connected, this, &MqttClient::connected);
  19. }
  20. // 单例模式
  21. MqttClient *MqttClient::getInstance()
  22. {
  23. if (instance == nullptr)
  24. {
  25. instance = new MqttClient();
  26. }
  27. return instance;
  28. }
  29. MqttClient *MqttClient::createNewInstance()
  30. {
  31. return new MqttClient();
  32. }
  33. void MqttClient::connectToMqttBroker()
  34. {
  35. qDebug() << "MQTT 1511: ";
  36. mqClient->setHostname("114.55.233.194");
  37. mqClient->setPort(1883);
  38. // // 设置账号和密码
  39. mqClient->setUsername("hxgc");
  40. mqClient->setPassword("hxgc123456");
  41. // 设置客户端 ID
  42. mqClient->setClientId("pc");
  43. mqClient->connectToHost();
  44. }
  45. void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username, const QString &password, const QString &clientId, const QStringList &topicsToSubscribe)
  46. {
  47. mqClient->setHostname(hostname);
  48. mqClient->setPort(port);
  49. // 设置账号和密码
  50. mqClient->setUsername(username);
  51. mqClient->setPassword(password);
  52. // 设置客户端 ID
  53. mqClient->setClientId(clientId);
  54. mqClient->connectToHost();
  55. // 保存要订阅的主题列表
  56. m_subscribeTopics = topicsToSubscribe;
  57. }
  58. void MqttClient::onConnected()
  59. {
  60. Logger::getInstance().debug("MQTT conncted");
  61. subscribeToTopics(m_subscribeTopics);
  62. }
  63. void MqttClient::subscribeToTopics(const QStringList &topics)
  64. {
  65. for (const auto &topic : topics)
  66. {
  67. subscribeToTopic(topic);
  68. }
  69. }
  70. void MqttClient::subscribeToTopic(const QString &topic)
  71. {
  72. mqClient->subscribe(topic);
  73. }
  74. void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg)
  75. {
  76. if (mqClient->state() == QMqttClient::Connected)
  77. {
  78. auto pub = mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
  79. if (pub == -1)
  80. qDebug() << "Could not publish message";
  81. else
  82. qDebug() << "Message published" << message;
  83. }
  84. else
  85. {
  86. qDebug() << "Not connected to MQTT server";
  87. }
  88. }
  89. void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
  90. {
  91. if (topic.name() == "hxgc/companycode/pro/P")
  92. {
  93. emit proMessageReceived(message, topic);
  94. }
  95. else
  96. {
  97. emit messageAndTopicReceived(message, topic);
  98. }
  99. }
  100. void MqttClient::onStateChanged(QMqttClient::ClientState state)
  101. {
  102. switch (state)
  103. {
  104. case QMqttClient::ClientState::Disconnected:
  105. QMessageBox::information(nullptr, "提示", "MQTT连接已断开,请重新登录");
  106. qDebug() << "MQTT 客户端状态: 断开连接";
  107. Logger::getInstance().info("Start init Mqtt server.");
  108. break;
  109. case QMqttClient::ClientState::Connecting:
  110. qDebug() << "MQTT 客户端状态: 正在连接";
  111. break;
  112. case QMqttClient::ClientState::Connected:
  113. qDebug() << "MQTT 客户端状态: 已连接";
  114. break;
  115. default:
  116. qDebug() << "MQTT 客户端状态: 未知状态";
  117. break;
  118. }
  119. }
  120. void MqttClient::onError(QMqttClient::ClientError error)
  121. {
  122. qDebug() << "MQTT 错误: " << error;
  123. }