生态流量数据采集传输协议定制开发(嵌入式水资源SZY206协议以及VC++ POST数据发送)

news2024/10/5 17:23:05

水电站生态流量在线监测,流量数据采集传输,水资源遥测终端机程序。

背景:现场使用SCJ-LL01多普勒超声波流量计采集生态下泄流量,使用太阳能供电系统,使用SCJ-RTU01遥测终端机进行数据采集,设备采用4G通讯,并配有串口工业相机抓拍照片。

要求:数据上传到指定的市监测平台,数据上传协议可以使用水资源SZY206或者http上传,但是平台方不支持图片直接通过水资源协议上传,需要使用专门的post接口上传,考虑到很多post接口上传图片都是使用BASE64以及https,单片机性能有限,而且图片数据间隔较大,因此选择将图片数据使用服务器转发,也就是流量数据上传由RTU直接发送,图片数据由计算机转发,下面是开发流程。

1.RTU程序开发。

        由于水资源协议水流量上传部分有灵活变动的地方,主要表现在流量数据数量,有的可以传输2个流量,有的只能传输一个,有的可以传输1个瞬时流量+1个累计水量,因此几乎所有的水资源协议都需要进行定制微调。

 水资源SZY206帧格式

         此处主要实现自报流量数据,只需要上传5个字节的瞬时流量即可。

 自报数据格式

 

 自报流量格式,需要注意的是,这个瞬时流量的单位是不唯一的,需要与平台方约定,此处平台方使用的是m3/s。

下面是遥测终端机RTU的代码

#define CUSTOM_PROTOCOL_WENZHOU_SZY				16		//温州市小水电站生态流量,水资源协议

//通过宏定义选择使用的协议,定制很多,根据宏定义选择即可。



/*************************************************************************************************************************
* 函数				:	u8 SZY206_SetPackWaterFlow(u8 *pBuff, REAL_DATA *pRealData)
* 功能				:	写入当前实时流量数据
* 参数				:	pBuff:数据存放位置;pRealData:实时数据
* 返回				:	数据长度
* 依赖				:	无
* 作者				:	cp1300@139.com
* 时间				:	2022-08-16
* 最后修改时间 		: 	2022-08-16
* 说明				: 	5B字节数据,单位为m3/s,3位小数,会将2个流量计的瞬时流量相加上传
*************************************************************************************************************************/
u8 WENZHOUSZY_SetPackWaterFlow(u8* pBuff, ESS_DATA_TYPE* pData)
{
	u8 ByteNum = 0;
	u8 temp;
	u32 InsFlowRate = 0;   //瞬时流量
	
	if (pData == NULL) return 0;

	//瞬时流量m3/s,保留3位小数点
	if (GET_ESS_FL_1_EN()) //使能了流量计1
	{
		if (pData->InsFlowRate[0] != ESS_DOUBLE_INVALID)
		{
			InsFlowRate += pData->InsFlowRate[0] / 3.6;	//瞬时流量单位m3/h,保留3位小数点,转换为m3/s
		}
	}
	if (GET_ESS_FL_2_EN()) //使能了流量计2
	{
		if (pData->InsFlowRate[1] != ESS_DOUBLE_INVALID)
		{
			InsFlowRate += pData->InsFlowRate[1] / 3.6;	//瞬时流量单位m3/h,保留3位小数点,转换为m3/s
		}
	}
	
	//流量1,实际上传输的是2个流量计只和
	temp = InsFlowRate % 100;
	pBuff[ByteNum++] = SZY206_DECtoBCD(temp);
	temp = (InsFlowRate / 100) % 100;
	pBuff[ByteNum++] = SZY206_DECtoBCD(temp);
	temp = (InsFlowRate / 10000) % 100;
	pBuff[ByteNum++] = SZY206_DECtoBCD(temp);
	temp = (InsFlowRate / 1000000) % 100;
	pBuff[ByteNum++] = SZY206_DECtoBCD(temp);
	temp = (InsFlowRate / 100000000) % 10;
	pBuff[ByteNum++] = SZY206_DECtoBCD(temp) & 0x0F;


	return ByteNum;
}



