| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 | 
							- #pragma once
 
- #include <ProtocolHandler.h>
 
- #include <ODBC/DBConnectPool.h>
 
- #include <rapidjson/document.h>
 
- #include <rapidjson/stringbuffer.h>
 
- #include <rapidjson/reader.h>
 
- #include <rapidjson/writer.h>
 
- #include <string>
 
- #include <vector>
 
- #include <map>
 
- #include "LNContext.h"
 
- #include "AlarmDefine.h"
 
- #define ROW_ARRAY_SIZE 50
 
- typedef struct tagResistance
 
- {
 
- 	char imei[50];
 
- 	//TIMESTAMP_STRUCT time;
 
- 	char  time[24];
 
-     uint8_t index;
 
- 	int data0;
 
- 	int data1;
 
- 	int data2;
 
- }RESISTANCE, *LPRESISTANCE;
 
- struct tagHandlePack
 
- {
 
- private:
 
- 	~tagHandlePack() {};
 
- public:
 
- 	LPBYTE pPack;
 
- 	int nPackLen;
 
- 	SOCKADDR psa = { 0 };
 
- 	CLNContext* pClientContext = nullptr;
 
- 	tagHandlePack(LPBYTE a, int b, SOCKADDR* c, CClientContext* d)
 
- 	{
 
- 		pPack = new BYTE[b];
 
- 		nPackLen = b;
 
- 		memcpy(pPack, a, b);
 
- 		if (c) memcpy(&psa, c, sizeof(SOCKADDR));
 
- 		if (d) pClientContext = (CLNContext*)d->GetSharedPointer(); //引用
 
- 	}
 
- 	void join()
 
- 	{
 
- 		if (pPack) delete[] pPack;
 
- 		nPackLen = 0;
 
- 		if (pClientContext) pClientContext->ReleaseSharedPointer(); //释放
 
- 		delete this;
 
- 	}
 
- };
 
- class CLNHandle
 
-     :public CProtocolHandler
 
- {
 
- public:
 
-     CLNHandle();
 
-     virtual ~CLNHandle();
 
-     virtual BOOL HandlePack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, void* pClientContext = NULL) override;
 
- 	virtual BOOL ProcessPack(LPBYTE pPack, int nPackLen, SOCKADDR* psa, CLNContext* pClientContext);
 
- 	//发送升级需求给设备
 
- 	static int    SendUpdateToDevice(const char* imei, string remote_addr, string type);
 
- 	//发送请求实时数据给设备
 
- 	static int	  SendMsgToDevice(const char* imei);
 
- 	BOOL	SendTimeAckToAllDevice();
 
- protected:
 
