| 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();
 
- 		}
 
- 	}
 
- }
 
 
  |