mqttclient.cpp 4.8 KB

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