#ifndef BINOCULARMARKRECEIVER_H #define BINOCULARMARKRECEIVER_H #include "IBinocularMarkReceiver.h" #include #include #include #include #include #include #include #include /** * @brief BinocularMarkReceiver实现类 * TCP客户端,接收BinocularMarkApp发送的Mark检测结果 */ class BinocularMarkReceiver : public QObject, public IBinocularMarkReceiver { Q_OBJECT public: explicit BinocularMarkReceiver(QObject *parent = nullptr); ~BinocularMarkReceiver() override; // 实现IBinocularMarkReceiver接口 int Connect(const std::string& serverIp, quint16 serverPort) override; int Disconnect() override; bool IsConnected() const override; int SendHeartbeat() override; int TriggerDetection() override; void SetMarkResultCallback(MarkResultCallback callback) override; void SetConnectionStatusCallback(ConnectionStatusCallback callback) override; void StartHeartbeat(int intervalSeconds = 30) override; void StopHeartbeat() override; private slots: /** * @brief 套接字连接成功槽函数 */ void onConnected(); /** * @brief 套接字断开连接槽函数 */ void onDisconnected(); /** * @brief 套接字错误槽函数 */ void onError(QAbstractSocket::SocketError socketError); /** * @brief 套接字可读槽函数 */ void onReadyRead(); /** * @brief 心跳定时器超时槽函数 */ void onHeartbeatTimeout(); private: /** * @brief 解析数据帧(处理粘包) * @param data 接收到的数据 */ void parseFrames(const QByteArray& data); /** * @brief 处理单个JSON消息 * @param jsonData JSON数据 */ void handleJsonMessage(const QByteArray& jsonData); /** * @brief 处理Mark结果消息 * @param jsonObj JSON对象 */ void handleMarkResult(const QJsonObject& jsonObj); /** * @brief 处理心跳应答消息 * @param jsonObj JSON对象 */ void handleHeartbeatAck(const QJsonObject& jsonObj); /** * @brief 处理命令应答消息 * @param jsonObj JSON对象 */ void handleCommandResponse(const QJsonObject& jsonObj); /** * @brief 构造数据帧 * @param jsonData JSON数据 * @return 完整的数据帧(帧头+长度+数据+帧尾) */ QByteArray buildFrame(const QByteArray& jsonData); /** * @brief 发送JSON消息 * @param messageType 消息类型 * @param jsonObj JSON对象 * @return 0-成功,其他-失败 */ int sendJsonMessage(const QString& messageType, const QJsonObject& jsonObj); private: QTcpSocket* m_pTcpSocket; // TCP套接字 QTimer* m_pHeartbeatTimer; // 心跳定时器 int m_nHeartbeatInterval; // 心跳间隔(秒) std::string m_serverIp; // 服务器IP quint16 m_serverPort; // 服务器端口 bool m_bConnected; // 连接状态 QByteArray m_dataBuffer; // 数据缓冲区(处理粘包) MarkResultCallback m_markResultCallback; // Mark结果回调 ConnectionStatusCallback m_connectionCallback; // 连接状态回调 mutable std::mutex m_mutex; // 线程安全锁 // 帧格式常量 static constexpr const char* FRAME_HEADER = "##START#"; // 8字节帧头 static constexpr const char* FRAME_TAIL = "#END"; // 4字节帧尾 static constexpr int FRAME_HEADER_SIZE = 8; static constexpr int FRAME_TAIL_SIZE = 4; static constexpr int FRAME_LENGTH_SIZE = 8; // 数据长度字段(8字节ASCII字符串) }; #endif // BINOCULARMARKRECEIVER_H