LNHandle.h 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #pragma once
  2. #include <ProtocolHandler.h>
  3. #include <ODBC/DBConnectPool.h>
  4. #include <rapidjson/document.h>
  5. #include <rapidjson/stringbuffer.h>
  6. #include <rapidjson/reader.h>
  7. #include <rapidjson/writer.h>
  8. #include <string>
  9. #include <vector>
  10. #include <map>
  11. #include "LNContext.h"
  12. #include "AlarmDefine.h"
  13. #define ROW_ARRAY_SIZE 50
  14. typedef struct tagResistance
  15. {
  16. char imei[50];
  17. //TIMESTAMP_STRUCT time;
  18. char time[24];
  19. uint8_t index;
  20. int data0;
  21. int data1;
  22. int data2;
  23. }RESISTANCE, *LPRESISTANCE;
  24. struct tagHandlePack
  25. {
  26. private:
  27. ~tagHandlePack() {};
  28. public:
  29. LPBYTE pPack;
  30. int nPackLen;
  31. SOCKADDR psa = { 0 };
  32. CLNContext* pClientContext = nullptr;
  33. tagHandlePack(LPBYTE a, int b, SOCKADDR* c, CClientContext* d)
  34. {
  35. pPack = new BYTE[b];
  36. nPackLen = b;
  37. memcpy(pPack, a, b);
  38. if (c) memcpy(&psa, c, sizeof(SOCKADDR));
  39. if (d) pClientContext = (CLNContext*)d->GetSharedPointer(); //引用
  40. }
  41. void join()
  42. {
  43. if (pPack) delete[] pPack;
  44. nPackLen = 0;
  45. if (pClientContext) pClientContext->ReleaseSharedPointer(); //释放
  46. delete this;
  47. }
  48. };
  49. class CLNHandle
  50. :public CProtocolHandler
  51. {
  52. public:
  53. CLNHandle();
  54. virtual ~CLNHandle();
  55. virtual BOOL HandlePack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, void* pClientContext = NULL) override;
  56. virtual BOOL ProcessPack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, CLNContext* pClientContext);
  57. //发送升级需求给设备
  58. static int SendUpdateToDevice(const char* imei, string remote_addr, string type);
  59. //发送请求实时数据给设备
  60. static int SendMsgToDevice(const char* imei);
  61. BOOL SendTimeAckToAllDevice();
  62. protected:
  63. BOOL HandlePingPack(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  64. BOOL HandlePushMsg(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext, LPBYTE pPack, int nPackLen);
  65. //传入空指针, 外面需要释放
  66. uint32_t GeneralResistPack(const string& momp, const int num,
  67. const std::vector<int>& vctData0, const std::vector<int>& vctData1, const std::vector<int>& vctData2,
  68. const std::vector<bool>& vctResult, const CTime& atime, uint8_t** pack, int* len);
  69. uint32_t GeneralResistPack(const string& momp, int data0, int data1, int data2, string str_time, uint8_t** pack, int* len);
  70. uint32_t GeneralTempPack(const string& momp, int temp, int Humi, time_t utime_t, uint8_t** pack, int* len);
  71. BOOL HandlePushInfo(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  72. BOOL HandleInfoAck(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  73. BOOL HanldeTime(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  74. BOOL HandlePushOnline(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext, LPBYTE pPack, int nPackLen);
  75. //Web 客户端发送 tcp
  76. BOOL HandleUpdate(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  77. //Client
  78. BOOL HandleUpdateAck(const rapidjson::Document& doc, LPBYTE pPack, int nPackLen, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  79. //get onlineDevice
  80. BOOL HandleOnlineDevice(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  81. BOOL HandleOnlineDeviceNew(const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  82. BOOL HandleQueryMsgAck(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  83. //设备升级
  84. BOOL HandleUpdateInit(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  85. //请求数据
  86. BOOL HandleUpdateSeq(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  87. BOOL HandleUpdateOk(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
  88. //设备升级 end
  89. private:
  90. static string m_strUpgradeRemoteAddr;
  91. uint32_t convertStrToArray(const string& str, std::vector<CString>& lst);
  92. static inline uint32_t convertStrToArray(const string& str, std::vector<int>& lst)
  93. {
  94. // string->char *
  95. char* s_input = (char*)str.c_str();
  96. const char* split = ",";
  97. // 以逗号为分隔符拆分字符串
  98. char* p = strtok(s_input, split);
  99. int i = 0;
  100. while (p != NULL)
  101. {
  102. if (i < lst.capacity())
  103. {
  104. int l = strlen(p);
  105. if (l > 4)
  106. lst[i++] = strtol(p, NULL, 16) - 0x800000;
  107. else if (l == 4)
  108. lst[i++] = strtol(p, NULL, 16) - 0x8000;
  109. }
  110. p = strtok(NULL, split);
  111. }
  112. return i;
  113. }
  114. uint32_t convertStrToArraytest(const string& str, std::vector<int>& lst);
  115. //2020年6月22日09:30:04 新增压缩
  116. uint32_t compressArray(std::vector<CString>& vct1, std::vector<CString>& vct2, std::vector<CString>& vct3, uint32_t len, std::vector<bool>& result);
  117. static inline uint32_t compressArrayNew(IN std::vector<int>& vct1, IN std::vector<int>& vct2, IN std::vector<int>& vct3, OUT uint32_t len, std::vector<bool>& result,
  118. IN __time64_t tmStart, OUT tagSecondStatInfo& tSS1, OUT tagSecondStatInfo& tSS2, OUT tagSecondStatInfo& tSS3)
  119. {
  120. if (len == 0) return 0;
  121. int newlen = len;
  122. int per = 1000 / len;
  123. for (int i = 0; i < len; i++)
  124. {
  125. const auto a = vct1[i];
  126. const auto b = vct2[i];
  127. const auto c = vct3[i];
  128. if (a < -INVLID_VAL || a > INVLID_VAL)
  129. {
  130. result[i] = false;
  131. vct1[i] = INVLID_VAL;
  132. }
  133. if (b < -INVLID_VAL || b > INVLID_VAL)
  134. {
  135. result[i] = false;
  136. vct2[i] = INVLID_VAL;
  137. }
  138. if (c < -INVLID_VAL || c > INVLID_VAL)
  139. {
  140. result[i] = false;
  141. vct3[i] = INVLID_VAL;
  142. }
  143. if (result[i] == false)
  144. {
  145. newlen--;
  146. continue;
  147. }
  148. if (tSS1.first_val == INT_MIN) tSS1.first_val = a; //存储第一个值
  149. if (tSS2.first_val == INT_MIN) tSS2.first_val = b;
  150. if (tSS3.first_val == INT_MIN) tSS3.first_val = c;
  151. if (a > tSS1.max_val)
  152. {
  153. tSS1.max_val = a;
  154. tSS1.max_time = tmStart + i * per;
  155. }
  156. if (b > tSS2.max_val)
  157. {
  158. tSS2.max_val = b;
  159. tSS2.max_time = tmStart + i * per;
  160. }
  161. if (c > tSS3.max_val)
  162. {
  163. tSS3.max_val = c;
  164. tSS3.max_time = tmStart + i * per;
  165. }
  166. if (a < tSS1.min_val)
  167. {
  168. tSS1.min_val = a;
  169. tSS1.min_time = tmStart + i * per;
  170. }
  171. if (b < tSS2.min_val)
  172. {
  173. tSS2.min_val = b;
  174. tSS2.min_time = tmStart + i * per;
  175. }
  176. if (c < tSS3.min_val)
  177. {
  178. tSS3.min_val = c;
  179. tSS3.min_time = tmStart + i * per;
  180. }
  181. tSS1.sum_val += a;
  182. tSS1.cout++;
  183. tSS1.end_val = a;
  184. tSS2.sum_val += b;
  185. tSS2.cout++;
  186. tSS2.end_val = b;
  187. tSS3.sum_val += c;
  188. tSS3.cout++;
  189. tSS3.end_val = c;
  190. }
  191. if (tSS1.cout) tSS1.dif_val = abs(tSS1.max_val - tSS1.min_val);
  192. if (tSS2.cout) tSS2.dif_val = abs(tSS2.max_val - tSS2.min_val);
  193. if (tSS3.cout) tSS3.dif_val = abs(tSS3.max_val - tSS3.min_val);
  194. //无波动 存第一个值
  195. //TRACE("%s\r\n", fmt::format("dif 1:{} 2:{} 3:{}", tSS1.dif_val, tSS2.dif_val, tSS3.dif_val).c_str());
  196. if (tSS1.dif_val < 100 && tSS2.dif_val < 100 && tSS3.dif_val < 100)
  197. {
  198. tSS1.cout = 1;
  199. tSS2.cout = 1;
  200. tSS3.cout = 1;
  201. bool bVal = true;
  202. for (int i = 0; i < len; i++)
  203. {
  204. if (result[i])
  205. {
  206. result[i] = bVal;
  207. bVal = false;
  208. }
  209. }
  210. return 1;
  211. }
  212. return newlen;
  213. }
  214. static inline uint32_t compressArray(std::vector<int>& vct1, std::vector<int>& vct2, std::vector<int>& vct3, uint32_t len, std::vector<bool>& result)
  215. {
  216. int newlen = len;
  217. size_t i = 0;
  218. for (i; i < 2; i++)
  219. {
  220. if (abs(vct1[i]) > INVLID_VAL || abs(vct2[i]) > INVLID_VAL || abs(vct3[i]) > INVLID_VAL)
  221. {
  222. result[i] = false;
  223. newlen--;
  224. }
  225. }
  226. for (i; i < len; i++)
  227. {
  228. if (vct1[i - 2] == vct1[i - 1] && vct1[i - 1] == vct1[i] &&
  229. vct2[i - 2] == vct2[i - 1] && vct2[i - 1] == vct2[i] &&
  230. vct3[i - 2] == vct3[i - 1] && vct3[i - 1] == vct3[i])
  231. {
  232. result[i - 1] = false;
  233. newlen--;
  234. }
  235. else if (abs(vct1[i - 1]) > INVLID_VAL || abs(vct2[i - 1] > INVLID_VAL || abs(vct3[i - 1]) > INVLID_VAL))
  236. {
  237. result[i - 1] = false;
  238. newlen--;
  239. }
  240. }
  241. if (abs(vct1[i - 1]) > INVLID_VAL || abs(vct2[i - 1] > INVLID_VAL || abs(vct3[i - 1]) > INVLID_VAL))
  242. {
  243. result[i - 1] = false;
  244. newlen--;
  245. }
  246. return newlen;
  247. }
  248. static std::map<CString, COleDateTime> m_mapIMEI_time0;
  249. static std::map<CString, COleDateTime> m_mapIMEI_time3;
  250. static std::map<CString, COleDateTime> m_mapIMEI_time6;
  251. static std::map<CString, COleDateTime> m_mapIMEI_temp;
  252. std::map<string, time_t> m_mapTempHumi; //温湿度1分钟上送一次
  253. //缓冲
  254. std::list<tagHandlePack*> m_lst;
  255. std::mutex m_mtx;
  256. std::thread* m_pThread = nullptr;
  257. static void ThreadForHandle(DWORD_PTR);
  258. bool m_bWork = false;
  259. };