GrabBag/Module/BinocularMarkReceiver/_Inc/BinocularMarkReceiver.h

134 lines
4.1 KiB
C
Raw Normal View History

2025-12-10 00:01:32 +08:00
#ifndef BINOCULARMARKRECEIVER_H
#define BINOCULARMARKRECEIVER_H
#include "IBinocularMarkReceiver.h"
#include <QObject>
#include <QTcpSocket>
#include <QTimer>
#include <QByteArray>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <mutex>
/**
* @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