From 66ea95dcb8fd91d29465c2f11ced4dd6153a2504 Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Wed, 22 May 2024 17:15:02 +0800
Subject: [PATCH] 继续完善远传

---
 Function/WirelessRemoteComm/wrc_sizhu_v4.c |  123 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 107 insertions(+), 16 deletions(-)

diff --git a/Function/WirelessRemoteComm/wrc_sizhu_v4.c b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
index fecc7b0..fa4e781 100644
--- a/Function/WirelessRemoteComm/wrc_sizhu_v4.c
+++ b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -6,18 +6,43 @@
 #include "main.h"
 #include "rs485_data_analysis_pro.h"
 #include "power_manage.h"
+#include "AES128.h"
+#include "system_general_para.h"
 
 static	SIZHU_V4_PROTOCOL_HEAD_T	protocol_head_up_g ={.frame_start_code = SIZHU_FRAME_HEAD,.data_start_code = SIZHU_DATA_HEAD};
 static	SIZHU_V4_PROTOCOL_NORMAL_DATA_HEAD_T	data_head_g;
 static	SIZHU_V4_PROTOCOL_TAIL_T	proto_tail_up_g = {.frame_end_code = SIZHU_FRAME_TAIL};
+static	SIZHU_V4_REPORT_CTRL_PARA_T	report_ctrl_para_g;
+ErrorStatus	wrc_sizhuV4_result_flag = FAIL;    //���յ�ͨѶ����жϣ���ʼ��FAIL�����ո���Э��ȷ�ϱ���ͨѶ�Ƿ�ɹ�������˼����Э��ͨ������֡�ж��Ƿ����ճɹ�
 
+//static	uint16_t	current_report_data_num = 0;
+
+uint32_t DataReadAddrInit(uint32_t current_save_addr,uint16_t data_num)
+{
+	uint32_t	read_start_addr ;
+	//?��ȡ��ʼ��ַ��ûд��
+	read_start_addr = current_save_addr;
+	
+	return read_start_addr;
+}
+
+void ReadDataFromRecord(uint32_t * read_addr ,uint8_t *buf)
+{
+	//?�Ӵ洢�����ȡ���ݵ�buf,����жϴ洢��ȡ�������쳣�������0��������ʶ�������
+	//read_addr++
+	
+}
 
 
 
 void	SizhuV4SendParaInit(void)
 {
+	/*ͨѶ���*/
+	wrc_ctrl_para_g.time_out_time_sec = wrc_para_sizhu_g.comm_timeout_time; //��ʱʱ��
+	wrc_sizhuV4_result_flag = FAIL;
+	wrc_ctrl_para_g.wrc_restart_time_sec_cnt = wrc_para_sizhu_g.retransmission_interval ; //���ر����ʱ��
 	
-	
+	/*�����*/
 	protocol_head_up_g.frame_start_code = SIZHU_FRAME_HEAD;
 	arrayA_2_arrayB((uint8_t*)equipment_basic_inf_g.serial_number, (uint8_t*)&protocol_head_up_g.device_num, 8, LITTLE_ENDIAN);
 	protocol_head_up_g.data_start_code = SIZHU_DATA_HEAD;
@@ -52,31 +77,79 @@
 
 
 	#else
+	report_ctrl_para_g.current_report_data_num = wrc_data_num_ctrl_para_sizhu_g.report_data_save_num + wrc_data_num_ctrl_para_sizhu_g.report_data_left_num ;
+	report_ctrl_para_g.current_report_data_num = (report_ctrl_para_g.current_report_data_num > ONCE_REPORT_MAX_NUM)? ONCE_REPORT_MAX_NUM:report_ctrl_para_g.current_report_data_num; //�����ϱ�����
+//?	report_ctrl_para_g.report_data_read_addr = (current_save_addr,report_ctrl_para_g.current_report_data_num);
+	wrc_data_num_ctrl_para_sizhu_g.report_data_save_num =0 ;
+	wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = report_ctrl_para_g.current_report_data_num;
+	//?wrc_data_num_ctrl_para_sizhu_g�洢
+	
+	//������֡�������һ֡����
+	protocol_head_up_g.frame_sum = 1;
+	report_ctrl_para_g.last_frame_data_num = report_ctrl_para_g.current_report_data_num;																
+	while(report_ctrl_para_g.last_frame_data_num > FRAME_DATA_MAX)	{
+		report_ctrl_para_g.last_frame_data_num -= FRAME_DATA_MAX;
+		protocol_head_up_g.frame_sum ++;
+	}		
+																		
+	protocol_head_up_g.frame_num = 1;																	
 	
 	#endif
 
 }
 
 
