SuperHandler.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "stdafx.h"
  2. #include "SuperHandler.h"
  3. #include "LibEventTCPClient.h"
  4. #include <Simplelog.h>
  5. #include "AppService.h"
  6. #include <jsonxx.h>
  7. #include "MonitorObject.h"
  8. using namespace jsonxx;
  9. CSuperHandler::CSuperHandler()
  10. {
  11. }
  12. CSuperHandler::~CSuperHandler()
  13. {
  14. }
  15. BOOL CSuperHandler::HandlePack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, void* pClientContext /*= NULL*/)
  16. {
  17. auto pClient = (CLibEventTCPClient*)pClientContext;
  18. //解析
  19. if (!CHjDataConver::conver_recvpack(pPack, nPackLen))
  20. return FALSE;
  21. LPHJDATAHEAD2 lpHead = (LPHJDATAHEAD2)pPack;
  22. if (lpHead->protocol == E_ZL_PROTOCAL::ZL_KEEP)
  23. return TRUE;
  24. //SPDLOG_INFO("recv {}:{} : {}", m_strServerIP, m_nServerPort, CSimpleLog::GetHexString2(pPack, nPackLen));
  25. BOOL bRet = FALSE;
  26. switch (lpHead->protocol)
  27. {
  28. case E_ZL_PROTOCAL::ZL_MO:
  29. case E_ZL_PROTOCAL::ZL_MP:
  30. case E_ZL_PROTOCAL::ZL_RESIST_DATA:
  31. case E_ZL_PROTOCAL::ZL_RESIST_REAL:
  32. case E_ZL_PROTOCAL::ZL_TEMP_HUMI:
  33. case E_ZL_PROTOCAL::ZL_ALARM_SET:
  34. case E_ZL_PROTOCAL::ZL_ALARM_DATA:
  35. case E_ZL_PROTOCAL::ZL_ALARM_ACK:
  36. case E_ZL_PROTOCAL::ZL_ALARM_HANDLE:
  37. case E_ZL_PROTOCAL::ZL_SVG:
  38. case E_ZL_PROTOCAL::ZL_REFER:
  39. case E_ZL_PROTOCAL::ZL_MOVE:
  40. case E_ZL_PROTOCAL::ZL_ALARM_UNACK:
  41. bRet = RecvPack(lpHead->packno, lpHead->protocol); //发出确认包
  42. break;
  43. case E_ZL_PROTOCAL::DL_SUB_NOTIFY:
  44. HandleSubNotify(lpHead, (char*)pPack + sizeof(HJDATAHEAD2), lpHead->len);
  45. break;
  46. case E_ZL_PROTOCAL::DL_SYNC:
  47. CAppService::Instance()->SetSycnSuperTime();
  48. break;
  49. case E_ZL_PROTOCAL::DL_ALARM_ACK:
  50. case E_ZL_PROTOCAL::DL_ALARM_HANDLE:
  51. break;
  52. default:
  53. CSimpleLog::Warn(fmt::format("收到未实现的命令:{}", uint8_t(lpHead->protocol)).c_str());
  54. break;
  55. }
  56. return bRet;
  57. }
  58. BOOL CSuperHandler::RecvPack(uint32_t packno, E_ZL_PROTOCAL protocal)
  59. {
  60. m_pFather->recvcount++;
  61. //SPDLOG_INFO("recv 协议号:{} packno:{})", uint8_t(protocal), packno);
  62. std::lock_guard<std::mutex> lock(m_mtx);
  63. for (auto it = m_task.begin(); it != m_task.end(); it++)
  64. {
  65. auto p = *it;
  66. if (p->packno == packno && p->protocal == protocal)
  67. {
  68. m_task.erase(it);
  69. p->join();
  70. }
  71. return TRUE;
  72. }
  73. return FALSE;
  74. }
  75. BOOL CSuperHandler::HandleSubNotify(LPHJDATAHEAD2 lpHead, char* json, int json_len)
  76. {
  77. Object obj;
  78. obj.parse(string(json, json_len));
  79. if (obj.empty()) return FALSE;
  80. auto momp = obj.get<string>("momp");
  81. if (momp.empty()) return FALSE;
  82. string imei; int idx;
  83. CMonitorObjectMng::Instance()->MOMP2IMEI(momp, imei, idx);
  84. return CAppService::Instance()->GetHandle()->SendMsgToDevice(imei.c_str());
  85. }
  86. BOOL CSuperHandler::ReSend()
  87. {
  88. if (m_task.size() == 0) return TRUE;
  89. std::lock_guard<std::mutex> lock(m_mtx);
  90. if (m_task.size() > 0)
  91. {
  92. auto& it = m_task.front();
  93. auto ret = m_pClient->Insert(it->pdata, it->nlen);
  94. if (ret)
  95. {
  96. m_pFather->sendlen += it->nlen;
  97. m_pFather->sendcount++;
  98. }
  99. else
  100. m_pFather->sendfail++;
  101. return ret;
  102. }
  103. return FALSE;
  104. }
  105. bool CSuperHandler::Send(uint8_t* data, uint32_t len)
  106. {
  107. return m_pClient->Insert(data, len);
  108. }
  109. void CSuperHandler::Insert(LPBYTE pPack, int nPackLen, uint32_t packno, E_ZL_PROTOCAL protocal, bool r)
  110. {
  111. if (m_task.size() > 1000)
  112. SPDLOG_WARN("待发送数据队列异常:{}", m_task.size());
  113. //if (nPackLen > 1500) SPDLOG_INFO("send e packno:{})", packno);
  114. auto ret = m_pClient->Insert(pPack, nPackLen);
  115. if (ret == false)
  116. {
  117. m_pFather->sendfail++;
  118. SPDLOG_WARN("send fail. packno:{})", packno);
  119. }
  120. else
  121. {
  122. m_pFather->sendcount++;
  123. m_pFather->sendlen += nPackLen;
  124. }
  125. //加入队列并发送
  126. if (r || ret == false)
  127. {
  128. CSendTask* pTask = new CSendTask(pPack, nPackLen, packno, protocal, r);
  129. std::lock_guard<std::mutex> lock(m_mtx);
  130. m_task.emplace_back(pTask);
  131. if (m_task.size() > 1500)
  132. {
  133. auto it = m_task.front();
  134. m_task.pop_front();
  135. it->join();
  136. }
  137. }
  138. }