| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 | 
							- #pragma once
 
- #include <mongoose.h>
 
- #include <thread>
 
- #include <string>
 
- #include <list>
 
- #include <yyjson.h>
 
- #include <map>
 
- #include <vector>
 
- #include "AlarmDefine.h"
 
- enum class VAL_STATUS : uint8_t
 
- {
 
- 	VAL_STEADY = 0x00, //稳定
 
- 	VAL_MOVE = 0x01, //波动
 
- 	VAL_UNKONW = 0x04, //未知
 
- };
 
- typedef struct tagMgHist_Query
 
- {
 
- 	uint32_t subsection = 5000;
 
- 	struct mg_connection* c = nullptr;
 
- 	time_t tmStart = 0;
 
- 	time_t tmEnd = 0;
 
- 	string imei;
 
- 	string mo_mp;
 
- 	short idx = 0;
 
- 	string type;
 
- }MG_HISTORY_QUERY, * LPMGHISTORY_QUERY;
 
- typedef struct tagConvertResist
 
- {
 
- 	time_t  time = 0; //报警时间
 
- 	int val = 0; //报警时阻力值
 
- 	int fluctuation_val = 0; //报警值;
 
- 	eUpOrDownInfo bUpOrDown = eUpOrDownInfo::UOD_UNKNOWN;  //1. up 缩进  2. down  伸出
 
- 	uint8_t bFixOrInvert = 0;  //1. fix   2. invert
 
- 	time_t tmStart = 0;  //开始波动的时间  单位秒
 
- 	time_t tmEnd = 0;    //结束波动时间  单位秒
 
- }CONVERT_RESIST;
 
- typedef struct tagFrictionResist
 
- {
 
- 	int show_val = 0; //稳态值
 
- 	time_t show_time = 0; //稳态时间
 
- 	int curr_val = 0; //当前值
 
- 	int peak_val = 0; //峰值
 
- 	time_t peak_time = 0; //峰值时间
 
- 	eUpOrDownInfo bUpOrDown = eUpOrDownInfo::UOD_UNKNOWN;  //1. up 缩进  2. down  伸出
 
- 	time_t tmStart = 0;  //开始波动的时间  单位秒
 
- 	time_t tmEnd = 0;    //结束波动时间  单位秒
 
- 	string t;
 
- }FRICTION_RESIST;
 
- //过车信息
 
- typedef struct tagPassResist
 
- {
 
- 	time_t show_time = 0;//报警时间
 
- 	int val = 0; //报警时阻力值
 
- 	int vv = 0;  //过车晃动量
 
- 	time_t tmStart = 0;  //开始过车的时间  单位秒
 
- 	time_t tmEnd = 0;    //结束过车时间  单位秒
 
- 	eDaoChaPosi posi = eDaoChaPosi::DCP_UNKNOWN;  //判断定位还是反位过车
 
- }PASS_RESIST;
 
- struct mg_per_session_data
 