/*************************************************************************************************************************
* 函数				:	DCP_ERROR SZY206_SendRealDataFrame(WENZHOUSZY_HANDLE *pHandle, UFRAME_FUN Fun, REAL_DATA *pRealData,  REAL_TIMER_TYPE* pAcqTime)
* 功能				:	遥测站自报实时数据
* 参数				:	pHandle:句柄;Fun:功能码;ParaData:实时数据;pAcqTime:数据采集时间
* 返回				:	DCP_ERROR
* 依赖				:	无
* 作者				:	cp1300@139.com
* 时间				:	2022-08-16
* 最后修改时间 		: 	2022-08-16
* 说明				: 	只支持水位/流量数据打包发送 UFUN_WL/UFUN_FLOW
*************************************************************************************************************************/
DCP_ERROR WENZHOUSZY_SendRealDataFrame(WENZHOUSZY_HANDLE* pHandle, SZY206_UFRAME_FUN Fun, ESS_DATA_TYPE* pData, REAL_TIMER_TYPE* pAcqTime)
{
	SZY206_SRDATA_FRAME* pFrame;
	u8 ByteNum = 0;
	u8 FrameLen = 0;
	u8 retry;
	int len;
	u16 ReceiveDelay;
	u8 cnt;

	for (retry = 0; retry < pHandle->SendRetry; retry++)	//失败重复发送
	{
		FrameLen = 0;
		Fun = (SZY206_UFRAME_FUN)(Fun & 0x0f);				//功能码为4bit,0-15
		pFrame = (SZY206_SRDATA_FRAME*)pHandle->pPackDataBuff;
		//报文头
		pFrame->SOH1 = 0x68;		//起始字符 68H
		//pFrame->len				//长度
		pFrame->SOH2 = 0x68;		//起始字符 68H
		ByteNum = 0;
		pFrame->Data[ByteNum++] = (1 << 7)					//BIT7->0:下行;1:上行
			| (0 << 6)										//BIT6->0:单帧;1:代表帧拆分过
			| (((pHandle->SendRetry - retry) & 0x3) << 4)	//重发变化位,3,2,1,0变化
			| (Fun << 0);									//BIT0-BIT3功能码
		memcpy(&pFrame->Data[ByteNum], pHandle->SendDataTelAttr.TelNumber, 5);	//遥测站地址编码
		ByteNum += 5;
		//报文正文
		//应用层功能码,AFN
		pFrame->Data[ByteNum++] = (u8)AFN_FUN_REPORT;		//功能码:自报实时数据 功能码0xC0
		//数据,根据功能码打包数据
		switch (Fun & 0x0f)
		{
			case UFUN_WL:		//自报帧 水位参数
			{
				cnt = SZY206_SetPackWaterLevel(&pFrame->Data[ByteNum], pData);		//写入当前实时水位
				ByteNum += cnt;
			}break;
			case UFUN_FLOW:		//自报帧 流量(水量)参数
			{
				cnt = WENZHOUSZY_SetPackWaterFlow(&pFrame->Data[ByteNum], pData);		//写入当前实时流量
				ByteNum += cnt;
			}break;			
			default:return DCP_DATA_ERROR;
		}
		pFrame->len = 1 + 5 + 1 + cnt + 4 + 5;		//长度,1B:控制;5B:地址;1:用户功能码;cnt字节数据;4B:运行状态;5B:时间标签
		//终端状态-4此处4字节
		pFrame->Data[ByteNum++] = 0x00;				//报警状态
		pFrame->Data[ByteNum++] = 0x00;
		pFrame->Data[ByteNum++] = 0x00;
		pFrame->Data[ByteNum++] = 0x00;

		//TP,时间
		pFrame->Data[ByteNum++] = SZY206_DECtoBCD(pAcqTime->sec);			//SS
		pFrame->Data[ByteNum++] = SZY206_DECtoBCD(pAcqTime->min);			//mm
		pFrame->Data[ByteNum++] = SZY206_DECtoBCD(pAcqTime->hour);			//HH
		pFrame->Data[ByteNum++] = SZY206_DECtoBCD(pAcqTime->date);			//DD
		pFrame->Data[ByteNum++] = 0x00;									//这个报文要求这个时间必须为0x00

		FrameLen = ByteNum;							//记录用户区数据长度
		//CRC校验
		pFrame->Data[ByteNum++] = SZY206_CRCByte(pFrame->Data, FrameLen);	//计算用户数据CRC ,1B控制,5B地址,1B用户功能码,nB实时数据长度,4B报警状态,5B时间标签
		//结束
		pFrame->Data[ByteNum++] = 0x16;

		//计算帧长度
		FrameLen = SRDATA_FRAME_HEADER_SIZE + ByteNum;
		//发送数据
#if 1
		{
			u16 i;

			INFO_S("[SZY206]发送数据帧(%d):\r\n", +FrameLen);
			for (i = 0; i < FrameLen; i++)
			{
				INFO_C("%02X ", pHandle->pPackDataBuff[i]);
			}

			INFO_C("\r\n\r\n");
		}
#endif//SZY206_DEBUG_EN	
		pHandle->pHW_IF->SendData(pHandle->pPackDataBuff, FrameLen);

		SYS_DelayMS(1500);		//数据发送完成后不会收到响应
		return DCP_OK;

	}

	return DCP_TIME_OUT;
}




