| 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			2
 
- C315SendTask::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);
 
- }
 
 
  |