Doxygen with github
Loading...
Searching...
No Matches
ksMqttConnector.h
1/*
2 * Copyright (c) 2021-2025, Krzysztof Strehlau
3 *
4 * This file is a part of the ksIotFramework library.
5 * All licensing information can be found inside LICENSE.md file.
6 *
7 * https://github.com/cziter15/ksIotFrameworkLib/blob/master/LICENSE
8 */
9
10#pragma once
11
12#include <string>
13#include <string_view>
14
15#include "../ksComponent.h"
16#include "../evt/ksEvent.h"
17#include "../misc/ksSimpleTimer.h"
18#include "../misc/ksDomainQuery.h"
19
20#if (defined(ESP32))
21 #if ESP_ARDUINO_VERSION_MAJOR >= 3
22 #define ksMqttConnectorNetClient_t NetworkClient
23 #define ksMqttConnectorNetClientSecure_t NetworkClientSecure
24 #else
25 #define ksMqttConnectorNetClient_t WiFiClient
26 #define ksMqttConnectorNetClientSecure_t WiFiClientSecure
27 #endif
28 class ksMqttConnectorNetClientSecure_t;
29 class ksMqttConnectorNetClient_t;
30#elif defined(ESP8266)
31 namespace BearSSL{class WiFiClientSecure;}
32 #define ksMqttConnectorNetClientSecure_t BearSSL::WiFiClientSecure
33 #define ksMqttConnectorNetClient_t WiFiClient
34 class ksMqttConnectorNetClient_t;
35#else
36 #error Platform not implemented.
37#endif
38
39class PubSubClient;
40
41namespace ksf::misc
42{
43 class ksCertFingerprint;
44}
45
46namespace ksf::comps
47{
48 class ksWifiConnector;
49
59 {
60 KSF_RTTI_DECLARATIONS(ksMqttConnector, ksComponent)
61
62 protected:
63#if APP_LOG_ENABLED
64 ksApplication* app{nullptr};
65#endif
66
68 std::unique_ptr<ksMqttConnectorNetClient_t> netClientUq;
69 std::unique_ptr<PubSubClient> mqttClientUq;
70 std::weak_ptr<ksWifiConnector> wifiConnWp;
72
74 uint32_t reconnectCounter{0};
75
76 struct
77 {
80 bool wasConnected : 1;
81 }
82 bitflags = {true, false, true};
83
84 std::string login;
85 std::string password;
86 std::string prefix;
87 uint16_t portNumber{1883};
88
89 std::unique_ptr<misc::ksCertFingerprint> certFingerprint;
90
96 bool connectToBroker();
97
104
111 void mqttMessageInternal(const char* topic, const uint8_t* payload, uint32_t length);
112
113 public:
114 enum class QosLevel
115 {
116 QOS_AT_LEAST_ONCE,
117 QOS_EXACTLY_ONCE
118 };
119
120 DECLARE_KS_EVENT(onDeviceMessage, const std::string_view&, const std::string_view&)
121 DECLARE_KS_EVENT(onAnyMessage, const std::string_view&, const std::string_view&)
122
123 DECLARE_KS_EVENT(onConnected)
124 DECLARE_KS_EVENT(onDisconnected)
125
133
137 virtual ~ksMqttConnector();
138
145 bool init(ksApplication* app) override;
146
155 bool postInit(ksApplication* app) override;
156
161 bool loop(ksApplication* app) override;
162
167 bool isConnected() const;
168
173 uint32_t getConnectionTimeSeconds() const;
174
179 uint32_t getReconnectCounter() const { return reconnectCounter; }
180
187 void subscribe(const std::string& topic, bool skipDevicePrefix = false, ksMqttConnector::QosLevel = ksMqttConnector::QosLevel::QOS_AT_LEAST_ONCE);
188
194 void unsubscribe(const std::string& topic, bool skipDevicePrefix = false);
195
203 void publish(const std::string& topic, const std::string& payload, bool retain = false, bool skipDevicePrefix = false);
204
213 void setupConnection(std::string broker, const std::string& port, std::string login, std::string password, std::string prefix, const std::string& fingerprint);
214 };
215}
A component responsible for managing MQTT connections.
Definition ksMqttConnector.h:59
std::weak_ptr< ksWifiConnector > wifiConnWp
Weak pointer to WiFi connector.
Definition ksMqttConnector.h:70
std::unique_ptr< ksMqttConnectorNetClient_t > netClientUq
Shared pointer to WiFiClient used to connect to MQTT.
Definition ksMqttConnector.h:68
std::string prefix
Saved MQTT prefix.
Definition ksMqttConnector.h:86
misc::ksDomainQuery domainResolver
Domain query used to resolve MQTT broker address.
Definition ksMqttConnector.h:67
misc::ksSimpleTimer reconnectTimer
Timer that counts time between reconnection attempts.
Definition ksMqttConnector.h:71
void subscribe(const std::string &topic, bool skipDevicePrefix=false, ksMqttConnector::QosLevel=ksMqttConnector::QosLevel::QOS_AT_LEAST_ONCE)
Subscribes to MQTT topic.
Definition ksMqttConnector.cpp:138
uint32_t getReconnectCounter() const
Retrieves MQTT reconnect counter.
Definition ksMqttConnector.h:179
bool init(ksApplication *app) override
Instantiates the MQTT connector component.
Definition ksMqttConnector.cpp:44
uint64_t lastSuccessConnectionTime
Time of connection to MQTT broker in seconds.
Definition ksMqttConnector.h:73
std::unique_ptr< PubSubClient > mqttClientUq
Shared pointer to PubSubClient used to connect to MQTT.
Definition ksMqttConnector.h:69
void setupConnection(std::string broker, const std::string &port, std::string login, std::string password, std::string prefix, const std::string &fingerprint)
Sets up MQTT connection.
Definition ksMqttConnector.cpp:68
std::shared_ptr< ksf::evt::ksEvent< const std::string_view &, const std::string_view & > > onAnyMessage
onAnyMessage event that user can bind to.
Definition ksMqttConnector.h:121
bool loop(ksApplication *app) override
Executes MQTT connection logic.
Definition ksMqttConnector.cpp:236
std::string login
Saved MQTT login.
Definition ksMqttConnector.h:84
std::unique_ptr< misc::ksCertFingerprint > certFingerprint
Shared pointer to fingerprint validator.
Definition ksMqttConnector.h:89
bool usePersistentSession
Use persistent session or not.
Definition ksMqttConnector.h:79
uint32_t getConnectionTimeSeconds() const
Retrieves connection time in seconds.
Definition ksMqttConnector.cpp:286
bool sendConnectionStatus
Send connection status to MQTT or not.
Definition ksMqttConnector.h:78
void unsubscribe(const std::string &topic, bool skipDevicePrefix=false)
Unsubscribes the MQTT topic.
Definition ksMqttConnector.cpp:144
bool isConnected() const
Retrieves connection state.
Definition ksMqttConnector.cpp:281
std::shared_ptr< ksf::evt::ksEvent<> > onDisconnected
onDisconnected event that user can bind to.
Definition ksMqttConnector.h:124
void publish(const std::string &topic, const std::string &payload, bool retain=false, bool skipDevicePrefix=false)
Publishes a message to the MQTT topic.
Definition ksMqttConnector.cpp:149
uint16_t portNumber
Saved MQTT port number.
Definition ksMqttConnector.h:87
void mqttConnectedInternal()
Connects to the MQTT broker (internal function).
Definition ksMqttConnector.cpp:101
bool connectToBroker()
Connects to the MQTT broker.
Definition ksMqttConnector.cpp:166
bool postInit(ksApplication *app) override
Method that handles component post-initialization.
Definition ksMqttConnector.cpp:62
std::shared_ptr< ksf::evt::ksEvent<> > onConnected
onConnected event that user can bind to.
Definition ksMqttConnector.h:123
void mqttMessageInternal(const char *topic, const uint8_t *payload, uint32_t length)
Called when MQTT message arrives (internal function).
Definition ksMqttConnector.cpp:108
std::string password
Saved MQTT password.
Definition ksMqttConnector.h:85
uint32_t reconnectCounter
MQTT reconnection counter.
Definition ksMqttConnector.h:74
bool wasConnected
True if connected in previous loop.
Definition ksMqttConnector.h:80
std::shared_ptr< ksf::evt::ksEvent< const std::string_view &, const std::string_view & > > onDeviceMessage
onDeviceMessage event that user can bind to.
Definition ksMqttConnector.h:120
A class that serves as the base for user-defined applications.
Definition ksApplication.h:44
Base component class.
Definition ksComponent.h:36
Class for resolving domain names to IP addresses using DNS queries.
Definition ksDomainQuery.h:34
A simple timer class that does not rely on component architecture.
Definition ksSimpleTimer.h:27