MQTTAgent.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "MQTTAgent.h"
  2. #include <QMqtt.h>
  3. MQTTAgent* g_pThis;
  4. QMQTT::Client* m_pMqtt;
  5. MQTTAgent::MQTTAgent()
  6. : QObject()
  7. {
  8. m_pMqtt = nullptr;
  9. g_pThis = this;
  10. }
  11. MQTTAgent::~MQTTAgent()
  12. {
  13. if( m_pMqtt != nullptr )
  14. {
  15. delete m_pMqtt;
  16. }
  17. }
  18. void onReceived(const QMQTT::Message& message)
  19. {
  20. emit g_pThis->sigEvent((char*)message.topic().toLocal8Bit().toStdString().c_str(), (char*)message.payload().toStdString().c_str());
  21. //qDebug() << "recv" << message.topic() << message.payload();
  22. }
  23. bool MQTTAgent::Connect(tagSetup ts)
  24. {
  25. m_pMqtt = new QMQTT::Client();
  26. connect(m_pMqtt, &QMQTT::Client::connected, []{
  27. qDebug()<< __FILE__ << __LINE__ << "connected";
  28. });
  29. connect(m_pMqtt, &QMQTT::Client::disconnected, []{
  30. qDebug()<< __FILE__ << __LINE__ << "disconnect";
  31. });
  32. connect(m_pMqtt, &QMQTT::Client::received, this, &onReceived);
  33. m_pMqtt->setHostName(ts.addr.c_str());
  34. //m_pMqtt->setHostName("mq.tongxinmao.com"); //18830
  35. //m_pMqtt->setHostName("www.kjxry.cn");
  36. m_pMqtt->setPort(ts.port);
  37. m_pMqtt->setKeepAlive(60);
  38. m_pMqtt->setClientId("C001"); //唯一id, 相同id不能同时连接
  39. m_pMqtt->setUsername(ts.user.c_str());
  40. m_pMqtt->setPassword(ts.password.c_str());
  41. m_pMqtt->setAutoReconnect(true); //开启自动重连
  42. m_pMqtt->setCleanSession(true); //非持久化连接,上线时,将不再关心之前所有的订阅关系以及离线消息
  43. m_pMqtt->setVersion(QMQTT::V3_1_1);
  44. qDebug()<< __FILE__ << __LINE__<< "ver" << m_pMqtt->version();
  45. m_pMqtt->connectToHost();
  46. return true;
  47. }
  48. bool MQTTAgent::Subscribe(std::list<std::string> topics)
  49. {
  50. bool ret = true;
  51. std::list<std::string>::iterator itr;
  52. for (itr = topics.begin(); itr != topics.end(); ++itr)
  53. {
  54. m_pMqtt->subscribe(itr->c_str(), 1);
  55. }
  56. return ret;
  57. }
  58. void MQTTAgent::Publish(std::string szKey,QVariant v)
  59. {
  60. std::string szContent;
  61. switch( v.type() )
  62. {
  63. case QMetaType::Bool:
  64. szContent = v.toBool() ? "true":"false";
  65. break;
  66. case QMetaType::Int:
  67. szContent = std::to_string(v.toInt());
  68. break;
  69. case QMetaType::UInt:
  70. szContent = std::to_string(v.toUInt());
  71. break;
  72. case QMetaType::LongLong:
  73. szContent = std::to_string(v.toLongLong());
  74. break;
  75. case QMetaType::ULongLong:
  76. szContent = std::to_string(v.toULongLong());
  77. break;
  78. case QMetaType::Double:
  79. szContent = std::to_string(v.toDouble());
  80. break;
  81. case QMetaType::QString:
  82. szContent = v.toString().toLocal8Bit().toStdString();
  83. break;
  84. }
  85. QMQTT::Message message;
  86. message.setTopic(szKey.c_str());
  87. message.setPayload(szContent.c_str());
  88. message.setRetain(true); //保留最后一条数据
  89. m_pMqtt->publish(message);
  90. }
  91. QStringList MQTTAgent::hvals(QString k)
  92. {
  93. return QStringList();
  94. }