forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-05-23 e5ec6ffc2fa0c07785c9d797c3fd74fd3031059f
Function/WirelessRemoteComm/wrc_sizhu_v4.c
@@ -6,18 +6,44 @@
#include "main.h"
#include "rs485_data_analysis_pro.h"
#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£¬×îÖÕ¸ù¾ÝЭÒéÈ·Èϱ¾´ÎͨѶÊÇ·ñ³É¹¦£¬±ÈÈç˼ÖþµÄЭÒéͨ¹ý½áÊøÖ¡ÅжÏÊÇ·ñ×îÖճɹ¦
//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;
@@ -26,24 +52,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
@@ -52,35 +81,96 @@
   #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;
   
   if((KeyVer&0x7f) > 8)
      return;
//   *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;
   if((KeyVer&0x7f) > 8)
      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);
//   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
   //²âÊÔ·¢ËÍÒ»Ö¡µ±Ç°Êý¾Ý
   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;
@@ -100,36 +190,179 @@
   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;
   up_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);
   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){
      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;
}
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){
      //ÏàÓ¦³É¹¦
      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;
   //?µÚÒ»ÕëÉϱ¨³É¹¦Ö®ºóÇå³ý±¨¾¯×Ö£¬½öÓÐһ֡ʱûÓÐÊý¾ÝÏìÓ¦Ö¡£¬ÔòÔÚ½áÊøÖ¡ÖлòÆäËûƽ̨±ØÏµÄÖ¸ÁîÖÐÔÙ´ÎÇå³ý±¨¾¯×Ö
   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)
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;
   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; //¼ÓÃÜǰµÄ³¤¶È
   count_i =0;
   buf_p +=2;  //ÒÆµ½ÏÂÒ»¸ö¶ººÅ
@@ -143,26 +376,23 @@
   }
   
   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);
      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){
         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;
      }
      
@@ -171,6 +401,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;
}