81 lines
2.6 KiB
C
Raw Normal View History

2026-03-26 08:30:31 +08:00
#ifndef TCPSERVERPROTOCOL_H
#define TCPSERVERPROTOCOL_H
#include <functional>
#include <vector>
#include <string>
#include <map>
#include <QByteArray>
#include "IYTCPServer.h"
#include "ProtocolCommon.h"
/**
* @brief TCP服务器协议封装类
*
* ->
* X1 RbtX-23.45 RbtY-23.45 RbtZ-23.45 RbtRoll-23.45 RbtPitch-123.45 RbtYaw-23.45\n
* X后跟1或2区分相机RbtX/Y/Z/Roll/Pitch/Yaw为机器人法兰位姿
*
* ->
* PointNum_X1_Y1_Z1_Roll1_Pitch1_Yaw1/X2_Y2_Z2_Roll2_Pitch2_Yaw2/\n
* _分隔同一孔洞各分量/
*/
class TCPServerProtocol
{
public:
using TCPStatus = ConnectionStatus;
/**
* @brief
* @param cameraIndex 12
* @param robotPose 姿
* @return
*/
using DetectionTriggerCallback = std::function<bool(int cameraIndex, const RobotFlangePose& robotPose)>;
public:
TCPServerProtocol();
~TCPServerProtocol();
int Initialize(uint16_t port = 5020);
void Deinitialize();
/**
* @brief
* @param text
* @param pClient nullptr则发送给所有客户端
* @return 0--
*/
int SendTextResult(const std::string& text, const TCPClient* pClient = nullptr);
TCPStatus GetConnectionStatus() const;
void SetConnectionCallback(const ConnectionCallback& callback);
void SetDetectionTriggerCallback(const DetectionTriggerCallback& callback);
bool IsRunning() const;
private:
void OnTCPEvent(const TCPClient* pClient, TCPServerEventType eventType);
void OnTCPDataReceived(const TCPClient* pClient, const char* pData, unsigned int nLen);
/**
* @brief
* @param pClient
* @param line
*/
void ParseTextCommand(const TCPClient* pClient, const QByteArray& line);
private:
IYTCPServer* m_pTCPServer;
bool m_bServerRunning;
uint16_t m_nPort;
TCPStatus m_connectionStatus;
ConnectionCallback m_connectionCallback;
DetectionTriggerCallback m_detectionTriggerCallback;
// 每个客户端的接收缓冲区(处理粘包/分包)
std::map<const TCPClient*, QByteArray> m_clientBuffers;
};
#endif // TCPSERVERPROTOCOL_H