| | |
| | | #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£¬×îÖÕ¸ù¾ÝÐÒéÈ·Èϱ¾´ÎͨѶÊÇ·ñ³É¹¦£¬±ÈÈç˼ÖþµÄÐÒéͨ¹ý½áÊøÖ¡ÅжÏÊÇ·ñ×îÖճɹ¦ |
| | |
| | | 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 |
| | |
| | | { |
| | | 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(((length) & 0x0f)!=0) |
| | | return; |
| | | |
| | | if((KeyVer&0x7f) > 8) |
| | | return; |
| | | |
| | | //°´16¸öΪһ×é½øÐнâÃÜ |
| | | for(uint16_t count_i =0;count_i < (length >>4);count_i++){ |
| | | |
| | |
| | | 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; |
| | |
| | | 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){ |
| | |
| | | |
| | | |
| | | |
| | | 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,uint8_t *ack_buf,uint16_t *ack_buf_length) |
| | |
| | | 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; //ÒÆµ½ÏÂÒ»¸ö¶ººÅ |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | |
| | | 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; |
| | | |
| | | } |