From 6b0d1f644233b2984d2a87553de598879cf05caf Mon Sep 17 00:00:00 2001
From: jinlicong <493886250@qq.com>
Date: Tue, 28 May 2024 17:24:59 +0800
Subject: [PATCH] 继续完善
---
Function/WirelessRemoteComm/wrc_sizhu_v4.c | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 206 insertions(+), 33 deletions(-)
diff --git a/Function/WirelessRemoteComm/wrc_sizhu_v4.c b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
index fa4e781..ae55cbb 100644
--- a/Function/WirelessRemoteComm/wrc_sizhu_v4.c
+++ b/Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -8,12 +8,14 @@
#include "power_manage.h"
#include "AES128.h"
#include "system_general_para.h"
+#include "linked_list.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_NORMAL_DATA_HEAD_T up_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�����ո���Э��ȷ�ϱ���ͨѶ�Ƿ�ɹ�������˼����Э��ͨ������֡�ж��Ƿ����ճɹ�
+ErrorStatus report_sizhuV4_result_flag = FAIL; //�ϱ��Ƿ�ɹ���־������һ��֮����û���ϴ��ɹ�������wrc_sizhuV4_result_flagͨѶ�Ƿ�ɹ���һ��������һ�㣬ֻҪ�����ϱ���Ӧ�ɹ��������ϱ��ɹ����յ�����֡Ҳ����ɹ�
//static uint16_t current_report_data_num = 0;
@@ -51,24 +53,27 @@
protocol_head_up_g.cmd_code_u16 = SIZHU_CONTROL_CODE_DATAUP;
protocol_head_up_g.key_ver = KEY_VERSION + 0; //��0�Ų�����Կ����
- data_head_g.equipment_type = (0x02 <<6) + equipment_basic_inf_g.equipment_type;
- data_head_g.device_type = equipment_basic_inf_g.product_type;
- data_head_g.sys_send_type = wrc_ctrl_para_g.wrc_start_flag;
- arrayA_2_arrayB((uint8_t*)&link_info_g.ICCID, (uint8_t*)&data_head_g.iccid, 20, LITTLE_ENDIAN);
- data_head_g.signal_intensity = link_info_g.net_signal_intensity;
- if(data_head_g.signal_intensity > 20)
- data_head_g.signal_intensity_level = 1;
- else if(data_head_g.signal_intensity > 15)
- data_head_g.signal_intensity_level = 2;
+ up_data_head_g.equipment_type = (0x02 <<6) + equipment_basic_inf_g.equipment_type;
+ up_data_head_g.device_type = equipment_basic_inf_g.product_type;
+ up_data_head_g.sys_send_type = wrc_ctrl_para_g.wrc_start_flag;
+ arrayA_2_arrayB((uint8_t*)&link_info_g.ICCID, (uint8_t*)&up_data_head_g.iccid, 20, LITTLE_ENDIAN);
+ up_data_head_g.signal_intensity = link_info_g.net_signal_intensity;
+ if(up_data_head_g.signal_intensity > 20)
+ up_data_head_g.signal_intensity_level = 1;
+ else if(up_data_head_g.signal_intensity > 15)
+ up_data_head_g.signal_intensity_level = 2;
else
- data_head_g.signal_intensity_level = 3;
+ up_data_head_g.signal_intensity_level = 3;
- data_head_g.net_info = link_info_g.SIM_Type ;
- arrayA_2_arrayB((uint8_t*)main_equipment_hardware_software_inf_g.soft_serial_number, (uint8_t*)&data_head_g.software_version, 4, LITTLE_ENDIAN);
- data_head_g.account_state = __SYS_STATUS_BYTES_GET(account_state);
- arrayA_2_arrayB((uint8_t*)system_alarm_word_g.alarm_word_union, (uint8_t*)&data_head_g.alarm_word, 14, LITTLE_ENDIAN);
- data_head_g.valve_close_reason = save_valve_para_g.valve_close_ID ;
- data_head_g.data_package_format = 0;
+ up_data_head_g.net_info = link_info_g.SIM_Type ;
+ arrayA_2_arrayB((uint8_t*)main_equipment_hardware_software_inf_g.soft_serial_number, (uint8_t*)&up_data_head_g.software_version, 4, LITTLE_ENDIAN);
+ up_data_head_g.account_state = __SYS_STATUS_BYTES_GET(account_state);
+
+
+// arrayA_2_arrayB((uint8_t*)system_alarm_word_g.alarm_word_union, (uint8_t*)&up_data_head_g.alarm_word, 14, LITTLE_ENDIAN); //
+
+ up_data_head_g.valve_close_reason = save_valve_para_g.valve_close_ID ;
+ up_data_head_g.data_package_format = 0;
//���Է���һ֡��ǰ����
#ifdef WRC_TEST_MODE_1
@@ -103,6 +108,10 @@
{
uint8_t yushu;
uint8_t fill_num;
+
+ if((KeyVer&0x7f) > 8)
+ return;
+
// *length = ((*length % 16 )!=0) ? ((*length >>4) + 1)*16 : *length;
/*����16���������������16����������ȱN�����N��N*/
yushu = (*length) & 0x0f;
@@ -113,7 +122,7 @@
}
*length = ((*length >>4) + 1) <<4;
}
-
+
//��16��Ϊһ����м���
for(uint16_t count_i =0;count_i < (*length >>4);count_i++){
@@ -125,6 +134,9 @@
void DataAes128EcbDecrypt(uint8_t KeyVer,uint8_t *buf_in,uint8_t *buf_out,uint16_t length)
{
if(((length) & 0x0f)!=0)
+ return;
+
+ if((KeyVer&0x7f) > 8)
return;
//��16��Ϊһ����н���
@@ -146,6 +158,12 @@
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);
+// arrayA_2_arrayB((uint8_t*)system_alarm_word_g.alarm_word_union, (uint8_t*)&up_data_head_g.alarm_word, 14, LITTLE_ENDIAN); //ʱ��ͱ����ֻ���ʱ���£����Է����ϱ�ǰ��ֵ
+ //�����б����ֶ��ǽ�ռ1��Bit������£������û�|�����ӱ������������Խ��ϴ�δ�ϱ��ɹ������ֵ����µı����ּ����ϱ�
+ for(uint8_t count_i =0;count_i < 7;count_i ++){
+ up_data_head_g.alarm_word[count_i] |= system_alarm_word_g.alarm_word_union[count_i];
+ system_alarm_word_g.alarm_word_union[count_i] = 0;//ת���������
+ }
//�������
#ifdef WRC_TEST_MODE_1
@@ -153,7 +171,7 @@
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;
- data_head_g.data_pack_num = 1;
+ up_data_head_g.data_pack_num = 1;
arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&one_pack_data.sample_time, 8, LITTLE_ENDIAN);
one_pack_data.sc_cumulate = flow_meter_data_g.cumulate_s.forward_cumulate_sc * 10000;
@@ -181,11 +199,11 @@
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;
+ up_data_head_g.data_pack_num = current_frame_data_num;
#endif
- arrayA_2_arrayB((uint8_t*)&data_head_g, (uint8_t*)&send_buf[FIRST_DATA_SHIFT_SIZHU], DATA_PACKET_HEAD_LENGTH, LITTLE_ENDIAN);
+ arrayA_2_arrayB((uint8_t*)&up_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){
@@ -206,10 +224,136 @@
+WRC_STATUS DataReportAckPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
+{
+ WRC_STATUS return_code = WRC_WAIT_REC_DATA;
+ if(*receive_buf == 0x00){
+ //��Ӧ�ɹ�
+ report_sizhuV4_result_flag = PASS;
+ if(protocol_head_up_g.frame_num == 1){
+ //?��һ���ϱ��ɹ�֮����������֣�����һ֡ʱû��������Ӧ֡�����ڽ���֡�л�����ƽ̨���µ�ָ�����ٴ����������
+ for(uint8_t count_j =0;count_j < 7;count_j ++){
+ up_data_head_g.alarm_word[count_j] = 0;
+ }
+ }
+
+ if(protocol_head_up_g.frame_num < protocol_head_up_g.frame_sum){ //����֡��û����
+
+ return_code = WRC_SEND_DATA;
+ protocol_head_up_g.frame_num ++;
+ }
+ }
+
+ if(wrc_data_num_ctrl_para_sizhu_g.report_data_left_num >= FRAME_DATA_MAX){
+ wrc_data_num_ctrl_para_sizhu_g.report_data_left_num -= FRAME_DATA_MAX;
+ }else{
+ wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = 0;
+ }
+ //? �洢
+ *ack_buf_length = 0; //������Ӧ��������0
+ return return_code;
+}
+WRC_STATUS EndFramePro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
+{
+ WRC_STATUS return_code = WRC_OFF;
+ int difference_value;
+
+ wrc_sizhuV4_result_flag = PASS;
+ report_sizhuV4_result_flag = PASS;
+
+ //?��һ���ϱ��ɹ�֮����������֣�����һ֡ʱû��������Ӧ֡�����ڽ���֡�л�����ƽ̨���µ�ָ�����ٴ����������
+ for(uint8_t count_j =0;count_j < 7;count_j ++){
+ up_data_head_g.alarm_word[count_j] = 0;
+ }
+
+ //?�Զ�Уʱ,ʱ������5�����Զ�Уʱ
+ difference_value = Datecmp(receive_buf, (uint8_t *)&sys_clockBCD_g);
+ difference_value = abs(difference_value); // ����ֵ
+ if(difference_value >= 300){
+ Set_Extern_Rtc_Time(receive_buf[0],receive_buf[1],receive_buf[2],1,receive_buf[3],receive_buf[4],receive_buf[5]);
+ }
+ //�����������
+ wrc_data_num_ctrl_para_sizhu_g.report_data_left_num = 0;
+ //? �洢
+
+ *ack_buf_length = 0; //������Ӧ��������0
+ return return_code;
+}
+
+WRC_STATUS SetKeyPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
+{
+ WRC_STATUS return_code = WRC_WAIT_REC_DATA;
+
+ //����8����Ӫ��Կ
+ arrayA_2_arrayB(receive_buf, (uint8_t*)&wrc_para_sizhu_g.KVer_AES_128[1], 8*16, LITTLE_ENDIAN);
+ //?�洢
+
+ ack_buf[0] = 0;//�ɹ�
+ *ack_buf_length = 1; //����ǰ�����ݳ���
+ return return_code;
+}
+
+WRC_STATUS PushSettlementInfoPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
+{
+ WRC_STATUS return_code = WRC_WAIT_REC_DATA;
+
+ int64_t recv_cumulate_sc,now_cumulate_sc,balance;
+ uint32_t price;
+ uint8_t ladder;
+
+ arrayA_2_arrayB(receive_buf + 6, (uint8_t*)&recv_cumulate_sc, sizeof(recv_cumulate_sc), LITTLE_ENDIAN);
+ arrayA_2_arrayB(receive_buf + 14, (uint8_t*)&balance, sizeof(balance), LITTLE_ENDIAN);
+ arrayA_2_arrayB(receive_buf + 22, (uint8_t*)&price, sizeof(price), LITTLE_ENDIAN);
+ ladder = *(receive_buf + 26);
+
+ save_realtime_data_g.realtime_billing_data_s.price_now = price;
+ save_realtime_data_g.realtime_billing_data_s.ladder_now = ladder;
+ now_cumulate_sc = save_realtime_data_g.realtime_flow_data_s.forward_cumulate_sc * 10000;
+ if(now_cumulate_sc > recv_cumulate_sc){
+ //�����������ǰ����������Ҫ���ۣ�������ƽ̨������
+ save_realtime_data_g.realtime_billing_data_s.balance_now = balance * 0.001 - (now_cumulate_sc - recv_cumulate_sc)*0.0001 * price * 0.0001;
+ }else{
+ save_realtime_data_g.realtime_billing_data_s.balance_now = balance * 0.001;
+ }
+
+ //?�洢
+
+ ack_buf[0] = 0;//�ɹ�
+ *ack_buf_length = 1; //����ǰ�����ݳ���
+ return return_code;
+}
+
+WRC_STATUS SetAccountPro(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
+{
+ WRC_STATUS return_code = WRC_WAIT_REC_DATA;
+
+ ack_buf[0] = 0;//�ɹ�
+
+ if(*receive_buf == 1){
+ if(__SYS_STATUS_BYTES_GET(account_state) == RESET){
+ __SYS_STATUS_BYTES_STATUS(account_state, SET, ALARM_ID_NORMAL);
+ system_function_ctrl_word_g.fun_ctrl_word.account_open = 1;
+ //?�洢
+ }
+ }else if(*receive_buf == 2){
+ if(__SYS_STATUS_BYTES_GET(account_state) == SET){
+ __SYS_STATUS_BYTES_STATUS(account_state, RESET, ALARM_ID_NORMAL);
+ system_function_ctrl_word_g.fun_ctrl_word.account_open = 0;
+ //?�洢
+ }
+
+ }else{
+ ack_buf[0] = 1;//ʧ��
+ }
+
+// ack_buf[0] = 0;//�ɹ�
+ *ack_buf_length = 1; //����ǰ�����ݳ���
+ return return_code;
+}
WRC_STATUS SizhuV4ProtocolDataAnalysis(uint8_t *receive_buf,uint8_t *ack_buf,uint16_t *ack_buf_length)
@@ -218,8 +362,10 @@
uint16_t count_i = 0;
SIZHU_V4_PROTOCOL_HEAD_T protocol_head_rec;
uint16_t check_crc;
+ uint16_t crc_addr;
+ WRC_STATUS return_code = WRC_WAIT_REC_DATA;
// uint8_t key_ver;
-
+ uint16_t ack_data_length = 0; //����ǰ�ij���
count_i =0;
buf_p +=2; //�Ƶ���һ������
@@ -236,10 +382,6 @@
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)){
-
- 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);
@@ -248,12 +390,12 @@
}
switch(protocol_head_rec.cmd_code_u16){
- case SIZHU_CONTROL_CODE_DATAUP :; //?������
-
-
-
-
-
+ case SIZHU_CONTROL_CODE_DATAUP : return_code = DataReportAckPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
+ case SIZHU_CONTROL_CODE_END : return_code = EndFramePro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
+ case SIZHU_CONTROL_CODE_MODIFY_KEY : return_code = SetKeyPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
+ case SIZHU_CONTROL_CODE_PUSH_SETTLEMENT_INFO : return_code = PushSettlementInfoPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
+ case SIZHU_CONTROL_CODE_ACCOUNT_STATUS : return_code = PushSettlementInfoPro((uint8_t*)(buf_p + FIRST_DATA_SHIFT_SIZHU),ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length); break;
+ //?������
default: break;
}
@@ -262,6 +404,37 @@
}
- return WRC_WAIT_REC_DATA;
+ if(ack_data_length > 0){
+ //��Ҫ��Ӧ���ݣ�
+ //��������ͷ��ֵ
+ arrayA_2_arrayB((uint8_t*)&sys_clockBCD_g, (uint8_t*)&protocol_head_up_g.device_time, sizeof(sys_clockBCD_g), LITTLE_ENDIAN);
+ protocol_head_up_g.frame_num =1;
+ protocol_head_up_g.frame_sum = 1;
+ protocol_head_up_g.cmd_code_u16 = protocol_head_rec.cmd_code_u16;
+ protocol_head_up_g.key_ver = protocol_head_rec.key_ver;
+
+ //���ܸ������е���Կ�汾���ܴ���
+ if((protocol_head_rec.key_ver & 0x80) == 0x80){
+ DataAes128EcbEncrypt(protocol_head_rec.key_ver,ack_buf + FIRST_DATA_SHIFT_SIZHU,ack_buf + FIRST_DATA_SHIFT_SIZHU,&ack_data_length);
+ protocol_head_up_g.data_length = ack_data_length;
+ }else{
+ protocol_head_up_g.data_length = ack_data_length;
+ }
+
+ //ͷ�ṹ�崦�����֮��ת��buf
+ arrayA_2_arrayB((uint8_t*)&protocol_head_up_g, ack_buf, 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, ack_buf, crc_addr);
+ proto_tail_up_g.frame_end_code = SIZHU_FRAME_TAIL;
+ arrayA_2_arrayB((uint8_t*)&proto_tail_up_g, (uint8_t*)&ack_buf[crc_addr], FRAME_TAIL_LENGTH, LITTLE_ENDIAN);
+
+ //������ӦBuf���ܳ���
+ *ack_buf_length = FIRST_DATA_SHIFT_SIZHU + protocol_head_up_g.data_length + FRAME_TAIL_LENGTH;
+ }else{
+ *ack_buf_length = 0; //����ҪӦ������0
+ }
+
+ return return_code;
}
--
Gitblit v1.9.3