| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552 | #include "stdafx.h"#include "315TCPClient.h"#include "Simplelog.h"#include <ZlDataDefine.h>#include "AppService.h"#include <jsonxx.h>#include "MonitorObject.h"#include "Device.h"#include "315ClientManager.h"using namespace jsonxx;#define IDT_HEARTBEAT		1#define IDT_RESEND			2C315SendTask::C315SendTask(BYTE const * const pPack, int nPackLen, E_315_PROTOCOL_TYPE proto, uint8_t no, int nReSendCount/* = 0*/, int nReSendInterval/* = 0*//*, uint32_t no, bool r*/){	m_pData = new BYTE[nPackLen];	memcpy(m_pData, pPack, nPackLen);	m_nDataLen = nPackLen;	this->m_nPackNO = no;	this->m_eProtocal = proto;	m_uSendTime = time(NULL);	m_nReSendCount = nReSendCount;	m_nReSendInterval = nReSendInterval;}void C315SendTask::join(){	delete this;}int C315SendTask::GetCmdDataSize() const{	if (m_nDataLen <= 12) return 0;	return m_nDataLen - 12;}BYTE* C315SendTask::GetCmdData(){	if (m_nDataLen <= 12)	{		return NULL;	}	return m_pData + 12;}C315SendTask::~C315SendTask(){	//SPDLOG_ERROR("mem:del {:X}", (DWORD_PTR)pdata);	delete[] m_pData;	m_pData = nullptr;	m_nDataLen = 0;}C315TCPClient::C315TCPClient(){	m_hFile = INVALID_HANDLE_VALUE;	m_lptlManageFrame = NULL;	InitializeCriticalSection(&m_LOGMutex);}C315TCPClient::~C315TCPClient(){	DeleteCriticalSection(&m_LOGMutex);	//if (m_pBuffer) m_pBuffer->Reset();}bool C315TCPClient::Connect(LPCSTR pszServerIP, UINT nServerPort){	SetBuffer(this);	if (!ConnectServer(pszServerIP, nServerPort))	{		QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);		return false;	}	return true;}void C315TCPClient::Close(){	if (m_hSocket != INVALID_SOCKET)		SPDLOG_ERROR("[315]主动断开TCP链路:{}:{}", m_strServerIP, m_nServerPort);	return __super::Close();}DWORD C315TCPClient::CheckLog(){	static WORD wPrevYear = 0;	static WORD wPrevMonth = 0;	static WORD wPrevDate = 0;	EnterCriticalSection(&m_LOGMutex);	SYSTEMTIME sNow;	GetLocalTime(&sNow);	BOOL bNeedRefreshFileName = (sNow.wYear != wPrevYear)		|| (sNow.wMonth != wPrevMonth) || (sNow.wDay != wPrevDate);	if (bNeedRefreshFileName)	{		//需要更新文件名称		//1.关闭老文件		if (m_hFile != INVALID_HANDLE_VALUE)		{			CloseHandle(m_hFile);			m_hFile = INVALID_HANDLE_VALUE;		}		TCHAR strLog_Path[MAX_PATH] = { '\0' };		CString Path;		{			TCHAR szBuffer[_MAX_PATH];			::GetModuleFileName(AfxGetInstanceHandle(), szBuffer, _MAX_PATH);			Path = (szBuffer);			Path = Path.Left(Path.ReverseFind('\\') + 1);		}		CreateDirectory(Path + "Log", NULL);		//2.生成新文件		CTime time = CTime::GetCurrentTime();		_stprintf_s(strLog_Path, sizeof(strLog_Path), "%s\\%s",			(LPCSTR)(Path + "Log"), time.Format(_T("%Y%m%d")));		CreateDirectory(strLog_Path, NULL);		char strNewFileName[MAX_PATH];		_stprintf_s(strNewFileName, sizeof(strNewFileName), "%s\\%d_%02d_%02d.log",			strLog_Path, sNow.wYear, sNow.wMonth, sNow.wDay);		m_hFile = CreateFile(strNewFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,			NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);		if (INVALID_HANDLE_VALUE != m_hFile)			::SetFilePointer(m_hFile, 0, NULL, FILE_END);		wPrevYear = sNow.wYear;		wPrevMonth = sNow.wMonth;		wPrevDate = sNow.wDay;	}	LeaveCriticalSection(&m_LOGMutex);	return 1;}BOOL C315TCPClient::writelog(const char* pBuf, int len, BOOL bInOrOut, const char* note/*, ClientInfo* pCltInfo / *= nullptr* /*/){	CheckLog();	char szMessage[256];	SYSTEMTIME tm;	GetLocalTime(&tm);	DWORD dwWrittenNum = 0;	EnterCriticalSection(&m_LOGMutex);	if (m_hFile != INVALID_HANDLE_VALUE)	{		DWORD dwFileLimit_M = 200;		DWORD dwFileLen = GetFileSize(m_hFile, NULL);		if (dwFileLen < dwFileLimit_M * 1024 * 1024)		{			//if (pCltInfo)			//	_stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [%s][%s:%d]%s ",			//		tm.wHour, tm.wMinute, tm.wSecond,			//		bInOrOut ? TEXT("请求") : TEXT("发出"), pCltInfo->strIP, pCltInfo->iPort, note);			//else				_stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [%s]%s ",					tm.wHour, tm.wMinute, tm.wSecond,					bInOrOut ? TEXT("请求") : TEXT("发出"), note);			WriteFile(m_hFile, szMessage, _tcslen(szMessage), &dwWrittenNum, NULL);			if (pBuf) WriteFile(m_hFile, pBuf, len, &dwWrittenNum, NULL);			WriteFile(m_hFile, "\r\n", 2, &dwWrittenNum, NULL);			dwFileLen = GetFileSize(m_hFile, NULL);			if (dwFileLen >= dwFileLimit_M * 1024 * 1024)			{				_stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [文件容量超限(最大%dM)]\r\n",					tm.wHour, tm.wMinute, tm.wSecond, dwFileLimit_M);				WriteFile(m_hFile, szMessage, _tcslen(szMessage), &dwWrittenNum, NULL);			}		}	}	LeaveCriticalSection(&m_LOGMutex);	return 1;}int C315TCPClient::Send(const void* lpBuf, int nBufLen, int nFlags){	string log = m_lptlManageFrame->GetStrFromData((const BYTE*)lpBuf, nBufLen);	writelog(log.c_str(), log.size(), FALSE, "");	return __super::Send(lpBuf, nBufLen, nFlags);}void C315TCPClient::Insert(BYTE const* const  pPack, int nPackLen, E_315_PROTOCOL_TYPE protocol, uint8_t no, bool bPush/* = false*/){	if (g_b315 == false) return;	if (m_task.size() > 1000)	{		string strLog = fmt::format("[315]待发送数据队列太多:{}", m_task.size());		writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");	}	if (nPackLen > 1500) 		SPDLOG_INFO("[315]send a pack)");	{		string strLog = GetStrFromData(pPack, nPackLen);		writelog(strLog.c_str(), strLog.length(), FALSE, fmt::format("【0x{:02x}命令】", (BYTE)protocol).c_str());	}	auto ret = Send(pPack, nPackLen);	if (ret == SOCKET_ERROR)	{		m_nSendFail++;		//SPDLOG_WARN("[315]send fail. pack)");		string strLog = fmt::format("[315]发送数据失败,len:{}", nPackLen);		writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");	}	else if (nPackLen == ret)	{		m_nSendCount++;		m_nSendLen += ret;	}	else		ASSERT(0);	int nReSendCount = 0;	int nReSendInterval = 0;	if (bPush)	{		CCSM315Protocol::GetResendProtocol(protocol, nReSendCount, nReSendInterval);	}	//加入队列并发送	if((nReSendCount > 1 && nReSendInterval > 0) || ret == SOCKET_ERROR)	{		if (nReSendCount != INT_MAX)		{			nReSendCount--;		}		C315SendTask* pTask = new C315SendTask(pPack, nPackLen, protocol, no, nReSendCount, nReSendInterval/*, packno, r*/);		std::lock_guard<std::mutex> lock(m_mtx);		m_task.emplace_back(pTask);		if (m_task.size() > 1500)		{			auto it = m_task.front();			m_task.pop_front();			it->join();		}	}	//统计发送量	time_t tmNow;	time(&tmNow);	m_mapSendCout[tmNow / 3600] += nPackLen;	if (m_mapSendCout.size() > 1)	{		auto it = m_mapSendCout.begin();		string strLog;		auto& item = it->second;		if (it->second > 1024 * 1024 * 1024)			strLog = fmt::format("{}GB {}MB {} KB", item / (1024 * 1024 * 1024), 				item % (1024 * 1024 * 1024) / (1024 * 1024), item % (1024 * 1024) / 1024);		else if (it->second > 1024 * 1024)			strLog = fmt::format("{}MB {} KB", item / (1024 * 1024), item % (1024 * 1024) / 1024);		else 			strLog = fmt::format("{} KB ", item / 1024);		SPDLOG_WARN("[315]上送流量统计:{} {}", CTime(it->first * 3600).Format("%Y-%m-%d %H:%M:%S"), strLog);		m_mapSendCout.erase(it);	}}void C315TCPClient::OnConnect(int nErrorCode){	string strLog = fmt::format("[315]收到TCP[{}:{}]链路连接结果:{}", m_strServerIP, m_nServerPort, nErrorCode);	writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");//#ifndef _DEBUG	if (nErrorCode == 0)	{		CTimerEngine::GetInstance()->SetTimer(this, IDT_HEARTBEAT, 5000, TIMES_INFINITY);		CTimerEngine::GetInstance()->SetTimer(this, IDT_RESEND, 100, TIMES_INFINITY);	} 	else	{		CTimerEngine::GetInstance()->KillTimer(this, IDT_HEARTBEAT);		CTimerEngine::GetInstance()->KillTimer(this, IDT_RESEND);		QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);	}//#endif // _DEBUG	return __super::OnConnect(nErrorCode);}DWORD C315TCPClient::OnReconnect(LPVOID lpParam){	C315TCPClient* pThis = (C315TCPClient*)lpParam;	int nCount = 0;	while (true)	{		Sleep(1000);		pThis->Close();		if(pThis->ConnectServer(pThis->m_strServerIP.c_str(), pThis->m_nServerPort))		{			string strLog = fmt::format("[315]重连[{}:{}]成功", pThis->m_strServerIP, pThis->m_nServerPort);			pThis->writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");			break;		}		nCount++;		if (nCount % 30 == 0)		{			string strLog = fmt::format("[315]重连[{}:{}] {}次失败!", pThis->m_strServerIP, pThis->m_nServerPort, nCount);			pThis->writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");		}	}	return 0;}void C315TCPClient::OnClose(int nErrorCode){	string strLog = fmt::format("[315]收到TCP链路断开[{}:{}]!", m_strServerIP, m_nServerPort);	writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");	QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);	return __super::OnClose(nErrorCode);}BOOL C315TCPClient::ReceiptPack(E_315_PROTOCOL_TYPE protocol, LPBYTE lpData, WORD wSize){	m_nRecvCount++;	if (!CCSM315Protocol::IsReceiptProtocol(protocol))	{	//非回执		return FALSE;	}	BOOL bRet = FALSE;	std::lock_guard<std::mutex> lock(m_mtx);	LPBYTE pData = (lpData + 12);	int nDataSize = wSize - 12;	E_315_PROTOCOL_TYPE eSendPtl = E_315_PROTOCOL_TYPE(uint8_t(protocol) - 1);	for (auto it = m_task.begin(); it != m_task.end(); it++)	{		auto p = *it;		bool bReceipt = false;		if (p->m_eProtocal == eSendPtl)		{			switch (protocol)			{						//case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x42:		//服务端回执主动推送的全行程最新值.	 					case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52:		//服务端回执主动推送的受力最新值	 					//case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x62:		//服务端回执主动推送的框架最新值	 					{			}						break;// 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x44:		//服务端回执主动推送预报警信息	 					case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54:		//服务端回执主动推送预报警信息	 		// 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x64:		//服务端回执主动推送预报警信息	 					{				BYTE cbRecvNo = *(pData + 1);				if (cbRecvNo == p->m_nPackNO)				{					bReceipt = true;				}			}						break;			//case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x46:		//查询曲线时间信息	 					//case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:		//查询曲线时间信息	 					//case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x66:		//查询曲线时间信息	 					//{				//StCurveCfgRes pSendCfg, pRecvCfg;				//FRAME_KIND eSend, eRecv;				//CCSM315Protocol::RecvParse(pSendCfg, p->GetCmdData(), p->GetCmdDataSize(), eSend);				//CCSM315Protocol::RecvParse(pRecvCfg, pData, nDataSize, eRecv);				////处理缺口配置				//CCSM315Protocol::Release(pSendCfg, eSend);				//CCSM315Protocol::Release(pRecvCfg, eRecv);				////判断一个是发送,另一个是回执				//if (eSend == FRAME_KIND::SEND && eRecv == FRAME_KIND::SEND)				//{				//	if (pSendCfg.cnt == pRecvCfg.cnt 				//		&& pSendCfg.starttime == pRecvCfg.starttime 				//		&& pSendCfg.endtime == pRecvCfg.endtime)				//	{				//		bReceipt = true;				//	}				//}			//}			//break;// 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x48:		//服务端回执主动推送曲线数据	 					case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58:		//服务端回执主动推送曲线数据	 		// 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x68:		//服务端回执主动推送曲线数据	 					{				BYTE cbRecvNo = *(pData + 3);				if (cbRecvNo == p->m_nPackNO)				{					bReceipt = true;				}			}			break;			}			if (bReceipt)			{				m_task.erase(it);				p->join();				bRet = TRUE;				break;			}		}	}	string strLog = GetStrFromData(lpData, wSize);	writelog(strLog.c_str(), strLog.length(), TRUE, fmt::format("【0x{:02x}回执】处理结果:{}", (BYTE)protocol, bRet ? "成功" : "失败").c_str());	return bRet;}string C315TCPClient::GetStrFromData(const BYTE* buf, int dwLen) const{	return CCSM315Protocol::GetStrFromData(buf, m_nLogMsgMaxLen > 0 ? min(dwLen, m_nLogMsgMaxLen) : dwLen);}BOOL C315TCPClient::ReSend(){	if (m_task.empty()) return FALSE;	time_t uCurTime = time(NULL);	std::lock_guard<std::mutex> lock(m_mtx);	//if (m_task.size() > 0)	for (auto it = m_task.begin(); it != m_task.end();)	{		//auto& it = m_task.front();		if((*it)->m_uSendTime + (*it)->m_nReSendInterval >= uCurTime)		{			string strLog = GetStrFromData((*it)->m_pData, (*it)->m_nDataLen);			writelog(strLog.c_str(), strLog.length(), FALSE, "【重发消息】");			auto ret = Send((*it)->m_pData, (*it)->m_nDataLen) != SOCKET_ERROR;			if (ret)			{				m_nSendLen += ret;				m_nSendCount++;				//一直重发				if ((*it)->m_nReSendCount != INT_MAX)				{					(*it)->m_nReSendCount--;				}				//重发次数没了, 上次发送失败项				if ((*it)->m_nReSendCount <= 0 || (*it)->m_nReSendInterval == 0)				{					(*it)->join();					it = m_task.erase(it);					continue;				}			}			else				m_nSendFail++;		}		it++;	}	return TRUE;}BOOL C315TCPClient::HandleSubNotify(LPHJDATAHEAD2 lpHead, char* json, int json_len){	Object obj;	obj.parse(string(json, json_len));	if (obj.empty()) return FALSE;	auto momp = obj.get<string>("momp");	if (momp.empty()) return FALSE;	string imei; int idx;	CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei, idx);	return CAppService::Instance()->GetHandle()->SendMsgToDevice(imei.c_str());}void C315TCPClient::ProcessPack(LPBYTE pPack, int nPackLen){	auto protocol = CCSM315Protocol::GetProtocolType(pPack, nPackLen);	//SPDLOG_INFO("[315]recv {}:{} : {}", m_strServerIP, m_nServerPort, CSimpleLog::GetHexString2(pPack, nPackLen));	if (protocol == E_315_PROTOCOL_TYPE(0xFF)) return;			//无效包	if (protocol == E_315_PROTOCOL_TYPE::ACTIVE_KEEP) 	{		static ULONGLONG g_ullTick = 0;		ULONGLONG ullTick = GetTickCount64();		if (ullTick > g_ullTick + 5 * 60)		{			g_ullTick = ullTick;			string strLog = GetStrFromData(pPack, nPackLen);			writelog(strLog.c_str(), strLog.length(), TRUE, "【5分钟心跳包】");		}		return;	//心跳包	}	string log = m_lptlManageFrame->GetStrFromData((const BYTE*)pPack, nPackLen);	writelog(log.c_str(), log.size(), TRUE, "");	LPBYTE pData = (pPack + 12);	int nDataSize = nPackLen - 16;	DWORD dwCmdDataLen = *(DWORD*)(pPack + 8);	if (nDataSize != dwCmdDataLen)	{		return;	//包数据错误	}	if (ReceiptPack(protocol, pPack, nPackLen)) return;			//回执包	switch (protocol)	{	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23:		//缺口配置	道岔缺口			{		StGapCfgRes pCfg;		CCSM315Protocol::RecvParse(pCfg, pData, nDataSize);		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x23缺口配置】");		//处理缺口配置		CCSM315Protocol::Release(pCfg);	}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26:		//道岔缺口数值	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27:		//道岔缺口报警、预警及图像视频信息	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29:		//道岔缺口最新图像	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32:		//历史图像信息列表	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A:		//历史图像信息	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E:		//视频信息列表	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F:		//视频文件	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22:		//1DQJ、区段状态信息	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25:		//油压曲线	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24:		//油位及缺口采集设备状态信息	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30:		//视频流信息	 			{}	break;	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31:		//请求命令时转辙机的定反位状态	 			{}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x40:		//全行程受力信息	全行程子系统占用			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50:		//受力配置信息	受力监测子系统		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x60:		//框架配置信息	道岔框架系统			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x50受力配置信息】");		SendClientConfig(protocol);	}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x41:		//全行程最新值	 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51:		//受力最新值	 		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x61:		//框架最新值	 			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x51受力最新值】");		SendRealDataValue(protocol);	}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x43:		//全行程预报警信息	 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53:		//受力预报警信息	 		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x63:		//框架预报警信息	 			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x53受力预报警信息】");		stQueryAlarm* pAlarm = (stQueryAlarm*)pData;		QueryHistoryAlarm(protocol, pAlarm, nDataSize);	}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x45:		//测试历史数据	 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55:		//测试历史数据	 		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x65:		//测试历史数据	 			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x55查询历史数据】");		stQueryHisData* pHis = (stQueryHisData*)pData;		QueryHistoryData(protocol, pHis, nDataSize);	}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x46:		//查询曲线时间信息	 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56:		//查询曲线时间信息	 		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x66:		//查询曲线时间信息	 			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x56查询曲线时间列表】");		stQueryHisCurveList* pHis = (stQueryHisCurveList*)pData;		QueryHistoryCurveList(protocol, pHis, nDataSize);	}	break;// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x47:		//查询曲线数据	 			case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57:		//查询曲线数据	 		// 	case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x67:		//查询曲线数据	 			{		string strLog = GetStrFromData(pData, nDataSize);		writelog(strLog.c_str(), strLog.length(), TRUE, "【0x57查询曲线数据】");		QueryHistoryCurve(protocol, (stQueryHisCurve*)pData, nDataSize);	}	break;	default:		break;	}}unsigned char C315TCPClient::GetPackageID(){	unsigned char no = m_byAutoPackageID;	if (m_byAutoPackageID >= UCHAR_MAX)	{		m_byAutoPackageID = 1;	}	else		m_byAutoPackageID++;	return no;}int C315TCPClient::HasPack(){	//return m_nPos;	int len = 0;	if (CCSM315Protocol::GetFrameData(CReceiveBuffer::m_pBuffer, m_nPos, len))		return len;	return 0;}void C315TCPClient::TimerCallBack(UINT_PTR iTimerID, WPARAM dwBindParameter /*= 0*/){	switch (iTimerID)	{	case IDT_HEARTBEAT:	//心跳	{		BYTE pBuf[100];		int ipos = 0;		BYTE head[12];		m_lptlManageFrame->InitFrmHead12B(head, FRAME_TYPE_HEARTBEAT, 0x2);		memcpy(pBuf + ipos, head, 12);		ipos += 12;		long ltm = (long)time(NULL);		*(long*)(pBuf + ipos) = ltm;		ipos += 4;		*(BYTE*)(pBuf + ipos) = 0xff;		ipos += 1;		*(BYTE*)(pBuf + ipos) = 0xff;		ipos += 1;		*(BYTE*)(pBuf + ipos) = 0xff;		ipos += 1;		*(DWORD*)(pBuf + ipos) = 0xffffffff;		ipos += 4;		//计算帧长度		DWORD frmlen = ipos - 16;		*(DWORD*)(pBuf + 8) = frmlen;		Send(pBuf, ipos);		static ULONGLONG g_ullSendTick = 0;		ULONGLONG ullTick = GetTickCount64();		if (ullTick > g_ullSendTick + 5 * 60)		{			g_ullSendTick = ullTick;			string strLog = GetStrFromData(pBuf, ipos);			writelog(strLog.c_str(), strLog.length(), FALSE, "【5分钟心跳包】");		}	}		break;	case IDT_RESEND:	//重发机制		ReSend();		break;	default:		break;	}}bool C315TCPClient::QueryHistoryData(E_315_PROTOCOL_TYPE ePortocol, stQueryHisData* pData, int nDataSize){	bool bRet = false;	//first:makelong(牵引点, 采集码)	std::map<DWORD, stHisStaticValue> mapData;	do 	{		if (nDataSize != sizeof(stQueryHisData) + pData->cnt * sizeof(stQueryHisDataItem))			break;		stQueryHisDataItem* pItem = (stQueryHisDataItem*)pData->lpinfo;		struct stQueryDataItem		{			WORD wNodeID = 0;			string id;			set<WORD> setAcqTypeID;		};		CTime tStart(pData->starttime);		CTime tEnd(pData->endtime);		//查询条件		string strQuery;		strQuery = fmt::format("SELECT a.IMEI + '.'+ CAST(idx AS NVARCHAR), DATEPART(MS, a.acquisitiontime), a.acquisitiontime, a.data0, a.data1, a.data2, b.[temperature], b.[humidity] \			FROM rm_resistance_%04d%02d%02d a, rm_temphumidity_%04d%02d b WHERE a.IMEI = b.IMEI and a.acquisitiontime = b.acquisitiontime AND a.acquisitiontime BETWEEN '{}' AND '{}' AND a.IMEI + '.'+ CAST(idx AS NVARCHAR) IN (%s) ORDER BY a.acquisitiontime",			(LPCSTR)tStart.Format("%Y-%m-%d %H:%M:%S"), (LPCSTR)tEnd.Format("%Y-%m-%d %H:%M:%S.999"));		map<string, stQueryDataItem> mapQueryItem;		//所有牵引点		for (WORD i = 0; i < pData->cnt; i++)		{			auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].wNodeID);			if (!p || p->type != "mo.mp") break;			string imei;			int idx;			if (!CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei, idx))			{				continue;			}			auto strName = fmt::format("{}.{}", imei, idx);			auto pFind = mapQueryItem.find(strName);			if (pFind == mapQueryItem.end())			{				mapQueryItem[strName] = { pItem[i].wNodeID, p->id, set<WORD>{pItem[i].acqTypeID} };			}			else			{				pFind->second.setAcqTypeID.insert(pItem[i].acqTypeID);			}		}		//查询条件(imei.idx集合)		CString strQueryCon;		for (auto& it : mapQueryItem)		{			strQueryCon.AppendFormat("'%s',", it.first.c_str());		}		if (!strQueryCon.IsEmpty()) strQueryCon=strQueryCon.Left(strQueryCon.GetLength() - 1);		//时间范围		CTime tStart1(tStart.GetYear(), tStart.GetMonth(), tStart.GetDay(), 0, 0, 0);		CTime tEnd1(tEnd.GetYear(), tEnd.GetMonth(), tEnd.GetDay(), 23, 59, 59);		char memiidx[80];		TIMESTAMP_STRUCT ts;		ts.year = 0;		int data[5];		int ms;		//遍历查询所有符合要求的数据库		for (auto curTime = tStart1; curTime < tEnd1; curTime += CTimeSpan(1, 0, 0, 0))		{			CString strSql;			{				strSql.Format(strQuery.c_str(), curTime.GetYear(), curTime.GetMonth(), curTime.GetDay(), curTime.GetYear(), curTime.GetMonth(), (LPCSTR)strQueryCon);				COdbcStatement stmt;				if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))				{					CSimpleLog::Error("执行语句失败:" + strSql);					break;				}				stmt.BindCharCol(1, memiidx, sizeof(memiidx));				stmt.BindIntCol(2, &ms);				stmt.BindTimeStampCol(3, &ts);				stmt.BindIntCol(4, &data[0]);				stmt.BindIntCol(5, &data[1]);				stmt.BindIntCol(6, &data[2]);				stmt.BindIntCol(7, &data[3]);				stmt.BindIntCol(8, &data[4]);				do				{					if (stmt.FetchNext() != 0) break;					auto p = mapQueryItem.find(memiidx);					if (p != mapQueryItem.end())					{						string name1, name2, name3;						CMonitorObjectMng::Instance()->GetNameByMoMp(p->second.id, name1, name2, name3);						bool bZeroFix = false;						if (name1 == "定位")							bZeroFix = true;						DWORD dwTime = CovertData(ts) / 1000;						for (auto wAcqTypeID : p->second.setAcqTypeID)						{							auto& itNode = mapData[MAKELONG(p->second.wNodeID, wAcqTypeID)];							if (itNode.vctAcqData.empty())								itNode.dwStartTime = dwTime;							WORD wOffsetTime = WORD(dwTime - itNode.dwStartTime);							//一分钟一个点							//if (itNode.vctAcqData.empty() || wOffsetTime - itNode.vctAcqData.rbegin()->first > 60)							{								auto& it = itNode.vctAcqData;								switch ((AcqTypeCode)wAcqTypeID)								{								case AcqTypeCode::eAcqTypeCode_0x101:									it.emplace_back(make_pair(wOffsetTime, bZeroFix ? data[0] : data[1]));									break;								case AcqTypeCode::eAcqTypeCode_0x102:									it.emplace_back(make_pair(wOffsetTime, bZeroFix ? data[1] : data[0]));									break;								case AcqTypeCode::eAcqTypeCode_0x103:									it.emplace_back(make_pair(wOffsetTime, data[2]));									break;								case AcqTypeCode::eAcqTypeCode_0x104:									it.emplace_back(make_pair(wOffsetTime, data[3]));									break;								case AcqTypeCode::eAcqTypeCode_0x105:									it.emplace_back(make_pair(wOffsetTime, data[4]));									break;								default:									break;								}							}													}					}				} while (true);				stmt.Close();			}		}		bRet = true;	} while (false);	C315CommData CommData;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, mapData, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());	return bRet;}bool C315TCPClient::QueryHistoryCurve(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurve* pCurve, int nDataSize){	bool bRet = false;	std::map<time_t, int> vctData0;	std::map<time_t, int> vctData1;	std::map<time_t, int> vctData2;	eDaoChaPosi posi;	do	{		if (nDataSize != sizeof(stQueryHisCurve)) break;		auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pCurve->wNodeID);		if (!p || p->type != "mo.mp") break;		string imei;		int idx;		if (!CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei, idx))		{			break;		}		CTime tStart(pCurve->time);		CTime tEnd;		CString strSql;		{			strSql.Format("SELECT [end_time], posi FROM [rm_move_%04d%02d] WHERE mo + '.' + mp = '%s' AND [start_time] = '%s' AND [type] <> 2", tStart.GetYear(), tStart.GetMonth(), p->id.c_str(), tStart.Format("%Y-%m-%d %H:%M:%S"));			COdbcStatement stmt;			if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))			{				CSimpleLog::Error("执行语句失败:" + strSql);				break;			}			TIMESTAMP_STRUCT ts;			ts.year = 0;			stmt.BindTimeStampCol(1, &ts);			stmt.BindTinyIntCol(2, (BYTE*)&posi);			do			{				if (stmt.FetchNext() != 0) break;			} while (false);			stmt.Close();			if(ts.year == 0) break;			tEnd = CTime(CovertData(ts) / 1000);		}		string strStart, strEnd;		strStart = tStart.Format("%Y-%m-%d %H:%M:%S.000");		CTime dateStart(tStart.GetYear(), tStart.GetMonth(), tStart.GetDay(), 0, 0, 0);				strEnd = tEnd.Format("%Y-%m-%d %H:%M:%S.999");		CTime dateEnd(tEnd.GetYear(), tEnd.GetMonth(), tEnd.GetDay(), 23, 59, 59);		//std::map<string, DWORD>	mapImeiRelat;		//std::string strImeiGroup;		//for (WORD i = 0; i < pCurve->cnt; i++)		//{		//	auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].acqTypeID);		//	if (!p || p->type != "mo.mp") continue;		//	string imei;		//	if (CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei))		//	{		//		mapImeiRelat[imei] = pItem[i].acqTypeID;		//		strImeiGroup += "\"" + imei + "\",";		//	}		//}		////删除最后一个逗号		//if (!strImeiGroup.empty())		//{		//	strImeiGroup.pop_back();		//}		string strFormat = fmt::format("SELECT acquisitiontime, [data0],[data1],[data2]  FROM [dbo].[rm_resistance_%s] WHERE [IMEI] = '{}' AND idx = {} AND \			[acquisitiontime] BETWEEN '{}' AND '{}' ORDER BY acquisitiontime", imei, idx, strStart, strEnd);		CString sql;		TIMESTAMP_STRUCT ts;		for (auto t = dateStart; t <= dateEnd; t += CTimeSpan(1, 0, 0, 0))		{			sql.Format(strFormat.c_str(), (LPCSTR)t.Format("%Y%m%d"));			COdbcStatement stmt;			if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))			{				CSimpleLog::Error("执行语句失败:" + sql);				continue;			}			//strSql.Format("SELECT [idx], datepart(ms, [acquisitiontime]) AS ms, [data0],[data1],[data2] FROM [dbo].[rm_resistance_%s] WHERE [IMEI] = '%s' AND \			//	CONVERT(varchar(100), [acquisitiontime], 120) = '%s' order by ms", (LPCSTR)tStart.Format("%Y%m%d"), (LPCSTR)tStart.Format("%Y-%m-%d %H:%M:%S"));			//COdbcStatement stmt;			//if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))			//{			//	CSimpleLog::Error("执行语句失败:" + strSql);			//	break;			//}			int nCol = 1;			//int idx = 1;			TIMESTAMP_STRUCT ts;			int data[3];			//stmt.BindIntCol(nCol++, &idx);			stmt.BindTimeStampCol(nCol++, &ts);			stmt.BindIntCol(nCol++, &data[0]);			stmt.BindIntCol(nCol++, &data[1]);			stmt.BindIntCol(nCol++, &data[2]);			do			{				if (stmt.FetchNext() != 0) break;				time_t dwTime = CovertData(ts);				vctData0[dwTime] = data[0];				vctData1[dwTime] = data[1];				vctData2[dwTime] = data[2];			} while (true);			stmt.Close();		}		bRet = true;	} while (false);	SendCurveData(pCurve->wNodeID, posi, 1, false, vctData0.begin(), vctData0.end(), vctData1.begin(), vctData1.end(), vctData2.begin(), vctData2.end(), pCurve->time);	return bRet;}bool C315TCPClient::QueryHistoryCurveList(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurveList* pCurve, int nDataSize){	bool bRet = false;	std::map<WORD, std::vector<DWORD>> mapData;	do	{		if (nDataSize != sizeof(stQueryHisCurveList) + pCurve->cnt * sizeof(StNodeAcqCfg))		{			break;		}		StNodeAcqCfg* pItem = (StNodeAcqCfg*)pCurve->lpinfo;		string strStart, strEnd;		CTime t(pCurve->starttime);		strStart = t.Format("%Y-%m-%d %H:%M:%S.000");		//CTime dateStart(t.GetYear(), t.GetMonth(), t.GetDay(), 0, 0, 0);		int dateStart = t.GetYear() * 12 + (t.GetMonth() - 1);		t = CTime(pCurve->endtime);		strEnd = t.Format("%Y-%m-%d %H:%M:%S.999");		//CTime dateEnd(t.GetYear(), t.GetMonth(), t.GetDay(), 23, 59, 59);		int dateEnd = t.GetYear() * 12 + (t.GetMonth() - 1);		std::map<string, DWORD>	mapMOMPRelat;		//std::string strImeiGroup;		std::string strMoMpGroup;		for (WORD i = 0; i < pCurve->cnt; i++)		{			auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].acqTypeID);			if (!p || p->type != "mo.mp") continue;			mapMOMPRelat[p->id] = pItem[i].acqTypeID;			strMoMpGroup += "'" + p->id + "',";		}		//删除最后一个逗号		if (!strMoMpGroup.empty())		{			strMoMpGroup.pop_back();		}		string strFormat = fmt::format("SELECT mo+'.'+mp, start_time, end_time FROM [dbo].[rm_move_%04d%02d] WHERE (mo+'.'+mp) in ({}) AND \			[start_time] BETWEEN '{}' AND '{}' AND [type] <> 2 order by start_time", strMoMpGroup, strStart, strEnd);		CString sql;		TIMESTAMP_STRUCT ts1, ts2;		char momp[51];		int nMonthID = -1;		for (auto t = dateStart; t <= dateEnd; t++)		{			sql.Format(strFormat.c_str(), t / 12, (t % 12) + 1);			COdbcStatement stmt;			if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))			{				CSimpleLog::Error("执行语句失败:" + sql);			}			else			{				int nCol = 1;				stmt.BindCharCol(nCol++, momp, sizeof(momp));				stmt.BindTimeStampCol(nCol++, &ts1);				stmt.BindTimeStampCol(nCol++, &ts2);				do				{					if (stmt.FetchNext() != 0) break;					mapData[mapMOMPRelat[momp]].emplace_back(CovertData(ts1) / 1000);				} while (true);				stmt.Close();			}		}		bRet = true;	} while (false);		C315CommData CommData;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, mapData, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());	return bRet;}bool C315TCPClient::QueryHistoryAlarm(E_315_PROTOCOL_TYPE ePortocol, stQueryAlarm* pAlarm, int nDataSize){	bool bRet = false;	std::vector<stAlarmItem> vctAlarm;	do	{		if (nDataSize != sizeof(stQueryAlarm)) break;		CString strCont;		if (pAlarm->wNodeID != 0xFFFF)		{			auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pAlarm->wNodeID);			if (p)			{				strCont.Format(" AND mo + '.' + mp = '%s' ", p->id.c_str());			}			else break;		}		if (pAlarm->wAlarmType != 0xFFFF) break;//暂时不支持单项查询		//CString sql = fmt::format("SELECT [mo],[mp],[no],[type],[occur_time],[val],ISNULL([ack_time], '1970-1-1'),level,posi,loworhigh,referval FROM [rm_alarm] \		//	WHERE occur_time BETWEEN '{0}' AND '{1}' {2} AND ([type] = {3} OR {3} = 0xFFFF)", 		//	(LPCSTR)(CTime(pAlarm->starttime).Format("%Y-%m-%d %H:%M:%S")), (LPCSTR)(CTime(pAlarm->endtime).Format("%Y-%m-%d %H:%M:%S")),		//	(LPCSTR)strCont, pAlarm->wAlarmType).c_str();		CString sql = fmt::format("SELECT [mo],[mp],[no],[type],[occur_time],[val],[recovery_time],level,posi,loworhigh,referval,[sunroof] FROM [rm_alarm] \			WHERE occur_time BETWEEN '{0}' AND '{1}' {2}",			(LPCSTR)(CTime(pAlarm->starttime).Format("%Y-%m-%d %H:%M:%S")), (LPCSTR)(CTime(pAlarm->endtime).Format("%Y-%m-%d %H:%M:%S")),			(LPCSTR)strCont).c_str();		COdbcStatement stmt;		if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))		{			CSimpleLog::Error("执行语句失败" + sql);			break;		}		char mo[51], mp[51]/*, desc[200], suggest[200], event_id[37] = { 0 }, rel_id[37] = { 0 }*/;		uint8_t no, type, level,sunroof;		int posi;		BYTE cbParam;		int val;		int referval;		TIMESTAMP_STRUCT ts, rts;		int nCol = 1;		stmt.BindCharCol(nCol++, mo, sizeof(mo));		stmt.BindCharCol(nCol++, mp, sizeof(mp));		stmt.BindTinyIntCol(nCol++, &no);		stmt.BindTinyIntCol(nCol++, &type);		stmt.BindTimeStampCol(nCol++, &ts);		//stmt.BindTinyIntCol(nCol++, &level);		//stmt.BindCharCol(nCol++, desc, sizeof(desc));		//stmt.BindCharCol(nCol++, suggest, sizeof(suggest));		stmt.BindIntCol(nCol++, &val);		stmt.BindTimeStampCol(nCol++, &rts);		stmt.BindTinyIntCol(nCol++, &level);		stmt.BindIntCol(nCol++, &posi);		stmt.BindTinyIntCol(nCol++, &cbParam);		stmt.BindIntCol(nCol++, &referval);		stmt.BindTinyIntCol(nCol++, &sunroof);		//stmt.BindCharCol(nCol++, event_id, 36);		//stmt.BindCharCol(nCol++, rel_id, 36);		do		{			if (stmt.FetchNext() != 0) break;			stAlarmItem it = {0};			it.wNodeID = CMonitorObjectMng::Instance()->GetZZJNO(fmt::format("{}.{}", mo, mp));			it.time = CovertData(ts) / 1000;			if (rts.year <= 2000)			{				it.dwRestoreTime = 0;				it.byAlarmType = 1;			}			else			{				it.dwRestoreTime = CovertData(rts) / 1000;				it.byAlarmType = 2;			}			eZL_ALARMTYPE eType = (eZL_ALARMTYPE)type;			it.wAlarmType = Get315AlarmID(eType, (eDaoChaPosi)posi, level, (eLowHigh)cbParam);			if (eType == eZL_ALARMTYPE::CONVERT_LIMIT || eType == eZL_ALARMTYPE::SUOBI_LOCK_LIMIT)			{				memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_MOVEING), 3);				memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_MOVEING), 3);			}			else if (eType == eZL_ALARMTYPE::RETENSION_FORCE)			{				memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_POLL), 3);				memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_POLL), 3);			}			else if (eType == eZL_ALARMTYPE::SENSOR_ABNORMAL || eType == eZL_ALARMTYPE::EQUIP_OFFLINE)			{				memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(INT_MIN), 3);				memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(INT_MIN), 3);			}			else if (eType == eZL_ALARMTYPE::MAX_OVER_LIMIT)			{				memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_MOVEING), 3);				memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_MOVEING), 3);			}			else				ASSERT(0);			vctAlarm.push_back(it);		} while (true);		stmt.Close();		bRet = true;	} while (false);	CSimpleLog::Info(("[315]一共加载(" + to_string(vctAlarm.size()) + ")条报警").c_str());	int packno = GetPackageID();	C315CommData CommData;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, false, packno, vctAlarm, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, packno);	return bRet;}WORD C315TCPClient::Get315AlarmID(eZL_ALARMTYPE cbAlarmType, eDaoChaPosi posi, uint8_t level, eLowHigh cbAlarmParam){	switch (cbAlarmType)	{	case eZL_ALARMTYPE::MAX_OVER_LIMIT:		//if (posi == eDaoChaPosi::DCP_FIX) return 0x101;		//else if (posi == eDaoChaPosi::DCP_INVERT) return 0x102;  //超限作为锁闭力转换力上报 2024年5月4日		if (posi == eDaoChaPosi::DCP_FIX)		{			if (level == 1) return 0x108;//报警			else return 0x107;			//预警		}		else if (posi == eDaoChaPosi::DCP_INVERT)		{			if (level == 1) return 0x110;//报警			else return 0x109;			//预警		}				else if (posi == eDaoChaPosi::DCP_FIX2INVERT)		{			if (level == 1) return 0x112;			else return 0x111;		}		else if (posi == eDaoChaPosi::DCP_INVERT2FIX)		{			if (level == 1) return 0x114;			else return 0x113;		}		break;	case eZL_ALARMTYPE::FRICTION_OVER_LIMIT:		break;	case eZL_ALARMTYPE::SUOBI_LOCK_LIMIT:		if (posi == eDaoChaPosi::DCP_FIX)		{			if (cbAlarmParam == eLowHigh::LH_LOW)//0:最小值  1:最大值			{				if (level == 1) return 0x104;				else return 0x103;			} 			else			{				if (level == 1) return 0x108;//报警				else return 0x107;			//预警			}					} 		else if (posi == eDaoChaPosi::DCP_INVERT)		{			if (cbAlarmParam == eLowHigh::LH_LOW)//0:最小值  1:最大值			{				if (level == 1) return 0x106;				else return 0x105;			}			else			{				if (level == 1) return 0x110;//报警				else return 0x109;			//预警			}		}		break;	case eZL_ALARMTYPE::CONVERT_LIMIT:		if (posi == eDaoChaPosi::DCP_FIX2INVERT)		{			if (level == 1) return 0x112;			else return 0x111;		} 		else if (posi == eDaoChaPosi::DCP_INVERT2FIX)		{			if (level == 1) return 0x114;			else return 0x113;		}		break;	case eZL_ALARMTYPE::EQUIP_OFFLINE:		return 0x117;		break;	case eZL_ALARMTYPE::SENSOR_ABNORMAL:		break;	case eZL_ALARMTYPE::RETENSION_FORCE:		if (posi == eDaoChaPosi::DCP_FIX)			return 0x115;		else if (posi == eDaoChaPosi::DCP_INVERT)			return 0x116;		break;	default:		break;	}	return 0;}void C315TCPClient::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){	if (g_b315 == false) return;	std::vector<stAlarmItem> vctAlarm;	stAlarmItem it = { 0 };	it.wNodeID = wNodeID;	it.time = dwTime;	if (cbAlarmStatus == 1)	{		it.dwRestoreTime = 0;		it.byAlarmType = 1;	}	else	{		it.dwRestoreTime = dwRestoreTime;		it.byAlarmType = 2;	}	it.wAlarmType = Get315AlarmID(cbAlarmType, posi, level, cbAlarmParam);	if (it.wAlarmType == 0) 		return;	memcpy(&it.sAlarmValue, &val, 3);	memcpy(&it.sRefValue, &refVal, 3);	it.wSuggestID = wSuggestID;	vctAlarm.push_back(it);	int no = GetPackageID();	C315CommData CommData;	auto ePortocol = E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, true, no, vctAlarm, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, no);}void C315TCPClient::SendClientConfig(E_315_PROTOCOL_TYPE ePortocol){	//1. 递归m_treeroot  取到 mo.mp   no name	//2.  mo.mp 转 imei m_mapMoMpImeiIdx,如果找不到 imei , 则说明无绑定信息 无测力 无温湿度	//3. 利用imei 找到 cdevie CDevice* Find(std::string imei);	//4. 如果找到设备, 说明有定位测力  反位测力 转换测力   	bool  m_bHaveTemp = false; bool  m_bHaveHumi = false;	vector<NodeConfig> vecConfig;	std::vector<CMonitorObject*> vctObj;	if (CMonitorObjectMng::Instance()->GetAllObjByType(vctObj, "mo.mp"))	{		for (auto &zzj : vctObj)		{			//mo.mp			string imei; int idx;			if (CMonitorObjectMng::Instance()->MOMP2IMEI(zzj->id, imei, idx))			{				auto pDevice = CDeviceMng::Instance()->Find(imei);				if(pDevice)				{					NodeConfig n;					n.strNodeName = zzj->name.c_str();					n.wNodeID = zzj->eqpno;					n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x101);					n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x102);					n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x103);					if (pDevice->IsHaveTemp()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);					if (pDevice->IsHaveHumi()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);					vecConfig.emplace_back(n);				}			}		}	}	C315CommData CommData;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, vecConfig, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());}void C315TCPClient::SendRealDataValue(E_315_PROTOCOL_TYPE ePortocol){	vector<NodeRealData> vecConfig;	//auto pMap = CMonitorObjectMng::Instance()->GetImeiIdxMoMp();	//for (auto &it : *pMap)	//{	//	auto pDevice = CDeviceMng::Instance()->Insert(it.first);	//	auto p = CMonitorObjectMng::Instance()->GetTreeByID(it.second);	//	if (!p || p->type != "mo.mp") continue;	//vector<NodeConfig> vecConfig;	std::vector<CMonitorObject*> vctObj;	if (CMonitorObjectMng::Instance()->GetAllObjByType(vctObj, "mo.mp"))	{		for (auto& zzj : vctObj)		{			//mo.mp			string imei;			int idx;			if (CMonitorObjectMng::Instance()->MOMP2IMEI(zzj->id, imei, idx))			{				auto pDevice = CDeviceMng::Instance()->Find(imei);				if (pDevice)				{					auto epos = CMonitorObjectMng::Instance()->GetZZJEPOS(zzj->id);					NodeRealData n;					n.wNodeID = zzj->eqpno;					int nData[5] = { INT_MIN, INT_MIN, INT_MIN, pDevice->m_nTemperature, pDevice->m_nHumidity };					n.vecAcqTypeID.assign({ (WORD)AcqTypeCode::eAcqTypeCode_0x101,(WORD)AcqTypeCode::eAcqTypeCode_0x102,(WORD)AcqTypeCode::eAcqTypeCode_0x103 });					if (pDevice->IsHaveTemp()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);					if (pDevice->IsHaveHumi()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);					lock_guard<mutex> lock(pDevice->m_mtx);					if (pDevice->m_tmMoveDetectTime1 > pDevice->m_tmMoveDetectTime2 && pDevice->m_tmMoveDetectTime1 > pDevice->m_tmMoveDetectTime0)					{						nData[0] = pDevice->map_resist_idx10.rbegin()->second;						nData[1] = pDevice->map_resist_idx11.rbegin()->second;						nData[2] = pDevice->map_resist_idx12.rbegin()->second;						n.dwAcqTime = pDevice->m_tmMoveDetectTime1;					}					else if (pDevice->m_tmMoveDetectTime0 > pDevice->m_tmMoveDetectTime2 && pDevice->m_tmMoveDetectTime0 > pDevice->m_tmMoveDetectTime1)					{						nData[0] = pDevice->map_resist_idx00.rbegin()->second;						nData[1] = pDevice->map_resist_idx01.rbegin()->second;						nData[2] = pDevice->map_resist_idx02.rbegin()->second;						n.dwAcqTime = pDevice->m_tmMoveDetectTime0;					}					else if (pDevice->m_tmMoveDetectTime2 > pDevice->m_tmMoveDetectTime1 && pDevice->m_tmMoveDetectTime2 > pDevice->m_tmMoveDetectTime0)					{						nData[0] = pDevice->map_resist_idx20.rbegin()->second;						nData[1] = pDevice->map_resist_idx21.rbegin()->second;						nData[2] = pDevice->map_resist_idx22.rbegin()->second;						n.dwAcqTime = pDevice->m_tmMoveDetectTime2;					}					string name1, name2, name3;					CMonitorObjectMng::Instance()->GetNameByMoMp(zzj->id, name1, name2, name3);					if (name1 == "反位")					{						swap(nData[0], nData[1]);					}					n.byFixInvert = 2;					if (epos == DAOCHA_POSITION::MP_FIX) n.byFixInvert = 0;					else if (epos == DAOCHA_POSITION::MP_INVERT) n.byFixInvert = 1;					n.vecStatus.assign({ 1,1,1,1,1 });					n.vecAcqData.assign(nData, nData + 5);					vecConfig.emplace_back(n);				}			}		}	}	C315CommData CommData;	CCSM315Protocol::DataSerialize((BYTE)ePortocol, vecConfig, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());}////void C315TCPClient::SendCurveData(E_315_PROTOCOL_TYPE ePortocol, uint16_t eqpno, const int num, bool bPush, const std::vector<int>& vctData0, const std::vector<int>& vctData1, const std::vector<int>& vctData2, DWORD atime)//{//	C315CommData CommData;//	int no = GetPackageID();//	CCSM315Protocol::DataSerialize((BYTE)ePortocol, bPush, no, eqpno, num, vctData0, vctData1, vctData2, atime, CommData);////	Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, no, bPush);//}//void C315TCPClient::SendCurveData(uint16_t eqpno, const int num, bool bPush, const std::vector<int>& vctData0, const std::vector<int>& vctData1, const std::vector<int>& vctData2, const CTime& atime)//{//	auto p = CMonitorObjectMng::Instance()->GetTreeByID(mo_mp);//	if (!p || p->type != "mo.mp") return;//	auto pup = CMonitorObjectMng::Instance()->GetTreeByID(p->up);//	if (!pup || pup->type != "station") return;////	//SendCurveData(E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, p->eqpno, num, bPush, vctData0, vctData1, vctData2, atime.GetTime());////	C315CommData CommData;//	int no = GetPackageID();//	CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, bPush, no, eqpno, num, vctData0, vctData1, vctData2, atime, CommData);////	Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);////}void C315TCPClient::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){	if (g_b315 == false) return;	//C315CommData CommData;	//int no = 0;	//if(bPush) no = GetPackageID();	//BYTE byFixOrNot = (posi == eDaoChaPosi::DCP_FIX2INVERT ? 0 : 1);	//CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, byFixOrNot, bPush, no, wEqpNO, num,	//	map00, map01, map10, map11, map20, map21, atime, CommData);	//Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);}void C315TCPClient::SendCurveData(WORD wEqpNO, eDaoChaPosi posi, const int num, bool bPush, std::map<time_t, int>* mapData[], 	time_t tmStartSecond, time_t tmEndSecond){	if (g_b315 == false) return;	C315CommData CommData;	int no = 0;	if (bPush) no = GetPackageID();	BYTE byFixOrNot = (posi == eDaoChaPosi::DCP_FIX2INVERT ? 0 : 1);	CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, byFixOrNot, bPush, no, wEqpNO, num,		mapData, tmStartSecond, tmEndSecond, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);}void C315TCPClient::SendRealDataValue(WORD wEqpNO, DAOCHA_POSITION byFixOrNot, bool bPush, int nFixData, int nInvertData, int nConvertData, int nTemp, int nHumi, const CTime& atime){	C315CommData CommData;	vector<WORD> vctAcq{ (WORD)AcqTypeCode::eAcqTypeCode_0x101,(WORD)AcqTypeCode::eAcqTypeCode_0x102,(WORD)AcqTypeCode::eAcqTypeCode_0x103};	vector<TIEDA_ACQ_VALUE> vctData;	vector<BYTE> vctStutas{ 1,1,1 };	vctData.emplace_back(nFixData, TIEDA_VAL_STATE::TVS_POLL);	vctData.emplace_back(nInvertData, TIEDA_VAL_STATE::TVS_POLL);	vctData.emplace_back(nConvertData, TIEDA_VAL_STATE::TVS_POLL);	if (nTemp != INT_MIN)	{		vctAcq.emplace_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);		vctStutas.emplace_back(1);		vctData.emplace_back(nTemp, TIEDA_VAL_STATE::TVS_POLL, 3);	}	if (nHumi != INT_MIN)	{		vctAcq.emplace_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);		vctStutas.emplace_back(1);		vctData.emplace_back(nHumi, TIEDA_VAL_STATE::TVS_POLL, 3);	}	BYTE cbPos = 2;	if (byFixOrNot == DAOCHA_POSITION::MP_FIX) cbPos = 0;	else if (byFixOrNot == DAOCHA_POSITION::MP_INVERT) cbPos = 1;	CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51, bPush, wEqpNO, cbPos, vctAcq, vctData, vctStutas, atime, CommData);	Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51, bPush ? GetPackageID() : 0, bPush);}
 |