/*************************************************************************************************************************
* 函数			:	DCP_ERROR WENZHOUSZY_SendRealDataPackge(WENZHOUSZY_HANDLE *pHandle, REAL_TIMER_TYPE *pAcqTime,ESS_DATA_TYPE *pData, u16 SerialNumber)
* 功能			:	发送实时数据
* 参数			:	pHandle:协议栈句柄;pConnectData:WENZHOUSZY连接结构指针;pAcqTime:发报时间;pData:实时数据指针;SerialNumber:流水号;
* 返回			:	DCP_ERROR
* 依赖			:	无
* 作者			:	cp1300@139.com
* 时间			:	2022-08-16
* 最后修改时间		: 	2022-08-16
* 说明			: 	
*************************************************************************************************************************/ 
DCP_ERROR WENZHOUSZY_SendRealDataPackge(WENZHOUSZY_HANDLE *pHandle,ESS_DATA_TYPE *pData,  REAL_TIMER_TYPE *pAcqTime,u16 SerialNumber)
{
	WENZHOUSZY_SendRealDataFrame(pHandle, UFUN_FLOW, pData, pAcqTime);									//发送流量数据包
	return DCP_OK;
}

 上面就是水资源协议的数据打包核心,下面是水资源协议相关的结构体定义


/*
//帧格式定义
起始字符(68H)
长度L 固定长度的报文头
起始字符(68H)
控制域C 控制域
用户数据区
地址域A 地址域
用户数据 用户数据域
校验CS 帧校验
结束字符(16H)*/


//帧定义,单包数据帧定义
typedef struct
{
	u8 SOH1;					//起始字符 68H
	u8 len;						//长度
	u8 SOH2;					//起始字符 68H
	//
	//用户数据区
	u8 Control;					//控制区
	u8 TelAddr[5];				//遥测站地址
	u8 Data[1024 + 3];			//报文正文
	//
	//报文正文
	//CRC校验
	//结束符16H
} SZY206_FRAME;



/*
用户数据 控制区 C,
由D0~D7(1 字节)组成,采用BIN 编码,是控制域、地址域、用户数据域(应用层)的字节总数。数据为图片数据流时,数据长度为L*1K
控制域C
D7 					D6 					D5~D4 			D3~D0
传输方向位DIR 		拆分标志位DIV 		帧计数位FCB 	功能码
0:下行,1:上行
*/