-void DataAes128EcbEncrypt()
+void DataAes128EcbEncrypt(uint8_t KeyVer,uint8_t *buf_in,uint8_t *buf_out,uint16_t *length)
 {
+	uint8_t yushu;
+	uint8_t	fill_num;
+//	*length = ((*length % 16 )!=0) ? ((*length >>4) + 1)*16 : *length;
+	/*����16���������������16����������ȱN�����N��N*/
+	yushu = (*length) & 0x0f;
+	if(yushu != 0){
+		fill_num = 16 - yushu;
+		for(uint8_t count_i=0;count_i < fill_num ;count_i ++){
+			*(buf_in + *length + count_i) = fill_num;
+		}
+		*length = ((*length >>4) + 1) <<4;
+	}
+
+	//��16��Ϊһ����м���
+	for(uint16_t count_i =0;count_i < (*length >>4);count_i++){
+		
+		AES128_ECB_encrypt(buf_in + count_i*16, (u8*)wrc_para_sizhu_g.KVer_AES_128[KeyVer&0x7f], buf_out + count_i*16);
+	}
 	
+}
+
+void DataAes128EcbDecrypt(uint8_t KeyVer,uint8_t *buf_in,uint8_t *buf_out,uint16_t length)
+{
+	if(((length) & 0x0f)!=0)
+		return;
+
+	//��16��Ϊһ����н���
+	for(uint16_t count_i =0;count_i < (length >>4);count_i++){
+		
+		AES128_ECB_decrypt(buf_in + count_i*16, (u8*)wrc_para_sizhu_g.KVer_AES_128[KeyVer&0x7f], buf_out + count_i*16);
+	}
 	
 }
 
 
 
-
-void	SizhuV4SendNormalData(void)
+//�������ݳ���
+uint16_t	SizhuV4SendNormalData2buf(uint8_t * send_buf)
 {
-	uint8_t send_buf[1024] = {0};
+//	uint8_t send_buf[1024] = {0};
+	uint16_t	crc_addr;
+	uint8_t		current_frame_data_num;
 	SIZHU_V4_PROTOCOL_NORMAL_DATA_PACK_T	one_pack_data;
 	
 	arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, 8, LITTLE_ENDIAN);
 	
 	//�������
-	//���Է���һ֡��ǰ����
 	#ifdef	WRC_TEST_MODE_1
+	//���Է���һ֡��ǰ����
 	protocol_head_up_g.frame_sum = 1;
 	protocol_head_up_g.frame_num = 1;
 	protocol_head_up_g.data_length = DATA_PACKET_HEAD_LENGTH + DATA_PACKET_LENGTH;
@@ -100,18 +173,35 @@
 	arrayA_2_arrayB((uint8_t*)&one_pack_data, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU + DATA_PACKET_HEAD_LENGTH], DATA_PACKET_LENGTH, LITTLE_ENDIAN);
 	
 	#else
+	//?�Ӵ洢�����ȡ�����¼�����ϱ�
+	
+	current_frame_data_num = (protocol_head_up_g.frame_num < protocol_head_up_g.frame_sum)? FRAME_DATA_MAX:report_ctrl_para_g.last_frame_data_num;
+	
+	for(uint8_t count_i =0;count_i < current_frame_data_num;count_i++ ){
+		ReadDataFromRecord(&report_ctrl_para_g.report_data_read_addr ,(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU + DATA_PACKET_HEAD_LENGTH + count_i * DATA_PACKET_LENGTH]);
+	}
+	protocol_head_up_g.data_length = DATA_PACKET_HEAD_LENGTH + DATA_PACKET_LENGTH * current_frame_data_num;
+	data_head_g.data_pack_num = current_frame_data_num;
 	
 	#endif
 	
