LWSServer.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #pragma once
  2. #include <thread>
  3. #include <HjDataDefine.h>
  4. #include <map>
  5. #include <mutex>
  6. #include <ReceiveBuffer.h>
  7. #include "libwebsockets.h"
  8. #include <rapidjson/stringbuffer.h>
  9. #include <rapidjson/writer.h>
  10. #include <rapidjson/pointer.h>
  11. #include <list>
  12. #include <vector>
  13. #define MAX_PAYLOAD_SIZE 20480
  14. extern time_t g_stStart;
  15. typedef struct tagHist_Query
  16. {
  17. lws* wsi = nullptr;
  18. time_t tmStart = 0;
  19. time_t tmEnd = 0;
  20. string imei;
  21. string mo_mp;
  22. short idx = 0;
  23. string type;
  24. }HISTORY_QUERY, *LPHISTORY_QUERY;
  25. /**
  26. * 会话上下文对象,结构根据需要自定义
  27. */
  28. struct per_session_data {
  29. lws* wsi = nullptr;
  30. lws_context* context = nullptr;
  31. //lws_protocols* protocol;
  32. uint32_t send_count = 0; //发送
  33. uint32_t send_fail_count = 0;
  34. uint32_t recv_count = 0; //接收
  35. uint64_t send_size = 0;
  36. uint64_t recv_size = 0;
  37. time_t tmConnect = 0; //链接时间
  38. time_t tmLastHeart = 0; //最后心跳时间
  39. char ip[32]; //链接的IP
  40. //char name[32]; //链接的主机名称
  41. uint16_t port = 0; //连接的端口
  42. uint16_t refer = 0; //引用数
  43. bool isLogin = false; //是否登录
  44. char token[38] = { 0 }; ; //登录的token
  45. char username[50] = { 0 }; //登录的用户名
  46. char node[50] = { 0 };
  47. //bool bin; //是否为二进制
  48. //bool fin; //是否为结束包
  49. std::list<std::string> m_lstSubReal; //订阅实时数据列表
  50. std::thread *thread_hist = nullptr; //历史数据发送线程
  51. bool bWork = false;
  52. bool bBlock = false; //历史数据包阻塞
  53. int SendHistResist(lws* wsi, string mo_mp, time_t start, time_t end, std::map<time_t, int>& data0, std::map<time_t, int>& data1, std::map<time_t, int>& data2);
  54. int SendHistResistForEcharts(lws* wsi, string mo_mp, time_t start, time_t end, std::map<time_t, int>& data0, std::map<time_t, int>& data1, std::map<time_t, int>& data2);
  55. int SendHistResistDB(LPHISTORY_QUERY);
  56. int SendHistResistDBForEcharts(LPHISTORY_QUERY);
  57. per_session_data()
  58. {
  59. memset(ip, 0, sizeof(ip));
  60. memset(token, 0, sizeof(token));
  61. memset(username, 0, sizeof(username));
  62. memset(node, 0, sizeof(node));
  63. }
  64. ~per_session_data()
  65. {
  66. bWork = false;
  67. if (thread_hist)
  68. {
  69. thread_hist->join();
  70. delete thread_hist;
  71. thread_hist = nullptr;
  72. }
  73. }
  74. };
  75. enum class LWS_SEND_PACK_TYPE
  76. {
  77. LSPT_UNKOWN = 0,
  78. LSPT_ALARM_EVENT,
  79. LSPT_TRAFFIC_FLOW,
  80. LSPT_PLATE_DETECT,
  81. LSPT_BOLT_DETECT,
  82. };
  83. class CLWSServer
  84. {
  85. public:
  86. CLWSServer();
  87. ~CLWSServer();
  88. public:
  89. friend class CLNHandle;
  90. BOOL Start(uint16_t port);
  91. void Stop();
  92. BOOL SendPackToALLClient(const uint8_t*, int len, LWS_SEND_PACK_TYPE type = LWS_SEND_PACK_TYPE::LSPT_UNKOWN, lws_write_protocol protocol = lws_write_protocol::LWS_WRITE_TEXT);
  93. BOOL SendPackToALLClient_with_noEncode(const uint8_t*, int len, LWS_SEND_PACK_TYPE type = LWS_SEND_PACK_TYPE::LSPT_UNKOWN, lws_write_protocol protocol = lws_write_protocol::LWS_WRITE_TEXT);
  94. int GetLwsSessionNum();
  95. void Establishe(lws*);
  96. void Close(lws*);
  97. void Destroy(lws*);
  98. void Recv(lws*, void* in, size_t len);
  99. void GetSessionDesc(std::map<DWORD_PTR, CString>& session_desc);
  100. CReceiveBuffer* GetBuffer() { return pBuffer; };
  101. static uint32_t FindJsonPack(const char * CH, uint32_t len);
  102. //协议处理
  103. int HandleLogin(lws*, rapidjson::Document&);
  104. int HandleSubNotify(lws*, rapidjson::Document&, std::string& imei_idx);
  105. int HanldeUnsubNotify(lws*, rapidjson::Document&);
  106. int HandleQueryHist(lws*, rapidjson::Document&);
  107. int HandleQueryHistConfirm(lws*, rapidjson::Document&);
  108. int HandleConfRead(lws*, rapidjson::Document&);
  109. int HandleConfWrite(lws*, rapidjson::Document&);
  110. //受理报警
  111. int HandleAlarmAck(lws*, rapidjson::Document&, std::string&, std::string&);
  112. //处理报警
  113. int HandleAlarmHandle(lws*, rapidjson::Document&, std::string&, std::string&, std::string&);
  114. //发送部分
  115. void SendRealResistData(const string& imei_idx, const int num, const std::vector<int>& vctData0,
  116. const std::vector<int>& vctData1, const std::vector<int>& vctData2, const std::vector<bool>& vctResult, const CTime& atime);
  117. void SendHumiTemp(const char* imei, const COleDateTime& dt, int humi, int temp);
  118. int SendUnAckAlarm(lws* wsi);
  119. bool GeneralResistData(const string mo_mp, const int num, const int index, const std::vector<int>& vctData0,
  120. const std::vector<int>& vctData1, const std::vector<int>& vctData2, const std::vector<bool>& vctResult, const CTime& atime, rapidjson::StringBuffer& strBuf);
  121. private:
  122. std::thread *m_pThread = nullptr;
  123. //数据接收缓冲区
  124. CReceiveBuffer* pBuffer = nullptr;
  125. bool m_work = false;
  126. static void ThreadProcForQueryHist(LPHISTORY_QUERY);
  127. static void ThreadProcForQueryHistDB(LPHISTORY_QUERY);
  128. static void ThreadProc(DWORD_PTR, uint16_t);
  129. //客户端链接
  130. std::map<lws*, per_session_data> m_mapLwsSession;
  131. std::mutex m_mtxSession;
  132. std::mutex m_mtxRecv;
  133. std::mutex m_mtxSend;
  134. };