/*
 * @Description: 云模块-svc层-协议子模块
 * @Author: yangsw
 * @Date: 2021-05-21 16:27:42
 * @LastEditTime: 2024-01-15 09:14:32
 * @LastEditors: LiDa
 * @Reference: 
 */

#include "svc_cloud_protocol.h"
#include "svc_cloud.h"
//#include "param/svc/svc_flash.h"
#include "../../log/svc/svc_log.h"
#include "../../bat/svc/svc_bat.h"
#include "../../rtc/svc/svc_rtc.h"
#include "../../nb/svc/svc_nb_core.h"
#include "../../util/util_crc.h"
#include "../../util/util_data.h"
#include "../../util/util_aes.h"
#include "../../util/util_time.h"
#include "../../led/app/app_led.h"
#include "hci/led/app/sr_app_led.h"

static void Parse_Cmd_Code(E_Cmd_Code e_cmd_code,gw_u8* data,gw_u16 len);
static void Parse_Cmd03_Request_Info(gw_u8* data,gw_u16 len);     
static void Parse_Cmd06_Request_Historical_Data(gw_u8* data,gw_u16 len);
static void Creat_Upload_Day_Data(S_Flash_Day_Usage *day_usage);
static void Creat_Upload_Day_Real_Data(S_Flash_Day_Usage *day_usage);
static void Creat_Upload_Day_Hour_Data(S_Flash_Day_Usage *day_usage);
static void Creat_Upload_Day_Dense_Data(S_Flash_Day_Usage *day_usage);
static void Creat_Upload_Day_Alarm_Data(S_Flash_Day_Usage *day_usage);
static void Creat_Upload_Basic_Info(S_Flash_Device_Security *Device_Security);
static void Creat_Upload_Para_Data(S_Flash_Device_Para *Device_Para);
static void Creat_Rsp_Result(void);
static void Creat_Cmd02_Upload_Data(void);
static void Creat_Cmd83_Reply_Requset_Info(void);
static void Creat_Cmd05_Historical_Upload_Data(void);
static void Creat_Cmd86_Reply_Requset_Historical_Data(void);
static S_Cloud_Data s_cloud_data;
static S_Flash_Data *ps_flash_data;
S_Flash_Day_Usage   S_Flash_Updata_Day_Usage;

static const E_PARA_ID_Data e_para_id_data[CMD1_04_ID_NUM]={   
    {E_ID_0_LARGE_FLOW,4},
    {E_ID_1_LARGE_FLOW_DURATION,1},
    {E_ID_2_NEG_FLOW,4},
    {E_ID_3_NEG_FLOW_DURATION,1},
    {E_ID_4_BAT_ALARM,2},
    {E_ID_5_SERVER_ADD,32},
    {E_ID_6_APN,32},
    {E_ID_7_RESEND_TIMES,1},
    {E_ID_8_DISCRETE_TIME,13},
    {E_ID_9_START_STOP_ENABLE,1},
    {E_ID_10_COMM_CYCLE,1},
    // {E_ID_111_DENSE_START_TIME,1},    
    {E_ID_11_DENSE_START_TIME,1},
    {E_ID_23_BASE_NUMBER,4},
    {E_ID_24_PN,1},      

};

/**
 * @brief: 云模块协议初始化
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Init(void){
    // Svc_Log_Printf(LOG_DEBUG,"%s \r\n",__FUNCTION__);	
    ps_flash_data=Svc_Flash_Get_Data();
}

/**
 * @brief: 获取云模块相关数据结构体指针
 * @param  {void}
 * @return {S_Cloud_Data*} 云模块相关数据结构体指针
 * @note: 
 * @see: 
 */
S_Cloud_Data* Svc_Cloud_Get_Data(void){
    return &s_cloud_data;
}


/*************************************功能片段生成函数******************************************/

/**
 * @name: 平台设置参数应答
 * @return {*}
 * @note: 
 */
static void Creat_Rsp_Result(void){  
	
	gw_u16 u16DataLen;
    gw_u16 u16LenIndex;
	S_Data_Field   *ps_data_field	=	&s_cloud_data.s_data_field; 
    gw_u16 index	=	ps_data_field->u16Len;
    gw_u8 *buff	=	ps_data_field->pu8Buf;      

    // u16LenIndex=index;  						//数据域长度地址
    // index=index+2;    

    buff[index]=E_CMD_TAG_RESULT;   //Tag（结果码）
    index=index+1;

    buff[index]=1;      						//基础信息长度
    buff[index+1]=0;
    index=index+2;

    buff[index]=s_cloud_data.Cmd_Result;//结果码
    index=index+1;
       
    ps_data_field->u16Len=index; 
    // u16DataLen=ps_data_field->u16Len-u16LenIndex;
    // memcpy(&buff[u16LenIndex],&u16DataLen,2);  
}

void  Creat_Upload_Day_Real_Data_Printf(S_Flash_Day_Usage *day_usage){
    #if LOG_FUNC_ENABLE    
		S_Flash_Real_Usage *ps_real_usage = &day_usage->s_real_usage;
        S_Flash_Device_Para *ps_device_para = &ps_flash_data->s_para; 		
		Svc_Log_Printf(LOG_INFO, "--------Day Updata Real Data Info---------\r\n"); 	
		Svc_Log_Printf(LOG_INFO, "ps_real_usage->u32TotalUsage=%d\r\n",ps_real_usage->u32TotalUsage);
		Svc_Log_Printf(LOG_INFO, "ps_real_usage->u32TotalUsagePosMidnight=%d\r\n",ps_real_usage->u32TotalUsagePosMidnight);
		Svc_Log_Printf(LOG_INFO, "ps_real_usage->u32TotalUsageNegMidnight=%d\r\n",ps_real_usage->u32TotalUsageNegMidnight);
		Svc_Log_Printf(LOG_INFO, "ps_real_usage->u16MaxUsage=%d\r\n",ps_real_usage->u16MaxUsage);
		Svc_Cloud_Time_Printf("u8MaxUseTime",ps_real_usage->u8MaxUseTime);
	    Svc_Cloud_Time_Printf("u8InfoTime",ps_real_usage->u8InfoTime);
		Svc_Log_Printf(LOG_INFO, "ps_real_usage->u16BatVol=%d\r\n",ps_real_usage->u16BatVol);
		Svc_Log_Printf(LOG_INFO, "ps_device_para->u16PluseEqu=%d\r\n",ps_device_para->u16PluseEqu);        
    #endif        
}
static void Creat_Upload_Day_Real_Data(S_Flash_Day_Usage *day_usage){
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;     
	S_Flash_Real_Usage *ps_real_usage = &day_usage->s_real_usage;
    S_Flash_Device_Para *ps_device_para = &ps_flash_data->s_para;  
    buff[index]=E_CMD_TAG_REAL_DATA;//Tag（实时数据）
    index=index+1;
    buff[index]=37; //实时数据长度
    buff[index+1]=0;
    index=index+2;

	buff[index]=0;//实时数据 id
    index=index+1;
    memcpy(&buff[index],&ps_real_usage->u32TotalUsage,4);
    index=index+4;
    
	buff[index]=1;//实时数据 id
    index=index+1;   	
    memcpy(&buff[index],&ps_real_usage->u32TotalUsagePosMidnight,4);
    index=index+4;

	buff[index]=2;//实时数据 id
    index=index+1;   	
    memcpy(&buff[index],&ps_real_usage->u32TotalUsageNegMidnight,4);
    index=index+4;

	buff[index]=3;//实时数据 id
    index=index+1;   	
    memcpy(&buff[index],&ps_real_usage->u16MaxUsage,2);
    index=index+2;

	buff[index]=4;//实时数据 id
    index=index+1;   	
    memcpy(&buff[index],&ps_real_usage->u8MaxUseTime,6);
    index=index+6;

	buff[index]=5;//实时数据 id
    index=index+1;   	
    memcpy(&buff[index],&ps_real_usage->u8InfoTime,6);
    index=index+6;

	buff[index]=6;//实时数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_real_usage->u16BatVol,2);
    index=index+2;

    buff[index]=7;//实时数据 id
    index=index+1;

    buff[index] = ps_device_para->u16PluseEqu & 0x00FF;//lida add code
    index=index+1;

    s_cloud_data.s_data_field.u16Len=index; 
	#if LOG_FUNC_ENABLE 					
    Creat_Upload_Day_Real_Data_Printf(day_usage);		
    #endif    
		
}

