mqttclient.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. });
  19. connect(mqClient, &QMqttClient::connected, this, &MqttClient::connected);
  20. }
  21. // 单例模式
  22. MqttClient* MqttClient::getInstance()
  23. {
  24. if (instance == nullptr) {
  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. subscribeToTopic(topic);
  67. }
  68. }
  69. void MqttClient::subscribeToTopic(const QString &topic)
  70. {
  71. mqClient->subscribe(topic);
  72. }
  73. void MqttClient:: sendMessage(const QString& topic, const QByteArray& message)
  74. {
  75. if (mqClient->state() == QMqttClient::Connected) {
  76. quint8 qos = 1;
  77. auto pub = mqClient->publish(QMqttTopicName(topic), message, qos, true);
  78. if (pub == -1)
  79. qDebug() << "Could not publish message";
  80. else
  81. qDebug() << "Message published"<<message;
  82. } else {
  83. qDebug() << "Not connected to MQTT server";
  84. }
  85. }
  86. void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic)
  87. {
  88. if (topic.name() == "hxgc/companycode/pro/P") {
  89. emit proMessageReceived(message,topic);
  90. }else{
  91. emit messageAndTopicReceived(message, topic);
  92. }
  93. }
  94. void MqttClient::onStateChanged(QMqttClient::ClientState state)
  95. {
  96. switch (state) {
  97. case QMqttClient::ClientState::Disconnected:
  98. QMessageBox::information(nullptr, "提示", "MQTT连接已断开,请重新登录");
  99. qDebug() << "MQTT 客户端状态: 断开连接";
  100. Logger::getInstance().info("Start init Mqtt server.");
  101. break;
  102. case QMqttClient::ClientState::Connecting:
  103. qDebug() << "MQTT 客户端状态: 正在连接";
  104. break;
  105. case QMqttClient::ClientState::Connected:
  106. qDebug() << "MQTT 客户端状态: 已连接";
  107. break;
  108. default:
  109. qDebug() << "MQTT 客户端状态: 未知状态";
  110. break;
  111. }
  112. }
  113. void MqttClient::onError(QMqttClient::ClientError error)
  114. {
  115. qDebug() << "MQTT 错误: " << error;
  116. }