#ifndef TCPSERVERPROTOCOL_H #define TCPSERVERPROTOCOL_H #include #include #include #include #include #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 相机索引(1或2) * @param robotPose 机器人法兰位姿 * @return 是否成功触发检测 */ using DetectionTriggerCallback = std::function; 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 m_clientBuffers; }; #endif // TCPSERVERPROTOCOL_H