void  Creat_Upload_Day_Hour_Data_Printf(S_Flash_Day_Usage *day_usage){
    #if LOG_FUNC_ENABLE    
		gw_u8 u8i;
		S_Flash_Hour_Usage  *ps_hour_usage = &day_usage->s_hour_usage;     		
		Svc_Log_Printf(LOG_INFO, "--------Day Updata Hour Data Info---------\r\n"); 	
		Svc_Cloud_Time_Printf("StartTime",day_usage->u8StartTime);
		Svc_Log_Printf(LOG_INFO, "ps_flash_data->s_para.u8HourPeriodTime=%d\r\n",ps_flash_data->s_para.u8HourPeriodTime);
		Svc_Log_Printf(LOG_INFO, "ps_hour_usage->u8RecordNumb=%d\r\n",ps_hour_usage->u8RecordNumb);
		for(u8i=0;u8i<ps_hour_usage->u8RecordNumb;u8i++){
			Svc_Log_Printf(LOG_INFO, "ps_hour_usage name=%d ,usage =%d\r\n",u8i,ps_hour_usage->u16RecordUse[u8i]);
		}
    #endif      		
}
static void Creat_Upload_Day_Hour_Data(S_Flash_Day_Usage *day_usage){
	gw_u16 u16Temp;  
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;  
	S_Flash_Hour_Usage  *ps_hour_usage = &day_usage->s_hour_usage;       
    buff[index]=E_CMD_TAG_HOUR_DATA;//Tag（周期数据） Tag 值 08
    index=index+1;
	if(ps_hour_usage->u8RecordNumb > 48){
		ps_hour_usage->u8RecordNumb = 48;
	}
    u16Temp=ps_hour_usage->u8RecordNumb*2+8;
    buff[index]=u16Temp&0x00ff; //周期数据长度
    buff[index+1]=(u16Temp>>8)&0x00ff; //周期数据长度
    index=index+2;
    memcpy(&buff[index],&day_usage->u8StartTime,6);
    index=index+6;
    memcpy(&buff[index],&ps_flash_data->s_para.u8HourPeriodTime,1);
    index=index+1;
    memcpy(&buff[index],&ps_hour_usage->u8RecordNumb,1);
    index=index+1;    
    memcpy(&buff[index],&ps_hour_usage->u16RecordUse,ps_hour_usage->u8RecordNumb*2);
    index=index+ps_hour_usage->u8RecordNumb*2;
    s_cloud_data.s_data_field.u16Len=index;
	#if LOG_FUNC_ENABLE    		
    Creat_Upload_Day_Hour_Data_Printf(day_usage);			
    #endif    		
}

void  Creat_Upload_Day_Dense_Data_Printf(S_Flash_Day_Usage *day_usage){
      #if LOG_FUNC_ENABLE 
		gw_u8 u8i;
		S_Flash_Dense_Usage *ps_dense_usage = &day_usage->s_Dense_usage;   		
		Svc_Log_Printf(LOG_INFO, "--------Day Updata Dense Data Info---------\r\n"); 	
		Svc_Cloud_Time_Printf("StartTime",ps_dense_usage->u8StartTime);
		Svc_Log_Printf(LOG_INFO, "ps_flash_data->s_para.u16DensePeriodTime=%d\r\n",ps_flash_data->s_para.u16DensePeriodTime);
		Svc_Log_Printf(LOG_INFO, "ps_dense_usage->u8RecordNumb=%d\r\n",ps_dense_usage->u8RecordNumb);
		for(u8i=0;u8i<ps_dense_usage->u8RecordNumb;u8i++){
			Svc_Log_Printf(LOG_INFO, "ps_dense_usage name=%d ,usage Pos  =%d   usage Neg  =%d\r\n",u8i,ps_dense_usage->u16RecordUsage[u8i][0],ps_dense_usage->u16RecordUsage[u8i][1]);
		}
        #endif        
}

static void Creat_Upload_Day_Dense_Data(S_Flash_Day_Usage *day_usage){ 
	gw_u16 u16Temp; 
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;    
	S_Flash_Dense_Usage *ps_dense_usage = &day_usage->s_Dense_usage;   
    buff[index]=E_CMD_TAG_DENSE_DATA;//水表密集数据(Tag 值 09)
    index=index+1;   
	if(ps_dense_usage->u8RecordNumb>48){
		ps_dense_usage->u8RecordNumb = 48;
	}
    u16Temp=ps_dense_usage->u8RecordNumb*4+8;
    buff[index]=u16Temp&0x00ff; //密集数据长度
    buff[index+1]=(u16Temp>>8)&0x00ff; //密集数据长度
    index=index+2;
    memcpy(&buff[index],&ps_dense_usage->u8StartTime,6);
    index=index+6;
	memcpy(&buff[index],&ps_flash_data->s_para.u16DensePeriodTime,1);		
    index=index+1;
    memcpy(&buff[index],&ps_dense_usage->u8RecordNumb,1);
    index=index+1;
    memcpy(&buff[index],&ps_dense_usage->u16RecordUsage,ps_dense_usage->u8RecordNumb*4);
    index=index+ps_dense_usage->u8RecordNumb*4;
    s_cloud_data.s_data_field.u16Len=index;
	#if LOG_FUNC_ENABLE   		
    Creat_Upload_Day_Dense_Data_Printf(day_usage);		
    #endif    		
}

void  Creat_Upload_Day_Alarm_Data_Printf(S_Flash_Day_Usage *day_usage){	
    #if LOG_FUNC_ENABLE    	
		S_Flash_Usage_Alarm *ps_usage_alarm=&day_usage->s_usage_alarm;    			
		Svc_Log_Printf(LOG_INFO, "--------Day Updata Alarm Data Info---------\r\n"); 	
		Svc_Log_Printf(LOG_INFO, "u8BatAlarm=%d\r\n",ps_usage_alarm->u8BatAlarm);
		Svc_Log_Printf(LOG_INFO, "u8MagneticAlarm=%d\r\n",ps_usage_alarm->u8MagneticAlarm);
		Svc_Log_Printf(LOG_INFO, "u8LargeFlowAlarm=%d\r\n",ps_usage_alarm->u8LargeFlowAlarm);	
		Svc_Cloud_Time_Printf("LargeFlowStartTime",ps_usage_alarm->u8LargeFlowStartTime);
		Svc_Log_Printf(LOG_INFO, "LargeFlowUsage=%d\r\n",ps_usage_alarm->u16LargeFlowUsage);	
	
		Svc_Log_Printf(LOG_INFO, "u8NegFlowAlarm=%d\r\n",ps_usage_alarm->u8NegFlowAlarm);	
		Svc_Cloud_Time_Printf("NegFlowStartTime",ps_usage_alarm->u8NegFlowStartTime);
		Svc_Log_Printf(LOG_INFO, "NegFlowUsage=%d\r\n",ps_usage_alarm->u16NegFlowUsage);	
	
		Svc_Log_Printf(LOG_INFO, "u8LightAlarm=%d\r\n",ps_usage_alarm->u8LightAlarm);
		Svc_Log_Printf(LOG_INFO, "u8PulseAlarm=%d\r\n",ps_usage_alarm->u8PulseAlarm);	
		Svc_Log_Printf(LOG_INFO, "u8MechSepar=%d\r\n",ps_usage_alarm->u8MechSepar);
        Svc_Log_Printf(LOG_INFO, "u8Measurement=%d\r\n",ps_usage_alarm->u8Measurement);//lida add code
    #endif		
}
static void Creat_Upload_Day_Alarm_Data(S_Flash_Day_Usage *day_usage){
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;    
	S_Flash_Usage_Alarm *ps_usage_alarm=&day_usage->s_usage_alarm;
	
    buff[index]=E_CMD_TAG_ALARM;//报警数据(Tag 值 05)
    index=index+1;   
    buff[index]=32; //报警数据长度  23.2.17yess - 修改 //lida add code
    buff[index+1]=0;
    index=index+2;

    buff[index]=0;//报警数据 id
    index=index+1;   
    memcpy(&buff[index],&ps_usage_alarm->u8BatAlarm,1);
    index=index+1;
    buff[index]=1;//报警数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8MagneticAlarm,1);
    index=index+1;
    buff[index]=2;//报警数据 id

    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8LargeFlowAlarm,1);
    index=index+1;
    memcpy(&buff[index],&ps_usage_alarm->u8LargeFlowStartTime,6);
    index=index+6;
    memcpy(&buff[index],&ps_usage_alarm->u16LargeFlowUsage,2);
    index=index+2;

    buff[index]=3;//报警数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8NegFlowAlarm,1);
    index=index+1;
    memcpy(&buff[index],&ps_usage_alarm->u8NegFlowStartTime,6);
    index=index+6;
    memcpy(&buff[index],&ps_usage_alarm->u16NegFlowUsage,2);
    index=index+2;

    buff[index]=4;//报警数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8LightAlarm,1);
    index=index+1;

    buff[index]=5;//报警数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8PulseAlarm,1);
    index=index+1;

    buff[index]=6;//报警数据 id
    index=index+1; 
    memcpy(&buff[index],&ps_usage_alarm->u8MechSepar,1);
    index=index+1;

    buff[index]=7;//报警数据 id
    index=index+1;
    memcpy(&buff[index],&ps_usage_alarm->u8Measurement,1);//lida add code
    index=index+1;
    s_cloud_data.s_data_field.u16Len=index; 

	#if LOG_FUNC_ENABLE  		
	    Creat_Upload_Day_Alarm_Data_Printf(day_usage); 			
	#endif   
}
/**
 * @brief: 
 * @param  {void}
 * @return {void}
 * @note: 
 * @see:
 */
