Procházet zdrojové kódy

V0.5.8
1、修改了qmqtt类,将其封装成父类,之类直接继承即可

Apple před 5 měsíci
rodič
revize
3500476255
4 změnil soubory, kde provedl 158 přidání a 150 odebrání
  1. 102 0
      common/mqtt/MQTTBase.cpp
  2. 56 0
      common/mqtt/MQTTBase.h
  3. 0 110
      common/mqtt/fromMQTT.cpp
  4. 0 40
      common/mqtt/fromMQTT.h

+ 102 - 0
common/mqtt/MQTTBase.cpp

@@ -0,0 +1,102 @@
+#include "MQTTBase.h"
+
+#include <QDebug>
+
+
+#include "qmqtt_message.h"
+
+
+MQTTBase::MQTTBase(QObject* parent) : QObject(parent)
+{
+    /* 获取日志 */
+    m_logger = spdlog::get("MQTT");
+    if(m_logger == nullptr)
+    {
+        SPDLOG_ERROR("获取MQTT logger 失败!");
+        exit(-1);
+    }
+
+    /* 连接信号和槽 */
+    connect(&m_client,SIGNAL(connected()),this,SLOT(do_connected()));
+    connect(&m_client,SIGNAL(disconnected()),this,SLOT(do_disconnect()));
+    connect(&m_client,SIGNAL(error(QMQTT::ClientError)),this,SLOT(do_error(QMQTT::ClientError)));
+    connect(&m_client,SIGNAL(subscribed(QString,quint8)),this,SLOT(do_subscribed(QString, quint8)));
+
+    connect(&m_client,SIGNAL(received(QMQTT::Message)),this,SLOT(do_received(QMQTT::Message)));
+}
+
+/* 设置地址 */
+void MQTTBase::setIPAndPort(const QString& IP, int port)
+{
+    m_mqttIP = IP;
+    m_mqttPort = port;
+    QHostAddress addr = QHostAddress(IP);
+    m_client.setHost(addr);
+    m_client.setPort(port);
+}
+
+/* 设置订阅 */
+void MQTTBase::addSubcribe(const QString& topic, int qos)
+{
+    if(qos > 2)
+    {
+        SPDLOG_LOGGER_ERROR(m_logger,"QoS值不合法:{}", qos);
+        return;
+    }
+    if(m_isConnected)
+    {
+        /* 已连接到MQTT,之前添加的主题已经订阅,现在添加的也直接添加订阅 */
+        m_client.subscribe(topic, qos);
+        m_mapTopic.insert(topic, qos);
+    }else 
+    {
+        /* 还未连接到MQTT,直接加入到订阅列表 */
+        m_mapTopic.insert(topic, qos);
+    }
+}
+
+/* 连接到服务器 */
+void MQTTBase::connectToServer()
+{
+    m_client.connectToHost();
+}
+
+
+/* 连接成功 */
+void MQTTBase::do_connected()
+{
+    SPDLOG_LOGGER_INFO(m_logger,"连接成功!");
+    m_isConnected = true;
+    /* 订阅所有的主题 */
+    for(auto& it : m_mapTopic.keys())
+    {
+        auto qos = m_mapTopic.value(it);
+        m_client.subscribe(it, qos);
+    }
+}
+
+/* 断开连接 */
+void MQTTBase::do_disconnect()
+{
+    SPDLOG_LOGGER_INFO(m_logger,"断开连接!");
+}
+
+/* 错误 */
+void MQTTBase::do_error(const QMQTT::ClientError error)
+{
+    SPDLOG_LOGGER_ERROR(m_logger,"错误:{}", (int)error);
+}
+
+/* 订阅成功 */
+void MQTTBase::do_subscribed(const QString& topic, const quint8 qos)
+{
+    SPDLOG_LOGGER_INFO(m_logger,"订阅:{}, QoS:{} 成功", topic.toStdString(), qos);
+}
+
+/* 接收到消息 */
+void MQTTBase::do_received(const QMQTT::Message& message)
+{
+    // SPDLOG_LOGGER_INFO(m_logger,"MQTTBase接收到一条消息:{}", message.topic().toStdString());
+    recvMessage(message);
+}
+