- 	BOOL	HandlePingPack(const rapidjson::Document& doc, const char* imei,  const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL	HandlePushMsg(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext, LPBYTE pPack, int nPackLen);
 
- 	//传入空指针, 外面需要释放
 
- 	uint32_t GeneralResistPack(const string& momp, 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, uint8_t** pack, int* len);
 
- 	uint32_t GeneralResistPack(const string& momp, int data0, int data1, int data2, string str_time, uint8_t** pack, int* len);
 
- 	uint32_t GeneralTempPack(const string& momp, int temp, int Humi, time_t utime_t, uint8_t** pack, int* len);
 
- 	BOOL	HandlePushInfo(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL	HandleInfoAck(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL	HanldeTime(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL	HandlePushOnline(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext, LPBYTE pPack, int nPackLen);
 
-     //Web 客户端发送 tcp
 
-     BOOL    HandleUpdate(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
-     //Client
 
- 	BOOL    HandleUpdateAck(const rapidjson::Document& doc, LPBYTE pPack, int nPackLen, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
-     //get onlineDevice
 
-     BOOL    HandleOnlineDevice(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL    HandleOnlineDeviceNew(const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	BOOL	HandleQueryMsgAck(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
-     //设备升级
 
-     BOOL    HandleUpdateInit(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
-     //请求数据
 
-     BOOL    HandleUpdateSeq(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
-     BOOL    HandleUpdateOk(const rapidjson::Document& doc, const char* imei, const SOCKADDR* psa, CLNContext* pClientContext = NULL);
 
- 	//设备升级 end
 
- private:
 
- 	static string		m_strUpgradeRemoteAddr;
 
- 	uint32_t	convertStrToArray(const string& str, std::vector<CString>& lst);
 
- 	static inline uint32_t	convertStrToArray(const string& str, std::vector<int>& lst)
 
- 	{
 
- 		// string->char *
 
- 		char* s_input = (char*)str.c_str();
 
- 		const char* split = ",";
 
- 		// 以逗号为分隔符拆分字符串
 
- 		char* p = strtok(s_input, split);
 
- 		int i = 0;
 
- 		while (p != NULL)
 
- 		{
 
- 			if (i < lst.capacity())
 
- 			{
 
- 				int l = strlen(p);
 
- 				if (l > 4)
 
- 					lst[i++] = strtol(p, NULL, 16) - 0x800000;
 
- 				else if (l == 4)
 
- 					lst[i++] = strtol(p, NULL, 16) - 0x8000;
 
- 			}
 
- 			p = strtok(NULL, split);
 
- 		}
 
- 		return i;
 
- 	}
 
- 	uint32_t	convertStrToArraytest(const string& str, std::vector<int>& lst);
 
- 	//2020年6月22日09:30:04 新增压缩
 
- 	uint32_t    compressArray(std::vector<CString>& vct1, std::vector<CString>& vct2, std::vector<CString>& vct3, uint32_t len, std::vector<bool>& result);
 
- 	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,
 
- 		IN __time64_t tmStart, OUT tagSecondStatInfo& tSS1, OUT tagSecondStatInfo& tSS2, OUT tagSecondStatInfo& tSS3)
 
- 	{
 
- 		if (len == 0) return 0;
 
- 		int newlen = len;
 
- 		int per = 1000 / len;
 
- 		for (int i = 0; i < len; i++)
 
- 		{
 
- 			const auto a = vct1[i];
 
- 			const auto b = vct2[i];
 
- 			const auto c = vct3[i];
 
- 			if (a < -INVLID_VAL || a > INVLID_VAL)
 
- 			{
 
- 				result[i] = false;
 
- 				vct1[i] = INVLID_VAL;
 
- 			}
 
- 			if (b < -INVLID_VAL || b > INVLID_VAL)
 
- 			{
 
- 				result[i] = false;
 
- 				vct2[i] = INVLID_VAL;
 
- 			}
 
- 			if (c < -INVLID_VAL || c > INVLID_VAL)
 
- 			{
 
- 				result[i] = false;
 
- 				vct3[i] = INVLID_VAL;
 
- 			}
 
- 			if (result[i] == false)
 
- 			{
 
- 				newlen--;
 
- 				continue;
 
- 			}
 
- 			if (tSS1.first_val == INT_MIN) tSS1.first_val = a;			//存储第一个值
 
- 			if (tSS2.first_val == INT_MIN) tSS2.first_val = b;
 
- 			if (tSS3.first_val == INT_MIN) tSS3.first_val = c;
 
- 			if (a > tSS1.max_val)
 
- 			{
 
- 				tSS1.max_val = a;
 
- 				tSS1.max_time = tmStart + i * per;
 
- 			}
 
- 			if (b > tSS2.max_val)
 
- 			{
 
- 				tSS2.max_val = b;
 
- 				tSS2.max_time = tmStart + i * per;
 
- 			}
 
- 			if (c > tSS3.max_val)
 
- 			{
 
- 				tSS3.max_val = c;
 
- 				tSS3.max_time = tmStart + i * per;
 
- 			}
 
- 			if (a < tSS1.min_val)
 
- 			{
 
- 				tSS1.min_val = a;
 
- 				tSS1.min_time = tmStart + i * per;
 
- 			}
 
- 			if (b < tSS2.min_val)
 
- 			{
 
- 				tSS2.min_val = b;
 
- 				tSS2.min_time = tmStart + i * per;
 
- 			}
 
- 			if (c < tSS3.min_val)
 
- 			{
 
- 				tSS3.min_val = c;
 
- 				tSS3.min_time = tmStart + i * per;
 
- 			}
 
- 			tSS1.sum_val += a;
 
- 			tSS1.cout++;
 
- 			tSS1.end_val = a;
 
- 			tSS2.sum_val += b;
 
- 			tSS2.cout++;
 
- 			tSS2.end_val = b;
 
- 			tSS3.sum_val += c;
 
- 			tSS3.cout++;
 
- 			tSS3.end_val = c;
 
- 		}
 
- 		if (tSS1.cout) tSS1.dif_val = abs(tSS1.max_val - tSS1.min_val);
 
- 		if (tSS2.cout) tSS2.dif_val = abs(tSS2.max_val - tSS2.min_val);
 
- 		if (tSS3.cout) tSS3.dif_val = abs(tSS3.max_val - tSS3.min_val);
 
- 		//无波动 存第一个值
 
- 		//TRACE("%s\r\n", fmt::format("dif 1:{} 2:{} 3:{}", tSS1.dif_val, tSS2.dif_val, tSS3.dif_val).c_str());
 
- 		if (tSS1.dif_val < 100 && tSS2.dif_val < 100 && tSS3.dif_val < 100)
 
- 		{
 
- 			tSS1.cout = 1;
 
- 			tSS2.cout = 1;
 
- 			tSS3.cout = 1;
 
- 			bool bVal = true;
 
- 			for (int i = 0; i < len; i++)
 
- 			{
 
- 				if (result[i])
 
- 				{
 
- 					result[i] = bVal;
 
- 					bVal = false;
 
- 				}
 
- 			}
 
- 			return 1;
 
- 		}
 
- 		return newlen;
 
- 	}
 
- 	static inline uint32_t   compressArray(std::vector<int>& vct1, std::vector<int>& vct2, std::vector<int>& vct3, uint32_t len, std::vector<bool>& result)
 
- 	{
 
- 		int newlen = len;
 
- 		size_t i = 0;
 
- 		for (i; i < 2; i++)
 
- 		{
 
- 			if (abs(vct1[i]) > INVLID_VAL || abs(vct2[i]) > INVLID_VAL || abs(vct3[i]) > INVLID_VAL)
 
- 			{
 
- 				result[i] = false;
 
- 				newlen--;
 
- 			}
 
- 		}
 
- 		for (i; i < len; i++)
 
- 		{
 
- 			if (vct1[i - 2] == vct1[i - 1] && vct1[i - 1] == vct1[i] &&
 
- 				vct2[i - 2] == vct2[i - 1] && vct2[i - 1] == vct2[i] &&
 
- 				vct3[i - 2] == vct3[i - 1] && vct3[i - 1] == vct3[i])
 
- 			{
 
- 				result[i - 1] = false;
 
- 				newlen--;
 
- 			}
 
- 			else if (abs(vct1[i - 1]) > INVLID_VAL || abs(vct2[i - 1] > INVLID_VAL || abs(vct3[i - 1]) > INVLID_VAL))
 
- 			{
 
- 				result[i - 1] = false;
 
- 				newlen--;
 
- 			}
 
- 		}
 
- 		if (abs(vct1[i - 1]) > INVLID_VAL || abs(vct2[i - 1] > INVLID_VAL || abs(vct3[i - 1]) > INVLID_VAL))
 
- 		{
 
- 			result[i - 1] = false;
 
- 			newlen--;
 
- 		}
 
- 		return newlen;
 
- 	}
 
- 	static std::map<CString, COleDateTime> m_mapIMEI_time0;
 
- 	static std::map<CString, COleDateTime> m_mapIMEI_time3;
 
- 	static std::map<CString, COleDateTime> m_mapIMEI_time6;
 
- 	static std::map<CString, COleDateTime> m_mapIMEI_temp;
 
- 	std::map<string, time_t> m_mapTempHumi;  //温湿度1分钟上送一次
 
- 	//缓冲
 
- 	std::list<tagHandlePack*> m_lst;
 
- 	std::mutex m_mtx;
 
- 	std::thread* m_pThread = nullptr;
 
- 	static void ThreadForHandle(DWORD_PTR);
 
- 	bool m_bWork = false;
 
- };
 
 
  |