#pragma once #include #include #include #include #include #include #include "protocol_codec.hpp" #include "mqtt_client_wrapper.hpp" class TcpClient { public: using ReceiveCallback = std::function; using StatusCallback = std::function; TcpClient(const std::string &id, const std::string &ip, int port); ~TcpClient(); void start(); // 启动连接与接收线程 void stop(); // 停止连接并关闭 socket bool send_data(const std::string &data); // 发送数据(线程安全) void set_receive_callback(ReceiveCallback cb); void set_status_callback(StatusCallback cb); bool is_connected() const; private: void client_loop(); // 主循环:连接、接收、重连 bool try_connect(); // 建立连接 void close_socket(); // 关闭连接 private: std::string id_; std::string ip_; int port_; int sock_fd_ = -1; std::atomic running_{false}; std::atomic connected_{false}; std::thread worker_; std::mutex send_mutex_; ReceiveCallback receive_callback_; StatusCallback status_callback_; };