Files
OpenDTU/include/MqttSettings.h
benzman d039455b82 Fix: handle MQTT message fragmentation
MQTT messages might arrive in parts if their payload is too big. for that
reason, we need to be prepared to re-assemble fragmented messages
on a topic before handing them over to the subscriber.
2025-05-04 16:17:24 +02:00

47 lines
1.4 KiB
C++

// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "NetworkSettings.h"
#include <MqttSubscribeParser.h>
#include <Ticker.h>
#include <espMqttClient.h>
#include <mutex>
#include <map>
#include <vector>
class MqttSettingsClass {
public:
MqttSettingsClass();
void init();
void performReconnect();
bool getConnected();
void publish(const String& subtopic, const String& payload);
void publishGeneric(const String& topic, const String& payload, const bool retain, const uint8_t qos = 0);
void subscribe(const String& topic, const uint8_t qos, const OnMessageCallback& cb);
void unsubscribe(const String& topic);
String getPrefix() const;
String getClientId() const;
private:
void NetworkEvent(network_event event);
void onMqttDisconnect(espMqttClientTypes::DisconnectReason reason);
void onMqttConnect(const bool sessionPresent);
void onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, const size_t len, const size_t index, const size_t total);
void performConnect();
void performDisconnect();
void createMqttClientObject();
MqttClient* _mqttClient = nullptr;
Ticker _mqttReconnectTimer;
std::map<String, std::vector<uint8_t>> _fragments;
MqttSubscribeParser _mqttSubscribeParser;
std::mutex _clientLock;
};
extern MqttSettingsClass MqttSettings;