mqttclient.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "mqttclient.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include <QMessageBox>
  5. #include "../global.h"
  6. #include "../logger.h"
  7. MqttClient::MqttClient(QObject *parent) : QObject(parent), _mqClient(new QMqttClient(this)) {
  8. // 连接信号和槽
  9. connect(_mqClient, &QMqttClient::stateChanged, this, &MqttClient::onStateChanged);
  10. connect(_mqClient, &QMqttClient::messageReceived, this, &MqttClient::onMessageReceived);
  11. connect(_mqClient, &QMqttClient::errorChanged, this, &MqttClient::onError);
  12. connect(_mqClient, &QMqttClient::connected, this, &MqttClient::onConnected);
  13. }
  14. void MqttClient::connectToMqttBroker(const QString &hostname, quint16 port, const QString &username,
  15. const QString &password, const QString &clientId) {
  16. _mqClient->setHostname(hostname);
  17. _mqClient->setPort(port);
  18. _mqClient->setKeepAlive(20);
  19. // 设置账号和密码
  20. _mqClient->setUsername(username);
  21. _mqClient->setPassword(password);
  22. // 设置客户端 ID
  23. _mqClient->setClientId(clientId);
  24. _mqClient->connectToHost();
  25. // 保存要订阅的主题列表
  26. // m_subscribeTopics = topicsToSubscribe;
  27. }
  28. void MqttClient::onConnected() {
  29. Logger::getInstance().debug("MQTT conncted");
  30. subscribeToTopics(m_subscribeTopics);
  31. }
  32. void MqttClient::subscribeToTopics(const QStringList &topics) {
  33. for (const auto &topic : topics) {
  34. subscribeToTopic(topic);
  35. }
  36. }
  37. void MqttClient::disconnectFromMqttBroker() {
  38. Logger::getInstance().info("MQTT client disconnecting from broker" + _mqClient->state());
  39. if (_mqClient->state() == QMqttClient::Connected) {
  40. _mqClient->disconnectFromHost();
  41. }
  42. }
  43. bool MqttClient::isConnected() const { return _mqClient->state() == QMqttClient::Connected; }
  44. QMqttSubscription *MqttClient::subscribeToTopic(const QString &topic) { return _mqClient->subscribe(topic); }
  45. void MqttClient::sendMessage(const QString &topic, const QByteArray &message, quint8 qos, bool isRetainedMsg) {
  46. if (_mqClient->state() == QMqttClient::Connected) {
  47. auto pub = _mqClient->publish(QMqttTopicName(topic), message, qos, isRetainedMsg);
  48. if (pub == -1)
  49. Logger::getInstance().error(
  50. QString("MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
  51. .arg(topic, QString(message), QString::number(qos), isRetainedMsg ? "true" : "false"));
  52. else
  53. Logger::getInstance().info(
  54. QString("MQTT client sent message to topic: %1, msg: %2, qos: %3, isRetainedMsg: %4")
  55. .arg(topic, QString(message), QString::number(qos), isRetainedMsg ? "true" : "false"));
  56. } else {
  57. qDebug() << "Not connected to MQTT server";
  58. Logger::getInstance().error(
  59. QString("MQTT client is not connected to the server. topic: %1, msg: %2").arg(topic, QString(message)));
  60. }
  61. }
  62. void MqttClient::onMessageReceived(const QByteArray &message, const QMqttTopicName &topic) {
  63. if (topic.name() == MQTT_TOPIC_COMPANY_PROJECTS) {
  64. emit proMessageReceived(message, topic);
  65. } else {
  66. emit messageReceived(message, topic);
  67. }
  68. }
  69. void MqttClient::onStateChanged(QMqttClient::ClientState state) {
  70. switch (state) {
  71. case QMqttClient::ClientState::Disconnected:
  72. Logger::getInstance().info("mqtt disconnected");
  73. break;
  74. case QMqttClient::ClientState::Connecting:
  75. Logger::getInstance().info("mqtt connecting");
  76. break;
  77. case QMqttClient::ClientState::Connected:
  78. Logger::getInstance().info("mqtt connected");
  79. break;
  80. default:
  81. Logger::getInstance().info("mqtt other state" + state);
  82. break;
  83. }
  84. }
  85. void MqttClient::onError(QMqttClient::ClientError error) {
  86. Logger::getInstance().error(QString("MQTT client error: %1").arg(static_cast<int>(error)));
  87. }