MQTTAgent.cpp 3.6 KB

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