mqttclient.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "mqttclient.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include <QMessageBox>
  5. #include <QPushButton>
  6. #include "../utils/global.h"
  7. #include "../utils/logger.h"
  8. MqttClient::MqttClient(QObject *parent) : QObject(parent), _mqClient(new QMqttClient(this)) {
  9. // 连接信号和槽
  10. connect(_mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
  11. connect(_mqClient, &QMqttClient::disconnected, this, [this]() {
  12. QMetaObject::invokeMethod(
  13. this,
  14. [this]() {
  15. QMessageBox msgBox;
  16. msgBox.setWindowTitle("MQtt 错误");
  17. msgBox.setText("mqtt连接失败, 请检查网络连接或MQTT服务器状态");
  18. QPushButton *yesButton = msgBox.addButton("重连", QMessageBox::YesRole);
  19. QPushButton *noButton = msgBox.addButton("取消", QMessageBox::NoRole);
  20. yesButton->setStyleSheet(
  21. "QPushButton { background-color:rgb(5, 58, 156); color: white; padding: 5px 15px; "
  22. "border-radius: 4px; }");
  23. noButton->setStyleSheet(
  24. "QPushButton { background-color: #f44336; color: white; padding: 5px 15px; "
  25. "border-radius: 4px; }");
  26. msgBox.exec();
  27. if (msgBox.clickedButton() == yesButton) {
  28. _mqClient->connectToHost();
  29. }
  30. },
  31. Qt::ConnectionType::QueuedConnection);
  32. });
  33. connect(_mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
  34. connect(_mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
  35. // connect(_mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
  36. }
  37. void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username,
  38. const QString &password, const QString &clientId) {
  39. _mqClient->setHostname(hostname);
  40. _mqClient->setPort(port);
  41. _mqClient->setKeepAlive(20);
  42. // 设置账号和密码
  43. _mqClient->setUsername(username);
  44. _mqClient->setPassword(password);
  45. // 设置客户端 ID
  46. _mqClient->setClientId(clientId);
  47. _mqClient->connectToHost();
  48. // 保存要订阅的主题列表
  49. // m_subscribeTopics = topicsToSubscribe;
  50. }
  51. void MqttClient::onConnected() {
  52. Logger::getInstance().debug("MQTT conncted");
  53. // subscribeToTopics(m_subscribeTopics);
  54. }
  55. void MqttClient::subscribeToTopics(const QStringList &topics) {
  56. for (const auto &topic : topics) {
  57. subscribeToTopic(topic);
  58. }
  59. }
  60. void MqttClient::disconnectFromMqttBroker() {
  61. Logger::getInstance().info("MQTT client disconnecting from broker");
  62. if (_mqClient->state() == QMqttClient::Connected) {
  63. _mqClient->disconnectFromHost();
  64. }
  65. }
  66. bool MqttClient::isConnected() const { return _mqClient->state() == QMqttClient::Connected; }
  67. QMqttSubscription *MqttClient::subscribeToTopic(const QString &topic) { return _mqClient->subscribe(topic); }
  68. void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg) {
  69. if (_mqClient->state() == QMqttClient::Connected) {
  70. auto pub = _mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
  71. if (pub == -1)
  72. Logger::getInstance().error(
  73. QString("Error MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
  74. .arg(topic, QString(message), QString::number(qos), isRetainedMsg ? "true" : "false"));
  75. else
  76. Logger::getInstance().info(
  77. QString("MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
  78. .arg(topic, QString(message), QString::number(qos), isRetainedMsg ? "true" : "false"));
  79. } else {
  80. qDebug() << "Not connected to MQTT server";
  81. Logger::getInstance().error(
  82. QString("MQTT client is not connected to the server. topic: %1, msg: %2").arg(topic, QString(message)));
  83. }
  84. }
  85. void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
  86. if (topic.name() == MQTT_TOPIC_COMPANY_PROJECTS_SUB) {
  87. emit proMessageReceived(message, topic);
  88. } else {
  89. emit messageReceived(message, topic);
  90. }
  91. }
  92. void MqttClient::onStateChanged(QMqttClient::ClientState state) {
  93. switch (state) {
  94. case QMqttClient::ClientState::Disconnected: {
  95. Logger::getInstance().info("mqtt disconnected");
  96. break;
  97. }
  98. case QMqttClient::ClientState::Connecting:
  99. Logger::getInstance().info("mqtt connecting");
  100. break;
  101. case QMqttClient::ClientState::Connected:
  102. Logger::getInstance().info("mqtt connected");
  103. break;
  104. default:
  105. Logger::getInstance().info("mqtt other state: " + QString::number(static_cast<int>(state)));
  106. break;
  107. }
  108. }
  109. void MqttClient::onError(QMqttClient::ClientError error) {
  110. Logger::getInstance().error(QString("MQTT client error: %1").arg(static_cast<int>(error)));
  111. }