static void Creat_Upload_Day_Data(S_Flash_Day_Usage *day_usage){
    // gw_u16 index=s_cloud_data.s_data_field.u16Len;
    // gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;         
    // gw_u16 u16DataLen;
    // gw_u16 u16LenIndex;
    // u16LenIndex=index;  //数据域长度地址
    // index=index+2;    
    // s_cloud_data.s_data_field.u16Len=index;
    Creat_Upload_Day_Real_Data(day_usage);
    Creat_Upload_Day_Hour_Data(day_usage);
    if(ps_flash_data->s_para.u8DenseEnable){
        Creat_Upload_Day_Dense_Data(day_usage);
    }
    Creat_Upload_Day_Alarm_Data(day_usage);    
    // u16DataLen=s_cloud_data.s_data_field.u16Len-u16LenIndex;
    // memcpy(&buff[u16LenIndex],&u16DataLen,2);
}

/**
 * @brief: 生成命令02-上报数据
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
static void Creat_Cmd02_Upload_Data(void){
    E_Result_State  	e_result_state;   
    gw_u8 						u8Day_Usage_Time[6];
    gw_u32 						u32Day_Usage_Time;
    gw_u8 						u8NowDayTime[6];
    gw_u32 						u32NowDayTime;
		
    if(ps_flash_data->s_para.u32ReportCycle==86400)
    {
		//取前一个系统值，防止上报时进行了时间校准由此产生时间
		Util_Time_Timestamp_To_Time(s_cloud_data.u32LastSystemTime,u8NowDayTime); 
        u8NowDayTime[3]=0;
        u8NowDayTime[4]=0;
        u8NowDayTime[5]=0;
        u32NowDayTime=Util_Time_Date_To_Timestamp(u8NowDayTime);
        if(u32NowDayTime>(60*60*24))
        {
			u32NowDayTime=u32NowDayTime-60*60*24;
			Util_Time_Timestamp_To_Time(u32NowDayTime,u8NowDayTime);
            for(gw_u8 i=0;i<FLASH_REPEAT_READ_NUM;i++){ 
			    e_result_state=Read_Day_Usage(&S_Flash_Updata_Day_Usage,u8NowDayTime);//取前一天数据
                if(e_result_state == E_STATE_SUCCESS)          //lida add code
                {
                    break;
                }
            }   
			if(e_result_state==E_STATE_SUCCESS)
            {
				memcpy(u8Day_Usage_Time,S_Flash_Updata_Day_Usage.u8StartTime,6); //
				u8Day_Usage_Time[3]=0;
				u8Day_Usage_Time[4]=0;
				u8Day_Usage_Time[5]=0;
				u32Day_Usage_Time=Util_Time_Date_To_Timestamp(u8Day_Usage_Time);
				if(u32Day_Usage_Time==u32NowDayTime)
                {
					e_result_state=E_STATE_SUCCESS;
					if(S_Flash_Updata_Day_Usage.u8SigReport==0)
                    {//（前一天数据）没上报过.继续上报
						e_result_state=E_STATE_SUCCESS;
					}
					else
                    { //（前一天数据）上报过,则取当天数据上报<<<<<<<<<<<<<<<<<22.2.17yess
//						e_result_state=E_STATE_ERROR;
						S_Flash_Updata_Day_Usage=ps_flash_data->s_usage_info.s_day_usage;//取当天数据
						e_result_state=E_STATE_SUCCESS;
					}
				}
				else
                {
					//一种填充0继续上报
					memset(&S_Flash_Updata_Day_Usage,0,sizeof(S_Flash_Updata_Day_Usage));
					memcpy(S_Flash_Updata_Day_Usage.u8StartTime,u8NowDayTime,6);
					S_Flash_Updata_Day_Usage.u8Sig =  FLASH_SIG_USED;
					e_result_state=E_STATE_SUCCESS;
					//一种不上报
					//e_result_state=E_STATE_ERROR;                
				}
			}
			else
            {
                    //一种填充0继续上报
                    memset(&S_Flash_Updata_Day_Usage,0,sizeof(S_Flash_Updata_Day_Usage));
                    memcpy(S_Flash_Updata_Day_Usage.u8StartTime,u8NowDayTime,6);
                    S_Flash_Updata_Day_Usage.u8Sig =  FLASH_SIG_USED;
                    e_result_state=E_STATE_SUCCESS;
                    //一种不上报
                    //e_result_state=E_STATE_ERROR;
            }
		}
		else
        {
//			e_result_state=E_STATE_ERROR;     
			S_Flash_Updata_Day_Usage=ps_flash_data->s_usage_info.s_day_usage;//取当天数据<<<<<<<<<<<<22.2.17yess
			e_result_state=E_STATE_SUCCESS;					
		}
    }
	else{
        S_Flash_Updata_Day_Usage=ps_flash_data->s_usage_info.s_day_usage;
        e_result_state=E_STATE_SUCCESS;
	}
    if(e_result_state==E_STATE_SUCCESS){
        Creat_Upload_Day_Data(&S_Flash_Updata_Day_Usage);
    }
    else{  
        Svc_Cloud_Clear_Event(E_Cloud_Event_Upload);
		Svc_Cloud_Resend_Clear();
		SR_AppLedClearFlag(LED_NB_NET_ERR);
		SR_AppLedSetFlag(LED_NB_NET_INIT);
		Parse_Cmd82_Reply_Data_Upload(0,0);
    }
}

static void Creat_Upload_Basic_Info(S_Flash_Device_Security *Device_Security){
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;   		
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info; 

    buff[index]=E_CMD_TAG_BASIC_INFO;//基础信息(Tag 值 03)
    index=index+1;

    buff[index]=40; //基础信息长度
    buff[index+1]=0;
    index=index+2;

    buff[index]=0;//基础信息ID
    index=index+1;
    memcpy(&buff[index],ps_nb->pu8Iccid,20);
    index=index+20;
    buff[index]=1;//基础信息ID
    index=index+1;
    buff[index]=Device_Security->pu8MeterChildType; 
    index++;

    buff[index]=2;//基础信息ID
    index=index+1;
    memcpy(&buff[index],&Device_Security->pu8MeterNum,7);
    index=index+7;
    
    buff[index]=3;//基础信息ID
    index=index+1;
    memcpy(&buff[index],&s_cloud_data.pu8CurTime,6);
    index=index+6;

    buff[index]=4;//基础信息ID
    index=index+1;
    buff[index]=Device_Security->pu8SoftVer; 
    index=index+1;
    s_cloud_data.s_data_field.u16Len=index; 
}

static void Creat_Upload_Para_Data(S_Flash_Device_Para *Device_Para){
    gw_u16 index=s_cloud_data.s_data_field.u16Len;
    gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;       

    buff[index]=E_CMD_TAG_PARA;//终端参数(Tag 值 04)
    index=index+1;
    buff[index]=133; //终端参数长度 lida add code
    buff[index+1]=0;
    index=index+2;

    buff[index]=0;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u32LargeFlowCutPoint,4);
    index=index+4;   
    buff[index]=1;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8LargeFlowDuration,1);
    index=index+1;
    buff[index]=2;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u32NegFlowCutPoint,4);
    index=index+4;
    buff[index]=3;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8NegFlowDuration,1);
    index=index+1;
    buff[index]=4;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u16BatAlarmVolt,2);
    index=index+2;
    buff[index]=5;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->s_nb_info.IpInfo,32);
    index=index+32;
    buff[index]=6;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->s_nb_info.u8Apn,32);
    index=index+32;
    buff[index]=7;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8ResendTimes,1);
    index=index+1;
    buff[index]=8;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8DiscreteStartTime,6);
    index=index+6;
    memcpy(&buff[index],&Device_Para->u8DiscreteStopTime,6);
    index=index+6;
    memcpy(&buff[index],&Device_Para->u8DiscreteStepTime,1);
    index=index+1;
    buff[index]=9;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8StartStopEnable,1);
    index=index+1;
    buff[index]=10;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8CommCycle,1);
    index=index+1;
    buff[index]=111;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8DenseStartTime,1);
    index=index+1;   

    buff[index]=12;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8HourPeriodTime,1);
    index=index+1;

    buff[index]=20;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u8ResendWaiteTime,1);
    index=index+1;

    buff[index]=21;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&Device_Para->u16DensePeriodTime,1);
    index=index+1;
    
    buff[index]=22;//终端参数ID
    index=index+1;
    memcpy(&buff[index],&ps_flash_data->s_security.pu8RunKey,16);
    index=index+16;

    buff[index]=23;//终端参数ID lida add code
    index=index+1;
    memcpy(&buff[index],&ps_flash_data->s_para.u32BaseUsage,4);
    index=index+4;

    buff[index]=24;//终端参数ID lida add code
    index=index+1;
    buff[index] = ps_flash_data->s_para.u16PluseEqu & 0x00FF;
    // memcpy(&buff[index],&ps_flash_data->s_para.u16PluseEqu,1);
    index=index+1;

    s_cloud_data.s_data_field.u16Len=index; 
}

static void Creat_Cmd83_Reply_Requset_Info(void){
    // gw_u16 index=s_cloud_data.s_data_field.u16Len;
    // gw_u8 *buff=s_cloud_data.s_data_field.pu8Buf;          
    // gw_u16 u16DataLen;
    // gw_u16 u16LenIndex;
    // u16LenIndex=index;  //数据域长度地址
    // index=index+2;
    // s_cloud_data.s_data_field.u16Len=index;    
    Creat_Upload_Basic_Info(&ps_flash_data->s_security); //基本信息
    Creat_Upload_Para_Data(&ps_flash_data->s_para);      //终端参数
    // u16DataLen=s_cloud_data.s_data_field.u16Len-u16LenIndex;
    // memcpy(&buff[u16LenIndex],&u16DataLen,2);            //数据域长度
}
static void  Creat_Cmd05_Historical_Upload_Data(void){
    gw_u8 u8Day_Usage_Time[6];    
    gw_u8 u8LastUpdataTime[6];
    gw_u8 u8LastHistoryUpdataTime[6];
    gw_u32 u32Day_Usage_Time;
    gw_u32 u32LastUpdataTime;
    gw_u32 u32LastHistoryUpdataTime; 
    memcpy(u8LastUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
    memcpy(u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,6);
    u8LastUpdataTime[3]=0;
    u8LastUpdataTime[4]=0;
    u8LastUpdataTime[5]=0;   
    u8LastHistoryUpdataTime[3]=0;
    u8LastHistoryUpdataTime[4]=0;
    u8LastHistoryUpdataTime[5]=0;
    u32LastUpdataTime=Util_Time_Date_To_Timestamp(u8LastUpdataTime);
    u32LastHistoryUpdataTime=Util_Time_Date_To_Timestamp(u8LastHistoryUpdataTime);
    while(1){     
	    // Svc_Wdg_Feed(1);
        Bsp_Iwdg_Feed();
        u32LastHistoryUpdataTime=u32LastHistoryUpdataTime+60*60*24;   
        Util_Time_Timestamp_To_Time(u32LastHistoryUpdataTime,u8LastHistoryUpdataTime);  
        //1历史时间超过日报时间 2超过存储容量 3历史上报与日上报相等,即没有要报的立等历史数据 
        //因为加了一天,那天时间是没有上报,所以必须跟日上报时间相等才是历史数据上报完了
        if((u32LastUpdataTime<u32LastHistoryUpdataTime)||
           (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))>90)||
           (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))==0)){
            memcpy(ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
            Svc_Cloud_Clear_Event(E_Cloud_Event_Upload_Historical);  
            return;
        }
        //下一条历史数据
        if(Read_Day_Usage(&S_Flash_Updata_Day_Usage,u8LastHistoryUpdataTime)==E_STATE_SUCCESS){ 
            memcpy(u8Day_Usage_Time,S_Flash_Updata_Day_Usage.u8StartTime,6);
            u8Day_Usage_Time[3]=0;
            u8Day_Usage_Time[4]=0;
            u8Day_Usage_Time[5]=0;
            u32Day_Usage_Time=Util_Time_Date_To_Timestamp(u8Day_Usage_Time);
            if(u32Day_Usage_Time==u32LastHistoryUpdataTime){ //核对时间
                //是否上报过  上报过则下一条,没上报则上报  
                if(S_Flash_Updata_Day_Usage.u8SigReport==0){        
                    Creat_Upload_Day_Data(&S_Flash_Updata_Day_Usage);
                    return;
                }                
            }
            else{   //时间不对 该天数据不存在 则填充缺失上报该年月日数据 
                memset(&S_Flash_Updata_Day_Usage,0,sizeof(S_Flash_Updata_Day_Usage));
                memcpy(S_Flash_Updata_Day_Usage.u8StartTime,u8LastHistoryUpdataTime,6);
                Creat_Upload_Day_Data(&S_Flash_Updata_Day_Usage);
                return;
            }            
        }
		else{
				memset(&S_Flash_Updata_Day_Usage,0,sizeof(S_Flash_Updata_Day_Usage));
				memcpy(S_Flash_Updata_Day_Usage.u8StartTime,u8LastHistoryUpdataTime,6);
				S_Flash_Updata_Day_Usage.u8Sig =  FLASH_SIG_USED;
				Creat_Upload_Day_Data(&S_Flash_Updata_Day_Usage);
				return;
		}
    }      
}
static void  Creat_Cmd86_Reply_Requset_Historical_Data(void){
    
    gw_u8 	u8Day_Usage_Time[6];    
    gw_u8 	u8RequestTime[6];
    gw_u32 	u32Day_Usage_Time;
    gw_u32 	u32RequestTime;
    
    memcpy(u8RequestTime,s_cloud_data.pu8RequestTime,6);    
    u8RequestTime[3]=0;
    u8RequestTime[4]=0;
    u8RequestTime[5]=0;
    u32RequestTime=Util_Time_Date_To_Timestamp(u8RequestTime);
    if(u32RequestTime<=(60*60*24)){
        s_cloud_data.Cmd_Result=RESULT_INFO_ERR;
        Creat_Rsp_Result();
        return;
    }
    u32RequestTime=u32RequestTime-(60*60*24);    
    Util_Time_Timestamp_To_Time(s_cloud_data.u32LastSystemTime,u8Day_Usage_Time);
    u8Day_Usage_Time[3]=0;
    u8Day_Usage_Time[4]=0;
    u8Day_Usage_Time[5]=0;   
    u32Day_Usage_Time=Util_Time_Date_To_Timestamp(u8Day_Usage_Time);
    //超过当前时间或者超过60天历史最早值 返回出错		23.2.18yess - 由90天修改为60天  23.4.25//lida add code更改为90天
    if((u32RequestTime>=u32Day_Usage_Time)||
       ((u32RequestTime+60*60*24*90)<=u32Day_Usage_Time)){	
        s_cloud_data.Cmd_Result=RESULT_INFO_ERR;
        Creat_Rsp_Result();
        return;
    }
    if(Read_Day_Usage(&S_Flash_Updata_Day_Usage,s_cloud_data.pu8RequestTime)==E_STATE_ERROR){
        s_cloud_data.Cmd_Result=RESULT_FAIL;
        Creat_Rsp_Result();
    }  
    else{
        memcpy(u8Day_Usage_Time,S_Flash_Updata_Day_Usage.u8StartTime,6);
        memcpy(u8RequestTime,s_cloud_data.pu8RequestTime,6);
        u8Day_Usage_Time[3]=0;
        u8Day_Usage_Time[4]=0;
        u8Day_Usage_Time[5]=0;          
        u32Day_Usage_Time=Util_Time_Date_To_Timestamp(u8Day_Usage_Time);
        if(u32Day_Usage_Time!=u32RequestTime){
            Util_Time_Timestamp_To_Time(u32RequestTime,u8RequestTime);
            memset(&S_Flash_Updata_Day_Usage,0,sizeof(S_Flash_Updata_Day_Usage));
            memcpy(S_Flash_Updata_Day_Usage.u8StartTime,u8RequestTime,6);
        }
        Creat_Upload_Day_Data(&S_Flash_Updata_Day_Usage);
    }    
}

/**
 * @brief: 生成数据域数据
 * @return {void}
 * @note: 
 * @see: Creat_Frame(E_Cmd_Code e_cmd_code)
 * @param {E_Cmd_Code} e_cmd_code 命令码
 */