//应用层功能码
typedef enum
{
	AFN_FUN_LINK = 0x02,	//链路检测
	AFN_FUN_TIMING = 0x11,	//校时
	AFN_FUN_QUERY_REAL	=	0xB0,	//查询遥测站实时数据
	AFN_FUN_REPORT = 0xc0,	//遥测站自报实时数据
	AFN_FUN_REPORT_PIC = 0xc1,	//遥测站自报图片数据
}SZY206_AFN_FUN;


//自报实时数据数据帧
typedef struct
{
	u8 SOH1;					//起始字符 68H
	u8 len;						//长度
	u8 SOH2;					//起始字符 68H
	//
	//用户数据区
	//控制区	1B
	//遥测站地址5B
	//链路层功能码1B
	//
	//报文正文
	u8 Data[1024 + 3];			//报文正文
	//CRC校验
	//结束符16H
} SZY206_SRDATA_FRAME;
#define SRDATA_FRAME_HEADER_SIZE	3	//正文前报头大小


//附加信息域AUX
//2B;	//密码 PW 用于重要下行报文中,由2 字节组成
//5B;	//时间标签 Tp



//下行帧功能码
typedef enum
{
	DFUN_OK = 0,		//发送∕确认 命令
	DFUN_RAIN = 1,		//查询∕响应帧 雨量参数
	DFUN_WL = 2,		//查询∕响应帧 水位参数
	DFUN_FLOW = 3,		//查询∕响应帧 流量(水量)参数
	DFUN_CURR = 4,		//查询∕响应帧 流速参数
	DFUN_GATE = 5,		//查询∕响应帧 闸位参数
	DFUN_POWER = 6,		//查询∕响应帧 功率参数
	DFUN_PRESS = 7,		//查询∕响应帧 气压参数
	DFUN_WIND = 8,		//查询∕响应帧 风速参数
	DFUN_WT = 9,		//查询∕响应帧 水温参数
	DFUN_WQ = 10,		//查询∕响应帧 水质参数
	DFUN_SOILM = 11,		//查询∕响应帧 土壤含水率参数
	DFUN_EVAP = 12,		//查询∕响应帧 蒸发量参数
	DFUN_ALARM = 13,		//查询∕响应帧 报警或状态参数
	DFUN_COMPRE = 14,		//查询∕响应帧 综合参数
	DFUN_WPRESS = 15,		//查询∕响应帧 水压参数
}SZY206_DFRAME_FUN;


//上行帧功能码
typedef enum
{
	UFUN_OK = 0,		//确认 命令
	UFUN_RAIN = 1,		//自报帧 雨量参数
	UFUN_WL = 2,		//自报帧 水位参数
	UFUN_FLOW = 3,		//自报帧 流量(水量)参数
	UFUN_CURR = 4,		//自报帧 流速参数
	UFUN_GATE = 5,		//自报帧 闸位参数
	UFUN_POWER = 6,		//自报帧 功率参数
	UFUN_PRESS = 7,		//自报帧 气压参数
	UFUN_WIND = 8,		//自报帧 风速参数
	UFUN_WT = 9,		//自报帧 水温参数
	UFUN_WQ = 10,		//自报帧 水质参数
	UFUN_SOILM = 11,	//自报帧 土壤含水率参数
	UFUN_EVAP = 12,		//自报帧 蒸发量参数
	UFUN_ALARM = 13,	//自报帧 报警或状态参数
	UFUN_RAINFALL = 14,	//自报帧 统计雨量
	UFUN_WPRESS = 15,	//自报帧 水压参数
}SZY206_UFRAME_FUN;




//将数字转换为压缩BCD格式,最大支持99
#define SZY206_DECtoBCD(DEC) (((u8)(DEC/10)<<4)+(DEC%10))
//将压缩BCD转为DEC,最大支持99
#define SZY206_BCDtoDEC(BCD) ((u8)(BCD>>4)*10+(BCD&0x0f))

