Doxygen with github
Loading...
Searching...
No Matches
ksMqttConnector.h
1/*
2 * Copyright (c) 2020-2026, Krzysztof Strehlau
3 *
4 * This file is a part of the ksIotFrameworkLib IoT 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 <cstdint>
13#include <string>
14#include <string_view>
15
16#include "../ksComponent.h"
17#include "../evt/ksEvent.h"
18#include "../misc/ksSimpleTimer.h"
19#include "../misc/ksDomainQuery.h"
20
21#if (defined(ESP32))
22 #if ESP_ARDUINO_VERSION_MAJOR >= 3
23 #define ksMqttConnectorNetClient_t NetworkClient
24 #define ksMqttConnectorNetClientSecure_t NetworkClientSecure
25 #else
26 #define ksMqttConnectorNetClient_t WiFiClient
27 #define ksMqttConnectorNetClientSecure_t WiFiClientSecure
28 #endif
29 class ksMqttConnectorNetClientSecure_t;
30 class ksMqttConnectorNetClient_t;
31#elif defined(ESP8266)
32 namespace BearSSL{class WiFiClientSecure;}
33 #define ksMqttConnectorNetClientSecure_t BearSSL::WiFiClientSecure
34 #define ksMqttConnectorNetClient_t WiFiClient
35 class ksMqttConnectorNetClient_t;
36#else
37 #error Platform not implemented.
38#endif
39
40class PubSubClient;
41
42namespace ksf::misc
43{
44 class ksCertFingerprint;
45}
46
47namespace ksf::comps
48{
49 class ksWifiConnector;
50
60 {
61 KSF_RTTI_DECLARATIONS(ksMqttConnector, ksComponent)
62
63 protected:
64#if APP_LOG_ENABLED
65 ksApplication* app{nullptr};
66#endif
67
69 std::unique_ptr<ksMqttConnectorNetClient_t> netClientUq;
70 std::unique_ptr<PubSubClient> mqttClientUq;
71 std::weak_ptr<ksWifiConnector> wifiConnWp;
73
75 uint32_t reconnectCounter{0};
76
77 struct
78 {
81 bool wasConnected : 1;
82 }
83 bitflags = {true, false, true};
84
85 std::string login;
86 std::string password;
87 std::string prefix;
88 uint16_t portNumber{1883};
89
90 std::unique_ptr<misc::ksCertFingerprint> certFingerprint;
91
97 bool connectToBroker();
98
105
112 void mqttMessageInternal(const char* topic, const uint8_t* payload, uint32_t length);
113
114 public:
115 enum class QosLevel
116 {
117 QOS_AT_LEAST_ONCE,
118 QOS_EXACTLY_ONCE
119 };
120
121 DECLARE_KS_EVENT(onDeviceMessage, const std::string_view&, const std::string_view&)
122 DECLARE_KS_EVENT(onAnyMessage, const std::string_view&, const std::string_view&)
123
124 DECLARE_KS_EVENT(onConnected)
125 DECLARE_KS_EVENT(onDisconnected)
126
134
138 virtual ~ksMqttConnector();
139
146 bool init(ksApplication* app) override;
147
156 bool postInit(ksApplication* app) override;
157
162 bool loop(ksApplication* app) override;
163
168 bool isConnected() const;
169
174 uint32_t getConnectionTimeSeconds() const;
175
180 uint32_t getReconnectCounter() const { return reconnectCounter; }
181
188 void subscribe(const std::string& topic, bool skipDevicePrefix = false, ksMqttConnector::QosLevel = ksMqttConnector::QosLevel::QOS_AT_LEAST_ONCE);
189
195 void unsubscribe(const std::string& topic, bool skipDevicePrefix = false);
196
204 void publish(const std::string& topic, const std::string& payload, bool retain = false, bool skipDevicePrefix = false);
205
214 void setupConnection(std::string broker, const std::string& port, std::string login, std::string password, std::string prefix, const std::string& fingerprint);
215 };
216}
A component responsible for managing MQTT connections.
Definition ksMqttConnector.h:60
std::weak_ptr< ksWifiConnector > wifiConnWp
Weak pointer to WiFi connector.
Definition ksMqttConnector.h:71
std::unique_ptr< ksMqttConnectorNetClient_t > netClientUq
Shared pointer to WiFiClient used to connect to MQTT.
Definition ksMqttConnector.h:69
std::string prefix
Saved MQTT prefix.
Definition ksMqttConnector.h:87
misc::ksDomainQuery domainResolver
Domain query used to resolve MQTT broker address.
Definition ksMqttConnector.h:68
misc::ksSimpleTimer reconnectTimer
Timer that counts time between reconnection attempts.
Definition ksMqttConnector.h:72
void subscribe(const std::string &topic, bool skipDevicePrefix=false, ksMqttConnector::QosLevel=ksMqttConnector::QosLevel::QOS_AT_LEAST_ONCE)
Subscribes to MQTT topic.
Definition ksMqttConnector.cpp:140
uint32_t getReconnectCounter() const
Retrieves MQTT reconnect counter.
Definition ksMqttConnector.h:180
bool init(ksApplication *app) override
Instantiates the MQTT connector component.
Definition ksMqttConnector.cpp:45
uint64_t lastSuccessConnectionTime
Time of connection to MQTT broker in seconds.
Definition ksMqttConnector.h:74
std::unique_ptr< PubSubClient > mqttClientUq
Shared pointer to PubSubClient used to connect to MQTT.
Definition ksMqttConnector.h:70
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:69
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:122
bool loop(ksApplication *app) override
Executes MQTT connection logic.
Definition ksMqttConnector.cpp:257
std::string login
Saved MQTT login.
Definition ksMqttConnector.h:85
std::unique_ptr< misc::ksCertFingerprint > certFingerprint
Shared pointer to fingerprint validator.
Definition ksMqttConnector.h:90
bool usePersistentSession
Use persistent session or not.
Definition ksMqttConnector.h:80
uint32_t getConnectionTimeSeconds() const
Retrieves connection time in seconds.
Definition ksMqttConnector.cpp:307
bool sendConnectionStatus
Send connection status to MQTT or not.
Definition ksMqttConnector.h:79
void unsubscribe(const std::string &topic, bool skipDevicePrefix=false)
Unsubscribes the MQTT topic.
Definition ksMqttConnector.cpp:152
bool isConnected() const
Retrieves connection state.
Definition ksMqttConnector.cpp:302
std::shared_ptr< ksf::evt::ksEvent<> > onDisconnected
onDisconnected event that user can bind to.
Definition ksMqttConnector.h:125
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:163
uint16_t portNumber
Saved MQTT port number.
Definition ksMqttConnector.h:88
void mqttConnectedInternal()
Connects to the MQTT broker (internal function).
Definition ksMqttConnector.cpp:102
bool connectToBroker()
Connects to the MQTT broker.
Definition ksMqttConnector.cpp:187
bool postInit(ksApplication *app) override
Method that handles component post-initialization.
Definition ksMqttConnector.cpp:63
std::shared_ptr< ksf::evt::ksEvent<> > onConnected
onConnected event that user can bind to.
Definition ksMqttConnector.h:124
void mqttMessageInternal(const char *topic, const uint8_t *payload, uint32_t length)
Called when MQTT message arrives (internal function).
Definition ksMqttConnector.cpp:109
std::string password
Saved MQTT password.
Definition ksMqttConnector.h:86
uint32_t reconnectCounter
MQTT reconnection counter.
Definition ksMqttConnector.h:75
bool wasConnected
True if connected in previous loop.
Definition ksMqttConnector.h:81
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:121
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