static void Creat_User_Data(E_Cmd_Code e_cmd_code){
    switch (e_cmd_code)
    {   
    case E_CMD_01_SET_PARA:        
        break;
    case E_CMD_81_REPLY_SET_PARA:
        Creat_Rsp_Result();//
        break;
    case E_CMD_02_DATA_UPLOAD:
        Creat_Cmd02_Upload_Data();//数据上报
        break;
    case E_CMD_82_REPLY_DATA_UPLOAD:       
        break;
    case E_CMD_03_REQUEST_INFO:       
        break;
    case E_CMD_83_REPLY_REQUEST_INFO:
        Creat_Cmd83_Reply_Requset_Info();//
        break;
    case E_CMD_05_HISTORICAL_DATA_UPLOAD:
        Creat_Cmd05_Historical_Upload_Data();//
        break;
    case E_CMD_85_REPLY_HISTORICAL_DATA_UPLOAD:        
        break;
    case E_CMD_06_REQUEST_HISTORICAL_DATA:        
        break;
    case E_CMD_86_REPLY_REQUEST_HISTORICAL_DATA:
        Creat_Cmd86_Reply_Requset_Historical_Data();
        break;      
    default:
        break;
    }
}

void  Creat_Frame_Printf(void){		
        #if LOG_FUNC_ENABLE		
		Svc_Log_Printf(LOG_INFO, "--------Day Updata Info---------\r\n"); 	
		Svc_Log_Printf(LOG_INFO, "Rsrp=%d\r\n",s_cloud_data.s16Rsrp);
		Svc_Log_Printf(LOG_INFO, "Snr=%d\r\n",s_cloud_data.s16Snr);
		Svc_Log_Printf(LOG_INFO, "CoverLev=%d\r\n",s_cloud_data.u8CoverLev);	
		Svc_Log_Printf(LOG_INFO, "Csq=%d\r\n",s_cloud_data.u8Csq);	
        #endif  	
}