2.PC端程序转发。

        生态流量图片采集转发

程序采用VC++ CLR开发,程序启动后会从数据库读取当前要转发的设备的信息,比如测站编码,转发的接口等信息,然后去数据库查询当前设备的最新图片,找到图片后就按照要求进行上传,之后延时10分钟,重新查询,发送。

以下是平台方提供的图片上传接口:

 这个接口可以看出,传输数据采用的json,将图片数据转换为base64字符串后,放入json传输,由于图片数据很大,起初我是想生成一个这个json对象,然后赋值,然后将对象转换为json,但是这样效率极低,我最终选择使用字符串拼接json,避免生成过多的对象,主要是考虑到以后很多类似的设备需要进行图片转发,降低系统内存CPU消耗。

以下是核心的数据发送的代码,至于数据查询部分就省略了,主要涉及到post发送数据:


bool RemoteCertificateValidationCallback1(System::Object^ sender, System::Security::Cryptography::X509Certificates::X509Certificate^ certificate, System::Security::Cryptography::X509Certificates::X509Chain^ chain, System::Net::Security::SslPolicyErrors sslPolicyErrors)
{
    return true; //总是接受  
}

ref class Headers_Class
{
public:
    String^ key;
    String^ value;
};

//POST方式发送字符串
String^ PostUrl(String^ url, String^ postData,String^ ContentType,String^ Accept,List<Headers_Class^>^ Headers, String^% pError)
{
    char* pBuff = nullptr;
    DWORD len;
    HttpWebRequest^ request = nullptr;
    String^ result = nullptr;

    try
    {
        if (url->StartsWith("https", StringComparison::OrdinalIgnoreCase))
        {
            request = (HttpWebRequest^)WebRequest::Create(url);
            ServicePointManager::ServerCertificateValidationCallback = gcnew System::Net::Security::RemoteCertificateValidationCallback(RemoteCertificateValidationCallback1);
            request->ProtocolVersion = HttpVersion::Version11;
            // 这里设置了协议类型。
            ServicePointManager::SecurityProtocol = SecurityProtocolType::Tls12; //(SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2; 
            request->KeepAlive = false;
            ServicePointManager::CheckCertificateRevocationList = true;
            ServicePointManager::DefaultConnectionLimit = 100;
            ServicePointManager::Expect100Continue = false;
        }
        else
        {
            request = (HttpWebRequest^)WebRequest::Create(url);
        }

        request->Method = "POST";           //使用post方式发送数据
        if (ContentType == nullptr)
        {
            request->ContentType = "application/json;charset:utf-8;";
        }
        else
        {
            request->ContentType = ContentType;
        }
        
        request->Referer = nullptr;
        request->AllowAutoRedirect = true;
        request->UserAgent = "PostmanRuntime/7.26.1";
        if (Accept == nullptr)
        {
            request->Accept = "*/*";
        }
        else
        {
            request->Accept = Accept;
        }
        request->Timeout = 15 * 1000;       //响应超时时间15秒
        if (Headers != nullptr && Headers->Count > 0)
        {
            for (int i = 0; i < Headers->Count; i++)
            {
                Headers_Class^ mHeader = Headers[i];
                request->Headers->Add(mHeader->key, mHeader->value);
            }
            
        }

        System::Text::UTF8Encoding ^ascii = gcnew System::Text::UTF8Encoding();
        array<unsigned char>^ data = ascii->GetBytes(postData);
        Stream^ newStream = request->GetRequestStream();
        newStream->Write(data, 0, data->Length);
        newStream->Close();

        //获取网页响应结果
        HttpWebResponse^ response = (HttpWebResponse^)request->GetResponse();
        Stream^ stream = response->GetResponseStream();
      
        StreamReader^ sr = gcnew StreamReader(stream);

        result = sr->ReadToEnd();
        response->Close();              //关闭
    }
    catch (Exception^ e)
    {
        pError = e->Message + e->StackTrace;
    }

    return result;
}

