#include "stdafx.h" #include "315TCPClient.h" #include "Simplelog.h" #include #include "AppService.h" #include #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 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 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 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("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 mapData; do { if (nDataSize != sizeof(stQueryHisData) + pData->cnt * sizeof(stQueryHisDataItem)) break; stQueryHisDataItem* pItem = (stQueryHisDataItem*)pData->lpinfo; struct stQueryDataItem { WORD wNodeID = 0; string id; set 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 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{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 vctData0; std::map vctData1; std::map 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 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> 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 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 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 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 vecConfig; std::vector 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 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 vecConfig; std::vector 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 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& vctData0, const std::vector& vctData1, const std::vector& 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& vctData0, const std::vector& vctData1, const std::vector& 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* 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 vctAcq{ (WORD)AcqTypeCode::eAcqTypeCode_0x101,(WORD)AcqTypeCode::eAcqTypeCode_0x102,(WORD)AcqTypeCode::eAcqTypeCode_0x103}; vector vctData; vector 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); }