MQTTBase.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "MQTTBase.h"
  2. #include <QDebug>
  3. #include "qmqtt_message.h"
  4. MQTTBase::MQTTBase(QObject* parent) : QObject(parent)
  5. {
  6. /* 获取日志 */
  7. m_logger = spdlog::get("MQTT");
  8. if(m_logger == nullptr)
  9. {
  10. SPDLOG_ERROR("获取MQTT logger 失败!");
  11. exit(-1);
  12. }
  13. /* 连接信号和槽 */
  14. connect(&m_client,SIGNAL(connected()),this,SLOT(do_connected()));
  15. connect(&m_client,SIGNAL(disconnected()),this,SLOT(do_disconnect()));
  16. connect(&m_client,SIGNAL(error(QMQTT::ClientError)),this,SLOT(do_error(QMQTT::ClientError)));
  17. connect(&m_client,SIGNAL(subscribed(QString,quint8)),this,SLOT(do_subscribed(QString, quint8)));
  18. connect(&m_client,SIGNAL(received(QMQTT::Message)),this,SLOT(do_received(QMQTT::Message)));
  19. }
  20. /* 设置地址 */
  21. void MQTTBase::setIPAndPort(const QString& IP, int port)
  22. {
  23. m_mqttIP = IP;
  24. m_mqttPort = port;
  25. QHostAddress addr = QHostAddress(IP);
  26. m_client.setHost(addr);
  27. m_client.setPort(port);
  28. }
  29. /* 设置订阅 */
  30. void MQTTBase::addSubcribe(const QString& topic, int qos)
  31. {
  32. if(qos > 2)
  33. {
  34. SPDLOG_LOGGER_ERROR(m_logger,"QoS值不合法:{}", qos);
  35. return;
  36. }
  37. if(m_isConnected)
  38. {
  39. /* 已连接到MQTT,之前添加的主题已经订阅,现在添加的也直接添加订阅 */
  40. m_client.subscribe(topic, qos);
  41. m_mapTopic.insert(topic, qos);
  42. }else
  43. {
  44. /* 还未连接到MQTT,直接加入到订阅列表 */
  45. m_mapTopic.insert(topic, qos);
  46. }
  47. }
  48. /* 连接到服务器 */
  49. void MQTTBase::connectToServer()
  50. {
  51. m_client.connectToHost();
  52. }
  53. /* 连接成功 */
  54. void MQTTBase::do_connected()
  55. {
  56. SPDLOG_LOGGER_INFO(m_logger,"MQTT IP:{} ,Port:{} 连接成功!", m_mqttIP.toStdString(), m_mqttPort);
  57. m_isConnected = true;
  58. /* 订阅所有的主题 */
  59. for(auto& it : m_mapTopic.keys())
  60. {
  61. auto qos = m_mapTopic.value(it);
  62. m_client.subscribe(it, qos);
  63. }
  64. }
  65. /* 断开连接 */
  66. void MQTTBase::do_disconnect()
  67. {
  68. SPDLOG_LOGGER_INFO(m_logger,"断开连接!");
  69. }
  70. /* 错误 */
  71. void MQTTBase::do_error(const QMQTT::ClientError error)
  72. {
  73. SPDLOG_LOGGER_ERROR(m_logger,"错误:{}", (int)error);
  74. }
  75. /* 订阅成功 */
  76. void MQTTBase::do_subscribed(const QString& topic, const quint8 qos)
  77. {
  78. SPDLOG_LOGGER_INFO(m_logger,"订阅:{}, QoS:{} 成功", topic.toStdString(), qos);
  79. }
  80. /* 接收到消息 */
  81. void MQTTBase::do_received(const QMQTT::Message& message)
  82. {
  83. // SPDLOG_LOGGER_INFO(m_logger,"MQTTBase接收到一条消息:{}", message.topic().toStdString());
  84. recvMessage(message);
  85. }