/**
 * @brief: 生成数据帧
 * @return {void}
 * @note: 主动上报数据帧、应答服务器帧
 * @see: 
 * @param {E_Cmd_Code} e_cmd_code 命令码
 */
static void Creat_Frame(E_Cmd_Code e_cmd_code){
	gw_u16 index=0;							//数据帧偏移指针	 
    gw_u16 u16Crc16;
	gw_u16 u16FrameLenIndex;		//帧长度字段在数据帧中的偏移量
    gw_u16 u16DataLenIndex;
    gw_u16 u16DataCrcIndex;
    gw_u16 u16DataCrcLen;    
	gw_s16 s16DataLen;					//数据域长度
	S_Flash_Data 		*ps_flash;
	S_Flash_Nb_Info *ps_nb;
	S_Data_Field   	*ps_data_field=&s_cloud_data.s_data_field;    
    gw_u8 *buff	= ps_data_field->pu8Buf;         
    
	ps_flash=Svc_Flash_Get_Data();
	ps_nb = &ps_flash->s_para.s_nb_info; 
    buff[index]=FRAME_HEAD1;//帧头1
    index=index+1;
    buff[index]=FRAME_HEAD2;//帧头2
    index=index+1;
    
    u16FrameLenIndex=index;	//记录数据域长度字段在数据帧中的偏移量
    index=index+1;					//帧长度 待填充
    index=index+1;   
    
    memcpy(&buff[index],&s_cloud_data.u16FrameSerial,2); 			//帧序列号
    index=index+2;
    buff[index]=ps_flash_data->s_security.u8ProtocolVer;			//协议版本号
    index=index+1;
    buff[index]=ps_flash_data->s_security.pu8FactoryNum;			//厂家编号
    index=index+1;
    buff[index]=ps_flash_data->s_security.pu8MeterChildType; 	//表类型
    index=index+1;
    memcpy(&buff[index],ps_nb->pu8Imei,15); 			//IMEI
    index=index+15;
    memcpy(&buff[index],&s_cloud_data.s16Rsrp,2); //RSRP   
    index=index+2;
    memcpy(&buff[index],&s_cloud_data.s16Snr,2); 	//SNR    
    index=index+2;
    buff[index]=s_cloud_data.u8CoverLev;		//覆盖等级 CoverLev
    index=index+1;
    buff[index]=s_cloud_data.u8Csq;					//信号质量CSQ
    index=index+1;   
    buff[index]=e_cmd_code;									//命令码
    index=index+1;
    buff[index]=s_cloud_data.u8AesEnable;		//加密标识
    index=index+1;
    
    u16DataLenIndex = index;
    index = index +2;
    u16DataCrcIndex = index;
    ps_data_field->u16Len=index; 						//数据域起始地址
		// Svc_Wdg_Feed(1);
    Bsp_Iwdg_Feed();
        Creat_User_Data(e_cmd_code);						//生成数据域数据
    Bsp_Iwdg_Feed();
		// Svc_Wdg_Feed(1);
    if(s_cloud_data.u8AesEnable){   				
			s16DataLen=ps_data_field->u16Len-u16DataCrcIndex;//计算数据域长度
            // Svc_Log_Print("s16DataLen = %d\r\n",s16DataLen); 
            // Bsp_Log_Send_Str("srcData:");
            // for(gw_u8 i = 0; i < s16DataLen; i++)
            // {
            //     Svc_Log_Print("%02x",buff[index+i]);                    
            //     // Bsp_Log_Send_Bytes(&buff[index],s16DataLen);
            // }
            // Bsp_Log_Send_Str("srcData---end");
            // Bsp_Log_Send_Bytes(&buff[index+i],s16DataLen);	
            // Bsp_Log_Send_Str("\r\n");
			Util_Aes_Set_Key(ps_flash_data->s_security.pu8RunKey,PKCS7_PADDING);  //密钥
			s16DataLen=Util_Aes_Ecb_Encrypt(&buff[index],s16DataLen,&buff[index]);  //加密
            // Svc_Log_Print("s16DataLenend = %d\r\n",s16DataLen); 
            // Bsp_Log_Send_Str("encrypt:");
            // for(gw_u8 i = 0; i < s16DataLen; i++)
            // {
            //     Svc_Log_Print("%02x",buff[index+i]);                    
            //     // Bsp_Log_Send_Bytes(&buff[index],s16DataLen);
            // }     
            // Bsp_Log_Send_Str("encrypt---end");               
            // // Bsp_Log_Send_Bytes(&buff[index],s16DataLen);	
            // Bsp_Log_Send_Str("\r\n");
			if(s16DataLen!=-1){
				index=index+s16DataLen;
			}        
    }
    else{		
			index=ps_data_field->u16Len;
	}	
    u16DataCrcLen = index - u16DataCrcIndex;
    memcpy(&buff[u16DataLenIndex],&u16DataCrcLen,2); //处理帧长度填充		
    ps_data_field->u16Len=index+3;    //帧尾加校验码
    memcpy(&buff[u16FrameLenIndex],&ps_data_field->u16Len,2); //处理帧长度填充	    
    /*计算CRC16*/
    u16Crc16=Util_Crc16(&buff[0],index); //CRC长度不对
    memcpy(&buff[index],&u16Crc16,2);
    index=index+2;
    buff[index]=FRAME_TAIL;//帧尾
    index++;      

	#if LOG_FUNC_ENABLE 			
	    Creat_Frame_Printf();			
	#endif   
		
}


/*************************************命令上报******************************************/

/**
 * @brief: 创建设置参数上报数据
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Reply_Set_Para(void){
    Creat_Frame(E_CMD_81_REPLY_SET_PARA);
    Svc_Nb_Core_Run_Post_Event(NB_EVENT_COAP_SEND);
    //Svc_Nb_Core_Run_Post_Event(NB_EVENT_GET_RSSI);
}

/**
 * @brief: 上报天用量数据
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Upload_Data(void){
    Creat_Frame(E_CMD_02_DATA_UPLOAD);
    Svc_Nb_Core_Run_Post_Event(NB_EVENT_COAP_SEND);
    //Svc_Nb_Core_Run_Post_Event(NB_EVENT_GET_RSSI);
}

/**
 * @brief: 信息查询上报数据
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Reply_Requset_Info(void){
    Creat_Frame(E_CMD_83_REPLY_REQUEST_INFO);
    Svc_Nb_Core_Run_Post_Event(NB_EVENT_COAP_SEND);
    //Svc_Nb_Core_Run_Post_Event(NB_EVENT_GET_RSSI);
}

/**
 * @brief: 历史数据补发
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Historical_Upload_Data(void){
    Creat_Frame(E_CMD_05_HISTORICAL_DATA_UPLOAD);
    Svc_Nb_Core_Run_Post_Event(NB_EVENT_COAP_SEND);
    //Svc_Nb_Core_Run_Post_Event(NB_EVENT_GET_RSSI);
}

/**
 * @brief: 读取历史数据上报
 * @param  {void}
 * @return {void}
 * @note: 
 * @see: 
 */
void Svc_Cloud_Protocol_Reply_Requset_Historical_Data(void){
    Creat_Frame(E_CMD_86_REPLY_REQUEST_HISTORICAL_DATA);
    Svc_Nb_Core_Run_Post_Event(NB_EVENT_COAP_SEND);
    //Svc_Nb_Core_Run_Post_Event(NB_EVENT_GET_RSSI);
}

/*************************************命令解析******************************************/

/**
 * @brief: 云模块协议解析
 * @return {void}
 * @note: 
 * @see: 
 * @param  {gw_u8*} data 待解析数据
 * @param {gw_u16} len 待解析长度
 */
