#ifndef MQTT_CLIENT_H #define MQTT_CLIENT_H #include #include #include #include "acuvim_registers.h" #include "config_manager.h" #define MQTT_BUFFER_SIZE 1024 #define MQTT_RECONNECT_BASE_MS 10000 #define MQTT_RECONNECT_MAX_MS 60000 class MqttClient { public: void begin(Client& networkClient); void setConfig(const DeviceConfig& config); bool connect(); void disconnect(); bool isConnected(); void loop(); bool publishTelemetry(const AcuvimData& data, const char* connType, int signal, const char* operatorName = nullptr); bool publishResponse(const char* requestId, const char* payload); bool publish(const char* topic, const char* payload, bool retain = false); bool publishBuffered(const char* payload); void onCommand(std::function callback) { _commandCallback = callback; } const char* getDeviceId() const { return _deviceId; } private: PubSubClient _client; char _deviceId[32]; char _broker[128]; uint16_t _port; char _username[64]; char _password[64]; char _topicPrefix[64]; char _topicTelemetry[128]; char _topicHeartbeat[128]; char _topicCmd[128]; char _topicResp[128]; char _topicStatus[128]; std::function _commandCallback; unsigned long _lastReconnectAttemptMs; unsigned long _reconnectIntervalMs; void buildTopics(); bool subscribeToCommands(); void publishOnlineStatus(); String buildLwtPayload(); static MqttClient* _instance; static void mqttCallbackStatic(char* topic, byte* payload, unsigned int length); void mqttCallback(char* topic, byte* payload, unsigned int length); uint32_t getEpochTime(); }; #endif