/** * Filename drsdk_transport_socket.h * Copyright Shanghai Baosight Software Co., Ltd. * Description Define DrSdkTransportSocket, as client use boost::asio to communicate with DataService. * * Author wuzheqiang * Version 09/20/2024 wuzheqiang Initial Version **************************************************************/ #ifndef DRSDK_TRANSPORT_SOCKET_H #define DRSDK_TRANSPORT_SOCKET_H #include "drsdk_transport.h" #include #include #include // 使用 deadline_timer #include #include #include #include #include namespace dsfapi { class DrSdkTransportSocket : public DrSdkTransport, public std::enable_shared_from_this { public: using DataTuple = std::tuple, int32>; // buffer , length using DataTupleSend = std::tuple, int32, uint64>; // buffer , length , ms_timestamp DrSdkTransportSocket(); ~DrSdkTransportSocket(); std::shared_ptr getSharedFromThis() { return shared_from_this(); } /** * @brief init DrSdkTransportSocket: conenct to DataService * @param [in] tDRSdkConnectParam contains server ip, server port, connect timeout * @return Successfully returned 0, other returned error codes * @version 09/10/2024 wuzheqiang Initial Version */ int32 Init(const DRSdkConnectParam &tDRSdkConnectParam, const bool bIsMain = true); /** * @brief Close socket * @return Successfully returned 0, other returned error codes * @version 09/10/2024 wuzheqiang Initial Version */ int32 Close(); /** * @brief Send data to DataService * @param [in] pSendBuf buffer to send * @param [in] nLenBuf buffer length * @return Successfully returned 0, other returned error codes * @version 09/10/2024 wuzheqiang Initial Version */ int32 SendData(const char *pSendBuf, int32 nLenBuf); /** * @brief Recv data to DataService * @param [in] pSendBuf buffer to recv * @param [in] nLenBuf received length * @return Successfully returned 0, other returned error codes * @version 09/10/2024 wuzheqiang Initial Version */ int32 RecvData(std::shared_ptr &pRecvBuf, int32 &pBufLen); /** * @brief get connection status * @return true if connected else false * @version 2024/10/09 wuzheqiang Initial Version */ bool GetConnectStatus() const; /** * @brief stop read thread and close connection * @version 2024/10/18 wuzheqiang Initial Version */ void Stop(); /** * @brief set connected callback, for automatic register async read callback * @version 2024/10/09 wuzheqiang Initial Version */ void SetConnectedCallback(const std::function)> &pConnectedCallback); SDKRMStatus GetRmStatus() const { return m_RmStatus; } bool GetAvailable() const { return m_bAvailable.load(); } const std::string &GetServiceName() const { return m_sServiceName; } private: /** * @brief start connect to dataseDataServicervice * @version 2024/09/23 wuzheqiang Initial Version */ void StartConnect(); /** * @brief after connected, start read data * @version 2024/09/23 wuzheqiang Initial Version */ void HandleConnect(const boost::system::error_code error); /** * @brief start read data * @version 2024/09/23 wuzheqiang Initial Version */ void StartRead(); /** * @brief read data head * @param [in] error error code * @param [in] bytes_transferred readed data length * @version 2024/09/23 wuzheqiang Initial Version */ void HandleReadHead(const boost::system::error_code &error, size_t bytes_transferred); /** * @brief read data body * @param [in] error error code * @param [in] bytes_transferred readed data length * @version 2024/09/23 wuzheqiang Initial Version */ void HandleReadBody(const boost::system::error_code &error, size_t bytes_transferred); /** * @brief Handle send data result * @param [in] error error code * @param [in] bytes_transferred sent data length * @version 2024/09/23 wuzheqiang Initial Version */ void HandleSend(const boost::system::error_code &error, size_t bytes_transferred); void SendInternal(); /** * @brief Start the reconnection process * @version 2024/09/23 wuzheqiang Initial Version */ void StartReconnect(); /** * @brief Handle reconnection result * @version 2024/09/23 wuzheqiang Initial Version */ void HandleReconnect(const boost::system::error_code &error); /** * @brief put data to queue * @version 2024/09/23 wuzheqiang Initial Version */ bool Enqueue(DataTuple &tData); /** * @brief get data to queue * @version 2024/09/23 wuzheqiang Initial Version */ bool Dequeue(DataTuple &tData); /** * @brief deal heart beat * @version 2025/02/18 wuzheqiang Initial Version */ void DealHeartBeat(const DataTuple &tData); /** * @brief check heart beat timeout * @version 2025/02/18 wuzheqiang Initial Version */ void CheckHeartBeatTimeOut(const boost::system::error_code &error); private: DRSdkConnectParam m_tDRSdkConnectParam; std::string m_sServiceName = "main"; // for log; redundancy [bak] std::string m_sServerIp = ""; std::string m_sServerPort = ""; boost::asio::io_service m_IoService; // 使用 io_service std::unique_ptr m_pSocket = nullptr; boost::asio::ip::tcp::resolver m_tResolver; std::atomic_bool m_bConnected = {false}; boost::asio::deadline_timer m_HeartBeatTimer; // Timer for heartbeat boost::asio::deadline_timer m_ReconnectTimer; // Timer for delayed reconnection boost::asio::deadline_timer m_TimeoutTimer; // Timer for connect timeout std::function)> m_pConnectedCallback = nullptr; // Callback when connected std::shared_ptr m_RecvBufHead = nullptr; // std::shared_ptr m_RecvBufHead = nullptr; // std::shared_ptr m_RecvBufBody = nullptr; std::vector m_RecvBufBody = {}; size_t m_RecvBufBodyLen = 0; std::queue m_RecvQueue; // recv socket buf and send data to drsdk_manager std::mutex m_Mutex; std::condition_variable m_Cv; std::atomic_bool m_bStop = {false}; uint64 m_nLastTransportTimeMs = 0; // updated when conncet/send/recv // uint64 m_nLastHeartBeatTimeMs = 0; // last received heart beat time std::chrono::steady_clock::time_point m_nLastHeartBeatTimeMs = std::chrono::steady_clock::now(); // last received heart beat time SDKRMStatus m_RmStatus = SDKRMStatus::SDKRM_STATUS_INACTIVE; std::atomic_bool m_bAvailable = {false}; // transport is available ,for rm_status and connect timeout std::atomic_bool m_bSendFlag = {false}; // sending flag std::queue m_SendQueue; // for send data to io_service std::mutex m_SendQueueMutex; }; } // namespace dsfapi #endif