//图片上传json格式
ref class ReportStaticPictureInfo_Class
{
public:
    String^ PIC_INFO;   //静态图片base64
    String^ REC_TIME;   //图片采集时间
    String^ HYST_CODE;  //测站编码
    String^ WAIN_NUM;   //从01开始,默认固定为1
};

//发送图片文件
//pURL:数据接口URL;HYST_CODE:测站图片编码;Token:AuthorizationToken;TT:图片采集时间;pPicFilePath:图片路径;pError:返回的错误字符串
bool SendPicFile(String^ url, String^ HYST_CODE, String^ Token,String ^TT, String^ pPicFilePath, String^% pError)
{
	try
	{
        StringBuilder^ mStringBuilder;
        array<BYTE>^ mDataBuff;
        String^ PicBase64;
        String^ pReturnString;

		//读取图片数据
		FileStream^ oFileStream = gcnew FileStream(pPicFilePath, FileMode::Open, FileAccess::Read);
		BinaryReader^ oBinaryReader = gcnew BinaryReader(oFileStream);
		if (oFileStream->Length > 800 * 1024 || oFileStream->Length < 1024)
		{
			pError = "上传图片不能超过800KB或小于1KB";
			return false;
		}
        mDataBuff = gcnew array<BYTE>(oFileStream->Length);
		//一次读取图片
		if (oBinaryReader->Read(mDataBuff, 0, oFileStream->Length) <= 0)
		{
			pError = "读取图片文件错误";
			return false;
		}
		//图片数据转换为base64
        PicBase64 = Convert::ToBase64String(mDataBuff);
        
        //准备json数据,直接拼接得到
        mStringBuilder = gcnew StringBuilder(PicBase64->Length + 256);
        mStringBuilder->Append("{\"DATA\":[{");
        mStringBuilder->Append("\"PIC_INFO\":\"");
        mStringBuilder->Append(PicBase64);
        mStringBuilder->Append("\",");

		mStringBuilder->Append("\"REC_TIME\":\"");
		mStringBuilder->Append(TT);
		mStringBuilder->Append("\",");

		mStringBuilder->Append("\"HYST_CODE\":\"");
		mStringBuilder->Append(HYST_CODE);
		mStringBuilder->Append("\",");

		mStringBuilder->Append("\"WAIN_NUM\":\"01\"");

        mStringBuilder->Append("}]}");


        //准备好header
        List<Headers_Class^>^ Headers = gcnew List<Headers_Class^>();
        Headers_Class^ mHeader;
        //添加 AuthorizationKey
        mHeader = gcnew Headers_Class;
        mHeader->key = "AuthorizationKey";
        mHeader->value = HYST_CODE;
        Headers->Add(mHeader);
        //添加 AuthorizationToken
		mHeader = gcnew Headers_Class;
		mHeader->key = "AuthorizationToken";
		mHeader->value = Token;
        Headers->Add(mHeader);

        //SYS_LOG.Write(mStringBuilder->ToString());
        pReturnString = PostUrl(url, mStringBuilder->ToString(), "application/json", nullptr, Headers, pError);
		//Console::WriteLine(pReturnString);
		if (pReturnString != nullptr && (pReturnString->IndexOf("上报成功")) > 0) return true;
		else
		{
			pError = (pReturnString != nullptr) ? pReturnString : pError;

			return false;
		}
	}
	catch (Exception^ e)
	{
		pError = e->Message + e->StackTrace;
		return false;
	}
}


有需要相关产品的可以去官网查看:https://www.scj-water.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于MATLAB开发AUTOSAR软件应用层模块-part23.SR interface通信介绍(接收的数据错误时应该如何处理)

在软件SWC之间的AUTOSAR SR通信中,当COM报告接收SWC的数据接收错误时,运行时环境(RTE)触发DataReceiveErrorEvent。该事件可以指示发送方SWC未能在AliveTimeout限制内回复,或者发送方SWC发送了无效数据。 接下来我们就讲解下怎么实现无效数据的接收和判断 还是三步走,建模…