void Svc_Cloud_Protocol_Parse(gw_u8* data,gw_u16 len){
    //S_Flash_Device_Security s_security;
    gw_u16 u16Crc16;
    gw_u16 u16CalCrc16;      
    E_Cmd_Code e_cmd_code;
    gw_u16  u16DataLen;
    gw_s16  s16FrameLen;     
    //s_security=ps_flash_data->s_security;
    //帧头、帧尾校验
    if((data[0]!=FRAME_HEAD1)||(data[1]!=FRAME_HEAD2)||(data[len-1])!=FRAME_TAIL){
        Svc_Log_Printf(LOG_ERROR,"Incomplete data frame\r\n");
        return;
    }   
    //帧长检查
    if(len<18){
        Svc_Log_Printf(LOG_ERROR,"frame len err\r\n");
        return;
    }
    s16FrameLen=((data[3]&0x00FF) << 8) | (0x00FF &data[2]); 
    if(len!=s16FrameLen){
        Svc_Log_Printf(LOG_ERROR,"frame len err\r\n");
        return;
    }
    //  帧序号
//    if((s_cloud_data.u16FrameSerial+1)!=(((data[5]&0x00FF) << 8) | (0x00FF &data[4]))){
//        Svc_Log_Printf(LOG_ERROR,"Frame Serial err");
//        return;
//    }
    s_cloud_data.u16FrameSerial=((data[5]&0x00FF) << 8) | (0x00FF &data[4]); 
    //  协议版本
    if(ps_flash_data->s_security.u8ProtocolVer!=data[6]){
         Svc_Log_Printf(LOG_ERROR,"Protocol Ver err\r\n");
        return;
    }    
    //crc16校验
    u16Crc16=((data[len-2]&0x00FF) << 8) | (0x00FF &data[len-3]);  
    u16CalCrc16=Util_Crc16(&data[0],len-3);
    if(u16Crc16!=u16CalCrc16){
        Svc_Log_Printf(LOG_ERROR,"crc16 check error:crc(0x%04X),cal_crc(0x%04X) \r\n",u16Crc16,u16CalCrc16);
        return;  
    }
    //上位机时间，年、月、日、时、分、秒
    s_cloud_data.u8ServerTime[0]=(0x00FF &data[7]);
    s_cloud_data.u8ServerTime[1]=(0x00FF &data[8]);
    s_cloud_data.u8ServerTime[2]=(0x00FF &data[9]);
    s_cloud_data.u8ServerTime[3]=(0x00FF &data[10]);
    s_cloud_data.u8ServerTime[4]=(0x00FF &data[11]);
    s_cloud_data.u8ServerTime[5]=(0x00FF &data[12]); 

    e_cmd_code=(E_Cmd_Code)data[13]; 
    s_cloud_data.u8AesEnable=(0x00FF &data[14]);
    
         

    if(s_cloud_data.u8AesEnable){         
		Util_Aes_Set_Key(ps_flash_data->s_security.pu8RunKey,PKCS7_PADDING);
		s16FrameLen=Util_Aes_Ecb_Decrypt(&data[17],&data[17],s16FrameLen-20);  //20是数据其他字段长度，包含帧起始符、帧长度等
		if(s16FrameLen!=-1){
			u16DataLen=s16FrameLen;
		}
		else{
			u16DataLen=0;
		}				
    }
	else{
		u16DataLen=s16FrameLen-20;
	}
    //数据域长度检查 与解密出来的长度进行比较
    s16FrameLen=((data[16]&0x00FF) << 8) | (0x00FF &data[15]); 
    if(u16DataLen!=s16FrameLen){		
		return;
	}
    //解析数据域
    Parse_Cmd_Code(e_cmd_code,&data[17],u16DataLen);
}

/**
 * @brief: 根据命令码解析数据域
 * @return {void}
 * @note: 
 * @see: 
 * @param {E_Cmd_Code} e_cmd_code 命令码
 * @param  {gw_u8*} data 待解析数据
 * @param {gw_u16} len 待解析数据长度
 */
static void Parse_Cmd_Code(E_Cmd_Code e_cmd_code,gw_u8* data,gw_u16 len){

    #if LOG_FUNC_ENABLE
        Svc_Log_Printf(LOG_INFO,"%s->cmd:0x%02X",__FUNCTION__,e_cmd_code);
    #endif
    switch (e_cmd_code)
    {
    case E_CMD_01_SET_PARA:       
        Parse_Cmd01_Set_Para(data,len);//设置参数
        break;
    case E_CMD_81_REPLY_SET_PARA:
        break;
    case E_CMD_02_DATA_UPLOAD:          
        break;
    case E_CMD_82_REPLY_DATA_UPLOAD:  
		Svc_Cloud_Resend_Clear( );
        Parse_Cmd82_Reply_Data_Upload(data,len);
        // Svc_Cloud_Set_Keep_Alive_Time(KEEP_ALIVE_TIME_MAX);
        s_cloud_data.u16FrameSerial=s_cloud_data.u16FrameSerial+1;
        break;
    case E_CMD_03_REQUEST_INFO:       
        Parse_Cmd03_Request_Info(data,len);
        break;
    case E_CMD_83_REPLY_REQUEST_INFO:
        break;
    case E_CMD_05_HISTORICAL_DATA_UPLOAD:
        break;
    case E_CMD_85_REPLY_HISTORICAL_DATA_UPLOAD:       
        Parse_Cmd85_Reply_Historical_Data_Upload(data,len);   
        //Svc_Cloud_Set_Keep_Alive_Time(KEEP_ALIVE_TIME_MAX);
        s_cloud_data.u16FrameSerial=s_cloud_data.u16FrameSerial+1;
        break;
    case E_CMD_06_REQUEST_HISTORICAL_DATA:       
        Parse_Cmd06_Request_Historical_Data(data,len);
        break;
    case E_CMD_86_REPLY_REQUEST_HISTORICAL_DATA:
        break;
    default:
        break;
    }
}
void Parse_Cmd82_Reply_Data_Upload(gw_u8* data,gw_u16 len){  

    gw_u8 u8Day_Usage_Time[6];
    gw_u32 u32Day_Usage_Time;
    gw_u8 u8LastUpdataTime[6];
    gw_u8 u8LastHistoryUpdataTime[6];
    gw_u32 u32LastUpdataTime;
    gw_u32 u32LastHistoryUpdataTime;
	
    memcpy(u8LastUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
    memcpy(u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,6);
    u8LastUpdataTime[3]=0;
    u8LastUpdataTime[4]=0;
    u8LastUpdataTime[5]=0;
    u8LastHistoryUpdataTime[3]=0;
    u8LastHistoryUpdataTime[4]=0;
    u8LastHistoryUpdataTime[5]=0;
    u32LastUpdataTime=Util_Time_Date_To_Timestamp(u8LastUpdataTime);
    if(S_Flash_Updata_Day_Usage.u8Sig==FLASH_SIG_USED){
        if(S_Flash_Updata_Day_Usage.u8SigReport==0){
            S_Flash_Updata_Day_Usage.u8SigReport=1;
            memcpy(u8Day_Usage_Time,S_Flash_Updata_Day_Usage.u8StartTime,6);           
            u8Day_Usage_Time[3]=0;
            u8Day_Usage_Time[4]=0;
            u8Day_Usage_Time[5]=0;
            u32Day_Usage_Time=Util_Time_Date_To_Timestamp(u8Day_Usage_Time);
            if(u32Day_Usage_Time>u32LastUpdataTime){
                u32LastUpdataTime=u32Day_Usage_Time;
                Util_Time_Timestamp_To_Time(u32LastUpdataTime,u8LastUpdataTime);
                memcpy(ps_flash_data->s_usage_info.u8LastUpdataTime,u8Day_Usage_Time,6);
            }
            // Write_Day_Usage(&S_Flash_Updata_Day_Usage); //lida add code
        }
    }
    // Svc_Cloud_Resend_Clear();
    Svc_Cloud_Clear_Event(E_Cloud_Event_Upload); 
    #if LOG_FUNC_ENABLE 
        Svc_Log_Printf(LOG_INFO,"%s->ENTER THIS PLACE",__FUNCTION__);        
        Svc_Cloud_Event_Info_Printf();
    #endif     
    u32LastUpdataTime=Util_Time_Date_To_Timestamp(u8LastUpdataTime);
    u32LastHistoryUpdataTime=Util_Time_Date_To_Timestamp(u8LastHistoryUpdataTime);
    if((u32LastUpdataTime<u32LastHistoryUpdataTime)||
        (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))>90)||
        (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))<=1)){
        memcpy(ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
    }
    else{
        Svc_Cloud_Post_Event(E_Cloud_Event_Upload_Historical);              
    }     
}
static void Parse_Cmd03_Request_Info(gw_u8* data,gw_u16 len){ 
    Svc_Cloud_Post_Event(E_Cloud_Event_Rsp_Info); 
}          
/**
 * @name: 上报历史数据
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
void Parse_Cmd85_Reply_Historical_Data_Upload(gw_u8* data,gw_u16 len){ 
   
    gw_u8 u8LastUpdataTime[6];
    gw_u8 u8LastHistoryUpdataTime[6];
    gw_u32 u32LastUpdataTime;
    gw_u32 u32LastHistoryUpdataTime;
    //更新历史上报时间
    memcpy(ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,S_Flash_Updata_Day_Usage.u8StartTime,6);

    if(S_Flash_Updata_Day_Usage.u8Sig==FLASH_SIG_USED){
        if(S_Flash_Updata_Day_Usage.u8SigReport==0){
            S_Flash_Updata_Day_Usage.u8SigReport=1;
            // Write_Day_Usage(&S_Flash_Updata_Day_Usage);    //lida add code     
        }
    }
    memcpy(u8LastUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
    memcpy(u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,6);
    u8LastUpdataTime[3]=0;
    u8LastUpdataTime[4]=0;
    u8LastUpdataTime[5]=0;
    u8LastHistoryUpdataTime[3]=0;
    u8LastHistoryUpdataTime[4]=0;
    u8LastHistoryUpdataTime[5]=0;
    u32LastUpdataTime=Util_Time_Date_To_Timestamp(u8LastUpdataTime);
    u32LastHistoryUpdataTime=Util_Time_Date_To_Timestamp(u8LastHistoryUpdataTime);
    if((u32LastUpdataTime<u32LastHistoryUpdataTime)||
        (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))>90)||
        (((u32LastUpdataTime-u32LastHistoryUpdataTime)/(60*60*24))<=1)){
        memcpy(ps_flash_data->s_usage_info.u8LastHistoryUpdataTime,ps_flash_data->s_usage_info.u8LastUpdataTime,6);
        Svc_Cloud_Clear_Event(E_Cloud_Event_Upload_Historical);
        #if LOG_FUNC_ENABLE 
            Svc_Log_Printf(LOG_INFO,"%s->ENTER THIS PLACE",__FUNCTION__);        
            Svc_Cloud_Event_Info_Printf();
        #endif                   
    }
    else{           
        Svc_Cloud_Post_Event(E_Cloud_Event_Upload_Historical);
        Svc_Cloud_Protocol_Historical_Upload_Data();           //历史数据上报命令生成              
    }    
} 
  
static void Parse_Cmd06_Request_Historical_Data(gw_u8* data,gw_u16 len){ 
    gw_u16 u16DataLen;        
    if(data[0]!=E_CMD_TAG_HIST_TIME){
        Svc_Log_Printf(LOG_ERROR,"Historical_Data code Error");
        return;
    }   
    u16DataLen=(((gw_u16)data[2]<<8)&0xFF00)|(data[1]&0x00FF);
    if(u16DataLen!=(len-3)||(len<3)||u16DataLen!=6){
        Svc_Log_Printf(LOG_ERROR,"Historical_Data Len Error");
        return;
    }      
    memcpy(s_cloud_data.pu8RequestTime,&data[3],6);   
    Svc_Cloud_Post_Event(E_Cloud_Event_Rsp_Historical);  
}

/*************************************命令应答******************************************/
/**
 * @brief: 解析命令01-服务器写入参数
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8*} data 待解析数据
 * @param {gw_u16} len  待解析数据长度
 */
