#ifndef C315_TCP_CLIENT_H #define C315_TCP_CLIENT_H #pragma once #include "TCPClientSocket.h" #include "CSM315Protocol.h" #include #include #include #include #include #include class C315SendTask { public: C315SendTask(BYTE const* const pPack, int nPackLen, E_315_PROTOCOL_TYPE protocal, uint8_t packno, int nReSendCount = 0, int nReSendInterval = 0); void join();//释放调用这个 private: ~C315SendTask(); public: BYTE* GetCmdData(); int GetCmdDataSize()const; public: LPBYTE m_pData; int m_nDataLen; uint8_t m_nPackNO; E_315_PROTOCOL_TYPE m_eProtocal; time_t m_uSendTime; //上次发送时间(秒) int m_nReSendInterval; //重发间隔时间(秒) 0:不重发 int m_nReSendCount; //重发次数 0:不重发 INT_MAX:无限重发 }; class C315TCPClient : public CTCPClientSocket, public ITimerCallBack, public CReceiveBuffer { public: C315TCPClient(); ~C315TCPClient(); virtual void Close() override; //重发, 有单独线程调用 BOOL ReSend(); virtual int Send(const void* lpBuf, int nBufLen, int nFlags = 0); void Insert(BYTE const* const pPack, int nPackLen, E_315_PROTOCOL_TYPE protocal, uint8_t packno, bool bPush = false); void SetProtocolMng(CCSM315Protocol* pMng) { m_lptlManageFrame = pMng; } virtual int HasPack() override; //inline void SetFather(per_user_data* a) //{ // m_pFather = a; //} public: virtual void TimerCallBack(UINT_PTR iTimerID, WPARAM dwBindParameter = 0); protected: BOOL ReceiptPack(E_315_PROTOCOL_TYPE protocal, LPBYTE lpData, WORD wDataSize); std::map m_mapSendCout; protected: BOOL HandleSubNotify(LPHJDATAHEAD2 lpHead, char* json, int json_len); protected: virtual void ProcessPack(LPBYTE pPack, int nLen) override; virtual void OnConnect(int nErrorCode) override; virtual void OnClose(int nErrorCode) override; public: CRITICAL_SECTION m_LOGMutex; HANDLE m_hFile = INVALID_HANDLE_VALUE; int m_nLogMsgMaxLen = 50; //日志报文长度。0:全部写入 DWORD CheckLog(); BOOL writelog(const char* pBuf, int len, BOOL bInOrOut, const char* note); string GetStrFromData(const BYTE* buf, int dwLen) const; bool Connect(LPCSTR pszServerIP, UINT nServerPort); static DWORD OnReconnect(LPVOID lpParam); bool QueryHistoryAlarm(E_315_PROTOCOL_TYPE ePortocol, stQueryAlarm* pAlarm, int nDataSize); bool QueryHistoryData(E_315_PROTOCOL_TYPE ePortocol, stQueryHisData* pData, int nDataSize); bool QueryHistoryCurveList(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurveList* pCurve, int nDataSize); bool QueryHistoryCurve(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurve* pCurve, int nDataSize); public: void SendClientConfig(E_315_PROTOCOL_TYPE ePortocol); //old void SendCurveData(WORD wEqpNO, eDaoChaPosi posi, const int num, bool bPush, const MapTimeIntItor& map00, const MapTimeIntItor& map01, const MapTimeIntItor& map10, const MapTimeIntItor& map11, const MapTimeIntItor& map20, const MapTimeIntItor& map21, time_t atime); void SendCurveData(WORD wEqpNO, eDaoChaPosi posi, const int num, bool bPush, std::map* mapData[], time_t tmStartSecond, time_t tmEndSecond); //void SendCurveData(E_315_PROTOCOL_TYPE ePortocol, uint16_t eqpno, const int num, bool bPush, const std::vector& vctData0, const std::vector& vctData1, const std::vector& vctData2, DWORD atime); void SendRealDataValue(WORD wEqpNO, DAOCHA_POSITION byFixOrNot, bool bPush, int nData0, int nData1, int nData2, int nTemp, int nHumi, const CTime& atime); void SendRealDataValue(E_315_PROTOCOL_TYPE ePortocol); //cbAlarmStatus 1:报警 2:恢复 dwTime 报警时间 dwRestoreTime:恢复时间 cbAlarmType:报警类型 posi:位置 cbAlarmParam:附加条件 val:报警值 refval:参考值 wSuggestID:建议ID void SendAlarmData(WORD wNodeID, BYTE cbAlarmStatus, DWORD dwTime, DWORD dwRestoreTime, eZL_ALARMTYPE cbAlarmType, eDaoChaPosi posi, uint8_t level, eLowHigh cbAlarmParam, TIEDA_ACQ_VALUE& val, TIEDA_ACQ_VALUE& refVal, WORD wSuggestID); static WORD Get315AlarmID(eZL_ALARMTYPE cbAlarmType, eDaoChaPosi posi, uint8_t level, eLowHigh cbAlarmParam); unsigned char GetPackageID(); private: CCSM315Protocol* m_lptlManageFrame; //per_user_data* m_pFather = nullptr; int m_nSendFail = 0, m_nSendCount = 0, m_nSendLen = 0; int m_nRecvCount = 0, m_nRecvLen = 0; std::list m_task; std::mutex m_mtx; std::atomic m_byAutoPackageID = 1; }; #endif // !C315_TCP_CLIENT_H