MQTTClient.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "MQTTClient.h"
  2. #include "qmqtt.h"
  3. MQTTClient::MQTTClient(QObject *parent) : QObject(parent)
  4. {
  5. }
  6. void MQTTClient::connect2Host(const QString &host, const uint16_t port, const QString &usr, const QString &passwd, const QString &clientID)
  7. {
  8. mqtt = new QMQTT::Client();
  9. connect(mqtt, &QMQTT::Client::connected, []{
  10. qDebug()<< __FILE__ << __LINE__ << "connected";
  11. });
  12. connect(mqtt, &QMQTT::Client::disconnected, []{
  13. qDebug()<< __FILE__ << __LINE__ << "disconnected";
  14. }
  15. );
  16. connect(mqtt, &QMQTT::Client::received, this, &MQTTClient::onReceived);
  17. //mqtt->setHostName("y.kjxry.cn");
  18. mqtt->setHostName(host);
  19. mqtt->setPort(port);
  20. mqtt->setKeepAlive(60);
  21. mqtt->setClientId(clientID); //唯一id, 相同id不能同时连接
  22. mqtt->setUsername(usr);
  23. mqtt->setPassword(passwd.toUtf8());
  24. mqtt->setAutoReconnect(true); //开启自动重连
  25. mqtt->setCleanSession(true); //非持久化连接,上线时,将不再关心之前所有的订阅关系以及离线消息
  26. mqtt->setVersion(QMQTT::V3_1_1);
  27. qDebug()<< "ver" << mqtt->version();
  28. mqtt->connectToHost();
  29. }
  30. MQTTClient::~MQTTClient()
  31. {
  32. mqtt->disconnected();
  33. mqtt->deleteLater();
  34. }
  35. //接收到的消息
  36. void MQTTClient::onReceived(const QMQTT::Message& message)
  37. {
  38. //qDebug() << "recv" << message.topic() << message.payload();
  39. MQTTCallbackFn cbFunc = hCbFuncs.value(message.topic());
  40. if (cbFunc)
  41. {
  42. cbFunc(message.topic(), message.payload());
  43. }
  44. else if (shareCbFunc)
  45. {
  46. shareCbFunc(message.topic(), message.payload());
  47. }
  48. }
  49. void MQTTClient::subscribe(const QString& topic, MQTTCallbackFn& func)
  50. {
  51. //qDebug()<< "sub" << topic;
  52. if (topic.contains("+") || topic.contains("#") || topic.contains("*"))
  53. {
  54. shareCbFunc = func; //共享回调
  55. }
  56. else
  57. {
  58. hCbFuncs.insert(topic, func); //独立回调
  59. }
  60. mqtt->subscribe(topic, 1);
  61. //不同的订阅方式
  62. //mqtt->subscribe("alarm/led", 1);
  63. //mqtt->subscribe("+/led", 1);
  64. //mqtt->subscribe("alarm/#", 1);
  65. }
  66. void MQTTClient::publish(const QString &topic, const QByteArray &payload)
  67. {
  68. //QMQTT::Message message(i, EXAMPLE_TOPIC, QString("Number %1").arg(i).toUtf8());
  69. QMQTT::Message message;
  70. message.setTopic(topic);
  71. message.setPayload(payload);
  72. message.setRetain(true); //保留最后一条数据
  73. mqtt->publish(message);
  74. }