152 lines
4.6 KiB
C
Raw Normal View History

#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