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