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