Ubuntu 上 Let‘s Encrypt 生成泛域名证书

安装生成工具certbot&#xff1a; apt install certbot 查看安装在哪&#xff1a; which certbot 使用certbot&#xff08;位置在 /usr/bin/certbot&#xff09;生成证书&#xff1a; /usr/bin/certbot certonly -d *.xxx.com --manual --preferred-challenges dns --ser…

一种全新的图像滤波理论的实验(二)

一、前言 2021年12月31日&#xff0c;我发布了基于加权概率模型的图像滤波算法的第一个实验&#xff0c;当时有两个关键问题没有解决&#xff1a; 1、出现了大面积的黑色区域&#xff0c;最近考虑把这个算法实际应用在图像和视频的压缩领域&#xff0c;于是通过对程序的分析&a…

【论文简述】GMFlow: Learning Optical Flow via Global Matching(CVPR 2022)

一、论文简述 1. 第一作者&#xff1a;Haofei Xu 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;CVPR oral 4. 关键词&#xff1a;光流、代价体、Transformers、全局匹配、注意力机制 5. 探索动机&#xff1a;过去几年中具有代表性的光流学习框架的核心估计方式没有…

Java文件IO及其案例分析

目录 1. 文件概述 1.1 狭义和广义上的文件 1.2 文件的路径 1.3 文件的类型 2. 针对文件系统的操作 3. 针对文件内容的操作&#xff08;文件的读和写&#xff09; 3.1 IO流对象 3.2 文件的读操作&#xff08;字节流&#xff09; 3.3 文件的写操作&#xff08;字节流&#…

内存取证常见例题思路方法-volatility (没有最全 只有更全)

目录 1.从内存文件中获取到用户hacker 的密码并且破解密码&#xff0c;将破解后的密码作为 Flag值提交; 2.获取当前系统的主机名&#xff0c;将主机名作为Flag值提交; 3.获取当前系统浏览器搜索过的关键词&#xff0c;作为Flag提交; 4.获取当前内存文件的 ip地址 5.当前系…

pycharm和navigator打开时出现报错,无法正常打开

1、navigator打开时出现提示&#xff1a; 原因是&#xff1a;python.exe有多个任务在占用。 解决办法&#xff1a; &#xff08;1&#xff09;打开cmd &#xff08;2&#xff09;输入&#xff1a;tasklist | findstr “pythonw” &#xff08;3&#xff09;有几个线程就kill几个…

qt qchart学习

Qt Charts主要由QChartView、QChart、QLegend图例、坐标轴(由QAbstractAxis子类实现)、**数据源(由QAbstractSeries子类实现)**等组成使用QChart的前期准备1. Qt5.9及以上版本&#xff1b;2. .pro文件中添加QT charts3. 在使用QChart的各个控件之前&#xff0c;引用头文件并必…

【前缀和】和为k的子数组 路径总和 III

文章目录和为k的子数组路径总和 III和为k的子数组 动态规划算法&#xff08;超时&#xff09; class Solution { public:int subarraySum(vector<int>& nums, int k) {int n nums.size();vector<vector<int>> dp(n, vector<int>(n, 0));int ans …

b2b b2c o2o分布式电子商务平台源码 mybatis+spring cloud

鸿鹄云商大型企业分布式互联网电子商务平台&#xff0c;推出PC微信APP云服务的云商平台系统&#xff0c;其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 分布式、微服务、云架构电子商务平台 java b2b2c o2o 技术解决方案 开发语言&#xff1a; java、j2ee 数据库&am…

注解@Transactional 原理和常见的坑