static void Parse_Cmd01_Set_Para(gw_u8* data,gw_u16 len){   
    gw_u16 u16DataLen;
    E_PARA_ID   e_para_id;
    if(data[0]!=E_CMD_TAG_PARA){
        Svc_Log_Printf(LOG_ERROR,"Para Set code Error\r\n");
        return;
    }   
    u16DataLen=(((gw_u16)data[2]<<8)&0xFF00)|(data[1]&0x00FF);
    if(u16DataLen!=(len-3)||(len<3)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Len Error\r\n");
        return;
    }      
    e_para_id=(E_PARA_ID)data[3];
    switch(e_para_id){
    case E_ID_0_LARGE_FLOW:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_0_LARGE_FLOW(&data[4],u16DataLen,e_para_id);     
        break;
    case E_ID_1_LARGE_FLOW_DURATION:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_1_LARGE_FLOW_DURATION(&data[4],u16DataLen,e_para_id);         
        break;
    case E_ID_2_NEG_FLOW:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_2_NEG_FLOW(&data[4],u16DataLen,e_para_id);    
        break;
    case E_ID_3_NEG_FLOW_DURATION:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_3_NEG_FLOW_DURATION(&data[4],u16DataLen,e_para_id);   
        break;
    case E_ID_4_BAT_ALARM:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_4_BAT_ALARM(&data[4],u16DataLen,e_para_id); 
        break;
    case E_ID_5_SERVER_ADD:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_5_SERVER_ADD(&data[4],u16DataLen,e_para_id);   
        break;
    case E_ID_6_APN:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_6_APN(&data[4],u16DataLen,e_para_id);             
        break;
    case E_ID_7_RESEND_TIMES:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_7_RESEND_TIMES(&data[4],u16DataLen,e_para_id);              
        break;
    case E_ID_8_DISCRETE_TIME:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_8_DISCRETE_TIME(&data[4],u16DataLen,e_para_id);           
        break;
    case E_ID_9_START_STOP_ENABLE:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_9_START_STOP_ENABLE(&data[4],u16DataLen,e_para_id); 
        break;
    case E_ID_10_COMM_CYCLE:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_10_COMM_CYCLE(&data[4],u16DataLen,e_para_id);  
        break;
    // case E_ID_111_DENSE_START_TIME:
    //     s_cloud_data.Cmd_Result=E_Cmd01_04_ID_111_DENSE_START_TIME(&data[4],u16DataLen,e_para_id); 
    //     break;        
    case E_ID_11_DENSE_START_TIME:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_11_DENSE_START_TIME(&data[4],u16DataLen,e_para_id); 
        break;
    case E_ID_23_BASE_NUMBER:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_23_BASE_NUMBER(&data[4],u16DataLen,e_para_id); 
        break;
    case E_ID_24_PN:
        s_cloud_data.Cmd_Result=E_Cmd01_04_ID_24_PN(&data[4],u16DataLen,e_para_id); 
        break;
    default:
        s_cloud_data.Cmd_Result=RESULT_CMD_INVALID;
        break;
    }
    Svc_Cloud_Post_Event(E_Cloud_Event_Rsp_Set); 
}
/**
 * @brief: 查找
 * @return {E_PARA_ID *} 命令信息指针
 * @note: 
 * @see: 
 * @param {E_PARA_ID} e_para_id 
 */
E_PARA_ID_Data* Svc_Find_Cmd01_04_ID(E_PARA_ID e_para_id){
    int i=0;
    for( i=0;i<CMD1_04_ID_NUM;i++){
        if(e_para_id_data[i].e_para_id==e_para_id){
            return (E_PARA_ID_Data *)&e_para_id_data[i];
        }
    }
    return NULL;
}
/**
 * @name:  大流切断流量，（参数可由后台设置）
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_0_LARGE_FLOW(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id) {
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u32LargeFlowCutPoint=(((gw_u32)data[3]<<24)&0xFF000000)|(((gw_u32)data[2]<<16)&0x00FF0000)|(((gw_u32)data[1]<<8)&0x0000FF00)|(data[0]&0x000000FF);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code    
    return RESULT_SUCCESS;
}
/**
 * @name:  超大流量持续时间,单位：分，
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note:
 */
E_CMD_RESULT E_Cmd01_04_ID_1_LARGE_FLOW_DURATION(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u8LargeFlowDuration=data[0];
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);   //lida add code     
    return RESULT_SUCCESS;
}
/**
 * @name:  反流切断流量，（参数可由后台设置）
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_2_NEG_FLOW(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u32NegFlowCutPoint=(((gw_u32)data[3]<<24)&0xFF000000)|(((gw_u32)data[2]<<16)&0x00FF0000)|(((gw_u32)data[1]<<8)&0x0000FF00)|(data[0]&0x000000FF);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);   //lida add code     
    return RESULT_SUCCESS;
}
/**
 * @name: 反流持续时间,单位：分，断
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_3_NEG_FLOW_DURATION(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u8NegFlowDuration=data[0];
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);   //lida add code  
    return RESULT_SUCCESS;
}
/**
 * @name:  电压报警阀值,单位：0.01V
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_4_BAT_ALARM(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u16BatAlarmVolt=(((gw_u16)data[1]<<8)&0xFF00)|(data[0]&0x00FF);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code     
    return RESULT_SUCCESS;
}
/**
 * @name: IP端口设置
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_5_SERVER_ADD(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    memcpy(&ps_flash_data->s_para.s_nb_info.IpInfo,data,len);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code    
    return RESULT_SUCCESS;   
}
/**
 * @name: APN设置
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_6_APN(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }   
    memcpy(&ps_flash_data->s_para.s_nb_info.u8Apn,data,len);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code    
    return RESULT_SUCCESS;
}
/**
 * @name: 上报重连次数
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_7_RESEND_TIMES(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u8ResendTimes=data[0];
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code   
    return RESULT_SUCCESS;
}
/**
 * @name:  周期上报离散起始 时间
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_8_DISCRETE_TIME(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){    
    if(len!=13){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }   
    memcpy(&ps_flash_data->s_para.u8DiscreteStartTime,data,len);
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code    
    return RESULT_SUCCESS;   
}
E_CMD_RESULT E_Cmd01_04_ID_9_START_STOP_ENABLE(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){   
    return RESULT_SUCCESS;   
}
/**
 * @name: 设置上报重连次数
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_10_COMM_CYCLE(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    if((data[0]==1)||(data[0]==2)||(data[0]==3)||(data[0]==4)||(data[0]==6)||(data[0]==8)||(data[0]==12)||(data[0]==24)){
    ps_flash_data->s_para.u8ResendTimes=data[0];
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);   //lida add code 
    return RESULT_SUCCESS;
    }
    else{
        Svc_Log_Printf(LOG_ERROR,"Para Set Id 10 Para Error");
        return RESULT_INFO_ERR;
    }    
}
/**
 * @name: 设置表底数
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_23_BASE_NUMBER(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u32BaseUsage=(((gw_u32)data[3]<<24)&0xFF000000)|(((gw_u32)data[2]<<16)&0x00FF0000)|(((gw_u32)data[1]<<8)&0x0000FF00)|(data[0]&0x000000FF);;
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code
    return RESULT_SUCCESS;
}

/**
 * @name: 设置PN脉冲当量
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_24_PN(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    ps_flash_data->s_para.u16PluseEqu=(gw_u16)data[0];
    Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code  
    return RESULT_SUCCESS;
}

/**
 * @name: 密集上报采样起始时间
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @param {E_PARA_ID} e_para_id
 * @return {*}
 * @note: 
 */
