File indexing completed on 2024-05-12 03:47:43
0001 /* 0002 File : MQTTClient.h 0003 Project : LabPlot 0004 Description : Represents a MQTT Client 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2018 Kovacs Ferencz <kferike98@gmail.com> 0007 0008 SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 #ifndef MQTTCLIENT_H 0011 #define MQTTCLIENT_H 0012 0013 #include "backend/core/Folder.h" 0014 0015 #include <QMap> 0016 #include <QVector> 0017 #include <QtMqtt/QMqttClient> 0018 #include <QtMqtt/QMqttMessage> 0019 #include <QtMqtt/QMqttSubscription> 0020 #include <QtMqtt/QMqttTopicFilter> 0021 #include <QtMqtt/QMqttTopicName> 0022 0023 class AsciiFilter; 0024 class MQTTSubscription; 0025 class MQTTTopic; 0026 class QAction; 0027 class QTimer; 0028 class QString; 0029 0030 class MQTTClient : public Folder { 0031 Q_OBJECT 0032 0033 public: 0034 enum class UpdateType { TimeInterval = 0, NewData }; 0035 0036 enum class ReadingType { ContinuousFixed = 0, FromEnd, TillEnd }; 0037 0038 enum class WillMessageType { OwnMessage = 0, Statistics, LastMessage }; 0039 0040 enum class WillUpdateType { TimePeriod = 0, OnClick }; 0041 0042 enum class WillStatisticsType { 0043 NoStatistics = -1, 0044 Minimum, 0045 Maximum, 0046 ArithmeticMean, 0047 GeometricMean, 0048 HarmonicMean, 0049 ContraharmonicMean, 0050 Median, 0051 Variance, 0052 StandardDeviation, 0053 MeanDeviation, 0054 MeanDeviationAroundMedian, 0055 MedianDeviation, 0056 Skewness, 0057 Kurtosis, 0058 Entropy 0059 }; 0060 0061 struct MQTTWill { 0062 bool enabled{false}; 0063 QString willMessage; 0064 QString willTopic; 0065 bool willRetain{false}; 0066 quint8 willQoS{0}; 0067 WillMessageType willMessageType{MQTTClient::WillMessageType::OwnMessage}; 0068 QString willOwnMessage; 0069 QString willLastMessage; 0070 int willTimeInterval{1000}; 0071 WillUpdateType willUpdateType{MQTTClient::WillUpdateType::TimePeriod}; 0072 QVector<bool> willStatistics{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 0073 }; 0074 0075 explicit MQTTClient(const QString& name); 0076 virtual ~MQTTClient() override; 0077 0078 void ready(); 0079 0080 UpdateType updateType() const; 0081 void setUpdateType(UpdateType); 0082 0083 ReadingType readingType() const; 0084 void setReadingType(ReadingType); 0085 0086 int sampleSize() const; 0087 void setSampleSize(int); 0088 0089 bool isPaused() const; 0090 0091 void setUpdateInterval(int); 0092 int updateInterval() const; 0093 0094 void setKeepNValues(int); 0095 int keepNValues() const; 0096 0097 void setKeepLastValues(bool); 0098 bool keepLastValues() const; 0099 0100 void setMQTTClientHostPort(const QString&, quint16); 0101 void setMQTTClientAuthentication(const QString&, const QString&); 0102 void setMQTTClientId(const QString&); 0103 0104 void addInitialMQTTSubscriptions(const QMqttTopicFilter&, quint8); 0105 QVector<QString> MQTTSubscriptions() const; 0106 0107 bool checkTopicContains(const QString& superior, const QString& inferior); 0108 QString checkCommonLevel(const QString& first, const QString& second); 0109 0110 QString clientHostName() const; 0111 quint16 clientPort() const; 0112 QString clientPassword() const; 0113 QString clientUserName() const; 0114 QString clientID() const; 0115 0116 void updateNow(); 0117 void pauseReading(); 0118 void continueReading(); 0119 0120 void setFilter(AsciiFilter*); 0121 AsciiFilter* filter() const; 0122 0123 QIcon icon() const override; 0124 0125 void save(QXmlStreamWriter*) const override; 0126 bool load(XmlStreamReader*, bool preview) override; 0127 0128 QVector<QString> topicNames() const; 0129 bool checkAllArrived(); 0130 0131 void setWillSettings(const MQTTWill&); 0132 MQTTWill willSettings() const; 0133 0134 void setMQTTWillUse(bool); 0135 bool MQTTWillUse() const; 0136 0137 void setWillTopic(const QString&); 0138 QString willTopic() const; 0139 QString statistics(const MQTTTopic*) const; 0140 0141 void setWillRetain(bool); 0142 bool willRetain() const; 0143 0144 void setWillQoS(quint8); 0145 quint8 willQoS() const; 0146 0147 void setWillMessageType(WillMessageType); 0148 WillMessageType willMessageType() const; 0149 0150 void setWillOwnMessage(const QString&); 0151 QString willOwnMessage() const; 0152 0153 WillUpdateType willUpdateType() const; 0154 void setWillUpdateType(WillUpdateType); 0155 0156 int willTimeInterval() const; 0157 void setWillTimeInterval(int); 0158 0159 void startWillTimer() const; 0160 void stopWillTimer() const; 0161 0162 void updateWillMessage(); 0163 0164 void setMQTTRetain(bool); 0165 bool MQTTRetain() const; 0166 0167 void setMQTTUseID(bool); 0168 bool MQTTUseID() const; 0169 0170 void setMQTTUseAuthentication(bool); 0171 bool MQTTUseAuthentication() const; 0172 0173 void clearLastMessage(); 0174 void addWillStatistics(WillStatisticsType); 0175 void removeWillStatistics(WillStatisticsType); 0176 QVector<bool> willStatistics() const; 0177 0178 void addMQTTSubscription(const QString&, quint8); 0179 void removeMQTTSubscription(const QString&); 0180 void addBeforeRemoveSubscription(const QString&, quint8); 0181 void reparentTopic(const QString& topic, const QString& parent); 0182 0183 private: 0184 UpdateType m_updateType{UpdateType::TimeInterval}; 0185 ReadingType m_readingType{ReadingType::ContinuousFixed}; 0186 bool m_paused{false}; 0187 bool m_prepared{false}; 0188 int m_sampleSize{1}; 0189 int m_keepNValues{0}; 0190 int m_updateInterval{1000}; 0191 AsciiFilter* m_filter{nullptr}; 0192 QTimer* m_updateTimer; 0193 QMqttClient* m_client; 0194 QMap<QMqttTopicFilter, quint8> m_subscribedTopicNameQoS; 0195 QVector<QString> m_subscriptions; 0196 QVector<QString> m_topicNames; 0197 bool m_MQTTTest{false}; 0198 QTimer* m_willTimer; 0199 bool m_MQTTFirstConnectEstablished{false}; 0200 bool m_MQTTRetain{false}; 0201 bool m_MQTTUseID{false}; 0202 bool m_MQTTUseAuthentication{false}; 0203 QVector<MQTTSubscription*> m_MQTTSubscriptions; 0204 bool m_disconnectForWill{false}; 0205 bool m_loaded{false}; 0206 int m_subscriptionsLoaded{0}; 0207 int m_subscriptionCountToLoad{0}; 0208 MQTTWill m_MQTTWill; 0209 0210 public Q_SLOTS: 0211 void read(); 0212 0213 private Q_SLOTS: 0214 void onMQTTConnect(); 0215 void MQTTSubscriptionMessageReceived(const QMqttMessage&); 0216 void MQTTErrorChanged(QMqttClient::ClientError); 0217 void subscriptionLoaded(const QString&); 0218 0219 Q_SIGNALS: 0220 void MQTTSubscribed(); 0221 void MQTTTopicsChanged(); 0222 void readFromTopics(); 0223 void clientAboutToBeDeleted(const QString&, quint16); 0224 }; 0225 #endif // MQTTCLIENT_H