mqttclient.cpp 3.6 KB

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