152 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef TCPSERVERPROTOCOL_H
#define TCPSERVERPROTOCOL_H
#include <functional>
#include <vector>
#include <string>
#include <memory>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include "IYTCPServer.h"
#include "ProtocolCommon.h"
/**
* @brief TCP服务器协议封装类
* 根据README.md文档实现搭接焊缝检测TCP/IP通信协议
*
* 协议特点:
* - 服务端模式,等待客户端连接
* - JSON格式数据交换
* - 支持start_detection指令
* - 返回检测结果的3D坐标点数组
*/
class TCPServerProtocol
{
public:
/**
* @brief 检测结果结构体
*/
struct DetectionResultData {
int code = 0; // 响应码0-成功,其他-错误
bool success = true; // 是否成功
QString message = "检测成功"; // 响应消息
qint64 timestamp = 0; // 时间戳(毫秒)
std::vector<std::vector<QJsonObject>> result; // 检测结果焊缝点的3D坐标数组
};
/**
* @brief 连接状态枚举(使用公共状态定义)
*/
using TCPStatus = ConnectionStatus;
/**
* @brief 检测结果回调函数类型
* @param success 是否成功触发检测
* @param cameraIndex 相机索引(从开始检测指令中解析,-1表示所有相机
* @param timestamp 请求时间戳
*/
using DetectionTriggerCallback = std::function<bool(bool success, int cameraIndex, qint64 timestamp)>;
public:
TCPServerProtocol();
~TCPServerProtocol();
/**
* @brief 初始化TCP服务器
* @param port TCP端口号默认5020
* @return 0-成功,其他-错误码
*/
int Initialize(uint16_t port = 5020);
/**
* @brief 反初始化,停止服务
*/
void Deinitialize();
/**
* @brief 发送检测结果给客户端
* @param result 检测结果数据
* @param pClient 目标客户端如果为nullptr则发送给所有客户端
* @return 0-成功,其他-错误码
*/
int SendDetectionResult(const DetectionResultData& result, const TCPClient* pClient = nullptr);
/**
* @brief 获取当前连接状态
* @return 当前状态
*/
TCPStatus GetConnectionStatus() const;
/**
* @brief 设置连接状态回调
* @param callback 回调函数
*/
void SetConnectionCallback(const ConnectionCallback& callback);
/**
* @brief 设置检测触发回调
* @param callback 回调函数
*/
void SetDetectionTriggerCallback(const DetectionTriggerCallback& callback);
/**
* @brief 获取服务运行状态
* @return true-运行中false-已停止
*/
bool IsRunning() const;
private:
/**
* @brief TCP客户端连接事件处理
* @param pClient 客户端对象
* @param eventType 事件类型
*/
void OnTCPEvent(const TCPClient* pClient, TCPServerEventType eventType);
/**
* @brief TCP数据接收处理
* @param pClient 客户端对象
* @param pData 数据指针
* @param nLen 数据长度
*/
void OnTCPDataReceived(const TCPClient* pClient, const char* pData, unsigned int nLen);
/**
* @brief 解析JSON命令
* @param pClient 客户端对象
* @param jsonData JSON数据
*/
void ParseJSONCommand(const TCPClient* pClient, const QJsonObject& jsonData);
/**
* @brief 处理开始检测命令
* @param pClient 客户端对象
* @param timestamp 时间戳
*/
void HandleStartDetectionCommand(const TCPClient* pClient, qint64 timestamp);
/**
* @brief 发送错误响应
* @param pClient 客户端对象
* @param code 错误码
* @param message 错误消息
* @param timestamp 时间戳
*/
void SendErrorResponse(const TCPClient* pClient, int code, const QString& message, qint64 timestamp);
private:
// TCP服务器相关
IYTCPServer* m_pTCPServer; // TCP服务器实例
bool m_bServerRunning; // 服务器运行状态
uint16_t m_nPort; // TCP端口
// 连接状态
TCPStatus m_connectionStatus; // TCP连接状态
// 回调函数
ConnectionCallback m_connectionCallback; // 连接状态回调
DetectionTriggerCallback m_detectionTriggerCallback; // 检测触发回调
};
#endif // TCPSERVERPROTOCOL_H