| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 | #include "stdafx.h"#include "SuperHandler.h"#include "LibEventTCPClient.h"#include <Simplelog.h>#include "AppService.h"#include <jsonxx.h>#include "MonitorObject.h"using namespace jsonxx;CSuperHandler::CSuperHandler(){}CSuperHandler::~CSuperHandler(){}BOOL CSuperHandler::HandlePack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, void* pClientContext /*= NULL*/){	auto pClient = (CLibEventTCPClient*)pClientContext;	//解析	if (!CHjDataConver::conver_recvpack(pPack, nPackLen))		return FALSE;	LPHJDATAHEAD2 lpHead = (LPHJDATAHEAD2)pPack;	if (lpHead->protocol == E_ZL_PROTOCAL::ZL_KEEP)		return TRUE;	//SPDLOG_INFO("recv {}:{} : {}", m_strServerIP, m_nServerPort, CSimpleLog::GetHexString2(pPack, nPackLen));	BOOL bRet = FALSE;	switch (lpHead->protocol)	{	case E_ZL_PROTOCAL::ZL_MO:	case E_ZL_PROTOCAL::ZL_MP:	case E_ZL_PROTOCAL::ZL_RESIST_DATA:	case E_ZL_PROTOCAL::ZL_RESIST_REAL:	case E_ZL_PROTOCAL::ZL_TEMP_HUMI:	case E_ZL_PROTOCAL::ZL_ALARM_SET:	case E_ZL_PROTOCAL::ZL_ALARM_DATA:	case E_ZL_PROTOCAL::ZL_ALARM_ACK:	case E_ZL_PROTOCAL::ZL_ALARM_HANDLE:	case E_ZL_PROTOCAL::ZL_SVG:	case E_ZL_PROTOCAL::ZL_REFER:	case E_ZL_PROTOCAL::ZL_MOVE:	case E_ZL_PROTOCAL::ZL_ALARM_UNACK:		bRet = RecvPack(lpHead->packno, lpHead->protocol);  //发出确认包		break;	case E_ZL_PROTOCAL::DL_SUB_NOTIFY:		HandleSubNotify(lpHead, (char*)pPack + sizeof(HJDATAHEAD2), lpHead->len);		break;	case E_ZL_PROTOCAL::DL_SYNC:		CAppService::Instance()->SetSycnSuperTime();		break;	case E_ZL_PROTOCAL::DL_ALARM_ACK:	case E_ZL_PROTOCAL::DL_ALARM_HANDLE:		break;	default:		CSimpleLog::Warn(fmt::format("收到未实现的命令:{}", uint8_t(lpHead->protocol)).c_str());		break;	}	return bRet;}BOOL CSuperHandler::RecvPack(uint32_t packno, E_ZL_PROTOCAL protocal){	m_pFather->recvcount++;	//SPDLOG_INFO("recv 协议号:{} packno:{})", uint8_t(protocal), packno);	std::lock_guard<std::mutex> lock(m_mtx);	for (auto it = m_task.begin(); it != m_task.end(); it++)	{		auto p = *it;		if (p->packno == packno && p->protocal == protocal)		{			m_task.erase(it);			p->join();		}		return TRUE;	}	return FALSE;}BOOL CSuperHandler::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());}BOOL CSuperHandler::ReSend(){	if (m_task.size() == 0) return TRUE;	std::lock_guard<std::mutex> lock(m_mtx);	if (m_task.size() > 0)	{		auto& it = m_task.front();		auto ret = m_pClient->Insert(it->pdata, it->nlen);		if (ret)		{			m_pFather->sendlen += it->nlen;			m_pFather->sendcount++;		}		else			m_pFather->sendfail++;		return ret;	}	return FALSE;}bool CSuperHandler::Send(uint8_t* data, uint32_t len){	return m_pClient->Insert(data, len);}void CSuperHandler::Insert(LPBYTE pPack, int nPackLen, uint32_t packno, E_ZL_PROTOCAL protocal, bool r){	if (m_task.size() > 1000)		SPDLOG_WARN("待发送数据队列异常:{}", m_task.size());	//if (nPackLen > 1500) SPDLOG_INFO("send e packno:{})", packno);	auto ret = m_pClient->Insert(pPack, nPackLen);	if (ret == false)	{		m_pFather->sendfail++;		SPDLOG_WARN("send fail. packno:{})", packno);	}	else	{		m_pFather->sendcount++;		m_pFather->sendlen += nPackLen;	}	//加入队列并发送	if (r || ret == false)	{		CSendTask* pTask = new CSendTask(pPack, nPackLen, packno, protocal, 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();		}	}}
 |