+ 56 - 0
common/mqtt/MQTTBase.h

@@ -0,0 +1,56 @@
+#ifndef MQTTBase_H
+#define MQTTBase_H
+
+#include <QObject>
+#include <QMap>
+
+#include "qmqtt.h"
+#include "spdlog/spdlog.h"
+
+
+/**
+ * 使用说明:
+ *      1. 子类可以继承这个类,重新实现 recvMessage 函数,这个函数是接收到消息的回调函数
+ *      2. 使用SPDLOG日志库,需要注册一个名为“MQTT”的logger
+ */
+
+
+
+class MQTTBase : public QObject
+{
+    Q_OBJECT
+public:
+    MQTTBase(QObject* parent = nullptr);
+
+    void setIPAndPort(const QString& IP, int port = 1883);  /* 设置地址 */
+    void addSubcribe(const QString& topic,int qos = 0);     /* 设置订阅 */
+    void connectToServer();                                 /* 连接到服务器 */
+    void analyzeAllMessage();                               /* 解析所有消息 */
+    
+signals:
+    void signal_recvMessage(const QString& message);/* 接收到消息,对消息进行了转发 */
+
+protected:
+    virtual void recvMessage(const QMQTT::Message& message) = 0; /* 接收到消息,子类继承这个解析消息数据 */
+
+protected slots:
+    void do_connected();                            /* 连接成功 */
+    void do_disconnect();                           /* 断开连接 */
+    void do_error(const QMQTT::ClientError error);  /* 错误 */
+    void do_subscribed(const QString& topic, const quint8 qos);     /* 订阅成功 */
+
+    void do_received(const QMQTT::Message& message);/* 接收到消息,子类继承这个解析消息数据 */
+
+
+protected:
+    std::shared_ptr<spdlog::logger> m_logger = nullptr;
+    bool m_isConnected = false;                     /* 是否连接成功 */
+    QString m_mqttIP;                               /* MQTT服务器IP */
+    int m_mqttPort;                                 /* MQTT服务器端口 */
+
+    QMap<QString, int> m_mapTopic;                  /* 订阅的主题和QOS */
+    QMQTT::Client m_client;                         /* MQTT客户端 */
+};
+
+
+#endif /* MQTTBase_H */

+ 0 - 110
common/mqtt/fromMQTT.cpp