E_CMD_RESULT E_Cmd01_04_ID_11_DENSE_START_TIME(gw_u8* data,gw_u16 len,E_PARA_ID e_para_id){
    E_PARA_ID_Data *para_id;  
    para_id=Svc_Find_Cmd01_04_ID(e_para_id);
    if((len==0)||(len>para_id->len)){
        Svc_Log_Printf(LOG_ERROR,"Para Set Id Len Error");
        return RESULT_FAIL;
    }
    if(data[0]<24){
        ps_flash_data->s_para.u8DenseStartTime=data[0];
        Svc_Flash_Write_Device_Para(&ps_flash_data->s_para);    //lida add code         
        return RESULT_SUCCESS;
    }
    else{
        Svc_Log_Printf(LOG_ERROR,"Para Set Id 111 Para Error");
        return RESULT_INFO_ERR;
    }    
}

/**
 * @brief: 更新时间戳
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u32} u32Time 时间戳
 */
void Svc_Cloud_Update_Time(gw_u32 u32Time){
    s_cloud_data.u32CurTime=u32Time;
}

/**
 * @brief: 刷新时间戳
 * @return {void}
 * @note: 
 * @see: 
 * @param {void}
 */
void Svc_Cloud_Refresh_Time(void){		    
    //上一次系统时间戳 只能放在这里 因为判断时间是否倒走,就是下面两个时间进行比较 
    //所以两个参数只能同时更新
    //Svc_Log_Printf(LOG_DEBUG,"%s \r\n",__FUNCTION__);	
    // Bsp_Com_Dis_Interrupts();    //关中断
    Svc_Rtc_Get_Time(&s_cloud_data.u32CurTime,&s_cloud_data.u32LastTime);
    Util_Time_Timestamp_To_Time(s_cloud_data.u32CurTime,s_cloud_data.pu8CurTime);
    Util_Time_Timestamp_To_Time(s_cloud_data.u32LastTime,s_cloud_data.pu8LastTime);
    // Bsp_Com_En_Interrupts(); 		
}

/**
 * @brief: Pulse用量信息打印
 * @return {void}
 * @note:
 * @see:
 * @param
 */
void Svc_Systemtime_Info_Printf(void)
{
	S_Flash_Data *ps_flash;     
	S_Cloud_Data	*ps_cloud_data;
	ps_flash = Svc_Flash_Get_Data();
	ps_cloud_data = Svc_Cloud_Get_Data();
		
    Svc_Log_Printf(LOG_INFO, "s_cloud_data.pu8CurTime = %d,%d,%d \r\n", s_cloud_data.pu8CurTime[3],s_cloud_data.pu8CurTime[4],s_cloud_data.pu8CurTime[5]);    
    Svc_Log_Printf(LOG_INFO, "s_cloud_data.pu8LastTime = %d,%d,%d \r\n", s_cloud_data.pu8LastTime[3],s_cloud_data.pu8LastTime[4],s_cloud_data.pu8LastTime[5]); 
    // 打印总流量
}

void Svc_Cloud_Time_Printf(char *PrintInfo,gw_u8 *PrintTime){	
	Svc_Log_Printf(LOG_INFO, "%s : %d-%d-%d,%d:%d:%d \r\n",PrintInfo,PrintTime[0],PrintTime[1],PrintTime[2],PrintTime[3],PrintTime[4],PrintTime[5]);
}

void Svc_Cloud_SysTime_Printf(void)
{
	Svc_Cloud_Time_Printf("now system time",s_cloud_data.pu8CurTime);
	Svc_Cloud_Time_Printf("last system time",s_cloud_data.pu8LastTime);	
}

E_Result_Check Svc_Cloud_Time_Check(char *FunctionName){			
    static E_Result_Check PrintFlag =E_CHECK_OK;			 		
    if(s_cloud_data.u32CurTime<s_cloud_data.u32LastTime){
        if(PrintFlag == E_CHECK_OK){
            #if LOG_FUNC_ENABLE		
                Svc_Log_Printf(LOG_INFO, "----------now system time < last system time------------- \r\n");  
                Svc_Cloud_SysTime_Printf();				
                Svc_Log_Printf(LOG_INFO,"%s \r\n",FunctionName);					 
                Svc_Log_Printf(LOG_ERROR,"s_cloud_data.u32CurTime = %d\r\n",s_cloud_data.u32CurTime);
                Svc_Log_Printf(LOG_ERROR,"s_cloud_data.u32LastTime = %d\r\n",s_cloud_data.u32LastTime);
                Svc_Log_Printf(LOG_ERROR,"s_cloud_data.u32SystemTime = %d\r\n",s_cloud_data.u32SystemTime);
                Svc_Log_Printf(LOG_ERROR,"s_cloud_data.u32LastSystemTime = %d\r\n",s_cloud_data.u32LastSystemTime);					
            #endif
        }
        PrintFlag = E_CHECK_FAIL;
        return E_CHECK_FAIL;
    }
    else{
        PrintFlag = E_CHECK_OK;
        return E_CHECK_OK;
    }	
}
/**
 * @brief: 获取当前时间戳
 * @param  {void}
 * @return {gw_u32} 当前时间戳
 * @note: 
 * @see: 
 */
gw_u32 Svc_Cloud_Get_Time(void){
    return s_cloud_data.u32CurTime;
}

/**
 * @brief: 设置通讯模组ICCID
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *pu8Iccid 通讯模组ICCID
 */
void Svc_Cloud_Set_Iccid(gw_u8 *pu8Iccid){	
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    if(memcmp(pu8Iccid,ps_nb->pu8Iccid,20)){
        memcpy(ps_nb->pu8Iccid,pu8Iccid,20);
        if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
        {	
            Svc_Flash_Write_Device_Para(&ps_flash->s_para);
        }
    }       
}
/**
 * @brief: 获取通讯模组ICCID
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *out_pu8Iccid 通讯模组ICCID
 */
void Svc_Cloud_Get_Iccid(gw_u8 *out_pu8Iccid){
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    memcpy(out_pu8Iccid,ps_nb->pu8Iccid,20);
}
/**
 * @brief: 设置通讯模组IMEI
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *pu8Imei 通讯模组IMEI
 */
void Svc_Cloud_Set_Imei(gw_u8 *pu8Imei){	
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    if(memcmp(pu8Imei,ps_nb->pu8Imei,15)){
        memcpy(ps_nb->pu8Imei,pu8Imei,15);	
        if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
        {        
            Svc_Flash_Write_Device_Para(&ps_flash->s_para);
        }
    }
}

/**
 * @brief: 获取通讯模组IMEI
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *out_pu8Imei 通讯模组IMEI
 */
void Svc_Cloud_Get_Imei(gw_u8 *out_pu8Imei){
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    memcpy(out_pu8Imei,ps_nb->pu8Imei,15);
}

/**
 * @brief: 设置通讯模组IMSI
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *pu8Imsi 通讯模组IMSI
 */
void Svc_Cloud_Set_Imsi(gw_u8 *pu8Imsi){	
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    if(memcmp(pu8Imsi,ps_nb->pu8Imsi,15)){
        memcpy(ps_nb->pu8Imsi,pu8Imsi,15);
        if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
        {        
            Svc_Flash_Write_Device_Para(&ps_flash->s_para);
        }
    }   
}

/**
 * @brief: 获取通讯模组IMSI
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *out_pu8Imsi 通讯模组IMSI
 */
void Svc_Cloud_Get_Imsi(gw_u8 *out_pu8Imsi){
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;	
    memcpy(out_pu8Imsi,ps_nb->pu8Imsi,15);
}

/**
 * @brief: 设置通讯模组NbVer
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *pu8NbVer 通讯模组NbVer
 */
void Svc_Cloud_Set_Nb_Ver(gw_u8 *pu8NbVer,gw_u8 u8Len){
	
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;
    if(memcmp(pu8NbVer,ps_nb->pu8NbVer,u8Len)){
        memcpy(ps_nb->pu8NbVer,pu8NbVer,u8Len);	
        if(Svc_Com_Sys_Get_Work_Mode() == E_NormalMode)
        {
            Svc_Flash_Write_Device_Para(&ps_flash->s_para);
        }
    }       
}

/**
 * @brief: 获取通讯模组NbVer
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8} *out_pu8Iccid 通讯模组NbVer
 */
void Svc_Cloud_Get_Nb_Ver(gw_u8 *out_pu8NbVer){
    S_Flash_Data *ps_flash;
    S_Flash_Nb_Info *ps_nb;
    ps_flash=Svc_Flash_Get_Data();
    ps_nb = &ps_flash->s_para.s_nb_info;	
    memcpy(out_pu8NbVer,ps_nb->pu8NbVer,sizeof(ps_nb->pu8NbVer));
}
