134 lines
4.1 KiB
C++
134 lines
4.1 KiB
C++
#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
|