@@ -1,110 +0,0 @@
-#include "fromMQTT.h"
-
-#include <QDebug>
-#include <QJsonDocument>
-#include <QJsonObject>
-#include <QJsonParseError>
-
-#include "qmqtt_message.h"
-
-
-FromMQTT::FromMQTT(QObject* parent) : QObject(parent)
-{
-    /* 获取日志 */
-    m_logger = spdlog::get("MQTT");
-    if(m_logger == nullptr)
-    {
-        qDebug() << "获取MQTT logger 失败!";
-        exit(-1);
-    }
-
-    /* 连接信号和槽 */
-    connect(&m_client,SIGNAL(connected()),this,SLOT(do_connected()));
-    connect(&m_client,SIGNAL(disconnected()),this,SLOT(do_disconnect()));
-    connect(&m_client,SIGNAL(error(QMQTT::ClientError)),this,SLOT(do_error(QMQTT::ClientError)));
-    connect(&m_client,SIGNAL(received(QMQTT::Message)),this,SLOT(do_received(QMQTT::Message)));
-    connect(&m_client,SIGNAL(subscribed(QString,quint8)),this,SLOT(do_subscribed(QString, quint8)));
-
-    
-}
-
-/* 设置地址 */
-void FromMQTT::setHostName(const QString& hostName)
-{
-    QHostAddress addr = QHostAddress(hostName);
-    m_client.setHost(addr);
-}
-
-/* 设置订阅 */
-void FromMQTT::setSubcribe(const QString& topic, int qos)
-{
-    m_client.subscribe(topic,qos);
-}
-
-/* 连接到服务器 */
-void FromMQTT::connectToServer()
-{
-    m_client.connectToHost();
-}
-
-/* 解析所有消息 */
-void FromMQTT::analyzeAllMessage()
-{
-    while (!m_queueMessage.isEmpty())
-    {
-        analyzeOneMessage();
-    }
-}
-
-/* 解析消息数据 */
-void FromMQTT::analyzeOneMessage()
-{
-    /* 先解锁,目前没有锁 */
-    if(m_queueMessage.isEmpty())
-    {
-        return;
-    }
-    SPDLOG_LOGGER_INFO(m_logger,"message:{}",m_queueMessage.front().toStdString());
-
-    /* 出队 */
-    m_queueMessage.dequeue();
-}
-
-
-/* 连接成功 */
-void FromMQTT::do_connected()
-{
-    SPDLOG_LOGGER_INFO(m_logger,"连接成功!");
-    m_client.subscribe("test/one");
-}
-
-/* 断开连接 */
-void FromMQTT::do_disconnect()
-{
-    SPDLOG_LOGGER_INFO(m_logger,"断开连接!");
-}
-
-/* 错误 */
-void FromMQTT::do_error(const QMQTT::ClientError error)
-{
-    SPDLOG_LOGGER_ERROR(m_logger,"错误:{}",(int)error);
-}
-
-/* 订阅成功 */
-void FromMQTT::do_subscribed(const QString& topic, const quint8 qos)
-{
-    SPDLOG_LOGGER_INFO(m_logger,"订阅:{},QoS:{} 成功",topic.toStdString(),qos);
-}
-
-/* 接收到消息 */
-void FromMQTT::do_received(const QMQTT::Message& message)
-{
-    // SPDLOG_LOGGER_INFO(m_logger,"接收到一条消息:{}",message.topic().toStdString());
-    /* 接收到消息,加入列表中 */
-    QByteArray ba = message.payload();
-    /* 这里可以添加锁,不过目前是单线程,不需要添加 */
-    m_queueMessage.enqueue(ba);
-
-    analyzeOneMessage();
-}
-

+ 0 - 40
common/mqtt/fromMQTT.h

@@ -1,40 +0,0 @@
-#ifndef FROMMQTT_H
-#define FROMMQTT_H
-
-#include <QObject>
-#include <QQueue>
-
-#include "qmqtt.h"
-#include "spdlog/spdlog.h"
-
-class FromMQTT : public QObject
-{
-    Q_OBJECT
-public:
-    FromMQTT(QObject* parent = nullptr);
-
-    void setHostName(const QString& hostName);      /* 设置地址 */
-    void setSubcribe(const QString& topic,int qos = 0);/* 设置订阅 */
-    void connectToServer();                         /* 连接到服务器 */
-    void analyzeAllMessage();                       /* 解析所有消息 */
-
-private:
-    void analyzeOneMessage();                       /* 解析消息数据 */
-
-private slots:
-    void do_connected();                            /* 连接成功 */
-    void do_disconnect();                           /* 断开连接 */
-    void do_error(const QMQTT::ClientError error);  /* 错误 */
-    void do_subscribed(const QString& topic, const quint8 qos);     /* 订阅成功 */
-    void do_received(const QMQTT::Message& message);/* 接收到消息 */
-
-
-private:
-    std::shared_ptr<spdlog::logger> m_logger = nullptr;
-
-    QMQTT::Client m_client;                         /* MQTT客户端 */
-    QQueue<QByteArray> m_queueMessage;              /* 消息列表 */
-};
-
-
-#endif /* FROMMQTT_H */