- {
 
- 	mg_per_session_data()
 
- 	{
 
- 	}
 
- 	~mg_per_session_data()
 
- 	{
 
- 		bWork = false;
 
- 		bBlock = false;
 
- 		if (thread_hist)
 
- 		{
 
- 			thread_hist->join();
 
- 			delete thread_hist;
 
- 			thread_hist = nullptr;
 
- 		}
 
- 	}
 
- 	uint32_t send_count = 0;   //发送
 
- 	uint32_t send_fail_count = 0;
 
- 	uint32_t recv_count = 0;   //接收
 
- 	uint64_t send_size = 0;
 
- 	uint64_t recv_size = 0;
 
- 	time_t tmConnect = 0;      //链接时间
 
- 	time_t tmLastRecvHeart = 0;		//最后心跳时间
 
- 	time_t tmLastSendHeart = 0;
 
- 	bool isLogin = false;			//是否登录
 
- 	string token;   //登录的token
 
- 	string username;		//登录的用户名
 
- 	string name;
 
- 	string node;   //管辖ID
 
- 	string node_name;    //管辖名称
 
- 	std::list<std::string>  m_lstSubReal;  //订阅实时数据列表   mo,mp
 
- 	std::thread* thread_hist = nullptr;  //历史数据发送线程
 
- 	bool  bWork = false;
 
- 	bool  bBlock = false;  //历史数据包阻塞
 
- 	int	 SendHistResistForEcharts(struct mg_connection* c, string mo_mp, time_t start, time_t end, uint32_t subsection, std::map<time_t, int>& data0, std::map<time_t, int>& data1, std::map<time_t, int>& data2);
 
- 	int	 SendHistResistDBForEcharts(LPMGHISTORY_QUERY);
 
- 	//最大转换阻力值   时间  高32值:计算值 低32位:阻力值
 
- 	static void GetMaxResist(std::map<time_t, int>& data2, std::map<time_t, tagSecondStatInfo>& mapSecondStatInfo, list<CONVERT_RESIST>& out, const string& mo, const string& mp);
 
- 	static void GetMaxResist(std::map<time_t, tagSecondStatInfo>& data, list<CONVERT_RESIST>& out);
 
- 	static void GetMaxResistNew(std::map<time_t, tagSecondStatInfo>& data, list<CONVERT_RESIST>& out, const string& mo, const string& mp);
 
- 	//密贴锁闭力值
 
- 	static void GetMaxLockNew(const std::map<time_t, int>& data, const list<CONVERT_RESIST>& refer, std::map<time_t, int64_t>& out, std::map<time_t, int64_t>& retensionforce);
 
- 	static void GetMaxLockNew(const std::map<time_t, tagSecondStatInfo>& data, const list<CONVERT_RESIST>& refer, std::map<time_t, int64_t>& out, std::map<time_t, int64_t>& retensionforce);
 
- 	//摩擦力值
 
- 	void GetMaxForce(std::map<time_t, int>& data2, std::map<time_t, int64_t>& out);
 
- 	//通过1号和2号来计算定扳反 和  反扳定
 
- 	void CalcFixOrInvert(list<CONVERT_RESIST>& out, std::map<time_t, int64_t>& in1, std::map<time_t, int64_t>& in2, string name1, string name2);
 
- 	//遍历求得最接近时间的秒数
 
- 	inline static bool CalcSecondDif(const list<CONVERT_RESIST>& out, const time_t t, OUT int& dif)
 
- 	{
 
- 		int lastVal = 8;
 
- 		bool bRet = false;
 
- 		for (const auto& it : out)
 
- 		{
 
- 			auto d = t - it.tmStart;
 
- 			if (abs(d) < lastVal)
 
- 			{
 
- 				dif = d;
 
- 				lastVal = abs(d);
 
- 				bRet = true;
 
- 			}
 
- 		}
 
- 		return bRet;
 
- 	}
 
- 	//毫秒记录 转换成 秒统计
 
- 	inline static void ConvertMiroToSecond(const std::map<time_t, int>& data, std::map<time_t, tagSecondStatInfo>& out)
 
- 	{
 
- 		uint32_t uLast = 0;
 
- 		std::map<time_t, tagSecondStatInfo>::iterator ik;
 
- 		for (auto& it : data)
 
- 		{
 
- 			uint32_t tt = it.first / 1000;
 
- 			if (uLast == tt)
 
- 			{
 
- 			}
 
- 			else
 
- 			{
 
- 				if (out[tt].first_val == INT_MIN) out[tt].first_val = it.second;			//存储第一个值
 
- 				ik = out.find(tt);
 
- 			}
 
- 			if (it.second > ik->second.max_val)
 
- 			{
 
- 				ik->second.max_val = it.second;
 
- 				ik->second.max_time = it.first;
 
- 			}
 
- 			if (it.second < ik->second.min_val)
 
- 			{
 
- 				ik->second.min_val = it.second;
 
- 				ik->second.min_time = it.first;
 
- 			}
 
- 			ik->second.dif_val = abs(ik->second.max_val - ik->second.min_val);
 
- 			ik->second.sum_val += it.second;
 
- 			ik->second.cout++;
 
- 			ik->second.end_val = it.second;
 
- 		}
 
- 	}
 
- 	static void GetPass(std::map<time_t, tagSecondStatInfo>& pStatInfo, std::map<time_t, int>* pData, const string& mo, const string& mp, OUT list<PASS_RESIST>* lstResist);
 
- 	static void GetPassNew(std::map<time_t, tagSecondStatInfo>& pStatInfo0, std::map<time_t, int>* pData0,
 
- 		std::map<time_t, tagSecondStatInfo>& pStatInfo1, std::map<time_t, int>* pData1,
 
- 		const string& mo, const string& mp, OUT list<PASS_RESIST>* lstResist);
 
- 	static void GetPassNewUnit(std::map<time_t, tagSecondStatInfo>* pStatInfo0, std::map<time_t, int>* pData0,
 
- 		std::map<time_t, tagSecondStatInfo>* pStatInfo1, std::map<time_t, int>* pData1,
 
- 		const string& mo, const string& mp, OUT list<PASS_RESIST>* lstResist);
 
- };
 
- __interface IMGWSHandler
 
- {
 
- 	virtual BOOL HandlerData(const char* ptr, size_t len, char** json) = 0;
 
- 	virtual size_t HandlerData(struct mg_connection* c, struct mg_ws_message* wm, char** json) = 0;
 
- };
 
- class CMGWSServer
 
- {
 
- public:
 
- 	CMGWSServer();
 
- 	~CMGWSServer();
 
- public:
 
- 	BOOL Start(uint16_t port);
 
- 	void Stop();
 
- 	//协议处理
 
- 	IMGWSHandler* m_pDataHanlder = nullptr;
 
- 	//发送部分
 
- 	void	SendRealResistData(const string& imei_idx, const int num, const std::vector<int>& vctData0,
 
- 		const std::vector<int>& vctData1, const std::vector<int>& vctData2, const std::vector<bool>& vctResult, const CTime& atime);
 
- 	//推送温湿度数据
 
- 	void	SendHumiTemp(string mo_mp, const COleDateTime& dt, int humi, int temp);
 
- 	void	SendToAllClient(const char* json, size_t len);
 
- 	void    SendToClient(const char* json, const size_t len, const char* ip);
 
- 	
 
- private:
 
- 	struct mg_mgr m_mg_mgr = { 0 }; //Event management structure
 
- 	std::thread* m_pThread = nullptr;
 
- 	BOOL m_bThreadWork = FALSE;
 
- 	static void ThreadProc(DWORD_PTR, uint16_t);
 
- 	int GeneralResistData(const string mo_mp, const int num, const int index, const std::vector<int>& vctData0,
 
- 		const std::vector<int>& vctData1, const std::vector<int>& vctData2, const std::vector<bool>& vctResult, const CTime& atime, char** json);
 
- };
 
 
  |