这篇文章&#xff0c;会先讲述 Transactional 的 4 种不生效的 Case&#xff0c;然后再通过源码解读&#xff0c;分析 Transactional 的执行原理&#xff0c;以及部分 Case 不生效的真正原因1 项目准备下面是 DB 数据和 DB 操作接口&#xff1a;uidunameusex1张三女2陈恒男3楼仔…

百万医疗险是什么

一、百万医疗险是什么 从名字可以看出&#xff0c;这是一款医疗险。因为保额高&#xff0c;最高能报销百万&#xff0c;所以叫百万医疗险。 二、百万医疗险有什么用 可以报销被保险人因意外伤害和疾病导致的医疗费用 三、如何挑选 虽然高达几百万的保额&#xff0c;但保额却并非…

cas单点登录-自定义登录界面 / 自定义主题风格(三)

cas单点登录-自定义登录界面 / 自定义主题风格&#xff08;三&#xff09; 在前面的文章中&#xff0c;介绍了使用cas实现SSO单点登录&#xff0c;静态登录&#xff0c;使用mysql数据库登录。但是在登录时都是跳转到了同一个登录界面。 假设现在我有两个子站点app1.com&#x…

【Docker】初识Dcoker以及镜像操作(一)

目录 1.初识Docker 1.1.什么是Docker 1.1.1.应用部署的环境问题 1.1.2.Docker解决依赖兼容问题 1.1.3.Docker解决操作系统环境差异 1.1.4.小结 1.2.Docker和虚拟机的区别 1.3.Docker架构 1.3.1.镜像和容器 1.3.2.DockerHub 1.3.3.Docker架构 1.3.4.小结 1.4.安装D…

Three.js铅笔手绘效果实现

在这个教程中&#xff0c;我们将学习如何使用 Three.js 后处理创建铅笔手绘效果。 我们将完成创建自定义后处理渲染通道、在 WebGL 中实现边缘检测、将法线缓冲区重新渲染到渲染目标以及使用生成和导入的纹理调整最终结果的步骤。 这就是最终结果的样子&#xff0c;让我们开始…

NLP学习笔记(九) 分词(上)

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲分词算法 1 概述 分词是自然语言处理领域中的基础任务&#xff0c;是文本预处理的重要步骤 简单来说&#xff0c;就是将文本段落分解为基本语言单位&#xff0c;亦可称之为词元 ( token\text{token}token ) 按照粒度的不…

day50【代码随想录】动态规划之不同的子序列、两个字符串的删除操作、编辑距离

文章目录前言一、不同的子序列&#xff08;力扣115&#xff09;【hard】二、两个字符串的删除操作&#xff08;力扣583&#xff09;思路一思路二三、编辑距离&#xff08;力扣72&#xff09;【hard】前言 1、不同的子序列 2、两个字符串的删除操作 3、编辑距离 一、不同的子序…

网页扫描图像并以pdf格式上传到服务器端

本文描述如何通过网页驱动扫描仪、高拍仪等图像扫描设备进行图像扫描&#xff0c;扫描结果经编辑修改后以pdf压缩格式上传到后台java程序中进行服务器端落盘保存。图像扫描上传如文字描述顺序所介绍&#xff0c;先要驱动扫描设备工作&#xff0c;进行纸张数据的光学扫描操作形成…

Impacket工具使用

Impacket工具说明 Impacker是用户处理网络协议的Python类集合,用于对SAB1-3或IPv4/IPv6 上的TCP/UPD/ICMP/IGMP/ARP/IPv4/IPv6/SMB/MSRPC/NTLM/Kerberos/WMI/LDAP 等进行低级的编程访问,数据包可以从头开始构建,也可以从原始数据包中解析, 面向对象API使用处理协议的深层结构变…

Action Segmentation数据集介绍——Breakfast

文章目录简介细节Cooking actibitiesillustration of the actions论文讲解Breakfast&#xff08;The Breakfast Action Dataset&#xff09;简介 早餐动作数据集包括与早餐准备相关的10个动作&#xff0c;由18个不同厨房的52个不同的人执行。该数据集是最大的完全带注释的数据…