MQTTAgent.cpp 3.1 KB

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