315TCPClient.cpp 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552
  1. #include "stdafx.h"
  2. #include "315TCPClient.h"
  3. #include "Simplelog.h"
  4. #include <ZlDataDefine.h>
  5. #include "AppService.h"
  6. #include <jsonxx.h>
  7. #include "MonitorObject.h"
  8. #include "Device.h"
  9. #include "315ClientManager.h"
  10. using namespace jsonxx;
  11. #define IDT_HEARTBEAT 1
  12. #define IDT_RESEND 2
  13. 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*/)
  14. {
  15. m_pData = new BYTE[nPackLen];
  16. memcpy(m_pData, pPack, nPackLen);
  17. m_nDataLen = nPackLen;
  18. this->m_nPackNO = no;
  19. this->m_eProtocal = proto;
  20. m_uSendTime = time(NULL);
  21. m_nReSendCount = nReSendCount;
  22. m_nReSendInterval = nReSendInterval;
  23. }
  24. void C315SendTask::join()
  25. {
  26. delete this;
  27. }
  28. int C315SendTask::GetCmdDataSize() const
  29. {
  30. if (m_nDataLen <= 12) return 0;
  31. return m_nDataLen - 12;
  32. }
  33. BYTE* C315SendTask::GetCmdData()
  34. {
  35. if (m_nDataLen <= 12)
  36. {
  37. return NULL;
  38. }
  39. return m_pData + 12;
  40. }
  41. C315SendTask::~C315SendTask()
  42. {
  43. //SPDLOG_ERROR("mem:del {:X}", (DWORD_PTR)pdata);
  44. delete[] m_pData;
  45. m_pData = nullptr;
  46. m_nDataLen = 0;
  47. }
  48. C315TCPClient::C315TCPClient()
  49. {
  50. m_hFile = INVALID_HANDLE_VALUE;
  51. m_lptlManageFrame = NULL;
  52. InitializeCriticalSection(&m_LOGMutex);
  53. }
  54. C315TCPClient::~C315TCPClient()
  55. {
  56. DeleteCriticalSection(&m_LOGMutex);
  57. //if (m_pBuffer) m_pBuffer->Reset();
  58. }
  59. bool C315TCPClient::Connect(LPCSTR pszServerIP, UINT nServerPort)
  60. {
  61. SetBuffer(this);
  62. if (!ConnectServer(pszServerIP, nServerPort))
  63. {
  64. QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);
  65. return false;
  66. }
  67. return true;
  68. }
  69. void C315TCPClient::Close()
  70. {
  71. if (m_hSocket != INVALID_SOCKET)
  72. SPDLOG_ERROR("[315]主动断开TCP链路:{}:{}", m_strServerIP, m_nServerPort);
  73. return __super::Close();
  74. }
  75. DWORD C315TCPClient::CheckLog()
  76. {
  77. static WORD wPrevYear = 0;
  78. static WORD wPrevMonth = 0;
  79. static WORD wPrevDate = 0;
  80. EnterCriticalSection(&m_LOGMutex);
  81. SYSTEMTIME sNow;
  82. GetLocalTime(&sNow);
  83. BOOL bNeedRefreshFileName = (sNow.wYear != wPrevYear)
  84. || (sNow.wMonth != wPrevMonth) || (sNow.wDay != wPrevDate);
  85. if (bNeedRefreshFileName)
  86. {
  87. //需要更新文件名称
  88. //1.关闭老文件
  89. if (m_hFile != INVALID_HANDLE_VALUE)
  90. {
  91. CloseHandle(m_hFile);
  92. m_hFile = INVALID_HANDLE_VALUE;
  93. }
  94. TCHAR strLog_Path[MAX_PATH] = { '\0' };
  95. CString Path;
  96. {
  97. TCHAR szBuffer[_MAX_PATH];
  98. ::GetModuleFileName(AfxGetInstanceHandle(), szBuffer, _MAX_PATH);
  99. Path = (szBuffer);
  100. Path = Path.Left(Path.ReverseFind('\\') + 1);
  101. }
  102. CreateDirectory(Path + "Log", NULL);
  103. //2.生成新文件
  104. CTime time = CTime::GetCurrentTime();
  105. _stprintf_s(strLog_Path, sizeof(strLog_Path), "%s\\%s",
  106. (LPCSTR)(Path + "Log"), time.Format(_T("%Y%m%d")));
  107. CreateDirectory(strLog_Path, NULL);
  108. char strNewFileName[MAX_PATH];
  109. _stprintf_s(strNewFileName, sizeof(strNewFileName), "%s\\%d_%02d_%02d.log",
  110. strLog_Path, sNow.wYear, sNow.wMonth, sNow.wDay);
  111. m_hFile = CreateFile(strNewFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
  112. NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  113. if (INVALID_HANDLE_VALUE != m_hFile)
  114. ::SetFilePointer(m_hFile, 0, NULL, FILE_END);
  115. wPrevYear = sNow.wYear;
  116. wPrevMonth = sNow.wMonth;
  117. wPrevDate = sNow.wDay;
  118. }
  119. LeaveCriticalSection(&m_LOGMutex);
  120. return 1;
  121. }
  122. BOOL C315TCPClient::writelog(const char* pBuf, int len, BOOL bInOrOut, const char* note/*, ClientInfo* pCltInfo / *= nullptr* /*/)
  123. {
  124. CheckLog();
  125. char szMessage[256];
  126. SYSTEMTIME tm;
  127. GetLocalTime(&tm);
  128. DWORD dwWrittenNum = 0;
  129. EnterCriticalSection(&m_LOGMutex);
  130. if (m_hFile != INVALID_HANDLE_VALUE)
  131. {
  132. DWORD dwFileLimit_M = 200;
  133. DWORD dwFileLen = GetFileSize(m_hFile, NULL);
  134. if (dwFileLen < dwFileLimit_M * 1024 * 1024)
  135. {
  136. //if (pCltInfo)
  137. // _stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [%s][%s:%d]%s ",
  138. // tm.wHour, tm.wMinute, tm.wSecond,
  139. // bInOrOut ? TEXT("请求") : TEXT("发出"), pCltInfo->strIP, pCltInfo->iPort, note);
  140. //else
  141. _stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [%s]%s ",
  142. tm.wHour, tm.wMinute, tm.wSecond,
  143. bInOrOut ? TEXT("请求") : TEXT("发出"), note);
  144. WriteFile(m_hFile, szMessage, _tcslen(szMessage), &dwWrittenNum, NULL);
  145. if (pBuf) WriteFile(m_hFile, pBuf, len, &dwWrittenNum, NULL);
  146. WriteFile(m_hFile, "\r\n", 2, &dwWrittenNum, NULL);
  147. dwFileLen = GetFileSize(m_hFile, NULL);
  148. if (dwFileLen >= dwFileLimit_M * 1024 * 1024)
  149. {
  150. _stprintf_s(szMessage, sizeof(szMessage), "%02d:%02d:%02d [文件容量超限(最大%dM)]\r\n",
  151. tm.wHour, tm.wMinute, tm.wSecond, dwFileLimit_M);
  152. WriteFile(m_hFile, szMessage, _tcslen(szMessage), &dwWrittenNum, NULL);
  153. }
  154. }
  155. }
  156. LeaveCriticalSection(&m_LOGMutex);
  157. return 1;
  158. }
  159. int C315TCPClient::Send(const void* lpBuf, int nBufLen, int nFlags)
  160. {
  161. string log = m_lptlManageFrame->GetStrFromData((const BYTE*)lpBuf, nBufLen);
  162. writelog(log.c_str(), log.size(), FALSE, "");
  163. return __super::Send(lpBuf, nBufLen, nFlags);
  164. }
  165. void C315TCPClient::Insert(BYTE const* const pPack, int nPackLen, E_315_PROTOCOL_TYPE protocol, uint8_t no, bool bPush/* = false*/)
  166. {
  167. if (g_b315 == false) return;
  168. if (m_task.size() > 1000)
  169. {
  170. string strLog = fmt::format("[315]待发送数据队列太多:{}", m_task.size());
  171. writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  172. }
  173. if (nPackLen > 1500)
  174. SPDLOG_INFO("[315]send a pack)");
  175. {
  176. string strLog = GetStrFromData(pPack, nPackLen);
  177. writelog(strLog.c_str(), strLog.length(), FALSE, fmt::format("【0x{:02x}命令】", (BYTE)protocol).c_str());
  178. }
  179. auto ret = Send(pPack, nPackLen);
  180. if (ret == SOCKET_ERROR)
  181. {
  182. m_nSendFail++;
  183. //SPDLOG_WARN("[315]send fail. pack)");
  184. string strLog = fmt::format("[315]发送数据失败,len:{}", nPackLen);
  185. writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  186. }
  187. else if (nPackLen == ret)
  188. {
  189. m_nSendCount++;
  190. m_nSendLen += ret;
  191. }
  192. else
  193. ASSERT(0);
  194. int nReSendCount = 0;
  195. int nReSendInterval = 0;
  196. if (bPush)
  197. {
  198. CCSM315Protocol::GetResendProtocol(protocol, nReSendCount, nReSendInterval);
  199. }
  200. //加入队列并发送
  201. if((nReSendCount > 1 && nReSendInterval > 0) || ret == SOCKET_ERROR)
  202. {
  203. if (nReSendCount != INT_MAX)
  204. {
  205. nReSendCount--;
  206. }
  207. C315SendTask* pTask = new C315SendTask(pPack, nPackLen, protocol, no, nReSendCount, nReSendInterval/*, packno, r*/);
  208. std::lock_guard<std::mutex> lock(m_mtx);
  209. m_task.emplace_back(pTask);
  210. if (m_task.size() > 1500)
  211. {
  212. auto it = m_task.front();
  213. m_task.pop_front();
  214. it->join();
  215. }
  216. }
  217. //统计发送量
  218. time_t tmNow;
  219. time(&tmNow);
  220. m_mapSendCout[tmNow / 3600] += nPackLen;
  221. if (m_mapSendCout.size() > 1)
  222. {
  223. auto it = m_mapSendCout.begin();
  224. string strLog;
  225. auto& item = it->second;
  226. if (it->second > 1024 * 1024 * 1024)
  227. strLog = fmt::format("{}GB {}MB {} KB", item / (1024 * 1024 * 1024),
  228. item % (1024 * 1024 * 1024) / (1024 * 1024), item % (1024 * 1024) / 1024);
  229. else if (it->second > 1024 * 1024)
  230. strLog = fmt::format("{}MB {} KB", item / (1024 * 1024), item % (1024 * 1024) / 1024);
  231. else
  232. strLog = fmt::format("{} KB ", item / 1024);
  233. SPDLOG_WARN("[315]上送流量统计:{} {}", CTime(it->first * 3600).Format("%Y-%m-%d %H:%M:%S"), strLog);
  234. m_mapSendCout.erase(it);
  235. }
  236. }
  237. void C315TCPClient::OnConnect(int nErrorCode)
  238. {
  239. string strLog = fmt::format("[315]收到TCP[{}:{}]链路连接结果:{}", m_strServerIP, m_nServerPort, nErrorCode);
  240. writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  241. //#ifndef _DEBUG
  242. if (nErrorCode == 0)
  243. {
  244. CTimerEngine::GetInstance()->SetTimer(this, IDT_HEARTBEAT, 5000, TIMES_INFINITY);
  245. CTimerEngine::GetInstance()->SetTimer(this, IDT_RESEND, 100, TIMES_INFINITY);
  246. }
  247. else
  248. {
  249. CTimerEngine::GetInstance()->KillTimer(this, IDT_HEARTBEAT);
  250. CTimerEngine::GetInstance()->KillTimer(this, IDT_RESEND);
  251. QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);
  252. }
  253. //#endif // _DEBUG
  254. return __super::OnConnect(nErrorCode);
  255. }
  256. DWORD C315TCPClient::OnReconnect(LPVOID lpParam)
  257. {
  258. C315TCPClient* pThis = (C315TCPClient*)lpParam;
  259. int nCount = 0;
  260. while (true)
  261. {
  262. Sleep(1000);
  263. pThis->Close();
  264. if(pThis->ConnectServer(pThis->m_strServerIP.c_str(), pThis->m_nServerPort))
  265. {
  266. string strLog = fmt::format("[315]重连[{}:{}]成功", pThis->m_strServerIP, pThis->m_nServerPort);
  267. pThis->writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  268. break;
  269. }
  270. nCount++;
  271. if (nCount % 30 == 0)
  272. {
  273. string strLog = fmt::format("[315]重连[{}:{}] {}次失败!", pThis->m_strServerIP, pThis->m_nServerPort, nCount);
  274. pThis->writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  275. }
  276. }
  277. return 0;
  278. }
  279. void C315TCPClient::OnClose(int nErrorCode)
  280. {
  281. string strLog = fmt::format("[315]收到TCP链路断开[{}:{}]!", m_strServerIP, m_nServerPort);
  282. writelog(strLog.c_str(), strLog.length(), FALSE, "【系统】");
  283. QueueUserWorkItem(C315TCPClient::OnReconnect, (LPVOID)this, WT_EXECUTEDEFAULT);
  284. return __super::OnClose(nErrorCode);
  285. }
  286. BOOL C315TCPClient::ReceiptPack(E_315_PROTOCOL_TYPE protocol, LPBYTE lpData, WORD wSize)
  287. {
  288. m_nRecvCount++;
  289. if (!CCSM315Protocol::IsReceiptProtocol(protocol))
  290. { //非回执
  291. return FALSE;
  292. }
  293. BOOL bRet = FALSE;
  294. std::lock_guard<std::mutex> lock(m_mtx);
  295. LPBYTE pData = (lpData + 12);
  296. int nDataSize = wSize - 12;
  297. E_315_PROTOCOL_TYPE eSendPtl = E_315_PROTOCOL_TYPE(uint8_t(protocol) - 1);
  298. for (auto it = m_task.begin(); it != m_task.end(); it++)
  299. {
  300. auto p = *it;
  301. bool bReceipt = false;
  302. if (p->m_eProtocal == eSendPtl)
  303. {
  304. switch (protocol)
  305. {
  306. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x42: //服务端回执主动推送的全行程最新值.
  307. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x52: //服务端回执主动推送的受力最新值
  308. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x62: //服务端回执主动推送的框架最新值
  309. {
  310. }
  311. break;
  312. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x44: //服务端回执主动推送预报警信息
  313. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x54: //服务端回执主动推送预报警信息
  314. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x64: //服务端回执主动推送预报警信息
  315. {
  316. BYTE cbRecvNo = *(pData + 1);
  317. if (cbRecvNo == p->m_nPackNO)
  318. {
  319. bReceipt = true;
  320. }
  321. }
  322. break;
  323. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x46: //查询曲线时间信息
  324. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56: //查询曲线时间信息
  325. //case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x66: //查询曲线时间信息
  326. //{
  327. //StCurveCfgRes pSendCfg, pRecvCfg;
  328. //FRAME_KIND eSend, eRecv;
  329. //CCSM315Protocol::RecvParse(pSendCfg, p->GetCmdData(), p->GetCmdDataSize(), eSend);
  330. //CCSM315Protocol::RecvParse(pRecvCfg, pData, nDataSize, eRecv);
  331. ////处理缺口配置
  332. //CCSM315Protocol::Release(pSendCfg, eSend);
  333. //CCSM315Protocol::Release(pRecvCfg, eRecv);
  334. ////判断一个是发送,另一个是回执
  335. //if (eSend == FRAME_KIND::SEND && eRecv == FRAME_KIND::SEND)
  336. //{
  337. // if (pSendCfg.cnt == pRecvCfg.cnt
  338. // && pSendCfg.starttime == pRecvCfg.starttime
  339. // && pSendCfg.endtime == pRecvCfg.endtime)
  340. // {
  341. // bReceipt = true;
  342. // }
  343. //}
  344. //}
  345. //break;
  346. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x48: //服务端回执主动推送曲线数据
  347. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x58: //服务端回执主动推送曲线数据
  348. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x68: //服务端回执主动推送曲线数据
  349. {
  350. BYTE cbRecvNo = *(pData + 3);
  351. if (cbRecvNo == p->m_nPackNO)
  352. {
  353. bReceipt = true;
  354. }
  355. }
  356. break;
  357. }
  358. if (bReceipt)
  359. {
  360. m_task.erase(it);
  361. p->join();
  362. bRet = TRUE;
  363. break;
  364. }
  365. }
  366. }
  367. string strLog = GetStrFromData(lpData, wSize);
  368. writelog(strLog.c_str(), strLog.length(), TRUE, fmt::format("【0x{:02x}回执】处理结果:{}", (BYTE)protocol, bRet ? "成功" : "失败").c_str());
  369. return bRet;
  370. }
  371. string C315TCPClient::GetStrFromData(const BYTE* buf, int dwLen) const
  372. {
  373. return CCSM315Protocol::GetStrFromData(buf, m_nLogMsgMaxLen > 0 ? min(dwLen, m_nLogMsgMaxLen) : dwLen);
  374. }
  375. BOOL C315TCPClient::ReSend()
  376. {
  377. if (m_task.empty()) return FALSE;
  378. time_t uCurTime = time(NULL);
  379. std::lock_guard<std::mutex> lock(m_mtx);
  380. //if (m_task.size() > 0)
  381. for (auto it = m_task.begin(); it != m_task.end();)
  382. {
  383. //auto& it = m_task.front();
  384. if((*it)->m_uSendTime + (*it)->m_nReSendInterval >= uCurTime)
  385. {
  386. string strLog = GetStrFromData((*it)->m_pData, (*it)->m_nDataLen);
  387. writelog(strLog.c_str(), strLog.length(), FALSE, "【重发消息】");
  388. auto ret = Send((*it)->m_pData, (*it)->m_nDataLen) != SOCKET_ERROR;
  389. if (ret)
  390. {
  391. m_nSendLen += ret;
  392. m_nSendCount++;
  393. //一直重发
  394. if ((*it)->m_nReSendCount != INT_MAX)
  395. {
  396. (*it)->m_nReSendCount--;
  397. }
  398. //重发次数没了, 上次发送失败项
  399. if ((*it)->m_nReSendCount <= 0 || (*it)->m_nReSendInterval == 0)
  400. {
  401. (*it)->join();
  402. it = m_task.erase(it);
  403. continue;
  404. }
  405. }
  406. else
  407. m_nSendFail++;
  408. }
  409. it++;
  410. }
  411. return TRUE;
  412. }
  413. BOOL C315TCPClient::HandleSubNotify(LPHJDATAHEAD2 lpHead, char* json, int json_len)
  414. {
  415. Object obj;
  416. obj.parse(string(json, json_len));
  417. if (obj.empty()) return FALSE;
  418. auto momp = obj.get<string>("momp");
  419. if (momp.empty()) return FALSE;
  420. string imei; int idx;
  421. CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei, idx);
  422. return CAppService::Instance()->GetHandle()->SendMsgToDevice(imei.c_str());
  423. }
  424. void C315TCPClient::ProcessPack(LPBYTE pPack, int nPackLen)
  425. {
  426. auto protocol = CCSM315Protocol::GetProtocolType(pPack, nPackLen);
  427. //SPDLOG_INFO("[315]recv {}:{} : {}", m_strServerIP, m_nServerPort, CSimpleLog::GetHexString2(pPack, nPackLen));
  428. if (protocol == E_315_PROTOCOL_TYPE(0xFF)) return; //无效包
  429. if (protocol == E_315_PROTOCOL_TYPE::ACTIVE_KEEP)
  430. {
  431. static ULONGLONG g_ullTick = 0;
  432. ULONGLONG ullTick = GetTickCount64();
  433. if (ullTick > g_ullTick + 5 * 60)
  434. {
  435. g_ullTick = ullTick;
  436. string strLog = GetStrFromData(pPack, nPackLen);
  437. writelog(strLog.c_str(), strLog.length(), TRUE, "【5分钟心跳包】");
  438. }
  439. return; //心跳包
  440. }
  441. string log = m_lptlManageFrame->GetStrFromData((const BYTE*)pPack, nPackLen);
  442. writelog(log.c_str(), log.size(), TRUE, "");
  443. LPBYTE pData = (pPack + 12);
  444. int nDataSize = nPackLen - 16;
  445. DWORD dwCmdDataLen = *(DWORD*)(pPack + 8);
  446. if (nDataSize != dwCmdDataLen)
  447. {
  448. return; //包数据错误
  449. }
  450. if (ReceiptPack(protocol, pPack, nPackLen)) return; //回执包
  451. switch (protocol)
  452. {
  453. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x23: //缺口配置 道岔缺口
  454. {
  455. StGapCfgRes pCfg;
  456. CCSM315Protocol::RecvParse(pCfg, pData, nDataSize);
  457. string strLog = GetStrFromData(pData, nDataSize);
  458. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x23缺口配置】");
  459. //处理缺口配置
  460. CCSM315Protocol::Release(pCfg);
  461. }
  462. break;
  463. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x26: //道岔缺口数值
  464. {}
  465. break;
  466. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x27: //道岔缺口报警、预警及图像视频信息
  467. {}
  468. break;
  469. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x29: //道岔缺口最新图像
  470. {}
  471. break;
  472. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x32: //历史图像信息列表
  473. {}
  474. break;
  475. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2A: //历史图像信息
  476. {}
  477. break;
  478. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2E: //视频信息列表
  479. {}
  480. break;
  481. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x2F: //视频文件
  482. {}
  483. break;
  484. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x22: //1DQJ、区段状态信息
  485. {}
  486. break;
  487. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x25: //油压曲线
  488. {}
  489. break;
  490. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x24: //油位及缺口采集设备状态信息
  491. {}
  492. break;
  493. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x30: //视频流信息
  494. {}
  495. break;
  496. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x31: //请求命令时转辙机的定反位状态
  497. {}
  498. break;
  499. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x40: //全行程受力信息 全行程子系统占用
  500. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x50: //受力配置信息 受力监测子系统
  501. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x60: //框架配置信息 道岔框架系统
  502. {
  503. string strLog = GetStrFromData(pData, nDataSize);
  504. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x50受力配置信息】");
  505. SendClientConfig(protocol);
  506. }
  507. break;
  508. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x41: //全行程最新值
  509. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51: //受力最新值
  510. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x61: //框架最新值
  511. {
  512. string strLog = GetStrFromData(pData, nDataSize);
  513. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x51受力最新值】");
  514. SendRealDataValue(protocol);
  515. }
  516. break;
  517. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x43: //全行程预报警信息
  518. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53: //受力预报警信息
  519. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x63: //框架预报警信息
  520. {
  521. string strLog = GetStrFromData(pData, nDataSize);
  522. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x53受力预报警信息】");
  523. stQueryAlarm* pAlarm = (stQueryAlarm*)pData;
  524. QueryHistoryAlarm(protocol, pAlarm, nDataSize);
  525. }
  526. break;
  527. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x45: //测试历史数据
  528. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x55: //测试历史数据
  529. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x65: //测试历史数据
  530. {
  531. string strLog = GetStrFromData(pData, nDataSize);
  532. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x55查询历史数据】");
  533. stQueryHisData* pHis = (stQueryHisData*)pData;
  534. QueryHistoryData(protocol, pHis, nDataSize);
  535. }
  536. break;
  537. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x46: //查询曲线时间信息
  538. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x56: //查询曲线时间信息
  539. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x66: //查询曲线时间信息
  540. {
  541. string strLog = GetStrFromData(pData, nDataSize);
  542. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x56查询曲线时间列表】");
  543. stQueryHisCurveList* pHis = (stQueryHisCurveList*)pData;
  544. QueryHistoryCurveList(protocol, pHis, nDataSize);
  545. }
  546. break;
  547. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x47: //查询曲线数据
  548. case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57: //查询曲线数据
  549. // case E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x67: //查询曲线数据
  550. {
  551. string strLog = GetStrFromData(pData, nDataSize);
  552. writelog(strLog.c_str(), strLog.length(), TRUE, "【0x57查询曲线数据】");
  553. QueryHistoryCurve(protocol, (stQueryHisCurve*)pData, nDataSize);
  554. }
  555. break;
  556. default:
  557. break;
  558. }
  559. }
  560. unsigned char C315TCPClient::GetPackageID()
  561. {
  562. unsigned char no = m_byAutoPackageID;
  563. if (m_byAutoPackageID >= UCHAR_MAX)
  564. {
  565. m_byAutoPackageID = 1;
  566. }
  567. else
  568. m_byAutoPackageID++;
  569. return no;
  570. }
  571. int C315TCPClient::HasPack()
  572. {
  573. //return m_nPos;
  574. int len = 0;
  575. if (CCSM315Protocol::GetFrameData(CReceiveBuffer::m_pBuffer, m_nPos, len))
  576. return len;
  577. return 0;
  578. }
  579. void C315TCPClient::TimerCallBack(UINT_PTR iTimerID, WPARAM dwBindParameter /*= 0*/)
  580. {
  581. switch (iTimerID)
  582. {
  583. case IDT_HEARTBEAT: //心跳
  584. {
  585. BYTE pBuf[100];
  586. int ipos = 0;
  587. BYTE head[12];
  588. m_lptlManageFrame->InitFrmHead12B(head, FRAME_TYPE_HEARTBEAT, 0x2);
  589. memcpy(pBuf + ipos, head, 12);
  590. ipos += 12;
  591. long ltm = (long)time(NULL);
  592. *(long*)(pBuf + ipos) = ltm;
  593. ipos += 4;
  594. *(BYTE*)(pBuf + ipos) = 0xff;
  595. ipos += 1;
  596. *(BYTE*)(pBuf + ipos) = 0xff;
  597. ipos += 1;
  598. *(BYTE*)(pBuf + ipos) = 0xff;
  599. ipos += 1;
  600. *(DWORD*)(pBuf + ipos) = 0xffffffff;
  601. ipos += 4;
  602. //计算帧长度
  603. DWORD frmlen = ipos - 16;
  604. *(DWORD*)(pBuf + 8) = frmlen;
  605. Send(pBuf, ipos);
  606. static ULONGLONG g_ullSendTick = 0;
  607. ULONGLONG ullTick = GetTickCount64();
  608. if (ullTick > g_ullSendTick + 5 * 60)
  609. {
  610. g_ullSendTick = ullTick;
  611. string strLog = GetStrFromData(pBuf, ipos);
  612. writelog(strLog.c_str(), strLog.length(), FALSE, "【5分钟心跳包】");
  613. }
  614. }
  615. break;
  616. case IDT_RESEND: //重发机制
  617. ReSend();
  618. break;
  619. default:
  620. break;
  621. }
  622. }
  623. bool C315TCPClient::QueryHistoryData(E_315_PROTOCOL_TYPE ePortocol, stQueryHisData* pData, int nDataSize)
  624. {
  625. bool bRet = false;
  626. //first:makelong(牵引点, 采集码)
  627. std::map<DWORD, stHisStaticValue> mapData;
  628. do
  629. {
  630. if (nDataSize != sizeof(stQueryHisData) + pData->cnt * sizeof(stQueryHisDataItem))
  631. break;
  632. stQueryHisDataItem* pItem = (stQueryHisDataItem*)pData->lpinfo;
  633. struct stQueryDataItem
  634. {
  635. WORD wNodeID = 0;
  636. string id;
  637. set<WORD> setAcqTypeID;
  638. };
  639. CTime tStart(pData->starttime);
  640. CTime tEnd(pData->endtime);
  641. //查询条件
  642. string strQuery;
  643. 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] \
  644. 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",
  645. (LPCSTR)tStart.Format("%Y-%m-%d %H:%M:%S"), (LPCSTR)tEnd.Format("%Y-%m-%d %H:%M:%S.999"));
  646. map<string, stQueryDataItem> mapQueryItem;
  647. //所有牵引点
  648. for (WORD i = 0; i < pData->cnt; i++)
  649. {
  650. auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].wNodeID);
  651. if (!p || p->type != "mo.mp") break;
  652. string imei;
  653. int idx;
  654. if (!CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei, idx))
  655. {
  656. continue;
  657. }
  658. auto strName = fmt::format("{}.{}", imei, idx);
  659. auto pFind = mapQueryItem.find(strName);
  660. if (pFind == mapQueryItem.end())
  661. {
  662. mapQueryItem[strName] = { pItem[i].wNodeID, p->id, set<WORD>{pItem[i].acqTypeID} };
  663. }
  664. else
  665. {
  666. pFind->second.setAcqTypeID.insert(pItem[i].acqTypeID);
  667. }
  668. }
  669. //查询条件(imei.idx集合)
  670. CString strQueryCon;
  671. for (auto& it : mapQueryItem)
  672. {
  673. strQueryCon.AppendFormat("'%s',", it.first.c_str());
  674. }
  675. if (!strQueryCon.IsEmpty()) strQueryCon=strQueryCon.Left(strQueryCon.GetLength() - 1);
  676. //时间范围
  677. CTime tStart1(tStart.GetYear(), tStart.GetMonth(), tStart.GetDay(), 0, 0, 0);
  678. CTime tEnd1(tEnd.GetYear(), tEnd.GetMonth(), tEnd.GetDay(), 23, 59, 59);
  679. char memiidx[80];
  680. TIMESTAMP_STRUCT ts;
  681. ts.year = 0;
  682. int data[5];
  683. int ms;
  684. //遍历查询所有符合要求的数据库
  685. for (auto curTime = tStart1; curTime < tEnd1; curTime += CTimeSpan(1, 0, 0, 0))
  686. {
  687. CString strSql;
  688. {
  689. strSql.Format(strQuery.c_str(), curTime.GetYear(), curTime.GetMonth(), curTime.GetDay(), curTime.GetYear(), curTime.GetMonth(), (LPCSTR)strQueryCon);
  690. COdbcStatement stmt;
  691. if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))
  692. {
  693. CSimpleLog::Error("执行语句失败:" + strSql);
  694. break;
  695. }
  696. stmt.BindCharCol(1, memiidx, sizeof(memiidx));
  697. stmt.BindIntCol(2, &ms);
  698. stmt.BindTimeStampCol(3, &ts);
  699. stmt.BindIntCol(4, &data[0]);
  700. stmt.BindIntCol(5, &data[1]);
  701. stmt.BindIntCol(6, &data[2]);
  702. stmt.BindIntCol(7, &data[3]);
  703. stmt.BindIntCol(8, &data[4]);
  704. do
  705. {
  706. if (stmt.FetchNext() != 0) break;
  707. auto p = mapQueryItem.find(memiidx);
  708. if (p != mapQueryItem.end())
  709. {
  710. string name1, name2, name3;
  711. CMonitorObjectMng::Instance()->GetNameByMoMp(p->second.id, name1, name2, name3);
  712. bool bZeroFix = false;
  713. if (name1 == "定位")
  714. bZeroFix = true;
  715. DWORD dwTime = CovertData(ts) / 1000;
  716. for (auto wAcqTypeID : p->second.setAcqTypeID)
  717. {
  718. auto& itNode = mapData[MAKELONG(p->second.wNodeID, wAcqTypeID)];
  719. if (itNode.vctAcqData.empty())
  720. itNode.dwStartTime = dwTime;
  721. WORD wOffsetTime = WORD(dwTime - itNode.dwStartTime);
  722. //一分钟一个点
  723. //if (itNode.vctAcqData.empty() || wOffsetTime - itNode.vctAcqData.rbegin()->first > 60)
  724. {
  725. auto& it = itNode.vctAcqData;
  726. switch ((AcqTypeCode)wAcqTypeID)
  727. {
  728. case AcqTypeCode::eAcqTypeCode_0x101:
  729. it.emplace_back(make_pair(wOffsetTime, bZeroFix ? data[0] : data[1]));
  730. break;
  731. case AcqTypeCode::eAcqTypeCode_0x102:
  732. it.emplace_back(make_pair(wOffsetTime, bZeroFix ? data[1] : data[0]));
  733. break;
  734. case AcqTypeCode::eAcqTypeCode_0x103:
  735. it.emplace_back(make_pair(wOffsetTime, data[2]));
  736. break;
  737. case AcqTypeCode::eAcqTypeCode_0x104:
  738. it.emplace_back(make_pair(wOffsetTime, data[3]));
  739. break;
  740. case AcqTypeCode::eAcqTypeCode_0x105:
  741. it.emplace_back(make_pair(wOffsetTime, data[4]));
  742. break;
  743. default:
  744. break;
  745. }
  746. }
  747. }
  748. }
  749. } while (true);
  750. stmt.Close();
  751. }
  752. }
  753. bRet = true;
  754. } while (false);
  755. C315CommData CommData;
  756. CCSM315Protocol::DataSerialize((BYTE)ePortocol, mapData, CommData);
  757. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());
  758. return bRet;
  759. }
  760. bool C315TCPClient::QueryHistoryCurve(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurve* pCurve, int nDataSize)
  761. {
  762. bool bRet = false;
  763. std::map<time_t, int> vctData0;
  764. std::map<time_t, int> vctData1;
  765. std::map<time_t, int> vctData2;
  766. eDaoChaPosi posi;
  767. do
  768. {
  769. if (nDataSize != sizeof(stQueryHisCurve)) break;
  770. auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pCurve->wNodeID);
  771. if (!p || p->type != "mo.mp") break;
  772. string imei;
  773. int idx;
  774. if (!CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei, idx))
  775. {
  776. break;
  777. }
  778. CTime tStart(pCurve->time);
  779. CTime tEnd;
  780. CString strSql;
  781. {
  782. 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"));
  783. COdbcStatement stmt;
  784. if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))
  785. {
  786. CSimpleLog::Error("执行语句失败:" + strSql);
  787. break;
  788. }
  789. TIMESTAMP_STRUCT ts;
  790. ts.year = 0;
  791. stmt.BindTimeStampCol(1, &ts);
  792. stmt.BindTinyIntCol(2, (BYTE*)&posi);
  793. do
  794. {
  795. if (stmt.FetchNext() != 0) break;
  796. } while (false);
  797. stmt.Close();
  798. if(ts.year == 0) break;
  799. tEnd = CTime(CovertData(ts) / 1000);
  800. }
  801. string strStart, strEnd;
  802. strStart = tStart.Format("%Y-%m-%d %H:%M:%S.000");
  803. CTime dateStart(tStart.GetYear(), tStart.GetMonth(), tStart.GetDay(), 0, 0, 0);
  804. strEnd = tEnd.Format("%Y-%m-%d %H:%M:%S.999");
  805. CTime dateEnd(tEnd.GetYear(), tEnd.GetMonth(), tEnd.GetDay(), 23, 59, 59);
  806. //std::map<string, DWORD> mapImeiRelat;
  807. //std::string strImeiGroup;
  808. //for (WORD i = 0; i < pCurve->cnt; i++)
  809. //{
  810. // auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].acqTypeID);
  811. // if (!p || p->type != "mo.mp") continue;
  812. // string imei;
  813. // if (CMonitorObjectMng::Instance()->MOMP2IMEI(p->id, imei))
  814. // {
  815. // mapImeiRelat[imei] = pItem[i].acqTypeID;
  816. // strImeiGroup += "\"" + imei + "\",";
  817. // }
  818. //}
  819. ////删除最后一个逗号
  820. //if (!strImeiGroup.empty())
  821. //{
  822. // strImeiGroup.pop_back();
  823. //}
  824. string strFormat = fmt::format("SELECT acquisitiontime, [data0],[data1],[data2] FROM [dbo].[rm_resistance_%s] WHERE [IMEI] = '{}' AND idx = {} AND \
  825. [acquisitiontime] BETWEEN '{}' AND '{}' ORDER BY acquisitiontime", imei, idx, strStart, strEnd);
  826. CString sql;
  827. TIMESTAMP_STRUCT ts;
  828. for (auto t = dateStart; t <= dateEnd; t += CTimeSpan(1, 0, 0, 0))
  829. {
  830. sql.Format(strFormat.c_str(), (LPCSTR)t.Format("%Y%m%d"));
  831. COdbcStatement stmt;
  832. if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))
  833. {
  834. CSimpleLog::Error("执行语句失败:" + sql);
  835. continue;
  836. }
  837. //strSql.Format("SELECT [idx], datepart(ms, [acquisitiontime]) AS ms, [data0],[data1],[data2] FROM [dbo].[rm_resistance_%s] WHERE [IMEI] = '%s' AND \
  838. // CONVERT(varchar(100), [acquisitiontime], 120) = '%s' order by ms", (LPCSTR)tStart.Format("%Y%m%d"), (LPCSTR)tStart.Format("%Y-%m-%d %H:%M:%S"));
  839. //COdbcStatement stmt;
  840. //if (!CDBConnectPool::Instance()->DBQuery(stmt, strSql))
  841. //{
  842. // CSimpleLog::Error("执行语句失败:" + strSql);
  843. // break;
  844. //}
  845. int nCol = 1;
  846. //int idx = 1;
  847. TIMESTAMP_STRUCT ts;
  848. int data[3];
  849. //stmt.BindIntCol(nCol++, &idx);
  850. stmt.BindTimeStampCol(nCol++, &ts);
  851. stmt.BindIntCol(nCol++, &data[0]);
  852. stmt.BindIntCol(nCol++, &data[1]);
  853. stmt.BindIntCol(nCol++, &data[2]);
  854. do
  855. {
  856. if (stmt.FetchNext() != 0) break;
  857. time_t dwTime = CovertData(ts);
  858. vctData0[dwTime] = data[0];
  859. vctData1[dwTime] = data[1];
  860. vctData2[dwTime] = data[2];
  861. } while (true);
  862. stmt.Close();
  863. }
  864. bRet = true;
  865. } while (false);
  866. SendCurveData(pCurve->wNodeID, posi, 1, false, vctData0.begin(), vctData0.end(), vctData1.begin(), vctData1.end(), vctData2.begin(), vctData2.end(), pCurve->time);
  867. return bRet;
  868. }
  869. bool C315TCPClient::QueryHistoryCurveList(E_315_PROTOCOL_TYPE ePortocol, stQueryHisCurveList* pCurve, int nDataSize)
  870. {
  871. bool bRet = false;
  872. std::map<WORD, std::vector<DWORD>> mapData;
  873. do
  874. {
  875. if (nDataSize != sizeof(stQueryHisCurveList) + pCurve->cnt * sizeof(StNodeAcqCfg))
  876. {
  877. break;
  878. }
  879. StNodeAcqCfg* pItem = (StNodeAcqCfg*)pCurve->lpinfo;
  880. string strStart, strEnd;
  881. CTime t(pCurve->starttime);
  882. strStart = t.Format("%Y-%m-%d %H:%M:%S.000");
  883. //CTime dateStart(t.GetYear(), t.GetMonth(), t.GetDay(), 0, 0, 0);
  884. int dateStart = t.GetYear() * 12 + (t.GetMonth() - 1);
  885. t = CTime(pCurve->endtime);
  886. strEnd = t.Format("%Y-%m-%d %H:%M:%S.999");
  887. //CTime dateEnd(t.GetYear(), t.GetMonth(), t.GetDay(), 23, 59, 59);
  888. int dateEnd = t.GetYear() * 12 + (t.GetMonth() - 1);
  889. std::map<string, DWORD> mapMOMPRelat;
  890. //std::string strImeiGroup;
  891. std::string strMoMpGroup;
  892. for (WORD i = 0; i < pCurve->cnt; i++)
  893. {
  894. auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pItem[i].acqTypeID);
  895. if (!p || p->type != "mo.mp") continue;
  896. mapMOMPRelat[p->id] = pItem[i].acqTypeID;
  897. strMoMpGroup += "'" + p->id + "',";
  898. }
  899. //删除最后一个逗号
  900. if (!strMoMpGroup.empty())
  901. {
  902. strMoMpGroup.pop_back();
  903. }
  904. string strFormat = fmt::format("SELECT mo+'.'+mp, start_time, end_time FROM [dbo].[rm_move_%04d%02d] WHERE (mo+'.'+mp) in ({}) AND \
  905. [start_time] BETWEEN '{}' AND '{}' AND [type] <> 2 order by start_time", strMoMpGroup, strStart, strEnd);
  906. CString sql;
  907. TIMESTAMP_STRUCT ts1, ts2;
  908. char momp[51];
  909. int nMonthID = -1;
  910. for (auto t = dateStart; t <= dateEnd; t++)
  911. {
  912. sql.Format(strFormat.c_str(), t / 12, (t % 12) + 1);
  913. COdbcStatement stmt;
  914. if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))
  915. {
  916. CSimpleLog::Error("执行语句失败:" + sql);
  917. }
  918. else
  919. {
  920. int nCol = 1;
  921. stmt.BindCharCol(nCol++, momp, sizeof(momp));
  922. stmt.BindTimeStampCol(nCol++, &ts1);
  923. stmt.BindTimeStampCol(nCol++, &ts2);
  924. do
  925. {
  926. if (stmt.FetchNext() != 0) break;
  927. mapData[mapMOMPRelat[momp]].emplace_back(CovertData(ts1) / 1000);
  928. } while (true);
  929. stmt.Close();
  930. }
  931. }
  932. bRet = true;
  933. } while (false);
  934. C315CommData CommData;
  935. CCSM315Protocol::DataSerialize((BYTE)ePortocol, mapData, CommData);
  936. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());
  937. return bRet;
  938. }
  939. bool C315TCPClient::QueryHistoryAlarm(E_315_PROTOCOL_TYPE ePortocol, stQueryAlarm* pAlarm, int nDataSize)
  940. {
  941. bool bRet = false;
  942. std::vector<stAlarmItem> vctAlarm;
  943. do
  944. {
  945. if (nDataSize != sizeof(stQueryAlarm)) break;
  946. CString strCont;
  947. if (pAlarm->wNodeID != 0xFFFF)
  948. {
  949. auto p = CMonitorObjectMng::Instance()->GetTreeByEpqID(pAlarm->wNodeID);
  950. if (p)
  951. {
  952. strCont.Format(" AND mo + '.' + mp = '%s' ", p->id.c_str());
  953. }
  954. else break;
  955. }
  956. if (pAlarm->wAlarmType != 0xFFFF) break;//暂时不支持单项查询
  957. //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] \
  958. // WHERE occur_time BETWEEN '{0}' AND '{1}' {2} AND ([type] = {3} OR {3} = 0xFFFF)",
  959. // (LPCSTR)(CTime(pAlarm->starttime).Format("%Y-%m-%d %H:%M:%S")), (LPCSTR)(CTime(pAlarm->endtime).Format("%Y-%m-%d %H:%M:%S")),
  960. // (LPCSTR)strCont, pAlarm->wAlarmType).c_str();
  961. CString sql = fmt::format("SELECT [mo],[mp],[no],[type],[occur_time],[val],[recovery_time],level,posi,loworhigh,referval,[sunroof] FROM [rm_alarm] \
  962. WHERE occur_time BETWEEN '{0}' AND '{1}' {2}",
  963. (LPCSTR)(CTime(pAlarm->starttime).Format("%Y-%m-%d %H:%M:%S")), (LPCSTR)(CTime(pAlarm->endtime).Format("%Y-%m-%d %H:%M:%S")),
  964. (LPCSTR)strCont).c_str();
  965. COdbcStatement stmt;
  966. if (!CDBConnectPool::Instance()->DBQuery(stmt, sql))
  967. {
  968. CSimpleLog::Error("执行语句失败" + sql);
  969. break;
  970. }
  971. char mo[51], mp[51]/*, desc[200], suggest[200], event_id[37] = { 0 }, rel_id[37] = { 0 }*/;
  972. uint8_t no, type, level,sunroof;
  973. int posi;
  974. BYTE cbParam;
  975. int val;
  976. int referval;
  977. TIMESTAMP_STRUCT ts, rts;
  978. int nCol = 1;
  979. stmt.BindCharCol(nCol++, mo, sizeof(mo));
  980. stmt.BindCharCol(nCol++, mp, sizeof(mp));
  981. stmt.BindTinyIntCol(nCol++, &no);
  982. stmt.BindTinyIntCol(nCol++, &type);
  983. stmt.BindTimeStampCol(nCol++, &ts);
  984. //stmt.BindTinyIntCol(nCol++, &level);
  985. //stmt.BindCharCol(nCol++, desc, sizeof(desc));
  986. //stmt.BindCharCol(nCol++, suggest, sizeof(suggest));
  987. stmt.BindIntCol(nCol++, &val);
  988. stmt.BindTimeStampCol(nCol++, &rts);
  989. stmt.BindTinyIntCol(nCol++, &level);
  990. stmt.BindIntCol(nCol++, &posi);
  991. stmt.BindTinyIntCol(nCol++, &cbParam);
  992. stmt.BindIntCol(nCol++, &referval);
  993. stmt.BindTinyIntCol(nCol++, &sunroof);
  994. //stmt.BindCharCol(nCol++, event_id, 36);
  995. //stmt.BindCharCol(nCol++, rel_id, 36);
  996. do
  997. {
  998. if (stmt.FetchNext() != 0) break;
  999. stAlarmItem it = {0};
  1000. it.wNodeID = CMonitorObjectMng::Instance()->GetZZJNO(fmt::format("{}.{}", mo, mp));
  1001. it.time = CovertData(ts) / 1000;
  1002. if (rts.year <= 2000)
  1003. {
  1004. it.dwRestoreTime = 0;
  1005. it.byAlarmType = 1;
  1006. }
  1007. else
  1008. {
  1009. it.dwRestoreTime = CovertData(rts) / 1000;
  1010. it.byAlarmType = 2;
  1011. }
  1012. eZL_ALARMTYPE eType = (eZL_ALARMTYPE)type;
  1013. it.wAlarmType = Get315AlarmID(eType, (eDaoChaPosi)posi, level, (eLowHigh)cbParam);
  1014. if (eType == eZL_ALARMTYPE::CONVERT_LIMIT || eType == eZL_ALARMTYPE::SUOBI_LOCK_LIMIT)
  1015. {
  1016. memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_MOVEING), 3);
  1017. memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_MOVEING), 3);
  1018. }
  1019. else if (eType == eZL_ALARMTYPE::RETENSION_FORCE)
  1020. {
  1021. memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_POLL), 3);
  1022. memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_POLL), 3);
  1023. }
  1024. else if (eType == eZL_ALARMTYPE::SENSOR_ABNORMAL || eType == eZL_ALARMTYPE::EQUIP_OFFLINE)
  1025. {
  1026. memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(INT_MIN), 3);
  1027. memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(INT_MIN), 3);
  1028. }
  1029. else if (eType == eZL_ALARMTYPE::MAX_OVER_LIMIT)
  1030. {
  1031. memcpy(&it.sAlarmValue, &TIEDA_ACQ_VALUE(val, TIEDA_VAL_STATE::TVS_MOVEING), 3);
  1032. memcpy(&it.sRefValue, &TIEDA_ACQ_VALUE(referval, TIEDA_VAL_STATE::TVS_MOVEING), 3);
  1033. }
  1034. else
  1035. ASSERT(0);
  1036. vctAlarm.push_back(it);
  1037. } while (true);
  1038. stmt.Close();
  1039. bRet = true;
  1040. } while (false);
  1041. CSimpleLog::Info(("[315]一共加载(" + to_string(vctAlarm.size()) + ")条报警").c_str());
  1042. int packno = GetPackageID();
  1043. C315CommData CommData;
  1044. CCSM315Protocol::DataSerialize((BYTE)ePortocol, false, packno, vctAlarm, CommData);
  1045. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, packno);
  1046. return bRet;
  1047. }
  1048. WORD C315TCPClient::Get315AlarmID(eZL_ALARMTYPE cbAlarmType, eDaoChaPosi posi, uint8_t level, eLowHigh cbAlarmParam)
  1049. {
  1050. switch (cbAlarmType)
  1051. {
  1052. case eZL_ALARMTYPE::MAX_OVER_LIMIT:
  1053. //if (posi == eDaoChaPosi::DCP_FIX) return 0x101;
  1054. //else if (posi == eDaoChaPosi::DCP_INVERT) return 0x102; //超限作为锁闭力转换力上报 2024年5月4日
  1055. if (posi == eDaoChaPosi::DCP_FIX)
  1056. {
  1057. if (level == 1) return 0x108;//报警
  1058. else return 0x107; //预警
  1059. }
  1060. else if (posi == eDaoChaPosi::DCP_INVERT)
  1061. {
  1062. if (level == 1) return 0x110;//报警
  1063. else return 0x109; //预警
  1064. }
  1065. else if (posi == eDaoChaPosi::DCP_FIX2INVERT)
  1066. {
  1067. if (level == 1) return 0x112;
  1068. else return 0x111;
  1069. }
  1070. else if (posi == eDaoChaPosi::DCP_INVERT2FIX)
  1071. {
  1072. if (level == 1) return 0x114;
  1073. else return 0x113;
  1074. }
  1075. break;
  1076. case eZL_ALARMTYPE::FRICTION_OVER_LIMIT:
  1077. break;
  1078. case eZL_ALARMTYPE::SUOBI_LOCK_LIMIT:
  1079. if (posi == eDaoChaPosi::DCP_FIX)
  1080. {
  1081. if (cbAlarmParam == eLowHigh::LH_LOW)//0:最小值 1:最大值
  1082. {
  1083. if (level == 1) return 0x104;
  1084. else return 0x103;
  1085. }
  1086. else
  1087. {
  1088. if (level == 1) return 0x108;//报警
  1089. else return 0x107; //预警
  1090. }
  1091. }
  1092. else if (posi == eDaoChaPosi::DCP_INVERT)
  1093. {
  1094. if (cbAlarmParam == eLowHigh::LH_LOW)//0:最小值 1:最大值
  1095. {
  1096. if (level == 1) return 0x106;
  1097. else return 0x105;
  1098. }
  1099. else
  1100. {
  1101. if (level == 1) return 0x110;//报警
  1102. else return 0x109; //预警
  1103. }
  1104. }
  1105. break;
  1106. case eZL_ALARMTYPE::CONVERT_LIMIT:
  1107. if (posi == eDaoChaPosi::DCP_FIX2INVERT)
  1108. {
  1109. if (level == 1) return 0x112;
  1110. else return 0x111;
  1111. }
  1112. else if (posi == eDaoChaPosi::DCP_INVERT2FIX)
  1113. {
  1114. if (level == 1) return 0x114;
  1115. else return 0x113;
  1116. }
  1117. break;
  1118. case eZL_ALARMTYPE::EQUIP_OFFLINE:
  1119. return 0x117;
  1120. break;
  1121. case eZL_ALARMTYPE::SENSOR_ABNORMAL:
  1122. break;
  1123. case eZL_ALARMTYPE::RETENSION_FORCE:
  1124. if (posi == eDaoChaPosi::DCP_FIX)
  1125. return 0x115;
  1126. else if (posi == eDaoChaPosi::DCP_INVERT)
  1127. return 0x116;
  1128. break;
  1129. default:
  1130. break;
  1131. }
  1132. return 0;
  1133. }
  1134. void C315TCPClient::SendAlarmData(WORD wNodeID, BYTE cbAlarmStatus, DWORD dwTime, DWORD dwRestoreTime, eZL_ALARMTYPE cbAlarmType,
  1135. eDaoChaPosi posi, uint8_t level, eLowHigh cbAlarmParam, TIEDA_ACQ_VALUE& val, TIEDA_ACQ_VALUE& refVal, WORD wSuggestID)
  1136. {
  1137. if (g_b315 == false) return;
  1138. std::vector<stAlarmItem> vctAlarm;
  1139. stAlarmItem it = { 0 };
  1140. it.wNodeID = wNodeID;
  1141. it.time = dwTime;
  1142. if (cbAlarmStatus == 1)
  1143. {
  1144. it.dwRestoreTime = 0;
  1145. it.byAlarmType = 1;
  1146. }
  1147. else
  1148. {
  1149. it.dwRestoreTime = dwRestoreTime;
  1150. it.byAlarmType = 2;
  1151. }
  1152. it.wAlarmType = Get315AlarmID(cbAlarmType, posi, level, cbAlarmParam);
  1153. if (it.wAlarmType == 0)
  1154. return;
  1155. memcpy(&it.sAlarmValue, &val, 3);
  1156. memcpy(&it.sRefValue, &refVal, 3);
  1157. it.wSuggestID = wSuggestID;
  1158. vctAlarm.push_back(it);
  1159. int no = GetPackageID();
  1160. C315CommData CommData;
  1161. auto ePortocol = E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x53;
  1162. CCSM315Protocol::DataSerialize((BYTE)ePortocol, true, no, vctAlarm, CommData);
  1163. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, no);
  1164. }
  1165. void C315TCPClient::SendClientConfig(E_315_PROTOCOL_TYPE ePortocol)
  1166. {
  1167. //1. 递归m_treeroot 取到 mo.mp no name
  1168. //2. mo.mp 转 imei m_mapMoMpImeiIdx,如果找不到 imei , 则说明无绑定信息 无测力 无温湿度
  1169. //3. 利用imei 找到 cdevie CDevice* Find(std::string imei);
  1170. //4. 如果找到设备, 说明有定位测力 反位测力 转换测力 bool m_bHaveTemp = false; bool m_bHaveHumi = false;
  1171. vector<NodeConfig> vecConfig;
  1172. std::vector<CMonitorObject*> vctObj;
  1173. if (CMonitorObjectMng::Instance()->GetAllObjByType(vctObj, "mo.mp"))
  1174. {
  1175. for (auto &zzj : vctObj)
  1176. {
  1177. //mo.mp
  1178. string imei; int idx;
  1179. if (CMonitorObjectMng::Instance()->MOMP2IMEI(zzj->id, imei, idx))
  1180. {
  1181. auto pDevice = CDeviceMng::Instance()->Find(imei);
  1182. if(pDevice)
  1183. {
  1184. NodeConfig n;
  1185. n.strNodeName = zzj->name.c_str();
  1186. n.wNodeID = zzj->eqpno;
  1187. n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x101);
  1188. n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x102);
  1189. n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x103);
  1190. if (pDevice->IsHaveTemp()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);
  1191. if (pDevice->IsHaveHumi()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);
  1192. vecConfig.emplace_back(n);
  1193. }
  1194. }
  1195. }
  1196. }
  1197. C315CommData CommData;
  1198. CCSM315Protocol::DataSerialize((BYTE)ePortocol, vecConfig, CommData);
  1199. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());
  1200. }
  1201. void C315TCPClient::SendRealDataValue(E_315_PROTOCOL_TYPE ePortocol)
  1202. {
  1203. vector<NodeRealData> vecConfig;
  1204. //auto pMap = CMonitorObjectMng::Instance()->GetImeiIdxMoMp();
  1205. //for (auto &it : *pMap)
  1206. //{
  1207. // auto pDevice = CDeviceMng::Instance()->Insert(it.first);
  1208. // auto p = CMonitorObjectMng::Instance()->GetTreeByID(it.second);
  1209. // if (!p || p->type != "mo.mp") continue;
  1210. //vector<NodeConfig> vecConfig;
  1211. std::vector<CMonitorObject*> vctObj;
  1212. if (CMonitorObjectMng::Instance()->GetAllObjByType(vctObj, "mo.mp"))
  1213. {
  1214. for (auto& zzj : vctObj)
  1215. {
  1216. //mo.mp
  1217. string imei;
  1218. int idx;
  1219. if (CMonitorObjectMng::Instance()->MOMP2IMEI(zzj->id, imei, idx))
  1220. {
  1221. auto pDevice = CDeviceMng::Instance()->Find(imei);
  1222. if (pDevice)
  1223. {
  1224. auto epos = CMonitorObjectMng::Instance()->GetZZJEPOS(zzj->id);
  1225. NodeRealData n;
  1226. n.wNodeID = zzj->eqpno;
  1227. int nData[5] = { INT_MIN, INT_MIN, INT_MIN, pDevice->m_nTemperature, pDevice->m_nHumidity };
  1228. n.vecAcqTypeID.assign({ (WORD)AcqTypeCode::eAcqTypeCode_0x101,(WORD)AcqTypeCode::eAcqTypeCode_0x102,(WORD)AcqTypeCode::eAcqTypeCode_0x103 });
  1229. if (pDevice->IsHaveTemp()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);
  1230. if (pDevice->IsHaveHumi()) n.vecAcqTypeID.push_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);
  1231. lock_guard<mutex> lock(pDevice->m_mtx);
  1232. if (pDevice->m_tmMoveDetectTime1 > pDevice->m_tmMoveDetectTime2 && pDevice->m_tmMoveDetectTime1 > pDevice->m_tmMoveDetectTime0)
  1233. {
  1234. nData[0] = pDevice->map_resist_idx10.rbegin()->second;
  1235. nData[1] = pDevice->map_resist_idx11.rbegin()->second;
  1236. nData[2] = pDevice->map_resist_idx12.rbegin()->second;
  1237. n.dwAcqTime = pDevice->m_tmMoveDetectTime1;
  1238. }
  1239. else if (pDevice->m_tmMoveDetectTime0 > pDevice->m_tmMoveDetectTime2 && pDevice->m_tmMoveDetectTime0 > pDevice->m_tmMoveDetectTime1)
  1240. {
  1241. nData[0] = pDevice->map_resist_idx00.rbegin()->second;
  1242. nData[1] = pDevice->map_resist_idx01.rbegin()->second;
  1243. nData[2] = pDevice->map_resist_idx02.rbegin()->second;
  1244. n.dwAcqTime = pDevice->m_tmMoveDetectTime0;
  1245. }
  1246. else if (pDevice->m_tmMoveDetectTime2 > pDevice->m_tmMoveDetectTime1 && pDevice->m_tmMoveDetectTime2 > pDevice->m_tmMoveDetectTime0)
  1247. {
  1248. nData[0] = pDevice->map_resist_idx20.rbegin()->second;
  1249. nData[1] = pDevice->map_resist_idx21.rbegin()->second;
  1250. nData[2] = pDevice->map_resist_idx22.rbegin()->second;
  1251. n.dwAcqTime = pDevice->m_tmMoveDetectTime2;
  1252. }
  1253. string name1, name2, name3;
  1254. CMonitorObjectMng::Instance()->GetNameByMoMp(zzj->id, name1, name2, name3);
  1255. if (name1 == "反位")
  1256. {
  1257. swap(nData[0], nData[1]);
  1258. }
  1259. n.byFixInvert = 2;
  1260. if (epos == DAOCHA_POSITION::MP_FIX) n.byFixInvert = 0;
  1261. else if (epos == DAOCHA_POSITION::MP_INVERT) n.byFixInvert = 1;
  1262. n.vecStatus.assign({ 1,1,1,1,1 });
  1263. n.vecAcqData.assign(nData, nData + 5);
  1264. vecConfig.emplace_back(n);
  1265. }
  1266. }
  1267. }
  1268. }
  1269. C315CommData CommData;
  1270. CCSM315Protocol::DataSerialize((BYTE)ePortocol, vecConfig, CommData);
  1271. Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, GetPackageID());
  1272. }
  1273. //
  1274. //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)
  1275. //{
  1276. // C315CommData CommData;
  1277. // int no = GetPackageID();
  1278. // CCSM315Protocol::DataSerialize((BYTE)ePortocol, bPush, no, eqpno, num, vctData0, vctData1, vctData2, atime, CommData);
  1279. //
  1280. // Insert(CommData.GetData(), CommData.GetDataSize(), ePortocol, no, bPush);
  1281. //}
  1282. //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)
  1283. //{
  1284. // auto p = CMonitorObjectMng::Instance()->GetTreeByID(mo_mp);
  1285. // if (!p || p->type != "mo.mp") return;
  1286. // auto pup = CMonitorObjectMng::Instance()->GetTreeByID(p->up);
  1287. // if (!pup || pup->type != "station") return;
  1288. //
  1289. // //SendCurveData(E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, p->eqpno, num, bPush, vctData0, vctData1, vctData2, atime.GetTime());
  1290. //
  1291. // C315CommData CommData;
  1292. // int no = GetPackageID();
  1293. // CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, bPush, no, eqpno, num, vctData0, vctData1, vctData2, atime, CommData);
  1294. //
  1295. // Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);
  1296. //
  1297. //}
  1298. void C315TCPClient::SendCurveData(WORD wEqpNO, eDaoChaPosi posi, const int num, bool bPush,
  1299. const MapTimeIntItor& map00, const MapTimeIntItor& map01,
  1300. const MapTimeIntItor& map10, const MapTimeIntItor& map11,
  1301. const MapTimeIntItor& map20, const MapTimeIntItor& map21, time_t atime)
  1302. {
  1303. if (g_b315 == false) return;
  1304. //C315CommData CommData;
  1305. //int no = 0;
  1306. //if(bPush) no = GetPackageID();
  1307. //BYTE byFixOrNot = (posi == eDaoChaPosi::DCP_FIX2INVERT ? 0 : 1);
  1308. //CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, byFixOrNot, bPush, no, wEqpNO, num,
  1309. // map00, map01, map10, map11, map20, map21, atime, CommData);
  1310. //Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);
  1311. }
  1312. void C315TCPClient::SendCurveData(WORD wEqpNO, eDaoChaPosi posi, const int num, bool bPush, std::map<time_t, int>* mapData[],
  1313. time_t tmStartSecond, time_t tmEndSecond)
  1314. {
  1315. if (g_b315 == false) return;
  1316. C315CommData CommData;
  1317. int no = 0;
  1318. if (bPush) no = GetPackageID();
  1319. BYTE byFixOrNot = (posi == eDaoChaPosi::DCP_FIX2INVERT ? 0 : 1);
  1320. CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, byFixOrNot, bPush, no, wEqpNO, num,
  1321. mapData, tmStartSecond, tmEndSecond, CommData);
  1322. Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x57, no, bPush);
  1323. }
  1324. void C315TCPClient::SendRealDataValue(WORD wEqpNO, DAOCHA_POSITION byFixOrNot, bool bPush, int nFixData, int nInvertData, int nConvertData, int nTemp, int nHumi, const CTime& atime)
  1325. {
  1326. C315CommData CommData;
  1327. vector<WORD> vctAcq{ (WORD)AcqTypeCode::eAcqTypeCode_0x101,(WORD)AcqTypeCode::eAcqTypeCode_0x102,(WORD)AcqTypeCode::eAcqTypeCode_0x103};
  1328. vector<TIEDA_ACQ_VALUE> vctData;
  1329. vector<BYTE> vctStutas{ 1,1,1 };
  1330. vctData.emplace_back(nFixData, TIEDA_VAL_STATE::TVS_POLL);
  1331. vctData.emplace_back(nInvertData, TIEDA_VAL_STATE::TVS_POLL);
  1332. vctData.emplace_back(nConvertData, TIEDA_VAL_STATE::TVS_POLL);
  1333. if (nTemp != INT_MIN)
  1334. {
  1335. vctAcq.emplace_back((WORD)AcqTypeCode::eAcqTypeCode_0x104);
  1336. vctStutas.emplace_back(1);
  1337. vctData.emplace_back(nTemp, TIEDA_VAL_STATE::TVS_POLL, 3);
  1338. }
  1339. if (nHumi != INT_MIN)
  1340. {
  1341. vctAcq.emplace_back((WORD)AcqTypeCode::eAcqTypeCode_0x105);
  1342. vctStutas.emplace_back(1);
  1343. vctData.emplace_back(nHumi, TIEDA_VAL_STATE::TVS_POLL, 3);
  1344. }
  1345. BYTE cbPos = 2;
  1346. if (byFixOrNot == DAOCHA_POSITION::MP_FIX) cbPos = 0;
  1347. else if (byFixOrNot == DAOCHA_POSITION::MP_INVERT) cbPos = 1;
  1348. CCSM315Protocol::DataSerialize((BYTE)E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51, bPush, wEqpNO, cbPos, vctAcq, vctData, vctStutas, atime, CommData);
  1349. Insert(CommData.GetData(), CommData.GetDataSize(), E_315_PROTOCOL_TYPE::E_315_PROTOCOL_0x51, bPush ? GetPackageID() : 0, bPush);
  1350. }