#include "MQTTAgent.h" #include MQTTAgent* g_pThis; QMQTT::Client* m_pMqtt; MQTTAgent::MQTTAgent() : QObject() { m_pMqtt = nullptr; g_pThis = this; } MQTTAgent::~MQTTAgent() { if( m_pMqtt != nullptr ) { delete m_pMqtt; } } void onReceived(const QMQTT::Message& message) { emit g_pThis->sigEvent((char*)message.topic().toLocal8Bit().toStdString().c_str(), (char*)message.payload().toStdString().c_str()); //qDebug() << "recv" << message.topic() << message.payload(); } bool MQTTAgent::Connect(tagSetup ts) { m_pMqtt = new QMQTT::Client(); connect(m_pMqtt, &QMQTT::Client::connected, []{ qDebug()<< __FILE__ << __LINE__ << "connected"; }); connect(m_pMqtt, &QMQTT::Client::disconnected, []{ qDebug()<< __FILE__ << __LINE__ << "disconnect"; }); connect(m_pMqtt, &QMQTT::Client::received, this, &onReceived); m_pMqtt->setHostName(ts.addr.c_str()); //m_pMqtt->setHostName("mq.tongxinmao.com"); //18830 //m_pMqtt->setHostName("www.kjxry.cn"); m_pMqtt->setPort(ts.port); m_pMqtt->setKeepAlive(60); m_pMqtt->setClientId("C001"); //唯一id, 相同id不能同时连接 m_pMqtt->setUsername(ts.user.c_str()); m_pMqtt->setPassword(ts.password.c_str()); m_pMqtt->setAutoReconnect(true); //开启自动重连 m_pMqtt->setCleanSession(true); //非持久化连接,上线时,将不再关心之前所有的订阅关系以及离线消息 m_pMqtt->setVersion(QMQTT::V3_1_1); //qDebug()<< __FILE__ << __LINE__<< "ver" << m_pMqtt->version(); m_pMqtt->connectToHost(); return true; } bool MQTTAgent::Subscribe(std::list topics) { bool ret = true; std::list::iterator itr; for (itr = topics.begin(); itr != topics.end(); ++itr) { m_pMqtt->subscribe(itr->c_str(), 1); } return ret; } void MQTTAgent::Publish(std::string szKey,QVariant v) { /* std::string szContent; switch( v.type() ) { case QMetaType::Bool: szContent = v.toBool() ? "true":"false"; break; case QMetaType::Int: szContent = std::to_string(v.toInt()); break; case QMetaType::UInt: szContent = std::to_string(v.toUInt()); break; case QMetaType::LongLong: szContent = std::to_string(v.toLongLong()); break; case QMetaType::ULongLong: szContent = std::to_string(v.toULongLong()); break; case QMetaType::Double: szContent = std::to_string(v.toDouble()); break; case QMetaType::QString: szContent = v.toString().toLocal8Bit().toStdString(); break; } */ QMQTT::Message message; message.setTopic(szKey.c_str()); message.setPayload(v.toByteArray()); message.setRetain(true); //保留最后一条数据 if( m_pMqtt != nullptr ) { m_pMqtt->publish(message); qDebug() << __FILE__ << __LINE__ << szKey.c_str() << " " << v.toString(); } } QStringList MQTTAgent::hvals(QString k) { return QStringList(); }