sweeper_video/include/mqtt_client.hpp
2026-01-05 14:01:42 +08:00

57 lines
1.6 KiB
C++

// mqtt_client.hpp
#pragma once
#include <mqtt/async_client.h>
#include <atomic>
#include <functional>
#include <memory>
#include <mutex>
#include <string>
#include "app_config.hpp"
#include "logger.hpp"
class MQTTClient : public virtual mqtt::callback
{
public:
using ConnectCallback = std::function<void()>;
using DisconnectCallback = std::function<void()>;
using MessageCallback = std::function<void(const std::string& topic, const std::string& message)>;
explicit MQTTClient(const MQTTConfig& config);
~MQTTClient();
void setConnectCallback(ConnectCallback cb);
void setDisconnectCallback(DisconnectCallback cb);
void setMessageCallback(MessageCallback cb);
void connect();
void disconnect();
void force_disconnect();
void publish(const std::string& topic, const std::string& payload, int qos = -1);
void subscribe(const std::string& topic, int qos = -1);
void unsubscribe(const std::string& topic);
void switchServer(const MQTTConfig& newConfig);
bool isConnected() const;
private:
void initializeClient();
// mqtt::callback 实现
void connection_lost(const std::string& cause) override;
void connected(const std::string& cause) override;
void message_arrived(mqtt::const_message_ptr msg) override;
void delivery_complete(mqtt::delivery_token_ptr token) override {}
MQTTConfig config_;
std::shared_ptr<mqtt::async_client> client_;
std::atomic<bool> connected_;
std::mutex mutex_;
ConnectCallback on_connect_;
DisconnectCallback on_disconnect_;
MessageCallback on_message_;
};