-	arrayA_2_arrayB((uint8_t*)&protocol_head_up_g, (uint8_t*)&send_buf[0], FIRST_DATA_SHIFT_SIZHU, LITTLE_ENDIAN);
 	arrayA_2_arrayB((uint8_t*)&data_head_g, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU], DATA_PACKET_HEAD_LENGTH, LITTLE_ENDIAN);
 	
 	//����
-
+	if((protocol_head_up_g.key_ver & 0x80) == 0x80){
+		DataAes128EcbEncrypt(protocol_head_up_g.key_ver,(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],(uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU],&protocol_head_up_g.data_length);
+	}
+	
+	//���ڼ������ᵼ�����ݳ��ȱ仯������֡ͷ��ת����Ҫ���ڼ���֮��
+	arrayA_2_arrayB((uint8_t*)&protocol_head_up_g, (uint8_t*)&send_buf[0], FIRST_DATA_SHIFT_SIZHU, LITTLE_ENDIAN);
 	
 	//����crc
-	
+	crc_addr = protocol_head_up_g.data_length + FIRST_DATA_SHIFT_SIZHU;
+	proto_tail_up_g.check_crc = usMBCRC16(0xFFFF, send_buf, crc_addr);
+	proto_tail_up_g.frame_end_code = SIZHU_FRAME_TAIL;
+	arrayA_2_arrayB((uint8_t*)&proto_tail_up_g, (uint8_t*)&send_buf[crc_addr], FRAME_TAIL_LENGTH, LITTLE_ENDIAN);
 	//����
+	return FIRST_DATA_SHIFT_SIZHU + protocol_head_up_g.data_length + FRAME_TAIL_LENGTH; 
 }
 
 
@@ -122,7 +212,7 @@
 
 
 
-WRC_STATUS	SizhuV4ProtocolDataAnalysis(uint8_t *receive_buf)
+WRC_STATUS	SizhuV4ProtocolDataAnalysis(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
 {
 	char *buf_p = NULL;
 	uint16_t count_i = 0;
@@ -143,17 +233,18 @@
 	}
 	
 	arrayA_2_arrayB((uint8_t*)buf_p, (uint8_t*)&protocol_head_rec, sizeof(protocol_head_rec), LITTLE_ENDIAN);
-	arrayA_2_arrayB((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length), (uint8_t*)&protocol_head_rec, 2, LITTLE_ENDIAN);
+	arrayA_2_arrayB((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length), (uint8_t*)&check_crc, 2, LITTLE_ENDIAN);
 
 	if(check_crc == usMBCRC16(0xFFFF,(uint8_t *)buf_p,FIRST_DATA_SHIFT_SIZHU + protocol_head_rec.data_length)){
-		uint8_t ack_buf[1024] = {0};	
-		
-		arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_rec.device_time, sizeof(sys_clockBCD_g), LITTLE_ENDIAN);
+
+		arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, sizeof(sys_clockBCD_g), LITTLE_ENDIAN);
+
 		
 		if((protocol_head_rec.key_ver & 0x80)==0x80){
 			//? ������Կ�Ž���
+			DataAes128EcbDecrypt(protocol_head_rec.key_ver,(uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),(uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),protocol_head_rec.data_length);
 		}else{
-			arrayA_2_arrayB((uint8_t*)buf_p, (uint8_t*)&ack_buf[FIRST_DATA_SHIFT_SIZHU], protocol_head_rec.data_length, LITTLE_ENDIAN);//����
+//			arrayA_2_arrayB((uint8_t*)buf_p, (uint8_t*)&ack_buf[FIRST_DATA_SHIFT_SIZHU], protocol_head_rec.data_length, LITTLE_ENDIAN);//����
 		}
 		
 		switch(protocol_head_rec.cmd_code_u16){
@@ -173,4 +264,4 @@
 	
 	return WRC_WAIT_REC_DATA;
 	
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3