| 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 50typedef 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);	//设备升级 endprivate:	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;};
 |