#include "svc_ir_protocol.h"
#include "../../log/svc/svc_log.h"
#include "../../com/svc/svc_com.h"
#include "param/svc/svc_flash.h"
#include "../../util/util_data.h"
#include "../../bat/svc/svc_bat.h"
#include "../../rtc/svc/svc_rtc.h"
#include "../../util/util_crc.h"
#include "../../util/util_time.h"
#include "../../timer/svc/svc_timer.h"
#include "../../cloud/svc/svc_cloud_protocol.h"
#include "../../cloud/svc/svc_cloud.h"
#include "../../pulse/svc/svc_pulse.h"
#include "../../pulse/svc/svc_pulse_usart.h"
#include "../../factory/svc/svc_factory.h"

static S_Ir_OtaData s_ir_otadata;
static S_Ir_Data    s_ir_data;
static void Parse_Cmd_Code(gw_u8* data,gw_u16 len);
static void Parse_Cmd41(gw_u8* data,gw_u16 len);
static void Parse_Cmd81(gw_u8* data,gw_u16 len);
static void Parse_CmdA0(gw_u8* data,gw_u16 len);
static void Parse_CmdA1(gw_u8* data,gw_u16 len);
static void Parse_CmdA2(gw_u8* data,gw_u16 len);
static void Parse_CmdC0(gw_u8* data,gw_u16 len);
static void Parse_CmdC3(gw_u8* data,gw_u16 len);
static void Rsp(S_Ir_OtaData *s_ir_otadata);
static void Creat_Head_Field(S_Ir_OtaData *s_ir_otadata);
static E_Result_State Creat_Data_Field(S_Ir_OtaData *s_ir_otadata);
static E_Result_State Creat_Check_Field(S_Ir_OtaData *s_ir_otadata);
static E_Result_State Creat_Ir_Frame(S_Ir_OtaData *s_ir_otadata);
static E_Result_State Creat_Ir_OtaFrame(S_Ir_OtaData *s_ir_otadata);
static E_Result_State Creat_OtaData_Field(S_Ir_OtaData *s_ir_otadata);
static void RspOta(S_Ir_OtaData *s_ir_otadata);
static void Ir_Send_Cmd(const gw_u8* Rsp_List,gw_u8 u8ListNum);
//"Len":" 50",
static gw_u16 Add_Item_Len(gw_u8* pu8Buf,gw_u16 u16Index);
//"all params":
static gw_u16 Add_Item_All(gw_u8* pu8Buf,gw_u16 u16Index);
//"NB":
static gw_u16 Add_Item_NB(gw_u8* pu8Buf,gw_u16 u16Index);
//TM 系统时间
static gw_u16 Add_Item_Unit_TM(gw_u8* pu8Buf,gw_u16 u16Index);
//SN 1234567980 设备编号，范围 1~20 位
static gw_u16 Add_Item_Sn(gw_u8* pu8Buf,gw_u16 u16Index);
//M_T 1表类型 1：水表， 2：气表，3：热量表，
static gw_u16 Add_Item_Unit_M_T(gw_u8* pu8Buf,gw_u16 u16Index);
//Mod 2 计量模式 0：双干簧管； 1：单干簧管； 2：双霍尔； 3：直读；
//4：无磁电感； 5：无磁线圈；6：三霍尔； 7：单霍尔；
static gw_u16 Add_Item_Unit_Mod(gw_u8* pu8Buf,gw_u16 u16Index);
//PN 3脉冲常数，1-1L/P； 2-10L/P； 3-100L/P； 4-1000L/P；
static gw_u16 Add_Item_Unit_PN(gw_u8* pu8Buf,gw_u16 u16Index);    
//MAX L 9999900 最大计量脉冲数
static gw_u16 Add_Item_Unit_Max_L(gw_u8* pu8Buf,gw_u16 u16Index);
//L 9900 表底数    
static gw_u16 Add_Item_Unit_Base_L(gw_u8* pu8Buf,gw_u16 u16Index);
//valve 1 阀门状态，0：开阀； 1：关阀；2：空闲； 3：正在动作；   
static gw_u16 Add_Item_Unit_Vavle(gw_u8* pu8Buf,gw_u16 u16Index);
//type 1 阀门类型，0：两线； 1：五线阀； 2：无阀；   
static gw_u16 Add_Item_Unit_Type(gw_u8* pu8Buf,gw_u16 u16Index);
//Ver 1.00 设备程序版本号 V1.00   
static gw_u16 Add_Item_Unit_Ver(gw_u8* pu8Buf,gw_u16 u16Index);
//IP 180.101.147.115:5683 IP 地址为 180.101.147.115，端口号为 5683
static gw_u16 Add_Item_Unit_IP(gw_u8* pu8Buf,gw_u16 u16Index);
static gw_u16 Add_Item_Unit_IMEI(gw_u8* pu8Buf,gw_u16 u16Index);
static gw_u16 Add_Item_Unit_IMSI(gw_u8* pu8Buf,gw_u16 u16Index);
static gw_u16 Add_Item_Unit_ICCID(gw_u8* pu8Buf,gw_u16 u16Index);
//RSSI -100.1 信号强度  
static gw_u16 Add_Item_Unit_RSSI(gw_u8* pu8Buf,gw_u16 u16Index);
//SNR 12 信噪比  
static gw_u16 Add_Item_Unit_SNR(gw_u8* pu8Buf,gw_u16 u16Index);
//CellID 12345 物理小区 ID
static gw_u16 Add_Item_Unit_CellID(gw_u8* pu8Buf,gw_u16 u16Index);
// NB_Ver BC95B5JBR01A02W NB 模组版本
static gw_u16 Add_Item_Unit_NB_Ver(gw_u8* pu8Buf,gw_u16 u16Index);
//PME 0 计费功能 0：失能 1：使能    
static gw_u16 Add_Item_Unit_PME(gw_u8* pu8Buf,gw_u16 u16Index);
//OW 2000 可透支量，单位：L 
static gw_u16 Add_Item_Unit_OW(gw_u8* pu8Buf,gw_u16 u16Index);
//AW 1000 余量报警值，单位：L   
static gw_u16 Add_Item_Unit_AW(gw_u8* pu8Buf,gw_u16 u16Index);
//VP 1疏通阀门周期，单位次数/月 （0~4）  
static gw_u16 Add_Item_Unit_VP(gw_u8* pu8Buf,gw_u16 u16Index);
//ACV 0 磁攻击关阀，0：失能 1：使能
static gw_u16 Add_Item_Unit_ACV(gw_u8* pu8Buf,gw_u16 u16Index);
//PSM 0 PSM 模式，0：失能 1：使能
static gw_u16 Add_Item_Unit_PSM(gw_u8* pu8Buf,gw_u16 u16Index);   
//APN ctnb 设置 APN
static gw_u16 Add_Item_Unit_APN(gw_u8* pu8Buf,gw_u16 u16Index);
//PLMN 46000 设置 PLMN    
static gw_u16 Add_Item_Unit_PLMN(gw_u8* pu8Buf,gw_u16 u16Index);
//BAND 5 设置 BAND   
static gw_u16 Add_Item_Unit_Band(gw_u8* pu8Buf,gw_u16 u16Index);
//NWP 0 设置网络协议，0：CAOP 1：UDP
static gw_u16 Add_Item_Unit_NWP(gw_u8* pu8Buf,gw_u16 u16Index);
//CWE 1密集流量采样使能，0：失能 1：使能
static gw_u16 Add_Item_Unit_CWE(gw_u8* pu8Buf,gw_u16 u16Index);
//CWT 60 密集流量采样周期，单位：min，范围 15~720，必须为 60 的约数或倍数，
//可设置的值为：15,20,30,60,120,240,360,720   
static gw_u16 Add_Item_Unit_CWT(gw_u8* pu8Buf,gw_u16 u16Index);
//RI 2004 上报区间 是 20:00:00 ~ 22:00:0    
static gw_u16 Add_Item_Unit_RI(gw_u8* pu8Buf,gw_u16 u16Index);
//RT 2 重发的次数是 2
static gw_u16 Add_Item_Unit_RT(gw_u8* pu8Buf,gw_u16 u16Index);
//RFM 0 非实时下行
static gw_u16 Add_Item_Unit_RFM(gw_u8* pu8Buf,gw_u16 u16Index);
//GRP 1 RF 信道组
static gw_u16 Add_Item_Unit_GRP(gw_u8* pu8Buf,gw_u16 u16Index);
//Bom_V 5000 过流值 (单位：L/H)
static gw_u16 Add_Item_Unit_Bom_V(gw_u8* pu8Buf,gw_u16 u16Index);  
//Bom_T 5 过流持续时间（单位：H）
static gw_u16 Add_Item_Unit_Bom_T(gw_u8* pu8Buf,gw_u16 u16Index);
//Con_T 5 持续用水时间（单位：H）
static gw_u16 Add_Item_Unit_Con_T(gw_u8* pu8Buf,gw_u16 u16Index);
//Con_MV 1000 单次用水最大值（单位：L）
static gw_u16 Add_Item_Unit_Con_MV(gw_u8* pu8Buf,gw_u16 u16Index);
//Con_FV 1000 持续反转最大值（单位：L）
static gw_u16 Add_Item_Unit_Con_FV(gw_u8* pu8Buf,gw_u16 u16Index);
//Stop_T 168 水表停走时间（单位：H）
static gw_u16 Add_Item_Unit_Stop_T(gw_u8* pu8Buf,gw_u16 u16Index);
//CVT 20 控阀超时时间（单位：s）
static gw_u16 Add_Item_Unit_CVT(gw_u8* pu8Buf,gw_u16 u16Index);
//ST_M 0 0 表示仓储模式，1 表示正常模式
static gw_u16 Add_Item_Unit_ST_M(gw_u8* pu8Buf,gw_u16 u16Index);
//dense 5 密集采集周期（单位：分钟）
static gw_u16 Add_Item_Unit_Dense(gw_u8* pu8Buf,gw_u16 u16Index);
//Frozen 123 冻结流量值（单位：L）
static gw_u16 Add_Item_Unit_Frozen(gw_u8* pu8Buf,gw_u16 u16Index);
//84_0_0   上报周期
static gw_u16 Add_Item_Unit_84_0(gw_u8* pu8Buf,gw_u16 u16Index);

static gw_u16 Add_Item_Unit_Char(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,char ItemData);
static gw_u16 Add_Item_Unit_Int(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u32 ItemData);
static gw_u16 Add_Item_Unit_String(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u8* ItemData);
static gw_u16 Add_Item_Unit_Memcpy(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u8* ItemData,gw_u16 u16DataLen);

//static void Ir_Send_Cmd(const gw_u8* Rsp_List,gw_u8 u8ListNum);
/*--------------------------------------------------------------------------------------------------------------------------------------*/
//下面代码为lierda OTA升级红外协议
/**
 * @name: 生成功能片段0004-产品ID
 * @param {S_Ir_OtaData} *data_field_struct
 * @return {*}
 * @note: 
 */
static void Creat_Func0004_Product_Id(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;
    S_Flash_Data *ps_flash_data;
    S_Flash_Device_Security *s_security;
    ps_flash_data=Svc_Flash_Get_Data();
    s_security=&ps_flash_data->s_security; 

    buff[index]=(FUNC_0004_PRODUCT_ID&0xFF00)>>8;
    buff[index+1]=FUNC_0004_PRODUCT_ID&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;
    len_index = index;
    index=index+2;

    memcpy(&buff[index],s_security->product_id,16);
    index=index+16;

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}

static void Creat_Func1C04_Query_Valve_State(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;
    S_Flash_Data *ps_flash;    
    ps_flash=Svc_Flash_Get_Data();     
    S_Pulse_ErrorCheck *s_pulse_errorcheck;
    s_pulse_errorcheck = Svc_Pulse_ErrorCheck_GetData();
    buff[index]=(FUNC_1C04_QUERY_VALVE_STATE&0xFF00)>>8;
    buff[index+1]=FUNC_1C04_QUERY_VALVE_STATE&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;
    len_index = index;
    index=index+2;

    buff[index] = 0x66;
    index++;
    buff[index] = 0x66;
    index++;     

    buff[index] = (s_pulse_errorcheck->u16perror_count&0xFF00)>>8;
    buff[index+1] = s_pulse_errorcheck->u16perror_count&0x00FF;
    index = index + 2;

    buff[index] = (s_pulse_errorcheck->u16perror_pulsecount&0xFF00)>>8;
    buff[index+1] = s_pulse_errorcheck->u16perror_pulsecount&0x00FF;
    index = index + 2;

    for(gw_u8 i = 0; i < s_pulse_errorcheck->u16perror_pulsecount; i++){
        buff[index] = (s_pulse_errorcheck->u16perror_width[i]&0xFF00)>>8;
        buff[index+1] = s_pulse_errorcheck->u16perror_width[i]&0x00FF;
        index = index + 2;
    }
    buff[index] = 0x77;
    index++;
    buff[index] = 0x77;
    index++;    
    // index = index + s_pulse_errorcheck->u16perror_pulsecount*2;
    for(gw_u8 i = 0; i < s_pulse_errorcheck->u16perror_pulsecount; i++){
        buff[index] = (s_pulse_errorcheck->u16perror_FallTime[i]&0xFF00)>>8;
        buff[index+1] = s_pulse_errorcheck->u16perror_FallTime[i]&0x00FF;
        buff[index+2] = (s_pulse_errorcheck->u16perror_RiseTime[i]&0xFF00)>>8;
        buff[index+3] = s_pulse_errorcheck->u16perror_RiseTime[i]&0x00FF;        
        index = index + 4;
    }
    buff[index]  = 0x88;
    buff[index+1]  = 0x88;
    index = index + 2;    
    for(gw_u8 i = 0; i < s_pulse_errorcheck->u16perror_subcount; i++){
        buff[index] = (s_pulse_errorcheck->u16perror_subsecond[i]&0xFF00)>>8;
        buff[index+1] = s_pulse_errorcheck->u16perror_subsecond[i]&0x00FF;
        buff[index+2] = (s_pulse_errorcheck->u16perror_second[i]&0xFF00)>>8;
        buff[index+3] = s_pulse_errorcheck->u16perror_second[i]&0x00FF;
        index = index + 4;
    }

    buff[index]  = 0x99;
    buff[index+1]  = 0x99;
    index = index + 2; 
    buff[index]  = 0xAA;
    buff[index+1]  = 0xAA;
    index = index + 2;    

    buff[index] = ps_flash->s_para.u8LPowerCnt;
    buff[index+1] = ps_flash->s_para.u8NRstCnt;
    buff[index+2] = ps_flash->s_para.u8RstPowerCnt; 

    index = index +3;

    buff[index] = (ps_flash->s_para.u16Netcnt&0xFF00) >> 8;    
    buff[index+1] = ps_flash->s_para.u16Netcnt&0x00FF;  
    index = index +2;

    buff[index]  = 0xBB;
    buff[index+1]  = 0xBB;
    index = index + 2;

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}

/**
 * @description: 复位无磁模块
 * @param {S_Ir_OtaData} *s_ir_otadata
 * @return {*}
 * @author: LiDa
 */
static void Creat_Func4000_RESET_MAG(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;

    buff[index]=(FUNC_4000_RESET_MAG&0xFF00)>>8;
    buff[index+1]=FUNC_4000_RESET_MAG&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;
    len_index = index;
    index=index+2;

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}


/**
 * @description: 获取无磁模块数据
 * @param {S_Ir_OtaData} *s_ir_otadata
 * @return {*}
 * @author: LiDa
 */
static void Creat_Func4001_READ_MAG_DATA(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;
    S_Pulse_Uart* s_pulse_uart;
    s_pulse_uart = Svc_Pulse_Get_Data();
    buff[index]=(FUNC_4001_READ_MAG_DATA&0xFF00)>>8;
    buff[index+1]=FUNC_4001_READ_MAG_DATA&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;

    len_index = index;
    index=index+2;

    memcpy(&buff[index],s_pulse_uart->RX_PULSE_DATA,40);
    index = index + 40;

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}

/**
 * @description: 获取无磁模块数据
 * @param {S_Ir_OtaData} *s_ir_otadata
 * @return {*}
 * @author: LiDa
 */
static void Creat_Func4002_CLEAR_MAG_RUNDATA(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;
    S_Flash_Data *ps_flash;    
    ps_flash=Svc_Flash_Get_Data();     
    buff[index]=(FUNC_4002_CLEAR_MAG_RUNDATA&0xFF00)>>8;
    buff[index+1]=FUNC_4002_CLEAR_MAG_RUNDATA&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;

    len_index = index;
    index=index+2;

    ps_flash->s_para.u8LPowerCnt = 0;
    ps_flash->s_para.u8NRstCnt = 0;
    ps_flash->s_para.u8RstPowerCnt = 0; 
    ps_flash->s_para.u16Netcnt  = 0;    
    Svc_Flash_Write_Device_Para(&ps_flash->s_para); 

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}

/**
 * @description: 获取无磁模块数据
 * @param {S_Ir_OtaData} *s_ir_otadata
 * @return {*}
 * @author: LiDa
 */
static void Creat_Func4003_CLEAR_MAG_CALIBRATE_DATA(S_Ir_OtaData *s_ir_otadata){
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u8 len_index=0;
    gw_u16 len=0;
    buff[index]=(FUNC_4003_CLEAR_MAG_CALIBRATE_DATA&0xFF00)>>8;
    buff[index+1]=FUNC_4003_CLEAR_MAG_CALIBRATE_DATA&0x00FF;
    index=index+2;
    buff[index]=0x01;
    index++;

    len_index = index;
    index=index+2;

    len=index-len_index-2;
    buff[len_index]=(len&0xFF00)>>8;
    buff[len_index+1]=len&0x00FF;
    s_ir_otadata->buff_len=index;
}

/**
 * @name: 生成具体数据包
 * @param {S_Ir_OtaData} *S_Ir_OtaData
 * @param {E_Function_Code} function_code
 * @return {*}
 * @note: 
 */
static void Creat_User_Data(S_Ir_OtaData *s_ir_otadata,E_Function_Code function_code){
    switch (function_code)
    {
        case FUNC_0004_PRODUCT_ID:
            Creat_Func0004_Product_Id(s_ir_otadata);
            break;
        case FUNC_1C04_QUERY_VALVE_STATE:
            Creat_Func1C04_Query_Valve_State(s_ir_otadata);
            break;         
        case FUNC_4000_RESET_MAG:
            Creat_Func4000_RESET_MAG(s_ir_otadata);
            break;   
        case FUNC_4001_READ_MAG_DATA:
            Creat_Func4001_READ_MAG_DATA(s_ir_otadata);
            break; 
        case FUNC_4002_CLEAR_MAG_RUNDATA:
            Creat_Func4002_CLEAR_MAG_RUNDATA(s_ir_otadata);
            break;   
        case FUNC_4003_CLEAR_MAG_CALIBRATE_DATA:
            Creat_Func4003_CLEAR_MAG_CALIBRATE_DATA(s_ir_otadata);
            break;          
        default:
            break;
    }
}

// /*************************************数据帧******************************************/
/**
 * @brief: 生成数据帧帧头部分
 * @param：
 * @return {void}
 * @note: 引导码、帧头、版本号、数据长度、产品序列号
 * @see: 
 */
static void Creat_Head_Field(S_Ir_OtaData *s_ir_otadata)
{
    gw_u16 index=0;
    gw_u8 *buff=s_ir_otadata->buff;
    buff[index]=(SLAVE_LEAD_CODE&0xFF000000)>>24;
    buff[index+1]=(SLAVE_LEAD_CODE&0x00FF0000)>>16;
    buff[index+2]=(SLAVE_LEAD_CODE&0x0000FF00)>>8;
    buff[index+3]=SLAVE_LEAD_CODE&0x000000FF;//引导码
    index=index+4;
    buff[index]=FRAME_HEAD;//帧头
    buff[index+1]=IR_PROTOCOL_VER;//协议版本号
    index=index+2;
    s_ir_otadata->s_data_index.u16DataLenIndex=index;//记录数据长度所在位置
    index=index+2;//数据长度           
    S_Flash_Data *ps_flash_data;
    S_Flash_Device_Security *s_security;
    ps_flash_data=Svc_Flash_Get_Data();
    s_security=&ps_flash_data->s_security;
    s_ir_otadata->s_data_index.u16IdIndex=index;//记录产品序列号所在位置
    gw_u8 pu8ProductId[16]={0};
    gw_u8 u8IdLen=sizeof(s_security->product_id);
    memcpy( pu8ProductId,&s_security->product_id,u8IdLen); 
    memcpy(&buff[index],pu8ProductId,16);//序列号
    index=index+16;
    s_ir_otadata->s_data_index.u16DataFieldIndex=index;//数据域起始位置
    s_ir_otadata->buff_len=index;//即当前数据帧长度
    // Bsp_Ir_Uart_Send_Bytes((gw_s8*)S_Ir_OtaData->buff,S_Ir_OtaData->buff_len);
}
/**
 * @brief: 生成数据域部分
 * @param：
 * @return {void}
 * @note: 命令码、应答结果、数据域
 * @see: 
 */
static E_Result_State Creat_Data_Field(S_Ir_OtaData *s_ir_otadata)
{
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u16 index=s_ir_otadata->s_data_index.u16DataFieldIndex;  
    buff[index]=s_ir_otadata->e_cmd_code_ir;//命令码
    index++;
    gw_u16 u16ResultIndex=index;//结果码所在位置
    index++;

    s_ir_otadata->buff_len=index;
    E_Function_Code function_code;
    function_code=s_ir_otadata->e_func_code_ir;
    switch (s_ir_otadata->e_cmd_code_ir)
    {
        case CMD_81_SET_SPECIAL_PARA:
        {
            buff[index]=(function_code&0xFF00)>>8;//功能片段码
            buff[index+1]=function_code&0x00FF;
            index=index+2;
            s_ir_otadata->buff_len=index;
            break; 
        }    
        default:
        {
            Creat_User_Data(s_ir_otadata,function_code);
            break;
        }
    }
   buff[u16ResultIndex]=s_ir_otadata->e_comm_result_ir;//应答结果
   if(s_ir_otadata->e_comm_result_ir != COMM_00_NORMAL)
   {   
       return E_STATE_ERROR;
   }
   gw_u16 u16Crclen=s_ir_otadata->buff_len-s_ir_otadata->s_data_index.u16IdIndex;//需要校验的数据为产品序列号和数据域
   s_ir_otadata->crc16=Util_Crc16(&s_ir_otadata->buff[s_ir_otadata->s_data_index.u16IdIndex],u16Crclen);

   return E_STATE_SUCCESS;
}
/**
 * @brief: 生成校验域部分
 * @param：
 * @return {void}
 * @note: CRC、帧尾、转义
 * @see: 
 */
static E_Result_State Creat_Check_Field(S_Ir_OtaData *s_ir_otadata)
{
    gw_u16 index=s_ir_otadata->buff_len;
    gw_u8 *buff=s_ir_otadata->buff;  
    gw_u16 u16Crc16=s_ir_otadata->crc16;
    buff[index]=(u16Crc16&0xFF00)>>8;
    buff[index+1]=u16Crc16&0x00FF;
    index=index+2;
    buff[index]=FRAME_TAIL_IR;
    index++;
    
    gw_s16 s16OutLen=Change_Original_Data(&buff[4],index-4,&s_ir_otadata->buff[4]);//转义
    if(s16OutLen<0)
    {
        return E_STATE_ERROR;
    }
    s_ir_otadata->buff_len=s16OutLen+4;
    return E_STATE_SUCCESS;
}
/**
 * @brief: 生成整个数据帧
 * @param：
 * @return {void}
 * @note: 
 * @see: 
 */
static E_Result_State Creat_Ir_Frame(S_Ir_OtaData *s_ir_otadata)
{
    memset(&s_ir_otadata->buff,0,sizeof(s_ir_otadata->buff));

    Creat_Head_Field(s_ir_otadata);
    
    if(Creat_Data_Field(s_ir_otadata)==E_STATE_ERROR)
    {
        return E_STATE_ERROR;
    }
    gw_u8 *buff;
    buff=s_ir_otadata->buff;   
    gw_u16 u16DataLenIndex=s_ir_otadata->s_data_index.u16DataLenIndex;    
    gw_u16 u16UserDataLen=s_ir_otadata->buff_len - s_ir_otadata->s_data_index.u16IdIndex;
    buff[u16DataLenIndex]=(u16UserDataLen&0xFF00)>>8;
    buff[u16DataLenIndex+1]=u16UserDataLen&0x00FF;
    
    if(Creat_Check_Field(s_ir_otadata)==E_STATE_ERROR)
    {
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;
}

// /*************************************命令应答******************************************/
/**
 * @brief: 应答并发送数据帧
 * @param:
 * @return {void}
 * @note: 
 * @see: 
 */
static void Rsp(S_Ir_OtaData *s_ir_otadata){

    if(Creat_Ir_Frame(s_ir_otadata)==E_STATE_SUCCESS){
        Bsp_Ir_Uart_Send_Bytes((gw_s8*)s_ir_otadata->buff,s_ir_otadata->buff_len);
    }  
}
void Svc_Pulse_Data_Rsp(S_Ir_OtaData *s_ir_otadata)
{
    Rsp(s_ir_otadata);
}
/*************************************命令解析******************************************/
/**
 * @brief: 红外数据帧解析
 * @return {void}
 * @note: 
 * @see: 
 * @param  {gw_u8*} data 待解析数据 
 * @param {gw_u16} u16Len
 */
void Svc_Ir_Protocol_Parse(gw_u8* data,gw_u16 len)
{
    gw_u32 u32LeadCode;
    u32LeadCode =( (data[0]&0xFF)<<24 | (data[1]&0xFF)<<16 | (data[2]&0xFF)<<8 | (data[3]&0xFF) );
    if(u32LeadCode != MAIN_LEAD_CODE)
    {
        //Svc_Log_Printf(LOG_ERROR,"%s : lead code error",__FUNCTION__);
        return;
    }
    if((data[4]!=0xDD)||(data[len-1])!=0xDC)
    {
        Svc_Log_Printf(LOG_ERROR,"%s : incomplete data frame",__FUNCTION__);
        return;
    }
    S_Flash_Data *ps_flash_data;
    S_Flash_Device_Security *s_security;
    ps_flash_data=Svc_Flash_Get_Data();
    s_security=&ps_flash_data->s_security;
    gw_s16 s16OutLen;
    s16OutLen=Get_Original_Data(&data[4],len-4,data);
    gw_u16 index=0;
    if(data[index]==IR_PROTOCOL_VER)
    {
        index++;
        gw_u16 u16DataLen;
        u16DataLen=((data[index]&0x00FF) << 8) | (0x00FF &data[index+1]);//数据长度
        index=index+2;
        //长度校验
        gw_u16 u16LenIndex=index;
        if( (u16LenIndex+u16DataLen+2)!= s16OutLen)
        {
          Svc_Log_Printf(LOG_ERROR,"%s : data len err",__FUNCTION__);
          return;
        }
        //crc校验       
        gw_u16 u16Crc;
        u16Crc=((data[s16OutLen-2]&0x00FF) << 8) | (0x00FF &data[s16OutLen-1]);
       // crc16=((data[u8LenIndex+u16DataLen]&0x00FF) << 8) | (0x00FF &data[u8LenIndex+u16DataLen+1]);
        gw_u16 u16CalCrc;
        u16CalCrc=Util_Crc16(&data[u16LenIndex],u16DataLen);
        if(u16Crc!=u16CalCrc)
        {
          Svc_Log_Printf(LOG_ERROR,"%s : crc16 check error:crc(0x%04X),cal_crc(0x%04X)",__FUNCTION__,u16Crc,u16CalCrc);
          return;  
        }   
        // //序列号校验        
        gw_u8 pu8ProductId[16]={0};//实际的序列号
        gw_u8 pu8ProductIdx[16];//接收到的序列号
        gw_u8 u8IdLen;        
        u8IdLen=sizeof(s_security->product_id);
        if(u8IdLen > 16)
        {
            return;
        }
        memcpy(pu8ProductId,&s_security->product_id,u8IdLen);//序列号不足16位的在末尾补0
        memcpy(pu8ProductIdx,&data[index],16);
        index=index+16;   
        //根据命令码解析数据
        Parse_Cmd_Code(&data[index],u16DataLen-16);
    }
    else
    {
        Svc_Log_Printf(LOG_ERROR,"%s : protocol version error",__FUNCTION__);
        return;
    }
}

/**
 * @name: 根据命令码解析数据
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static void Parse_Cmd_Code(gw_u8* data,gw_u16 len){
    gw_u8 cmd;
    cmd=data[0];
    #if LOG_FUNC_ENABLE
        Svc_Log_Printf(LOG_INFO,"%s->cmd:0x%02X",__FUNCTION__,cmd);
    #endif
    switch (cmd)
    {
    case CMD_41_QUERY_SPECIAL_PARA:
        Parse_Cmd41(data+1,len-1);
        break;
    case CMD_81_SET_SPECIAL_PARA:
        Parse_Cmd81(data+1,len-1);
        break;
    case CMD_C0_OPERATE:
        Parse_CmdC0(data+1,len-1);
        break;        
    case CMD_C3_OPERATE:
        Parse_CmdC3(data+1,len-1);
        break;
    case CMD_A0_ISSUE_OTA:
        Parse_CmdA0(data+1,len-1);
        break; 
    case CMD_A1_REQUEST_OTA:
        Parse_CmdA1(data+1,len-1);
        break;
    case CMD_A2_REQUEST_OTA_DATA:
        Parse_CmdA2(data+1,len-1);
        break;          
    default:
        break;
    }
    Svc_Ir_Set_Keep_Alive_Time(IR_OPEN_IR);//一旦接收到数据就置20s    
}

//匹配旧的 SN 号的值 范围 1~20 位
static gw_s8 Svc_Ir_ChangeSn(gw_u8 *FrameItemData,gw_u8 u8Len){       
    gw_u8 u8i;    
    gw_u8 u8StrLen;
    gw_u8 u8Sn[14]={0};
    gw_u8 *Data_Field;     
    S_Flash_Data *ps_flash;       
    Data_Field=&FrameItemData[2];        
    u8StrLen=strlen((const char *)Data_Field);
    // if(u8StrLen!=u8Len-2){
    //    return E_STATE_ERROR;    
    // }
    for(u8i=0;u8i<u8Len-2;u8i++){
        if(isdigit(*Data_Field)==0){
            return E_STATE_ERROR;
        } 
        if(u8i%2==1){
            u8Sn[u8i/2]=u8Sn[u8i/2]+(*Data_Field-'0');
        }
        else{
            u8Sn[u8i/2]=u8Sn[u8i/2]+((*Data_Field-'0')<<4);
        }
        Data_Field++;
    }
	ps_flash=Svc_Flash_Get_Data(); 
    memcpy(ps_flash->s_security.pu8MeterNum,u8Sn,7);
    if(Svc_Flash_Write_Device_Security(&ps_flash->s_security)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;
}

/**
 * @name: 红外修改参数0004 --产品id
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func0004(gw_u8* data,gw_u16 len){
    if(len!=19){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0;
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    S_Flash_Data *ps_flash_data;
    S_Flash_Device_Security *s_security;
    ps_flash_data=Svc_Flash_Get_Data();
    S_Factory_Data *ps_factory;
    ps_factory = Svc_Factory_Get_Data();      
    s_security=&ps_flash_data->s_security;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){

        if(Svc_Ir_ChangeSn(&data[index],16) != 0)
        {
            return COMM_02_ERROR_PARA;
        }
        memcpy(s_security->product_id,&data[index],16);
        if(ps_factory->u8FactoryTest == 1)
        {
            ps_factory->u8PulseTestCnt++;
            if(ps_factory->u8PulseTestCnt > 4)
            {
                ps_factory->u8PulseTestCnt = 0;
            }  
        }
        //保存数据到flash
        Svc_Flash_Write_Device_Security(s_security);
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

/**
 * @name: 解析功能片段1C04 -查询阀门状态
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func1C04(gw_u8* data,gw_u16 len){
    if(len!=3){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0;
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

/**
 * @name: 复位无磁模块
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func4000(gw_u8* data,gw_u16 len){
    if(len!=3){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0; 
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){
            Svc_Pulse_Core_Reset();
            //开阀操作
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

/**
 * @name: 读无磁模组运行数据（0x4001）
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func4001(gw_u8* data,gw_u16 len){
    if(len!=3){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0;
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){
        Svc_Pulse_GetN(); 
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

/**
 * @name: 清除无磁模组运行数据（0x4002）
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func4002(gw_u8* data,gw_u16 len){
    if(len!=3){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0;
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){
        Svc_Pulse_Clear_Run_State(); 
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

/**
 * @name: 清除无磁模组校准参数（0x4003）
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static E_Comm_Result Parse_Func4003(gw_u8* data,gw_u16 len){
    if(len!=3){
        return COMM_02_ERROR_PARA;
    }
    gw_u16 index=0;
    gw_u8 type=data[index];
    index++;
    gw_u16 data_len;
    data_len=((data[index]&0x00FF)<<8)|(data[index+1]&0x00FF);
    index=index+2;
    if(data_len!=(len-3)){
        return COMM_02_ERROR_PARA;
    }
    if(type==1){
        Svc_Pulse_Clear_Calibrate_State(); 
    }else{
        return COMM_04_ERROR_CMD_NO_SUPPORT;
    }
    return COMM_00_NORMAL;
}

// /*************************************功能码解析******************************************/
/**
 * @name: 
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static void Parse_Cmd41(gw_u8* data,gw_u16 len){
    if(len<2){
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    gw_u16 u16FuncCode;
    gw_u16 index=0;
    u16FuncCode=((data[index]&0x00FF) << 8) | (0x00FF &data[index+1]);
    index=index+2;
    Svc_Log_Printf(LOG_INFO,"%s->func code:0x%04X",__FUNCTION__,u16FuncCode);
    
    memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
    s_ir_otadata.e_cmd_code_ir=CMD_41_QUERY_SPECIAL_PARA;  
    s_ir_otadata.e_func_code_ir=(E_Function_Code)u16FuncCode;
    s_ir_otadata.e_comm_result_ir=COMM_00_NORMAL; 

    switch (u16FuncCode)
    {
    case FUNC_0004_PRODUCT_ID:
        Rsp(&s_ir_otadata);
        break;
    default:
        break;
    }
}

/**
 * @name: 
 * @param {gw_u8*} data
 * @param {gw_u16} len
 * @return {*}
 * @note: 
 */
static void Parse_Cmd81(gw_u8* data,gw_u16 len){
    if(len<3){
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    gw_u16 u16FuncCode;
    gw_u16 index=0;
    u16FuncCode=((data[index]&0x00FF) << 8) | (0x00FF &data[index+1]);
    index=index+2;
    Svc_Log_Printf(LOG_INFO,"%s->func code:0x%04X",__FUNCTION__,u16FuncCode);
    
    memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
    s_ir_otadata.e_cmd_code_ir=CMD_81_SET_SPECIAL_PARA;  
    s_ir_otadata.e_func_code_ir=(E_Function_Code)u16FuncCode;

    switch (u16FuncCode)
    {
        case FUNC_0004_PRODUCT_ID:
            s_ir_otadata.e_comm_result_ir=Parse_Func0004(data+index,len-index);
            Rsp(&s_ir_otadata);
            break;  
        default:
            break;
    }
}

static void Parse_CmdC0(gw_u8* data,gw_u16 len){
    if(len<3){
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    gw_u16 u16FuncCode;
    gw_u16 index=0;
    u16FuncCode=((data[index]&0x00FF) << 8) | (0x00FF &data[index+1]);
    index=index+2;
    Svc_Log_Printf(LOG_INFO,"%s->func code:0x%04X",__FUNCTION__,u16FuncCode);
    
    memset(&s_ir_data,0,sizeof(s_ir_data));
    s_ir_otadata.e_cmd_code_ir=CMD_C0_OPERATE;
    s_ir_otadata.e_func_code_ir=(E_Function_Code)u16FuncCode;

    switch (u16FuncCode)
    {
        case FUNC_1C04_QUERY_VALVE_STATE:
            s_ir_otadata.e_comm_result_ir=Parse_Func1C04(data+index,len-index);
            Rsp(&s_ir_otadata);
            break; 
        default:
            break;
    }
}

static void Parse_CmdC3(gw_u8* data,gw_u16 len){
    if(len<3){
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    gw_u16 u16FuncCode;
    gw_u16 index=0;
    S_Pulse_Uart* s_pulse_uart;
    s_pulse_uart = Svc_Pulse_Get_Data();
    S_Factory_Data *ps_factory;
    ps_factory = Svc_Factory_Get_Data(); 
    u16FuncCode=((data[index]&0x00FF) << 8) | (0x00FF &data[index+1]);
    index=index+2;
    Svc_Log_Printf(LOG_INFO,"%s->func code:0x%04X",__FUNCTION__,u16FuncCode);
    if(u16FuncCode == FUNC_4001_READ_MAG_DATA)
    {
        memset(&s_pulse_uart->s_ir_pulsedata,0,sizeof(s_pulse_uart->s_ir_pulsedata));
        s_pulse_uart->s_ir_pulsedata.e_cmd_code_ir=CMD_C3_OPERATE;
        s_pulse_uart->s_ir_pulsedata.e_func_code_ir=(E_Function_Code)u16FuncCode;
    }
    else
    {
        memset(&s_ir_data,0,sizeof(s_ir_data));
        s_ir_otadata.e_cmd_code_ir=CMD_C3_OPERATE;
        s_ir_otadata.e_func_code_ir=(E_Function_Code)u16FuncCode;
    }
    switch (u16FuncCode)
    {
        case FUNC_4000_RESET_MAG:
            s_ir_otadata.e_comm_result_ir=Parse_Func4000(data+index,len-index);
            Rsp(&s_ir_otadata);
            break; 
        case FUNC_4001_READ_MAG_DATA:
            s_pulse_uart->s_ir_pulsedata.e_comm_result_ir=Parse_Func4001(data+index,len-index);
            // Rsp(&s_ir_otadata);
            break; 
        case FUNC_4002_CLEAR_MAG_RUNDATA:
            s_ir_otadata.e_comm_result_ir=Parse_Func4002(data+index,len-index);
            Rsp(&s_ir_otadata);
            break;
        case FUNC_4003_CLEAR_MAG_CALIBRATE_DATA:
            s_ir_otadata.e_comm_result_ir=Parse_Func4003(data+index,len-index);
            Rsp(&s_ir_otadata);
            break;                     
        default:
            break;
    }
}

/**
 * @brief: 解析命令A0-OTA
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8*} data 待解析数据
 * @param {gw_u16} len  待解析数据长度
 */
static void Parse_CmdA0(gw_u8* data,gw_u16 len)
{
    if(len<3)
    {
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    Svc_Ota_Clear_Event(E_OTA_EVENT_REQUEST_OTA);
    Svc_Ota_Clear_Event(E_OTA_EVENT_REQUEST_OTA_DATA);    
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();
    // S_Flash_Data *ps_flash_data;
    // ps_flash_data=Svc_Flash_Get_Data();
    // S_Flash_Device_Para *s_para;
    // s_para=&ps_flash_data->s_para;
    gw_u16 index=0;
    s_ota->s_para.u8softversion[0]=data[index];
    s_ota->s_para.u8softversion[1]=data[index+1];
    index = index+2;   
    s_ota->s_para.u32FirmwareLen = (data[index]&0xFF)<<24 | (data[index+1]&0xFF)<<16 | (data[index+2]&0xFF)<<8 | (data[index+3]&0xFF);
    index = index+4;   
    memcpy(s_ota->s_para.u8Md5,&data[index],16);
    memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
    s_ir_otadata.e_cmd_code_ir=CMD_A0_ISSUE_OTA;
    // if(s_ota->s_para.u8softversion[0] == s_para->main_version && s_ota->s_para.u8softversion[1] == s_para->sub_version)
    // {
    //     s_ir_otadata.e_comm_result_ir = COMM_63_ERROR_OTA_FIRMWARE_NO_EXIST;
    //     RspOta(&s_ir_otadata);
    // }
    // else{
    s_ir_otadata.e_comm_result_ir = COMM_00_NORMAL;
    RspOta(&s_ir_otadata);
    Svc_Timer_Delay_Ms(500); //此处延时是为了配合OTA上位机收发机制
    Svc_Ota_Post_Event(E_OTA_EVENT_REQUEST_OTA);
    // }
}

/**
 * @brief: 解析命令A1-OTA
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8*} data 待解析数据
 * @param {gw_u16} len  待解析数据长度
 */
static void Parse_CmdA1(gw_u8* data,gw_u16 len)
{
    if(len<3)
    {
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    Svc_Ota_Clear_Event(E_OTA_EVENT_REQUEST_OTA_DATA);
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();
    gw_u16 index=0;
    s_ir_otadata.e_comm_result_ir = data[index];
    index++;
    s_ota->s_para.u8softversion[0]=data[index];
    s_ota->s_para.u8softversion[1]=data[index+1];
    index = index+2;   
    s_ota->s_para.u32FirmwareLen = (data[index]&0xFF)<<24 | (data[index+1]&0xFF)<<16 | (data[index+2]&0xFF)<<8 | (data[index+3]&0xFF);
    index = index+4;   
    memcpy(s_ota->s_para.u8Md5,&data[index],16);
    memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
    if(s_ir_otadata.e_comm_result_ir == COMM_00_NORMAL)
    {
        Svc_Ota_Post_Event(E_OTA_EVENT_REQUEST_OTA_DATA);
        s_ota->startflag = 1;
        Save_Firmware_Para();
        Svc_Timer_Delay_Ms(50); //此处延时是为了配合OTA上位机收发机制
    }
    Svc_Ota_Clear_Event(E_OTA_EVENT_REQUEST_OTA);
}

/**
 * @brief: 解析命令A1-OTA
 * @return {void}
 * @note: 
 * @see: 
 * @param {gw_u8*} data 待解析数据
 * @param {gw_u16} len  待解析数据长度
 */
static void Parse_CmdA2(gw_u8* data,gw_u16 len)
{
    if(len<3)
    {
        Svc_Log_Printf(LOG_ERROR,"%s->no function code",__FUNCTION__);
        return;
    }
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();
    gw_u16 index=0;
    s_ir_otadata.e_comm_result_ir = data[index];
    index++;
    s_ota->u32OtaStartAddr=(data[index]&0xFF)<<24 | (data[index+1]&0xFF)<<16 | (data[index+2]&0xFF)<<8 | (data[index+3]&0xFF);
    index = index+4; 
    s_ota->u32OtaEndAddr=(data[index]&0xFF)<<24 | (data[index+1]&0xFF)<<16 | (data[index+2]&0xFF)<<8 | (data[index+3]&0xFF);
    index = index+4;

    Svc_Ota_Clear_Event(E_OTA_EVENT_REQUEST_OTA_DATA);
    if(s_ota->u32RemainLen <= OTA_PACKGE_SIZE)
    {
        memcpy(s_ota->buff,&data[index],s_ota->u32RemainLen);
        index = index + s_ota->u32RemainLen;
        s_ota->u16Crc = (data[index]&0xFF)<<8 | (data[index+1]&0xFF);
        memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
        Svc_Ota_Write_Firmware(s_ota->buff,s_ota->u16PackNum,s_ota->u32RemainLen);
    }
    else
    {
        memcpy(s_ota->buff,&data[index],OTA_PACKGE_SIZE);
        index = index + OTA_PACKGE_SIZE;
        s_ota->u16Crc = (data[index]&0xFF)<<8 | (data[index+1]&0xFF);
        memset(&s_ir_otadata,0,sizeof(s_ir_otadata));
        Svc_Ota_Write_Firmware(s_ota->buff,s_ota->u16PackNum,OTA_PACKGE_SIZE);
    }
}
/*************************************OTA任务切换******************************************/

/**
 * @brief: ota事件推送
 * @return {void}
 * @note: 
 * @see: 
 * @param {E_Cloud_Event} cloud_event 需要推送的事件
 */
void Svc_Ota_Post_Event(E_OTA_Event_Enum ota_event){
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();    
    s_ota->ota_event|=ota_event;
}

/**
 * @brief: ota事件清除
 * @return {void}
 * @note: 
 * @see: 
 * @param {E_Cloud_Event} cloud_event 需要清除的事件
 */
void Svc_Ota_Clear_Event(E_OTA_Event_Enum ota_event){
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();   
    /*清除云事件*/
    s_ota->ota_event&=~ota_event;
    /*清除正在发送的云事件*/
    s_ota->e_ota_sending_event=E_OTA_EVENT_NO;
}

/**
 * @brief: 获取处于等待处理的最高优先级事件
 * @param  {void}
 * @return {E_Cloud_Event}  处于等待处理的最高优先级事件
 * @note: 
 * @see: 
 */
E_OTA_Event_Enum Svc_Ota_Get_Pending_Event(void){
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();
    if((s_ota->ota_event &E_OTA_EVENT_REQUEST_OTA)==E_OTA_EVENT_REQUEST_OTA){
        return E_OTA_EVENT_REQUEST_OTA;
    }
    if((s_ota->ota_event&E_OTA_EVENT_REQUEST_OTA_DATA)==E_OTA_EVENT_REQUEST_OTA_DATA){
        return E_OTA_EVENT_REQUEST_OTA_DATA;
    }
    return E_OTA_EVENT_NO;
}

/**
 * @brief: 锁定事件，该事件状态转为发送中
 * @return {void}
 * @note: 事件被锁定后，会触发该事件的数据上报，直到该事件解锁
 * @see: 
 * @param {E_Cloud_Event} cloud_event 待锁定的事件
 */
void Svc_Ota_Lock_Event(E_OTA_Event_Enum ota_event){
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data(); 
    s_ota->e_ota_sending_event=ota_event;
}

/**
 * @brief:检查事件是否改变 
 * @return {E_Result_Check} 检查结果
 * @note: 当待检查的事件和正在发送的事件不一致时，说明事件发生了变化，可能是优先级更高的事件插入
 * @see: 
 * @param {E_Cloud_Event} e_event 待检查的事件
 */
E_Result_Check Svc_Ota_Event_Is_Changed(E_OTA_Event_Enum ota_event){
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data();
    if(s_ota->e_ota_sending_event!=ota_event){
        return E_CHECK_OK;
    }
    return E_CHECK_FAIL;
}

// /*************************************OTA事件******************************************/
/**
 * @brief: 应答并发送数据帧
 * @param:
 * @return {void}
 * @note: 
 * @see: 
 */
static void RspOta(S_Ir_OtaData *s_ir_otadata){      

    if(Creat_Ir_OtaFrame(s_ir_otadata)==E_STATE_SUCCESS){
        Bsp_Ir_Uart_Send_Bytes((gw_s8*)s_ir_otadata->buff,s_ir_otadata->buff_len);
    }  
}

/**
 * @name: 
 * @param {S_Cloud_Data} *s_cloud_data
 * @return {*}
 * @note: 
 */
E_Result_Check Svc_Ir_Protocol_Request_Ota(void){
    S_Ir_OtaData s_ir_otadata;
    s_ir_otadata.e_cmd_code_ir=CMD_A1_REQUEST_OTA;
    if(Creat_Ir_OtaFrame(&s_ir_otadata)==E_STATE_SUCCESS){
        Bsp_Ir_Uart_Send_Bytes((gw_s8*)s_ir_otadata.buff,s_ir_otadata.buff_len);
        return E_CHECK_OK;
    }
    return E_CHECK_FAIL;
}
/**
 * @name: 
 * @param {S_Cloud_Data} *s_cloud_data
 * @return {*}
 * @note: 
 */
E_Result_Check Svc_Ir_Protocol_Request_Ota_Data(void){
    S_Ir_OtaData s_ir_otadata;
    s_ir_otadata.e_cmd_code_ir=CMD_A2_REQUEST_OTA_DATA;
    if(Creat_Ir_OtaFrame(&s_ir_otadata)==E_STATE_SUCCESS){
        Bsp_Ir_Uart_Send_Bytes((gw_s8*)s_ir_otadata.buff,s_ir_otadata.buff_len);
        return E_CHECK_OK;
    }
    return E_CHECK_FAIL;      
}
/**
 * @brief: 生成数据域部分
 * @param：
 * @return {void}
 * @note: 命令码、应答结果、数据域
 * @see: 
 */
static E_Result_State Creat_OtaData_Field(S_Ir_OtaData *s_ir_otadata)
{
    S_Ota *s_ota;
    s_ota = Svc_Ota_Get_Data(); 
    gw_u32 u32OtaEndAddr;    
    gw_u8 *buff=s_ir_otadata->buff;
    gw_u16 index=s_ir_otadata->s_data_index.u16DataFieldIndex; 
    buff[index]=s_ir_otadata->e_cmd_code_ir;//命令码
    index++;
    if(s_ir_otadata->e_cmd_code_ir == CMD_A0_ISSUE_OTA)
    {
        buff[index]=s_ir_otadata->e_comm_result_ir;//应答结果
        index++;
    }
    else
    {
        switch (s_ota->e_ota_sending_event)
        {
        case E_OTA_EVENT_REQUEST_OTA:
            buff[index] = s_ota->s_para.u8softversion[0];
            buff[index+1] = s_ota->s_para.u8softversion[1]; 
            index = index + 2;         
            break;
        case E_OTA_EVENT_REQUEST_OTA_DATA:
            buff[index] = s_ota->s_para.u8softversion[0];
            buff[index+1] = s_ota->s_para.u8softversion[1]; 
            index = index + 2;
            if(s_ota->startflag == 1)
            {
                s_ota->u32CurLen = OTA_PACKGE_SIZE*s_ota->u16PackNum;
                s_ota->u32RemainLen = s_ota->s_para.u32FirmwareLen - s_ota->u32CurLen;
                s_ota->u32OtaStartAddr = s_ota->u32CurLen; //s_ota->u32OtaStartAddr +
                buff[index]=(s_ota->u32OtaStartAddr &0xFF000000)>>24;
                buff[index+1]=(s_ota->u32OtaStartAddr &0x00FF0000)>>16;
                buff[index+2]=(s_ota->u32OtaStartAddr &0x0000FF00)>>8;
                buff[index+3]=(s_ota->u32OtaStartAddr &0x000000FF);
                index=index+4;                 
                if(s_ota->u32RemainLen < OTA_PACKGE_SIZE)
                {
                    u32OtaEndAddr = s_ota->u32OtaStartAddr + s_ota->u32RemainLen;
                }
                else
                {
                    u32OtaEndAddr = s_ota->u32OtaStartAddr + OTA_PACKGE_SIZE -1;
                }
                buff[index]=  (u32OtaEndAddr &0xFF000000)>>24;
                buff[index+1]=(u32OtaEndAddr &0x00FF0000)>>16;
                buff[index+2]=(u32OtaEndAddr &0x0000FF00)>>8;
                buff[index+3]=(u32OtaEndAddr &0x000000FF);
                index=index+4; 
            }
            break;            
        default:
        {
            buff[index]=s_ir_otadata->e_comm_result_ir;//应答结果
            index++;
            break;
        }
        }
    }
    s_ir_otadata->buff_len=index;
    gw_u16 u16Crclen=s_ir_otadata->buff_len-s_ir_otadata->s_data_index.u16IdIndex;//需要校验的数据为产品序列号和数据域
    s_ir_otadata->crc16=Util_Crc16(&s_ir_otadata->buff[s_ir_otadata->s_data_index.u16IdIndex],u16Crclen);
   return E_STATE_SUCCESS;
}

/**
 * @brief: 生成整个数据帧
 * @param：
 * @return {void}
 * @note: 
 * @see: 
 */
static E_Result_State Creat_Ir_OtaFrame(S_Ir_OtaData *s_ir_otadata)
{
    memset(&s_ir_otadata->buff,0,sizeof(s_ir_otadata->buff));

    Creat_Head_Field(s_ir_otadata);
    if(Creat_OtaData_Field(s_ir_otadata)==E_STATE_ERROR)
    {
        return E_STATE_ERROR;
    }
    gw_u8 *buff;
    buff=s_ir_otadata->buff;   
    gw_u16 u16DataLenIndex=s_ir_otadata->s_data_index.u16DataLenIndex;    
    gw_u16 u16UserDataLen=s_ir_otadata->buff_len - s_ir_otadata->s_data_index.u16IdIndex;
    buff[u16DataLenIndex]=(u16UserDataLen&0xFF00)>>8;
    buff[u16DataLenIndex+1]=u16UserDataLen&0x00FF;
    if(Creat_Check_Field(s_ir_otadata)==E_STATE_ERROR)
    {
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;
}

/*--------------------------------------------------------------------------------------------------------------------------------------*/
//下面代码为客户定制红外协议

#define  E_CMD_MAX      9
#define  E_CMD_MAX_3    4
#define  E_CMD_MAX_80    7
#define  E_CMD_MAX_81    5
#define  E_CMD_MAX_82    3
#define  E_CMD_MAX_83    11
#define  E_CMD_MAX_84    6
#define  E_CMD_MAX_99    8
#define  E_CMD_RSP_MAX   48
//红外协议大类分类
static const S_Ir_Cmd_Data  ir_cmd_data[E_CMD_MAX]={
    {E_IR_CMD_3,"\"bn\":\"/3/0\"",Parse_Cmd_Code_03},
    {E_IR_CMD_80,"\"bn\":\"/80/0\"",Parse_Cmd_Code_80},
    {E_IR_CMD_81,"\"bn\":\"/81/0\"",Parse_Cmd_Code_81},
    {E_IR_CMD_82,"\"bn\":\"/82/0\"",Parse_Cmd_Code_82},
    {E_IR_CMD_83,"\"bn\":\"/83/0\"",Parse_Cmd_Code_83},
    {E_IR_CMD_84,"\"bn\":\"/84/0\"",Parse_Cmd_Code_84},
    {E_IR_CMD_99,"\"bn\":\"/99/0\"",Parse_Cmd_Code_99},
    {E_IR_CMD_IMEI,"\"bn\":\"IMEI\"",Parse_Cmd_Code_Imei},
	{E_IR_CMD_ALL, "\"bn\":\"all\"",Parse_Cmd_Code_All},
};

static const S_Ir_Cmd_Data  ir_cmd_data_03[E_CMD_MAX_3]={
    {E_IR_CMD_3_2,"\"2\"",Parse_Cmd_Code_03_2},
    {E_IR_CMD_3_22,"\"22\"",Parse_Cmd_Code_03_22},
    {E_IR_CMD_3_13,"\"13\"",Parse_Cmd_Code_03_13},
    {E_IR_CMD_3_17,"\"17\"",Parse_Cmd_Code_03_17},    
};
static const S_Ir_Cmd_Data  ir_cmd_data_80[E_CMD_MAX_80]={
    {E_IR_CMD_80_1,"\"1\"",Parse_Cmd_Code_80_1},
    {E_IR_CMD_80_2,"\"2\"",Parse_Cmd_Code_80_2},
    {E_IR_CMD_80_7,"\"7\"",Parse_Cmd_Code_80_7},
    {E_IR_CMD_80_16,"\"16\"",Parse_Cmd_Code_80_16},
    {E_IR_CMD_80_31,"\"31\"",Parse_Cmd_Code_80_31},
    {E_IR_CMD_80_24,"\"24\"",Parse_Cmd_Code_80_24},
    {E_IR_CMD_80_26,"\"26\"",Parse_Cmd_Code_80_26},
};

static const S_Ir_Cmd_Data  ir_cmd_data_81[E_CMD_MAX_81]={
    {E_IR_CMD_81_0,"\"0\"",Parse_Cmd_Code_81_0},
    {E_IR_CMD_81_3,"\"3\"",Parse_Cmd_Code_81_3},
    {E_IR_CMD_81_4,"\"4\"",Parse_Cmd_Code_81_4},
    {E_IR_CMD_81_5,"\"5\"",Parse_Cmd_Code_81_5},
    {E_IR_CMD_81_7,"\"7\"",Parse_Cmd_Code_81_7},   
};
static const S_Ir_Cmd_Data  ir_cmd_data_82[E_CMD_MAX_82]={
    {E_IR_CMD_82_10,"\"10\"",Parse_Cmd_Code_82_10},
    {E_IR_CMD_82_11,"\"11\"",Parse_Cmd_Code_82_11},
    {E_IR_CMD_82_0,"\"0\"",  Parse_Cmd_Code_82_0},    
};
static const S_Ir_Cmd_Data  ir_cmd_data_83[E_CMD_MAX_83]={
    {E_IR_CMD_83_14,"\"14\"",Parse_Cmd_Code_83_14},
    {E_IR_CMD_83_15,"\"15\"",Parse_Cmd_Code_83_15},
    {E_IR_CMD_83_16,"\"16\"",Parse_Cmd_Code_83_16},
    {E_IR_CMD_83_17,"\"17\"",Parse_Cmd_Code_83_17},
    {E_IR_CMD_83_20,"\"20\"",Parse_Cmd_Code_83_20},
    {E_IR_CMD_83_18,"\"18\"",Parse_Cmd_Code_83_18},
    {E_IR_CMD_83_7,"\"7\"",Parse_Cmd_Code_83_7},
    {E_IR_CMD_83_8,"\"8\"",Parse_Cmd_Code_83_8},
    {E_IR_CMD_83_9,"\"9\"",Parse_Cmd_Code_83_9},
    {E_IR_CMD_83_10,"\"10\"",Parse_Cmd_Code_83_10},
    {E_IR_CMD_83_11,"\"11\"",Parse_Cmd_Code_83_11},    
};
static const S_Ir_Cmd_Data  ir_cmd_data_84[E_CMD_MAX_84]={
    {E_IR_CMD_84_0,"\"0\"",Parse_Cmd_Code_84_0},
    {E_IR_CMD_84_1,"\"1\"",Parse_Cmd_Code_84_1},
    {E_IR_CMD_84_2,"\"2\"",Parse_Cmd_Code_84_2},
    {E_IR_CMD_84_4,"\"4\"",Parse_Cmd_Code_84_4},
    {E_IR_CMD_84_5,"\"5\"",Parse_Cmd_Code_84_5},
    {E_IR_CMD_84_10,"\"10\"",Parse_Cmd_Code_84_10},    
};
static const S_Ir_Cmd_Data  ir_cmd_data_99[E_CMD_MAX_99]={
    {E_IR_CMD_99_21,"\"21\"",Parse_Cmd_Code_99_21},
    {E_IR_CMD_99_23,"\"23\"",Parse_Cmd_Code_99_23},
    {E_IR_CMD_99_3,"\"3\"",Parse_Cmd_Code_99_3},
    {E_IR_CMD_99_4,"\"4\"",Parse_Cmd_Code_99_4},
    {E_IR_CMD_99_5,"\"5\"",Parse_Cmd_Code_99_5},
    {E_IR_CMD_99_6,"\"6\"", Parse_Cmd_Code_99_6},
    {E_IR_CMD_99_7,"\"7\"",Parse_Cmd_Code_99_7},
    {E_IR_CMD_99_29,"\"29\"",Parse_Cmd_Code_99_29},   
};

static const S_Ir_Cmd_Rsp ir_cmd_rsp[E_CMD_RSP_MAX]={
    {E_IR_RSP_LEN,Add_Item_Len},
    {E_IR_RSP_ALL,Add_Item_All},
    {E_IR_RSP_TM,Add_Item_Unit_TM},
    {E_IR_RSP_SN,Add_Item_Sn},
    {E_IR_RSP_M_T,Add_Item_Unit_M_T},
    {E_IR_RSP_MOD,Add_Item_Unit_Mod},
    {E_IR_RSP_PN,Add_Item_Unit_PN},
    {E_IR_RSP_MAX_L,Add_Item_Unit_Max_L},
    {E_IR_RSP_BASE_L,Add_Item_Unit_Base_L},
    {E_IR_RSP_VALVE,Add_Item_Unit_Vavle},
    {E_IR_RSP_TYPE,Add_Item_Unit_Type},
    {E_IR_RSP_VER,Add_Item_Unit_Ver},
    {E_IR_RSP_IP,Add_Item_Unit_IP},
    {E_IR_RSP_IMEI,Add_Item_Unit_IMEI},
    {E_IR_RSP_IMSI,Add_Item_Unit_IMSI},
    {E_IR_RSP_ICCID,Add_Item_Unit_ICCID},
    {E_IR_RSP_RSSI,Add_Item_Unit_RSSI},
    {E_IR_RSP_SNR,Add_Item_Unit_SNR},
    {E_IR_RSP_CELL_ID,Add_Item_Unit_CellID},
    {E_IR_RSP_NB_VER,Add_Item_Unit_NB_Ver},
    {E_IR_RSP_PME,Add_Item_Unit_PME},
    {E_IR_RSP_OW,Add_Item_Unit_OW},
    {E_IR_RSP_AW,Add_Item_Unit_AW},
    {E_IR_RSP_VP,Add_Item_Unit_VP},
    {E_IR_RSP_ACV,Add_Item_Unit_ACV},
    {E_IR_RSP_PSM,Add_Item_Unit_PSM},
    {E_IR_RSP_APN,Add_Item_Unit_APN},
    {E_IR_RSP_PLMN,Add_Item_Unit_PLMN},
    {E_IR_RSP_BAND,Add_Item_Unit_Band},
    {E_IR_RSP_NWP,Add_Item_Unit_NWP},
    {E_IR_RSP_CWE,Add_Item_Unit_CWE},
    {E_IR_RSP_CWT,Add_Item_Unit_CWT},
    {E_IR_RSP_RI,Add_Item_Unit_RI},
    {E_IR_RSP_RT,Add_Item_Unit_RT},
    {E_IR_RSP_RFM,Add_Item_Unit_RFM},
    {E_IR_RSP_GRP,Add_Item_Unit_GRP},
    {E_IR_RSP_BOM_V,Add_Item_Unit_Bom_V},
    {E_IR_RSP_BOM_T,Add_Item_Unit_Bom_T},
    {E_IR_RSP_CON_T,Add_Item_Unit_Con_T},
    {E_IR_RSP_CON_MV,Add_Item_Unit_Con_MV},
    {E_IR_RSP_CON_FV,Add_Item_Unit_Con_FV},
    {E_IR_RSP_STOP_T,Add_Item_Unit_Stop_T},
    {E_IR_RSP_CVT,Add_Item_Unit_CVT},
    {E_IR_RSP_ST_M,Add_Item_Unit_ST_M},
    {E_IR_RSP_DENSE,Add_Item_Unit_Dense},
    {E_IR_RSP_FROZEN,Add_Item_Unit_Frozen},
    {E_IR_RSP_84_0,Add_Item_Unit_84_0},    
    {E_IR_RSP_NB,Add_Item_NB},

};
 

static const gw_u8 E_IR_RSP_FULL_LIST[]={
	E_IR_RSP_LEN,
	E_IR_RSP_ALL,  
	E_IR_RSP_SN,     
	E_IR_RSP_TM,
	E_IR_RSP_M_T,
	E_IR_RSP_MOD,
	E_IR_RSP_PN,
	E_IR_RSP_MAX_L,
	E_IR_RSP_BASE_L,
	E_IR_RSP_VALVE,
	E_IR_RSP_TYPE,
	E_IR_RSP_VER,
	E_IR_RSP_IP,
	E_IR_RSP_IMEI,
	E_IR_RSP_IMSI,
	E_IR_RSP_ICCID,
	E_IR_RSP_RSSI,
	E_IR_RSP_SNR,
	E_IR_RSP_CELL_ID,
	E_IR_RSP_NB_VER,
	E_IR_RSP_PME,
	E_IR_RSP_OW,
	E_IR_RSP_AW,
	E_IR_RSP_VP,
	E_IR_RSP_ACV,
	E_IR_RSP_PSM,
	E_IR_RSP_APN,
	E_IR_RSP_PLMN,
	E_IR_RSP_BAND,
	E_IR_RSP_NWP,
	E_IR_RSP_CWE,
	E_IR_RSP_CWT,
	E_IR_RSP_RI,
	E_IR_RSP_RT,
	E_IR_RSP_RFM,
	E_IR_RSP_GRP,
	E_IR_RSP_BOM_V,
	E_IR_RSP_BOM_T,
	E_IR_RSP_CON_T,
	E_IR_RSP_CON_MV,
	E_IR_RSP_CON_FV,
	E_IR_RSP_STOP_T,
	E_IR_RSP_CVT,
	E_IR_RSP_ST_M,
	E_IR_RSP_DENSE,
	E_IR_RSP_FROZEN,  
	E_IR_RSP_84_0,	
};

//static const gw_u8 E_IR_RSP_ALL_LIST[]={//支持命令 样板命令
//    E_IR_RSP_LEN,
//    E_IR_RSP_ALL,    
//    E_IR_RSP_SN,
//    E_IR_RSP_TM,
//    E_IR_RSP_M_T,
//    E_IR_RSP_MOD,
//    E_IR_RSP_PN,
//    E_IR_RSP_MAX_L,
//    E_IR_RSP_BASE_L,
//    E_IR_RSP_IP,  		
//    E_IR_RSP_APN,
//    E_IR_RSP_PLMN,
//    E_IR_RSP_BAND,
//    E_IR_RSP_NWP,		
//    E_IR_RSP_84_0, 		
//    E_IR_RSP_TYPE,  
//		E_IR_RSP_VALVE,
//		E_IR_RSP_VP,
//		E_IR_RSP_ACV,
//    E_IR_RSP_CWE,
//    E_IR_RSP_CWT,		
//		E_IR_RSP_RT,
//		E_IR_RSP_RI,
//    E_IR_RSP_VER,    
//};
static const gw_u8 E_IR_RSP_ALL_LIST[]={//支持命令
    E_IR_RSP_LEN,
    E_IR_RSP_ALL,    
    E_IR_RSP_SN,
    E_IR_RSP_TM,
    E_IR_RSP_M_T,
    E_IR_RSP_MOD,
    E_IR_RSP_PN,
    E_IR_RSP_MAX_L,
    E_IR_RSP_BASE_L,
    E_IR_RSP_IP,  		
    E_IR_RSP_APN,
    E_IR_RSP_PLMN,
    E_IR_RSP_BAND,
    E_IR_RSP_NWP,		
    E_IR_RSP_84_0, 		
    E_IR_RSP_TYPE,  			
    E_IR_RSP_CWE,
    E_IR_RSP_CWT,	
    E_IR_RSP_BOM_V,
    E_IR_RSP_BOM_T,			
    E_IR_RSP_RT,
    E_IR_RSP_RI,
    E_IR_RSP_PSM,
    E_IR_RSP_DENSE,
    E_IR_RSP_VER,    
};
static const gw_u8 E_IR_RSP_IMEI_LIST[]={
    E_IR_RSP_LEN,
    E_IR_RSP_NB,    
    E_IR_RSP_SN,
	E_IR_RSP_TM,
    E_IR_RSP_IMEI,
    E_IR_RSP_IMSI,
    E_IR_RSP_ICCID,
    E_IR_RSP_NB_VER   
};
#define E_IR_RSP_3_2_LIST  		E_IR_RSP_ALL_LIST   
#define E_IR_RSP_3_13_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_3_17_LIST  	E_IR_RSP_ALL_LIST

#define E_IR_RSP_80_1_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_80_2_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_80_7_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_80_16_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_80_24_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_80_26_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_80_31_LIST  	E_IR_RSP_FULL_LIST


#define E_IR_RSP_81_0_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_81_3_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_81_4_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_81_5_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_81_7_LIST  	E_IR_RSP_FULL_LIST


#define E_IR_RSP_82_0_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_82_10_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_82_11_LIST  	E_IR_RSP_FULL_LIST


#define E_IR_RSP_83_7_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_83_8_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_9_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_10_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_11_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_14_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_15_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_16_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_17_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_83_18_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_83_20_LIST  	E_IR_RSP_ALL_LIST


#define E_IR_RSP_84_0_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_84_1_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_84_2_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_84_4_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_84_5_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_84_10_LIST  	E_IR_RSP_FULL_LIST


#define E_IR_RSP_99_3_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_4_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_5_LIST  	E_IR_RSP_FULL_LIST
#define E_IR_RSP_99_6_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_7_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_21_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_23_LIST  	E_IR_RSP_ALL_LIST
#define E_IR_RSP_99_29_LIST  	E_IR_RSP_FULL_LIST



static gw_u16 Add_Item_Unit_Char(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,char ItemData){
    gw_u16 u16Len;     
    u16Len=strlen((const char *)ItemName);
    memcpy(&pu8Buf[u16Index],ItemName,u16Len);
    u16Index=u16Index+u16Len;    
    pu8Buf[u16Index]=ItemData;
    u16Index=u16Index+1;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);   
}

static gw_u16 Add_Item_Unit_String(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u8* ItemData){ 
    gw_u16 u16Len;     
    u16Len=strlen((const char *)ItemName);
    memcpy(&pu8Buf[u16Index],ItemName,u16Len);
    u16Index=u16Index+u16Len;
    u16Len=strlen((const char *)ItemData);    
    memcpy(&pu8Buf[u16Index],ItemData,u16Len);
    u16Index=u16Index+u16Len;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);   
}
static gw_u16 Add_Item_Unit_Memcpy(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u8* ItemData,gw_u16 u16DataLen){ 
    gw_u16 u16Len;     
    u16Len=strlen((const char *)ItemName);
    memcpy(&pu8Buf[u16Index],ItemName,u16Len);
    u16Index=u16Index+u16Len;     
    memcpy(&pu8Buf[u16Index],ItemData,u16DataLen);
    u16Index=u16Index+u16DataLen;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);   
}

static gw_u16 Add_Item_Unit_Int(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,gw_u32 ItemData){ 
    gw_u16 u16Len; 
		char SprintfBuf[20];
    char *p=SprintfBuf;
    u16Len=strlen((const char *)ItemName);
    memcpy(&pu8Buf[u16Index],ItemName,u16Len);
    u16Index=u16Index+u16Len;
    sprintf(p,"%d",(int)ItemData);      
    u16Len=strlen(p);  
    memcpy(&pu8Buf[u16Index],p,u16Len);
    u16Index=u16Index+u16Len;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);   
}
static gw_u16 Add_Item_Unit_Float(gw_u8* pu8Buf,gw_u16 u16Index,gw_u8*ItemName,float ItemData,gw_u8 u8Point){ 
    gw_u16 u16Len;  
    char SprintfBuf[20]={0};
    char *p=SprintfBuf;
    u16Len=strlen((const char *)ItemName);
    memcpy(&pu8Buf[u16Index],ItemName,u16Len);
    u16Index=u16Index+u16Len;   
	  switch(u8Point){
			case 0:
				sprintf(p,"%.0f",ItemData);  
			break;				  
			case 1:
				sprintf(p,"%.1f",ItemData);
			break;
			case 2:
				sprintf(p,"%.2f",ItemData);  
			break;
			case 3:
				sprintf(p,"%.3f",ItemData);  
			break;
			case 4:
				sprintf(p,"%.4f",ItemData);  
			break;
		}        
    u16Len=strlen(p);  
    memcpy(&pu8Buf[u16Index],p,u16Len);
    u16Index=u16Index+u16Len;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);   
}

static const char Item_Len[12]="\"Len\":\" 59\",";
static const char Item_All[13]="\"all params\":";
//"Len":" 50",
static gw_u16 Add_Item_Len(gw_u8* pu8Buf,gw_u16 u16Index){
    memcpy(&pu8Buf[u16Index],Item_Len,12);
    return (u16Index+12);
}
//"all params":
static gw_u16 Add_Item_All(gw_u8* pu8Buf,gw_u16 u16Index){
    memcpy(&pu8Buf[u16Index],Item_All,13);
    return (u16Index+13);
}
//"NB":
static gw_u16 Add_Item_NB(gw_u8* pu8Buf,gw_u16 u16Index){
    memcpy(&pu8Buf[u16Index],"\"NB\":",5);
    return (u16Index+5);
}
//TM 系统时间
static gw_u16 Add_Item_Unit_TM(gw_u8* pu8Buf,gw_u16 u16Index){
    gw_u8 u8TimeTemp[6];
    gw_u32 u32TimeData;
    S_Cloud_Data *ps_cloud_data;  
    ps_cloud_data=Svc_Cloud_Get_Data(); 	
    Util_Time_Timestamp_To_Time(ps_cloud_data->u32SystemTime-8*3600-86400,u8TimeTemp);//<<<<<<<<22.8.16yess
    u8TimeTemp[0]=u8TimeTemp[0]+30;
    u32TimeData=Util_Time_Date_To_Timestamp(u8TimeTemp);
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"TM:",u32TimeData);		
}
//SN 1234567980 设备编号，范围 1~20 位
static gw_u16 Add_Item_Sn(gw_u8* pu8Buf,gw_u16 u16Index){
		gw_u8 i;
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data();  
	
	  memcpy(&pu8Buf[u16Index],"\"SN:",4);
		u16Index=u16Index+4;
    for(i=0;i<7;i++){
        pu8Buf[u16Index]=((ps_flash->s_security.pu8MeterNum[i]>>4)&0x0f)+0x30;
        u16Index++;
        pu8Buf[u16Index]=(ps_flash->s_security.pu8MeterNum[i]&0x0f)+0x30;
        u16Index++;
	}    
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    pu8Buf[u16Index]=' ';
    return (u16Index+1);
}
//M_T 1表类型 1：水表， 2：气表，3：热量表，
static gw_u16 Add_Item_Unit_M_T(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"M_T:",ps_flash->s_security.pu8MeterType+0x30);
}  
//Mod 2 计量模式 0：双干簧管； 1：单干簧管； 2：双霍尔； 3：直读；
//4：无磁电感； 5：无磁线圈；6：三霍尔； 7：单霍尔；
static gw_u16 Add_Item_Unit_Mod(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"Mod:",ps_flash->s_security.pu8MeterDetectModel+0x30);
} 
//PN 3脉冲常数，1-1L/P； 2-10L/P； 3-100L/P； 4-1000L/P；
static gw_u16 Add_Item_Unit_PN(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    if(ps_flash->s_para.u16PluseEqu==1){
        return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PN:",'1');       
    }
    else if(ps_flash->s_para.u16PluseEqu==10){       
        return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PN:",'2'); 
    }
    else if(ps_flash->s_para.u16PluseEqu==100){       
        return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PN:",'3'); 
    }
    else if(ps_flash->s_para.u16PluseEqu==1000){       
        return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PN:",'4'); 
    }
    return u16Index;
}   
    
//MAX L 9999900 最大计量脉冲数    
static gw_u16 Add_Item_Unit_Max_L(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"MAX L:",ps_flash->s_para.u32MaxTotalUsage);  
}  
//L 9900 表底数    
static gw_u16 Add_Item_Unit_Base_L(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data();
	return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"L:",ps_flash->s_usage_info.u32TotalUsage);//<<<<<<<22.2.8yess将表底数修改为总使用量  
//    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"L:",ps_flash->s_para.u32BaseUsage);  
}
//valve 1 阀门状态，0：开阀； 1：关阀；2：空闲； 3：正在动作；   
static gw_u16 Add_Item_Unit_Vavle(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"valve:",'0'); 
}
//type 1 阀门类型，0：两线； 1：五线阀； 2：无阀；   
static gw_u16 Add_Item_Unit_Type(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"type:",'2'); 
}
//Ver 1.00 设备程序版本号 V1.00   
static gw_u16 Add_Item_Unit_Ver(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Float( pu8Buf,u16Index,(gw_u8 *)"Ver:",ps_flash->s_security.pu8SoftVer/10.0,2); 
}
//IP 180.101.147.115:5683 IP 地址为 180.101.147.115，端口号为 5683
static gw_u16 Add_Item_Unit_IP(gw_u8* pu8Buf,gw_u16 u16Index){
    char *p;
	  gw_u8 len;
		gw_u8 Server_Info[32]={0};
		S_Flash_Data *ps_flash;
		ps_flash=Svc_Flash_Get_Data(); 
		len=strlen((const char *)ps_flash->s_para.s_nb_info.IpInfo);
		if(len>32){
			return u16Index;
		}
        memcpy(Server_Info,ps_flash->s_para.s_nb_info.IpInfo,len);
		p=strchr((char const*)Server_Info,',');  
		if(p!=NULL){
			*p=':';
		}
		else{
			return u16Index;
		}
    return Add_Item_Unit_String( pu8Buf,u16Index,(gw_u8 *)"IP:",(gw_u8*)Server_Info);
}    

static gw_u16 Add_Item_Unit_IMEI(gw_u8* pu8Buf,gw_u16 u16Index){
    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;	  
    return Add_Item_Unit_Memcpy( pu8Buf,u16Index,(gw_u8 *)"IMEI:",(gw_u8*)ps_nb->pu8Imei,15);
} 
static gw_u16 Add_Item_Unit_IMSI(gw_u8* pu8Buf,gw_u16 u16Index){
    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;	
    return Add_Item_Unit_Memcpy( pu8Buf,u16Index,(gw_u8 *)"IMSI:",(gw_u8*)ps_nb->pu8Imsi,15);
}
static gw_u16 Add_Item_Unit_ICCID(gw_u8* pu8Buf,gw_u16 u16Index){
    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;  
    return Add_Item_Unit_Memcpy( pu8Buf,u16Index,(gw_u8 *)"ICCID:",(gw_u8*)ps_nb->pu8Iccid,20);
}

//RSSI -100.1 信号强度  
static gw_u16 Add_Item_Unit_RSSI(gw_u8* pu8Buf,gw_u16 u16Index){    
    S_Cloud_Data *ps_cloud_data;  
    ps_cloud_data=Svc_Cloud_Get_Data();    
    return Add_Item_Unit_Float( pu8Buf,u16Index,(gw_u8 *)"RSSI:",ps_cloud_data->u8Csq,0); 
}
//SNR 12 信噪比  
static gw_u16 Add_Item_Unit_SNR(gw_u8* pu8Buf,gw_u16 u16Index){    
    S_Cloud_Data *ps_cloud_data;  
    ps_cloud_data=Svc_Cloud_Get_Data();    
    return Add_Item_Unit_Float( pu8Buf,u16Index,(gw_u8 *)"SNR:",ps_cloud_data->s16Snr,0); 
}
//CellID 12345 物理小区 ID
static gw_u16 Add_Item_Unit_CellID(gw_u8* pu8Buf,gw_u16 u16Index){   
    S_Cloud_Data *ps_cloud_data;  
    ps_cloud_data=Svc_Cloud_Get_Data();    
    return Add_Item_Unit_Float( pu8Buf,u16Index,(gw_u8 *)"CellID:",ps_cloud_data->u32CellId,0); 
}
// NB_Ver BC95B5JBR01A02W NB 模组版本
static gw_u16 Add_Item_Unit_NB_Ver(gw_u8* pu8Buf,gw_u16 u16Index){
		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;    
    return Add_Item_Unit_String( pu8Buf,u16Index,(gw_u8 *)"NB_Ver:",(gw_u8*)ps_nb->pu8NbVer);
}
//PME 0 计费功能 0：失能 1：使能    
static gw_u16 Add_Item_Unit_PME(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PME:",'0'); 
}

//OW 2000 可透支量，单位：L 
static gw_u16 Add_Item_Unit_OW(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"OW:",'0');
}
//AW 1000 余量报警值，单位：L   
static gw_u16 Add_Item_Unit_AW(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"AW:",'0'); 
}
//VP 1疏通阀门周期，单位次数/月 （0~4）  
static gw_u16 Add_Item_Unit_VP(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"VP:",'0'); 
}
//ACV 0 磁攻击关阀，0：失能 1：使能
static gw_u16 Add_Item_Unit_ACV(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"ACV:",'0'); 
}
//PSM 0 PSM 模式，0：失能 1：使能
static gw_u16 Add_Item_Unit_PSM(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"PSM:",'0'); 
}    
//APN ctnb 设置 APN
static gw_u16 Add_Item_Unit_APN(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_String( pu8Buf,u16Index,(gw_u8 *)"APN:",(gw_u8*)ps_flash->s_para.s_nb_info.u8Apn); 
}
//PLMN 46000 设置 PLMN    
static gw_u16 Add_Item_Unit_PLMN(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_String( pu8Buf,u16Index,(gw_u8 *)"PLMN:",(gw_u8*)ps_flash->s_para.s_nb_info.u8Plmn);
}
//BAND 5 设置 BAND   
static gw_u16 Add_Item_Unit_Band(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"BAND:",ps_flash->s_para.s_nb_info.u8Band); 
}
//NWP 0 设置网络协议，0：CAOP 1：UDP
static gw_u16 Add_Item_Unit_NWP(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"NWP:",'0');
}   

//CWE 1密集流量采样使能，0：失能 1：使能
static gw_u16 Add_Item_Unit_CWE(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"CWE:",ps_flash->s_para.u8DenseEnable);
}  

//CWT 60 密集流量采样周期，单位：min，范围 15~720，必须为 60 的约数或倍数，
//可设置的值为：15,20,30,60,120,240,360,720   
static gw_u16 Add_Item_Unit_CWT(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"CWT:",ps_flash->s_para.u8HourPeriodTime);
}
//RI 2004 上报区间 是 20:00:00 ~ 22:00:0    
static gw_u16 Add_Item_Unit_RI(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"RI:",ps_flash->s_para.u16ReportInterval);
}
//RT 2 重发的次数是 2
static gw_u16 Add_Item_Unit_RT(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"RT:",ps_flash->s_para.u8ResendTimes);
}
//RFM 0 非实时下行
static gw_u16 Add_Item_Unit_RFM(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"RFM:",'0'); 
}
//GRP 1 RF 信道组
static gw_u16 Add_Item_Unit_GRP(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Char( pu8Buf,u16Index,(gw_u8 *)"GRP:",'0'); 
}
//Bom_V 5000 过流值 (单位：L/H)
static gw_u16 Add_Item_Unit_Bom_V(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Bom_V:",ps_flash->s_para.u32LargeFlowCutPoint);
}   
//Bom_T 5 过流持续时间（单位：H）
static gw_u16 Add_Item_Unit_Bom_T(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Bom_T:",ps_flash->s_para.u8LargeFlowDuration);
} 
//Con_T 5 持续用水时间（单位：H）
static gw_u16 Add_Item_Unit_Con_T(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Con_T:",0);
} 

//Con_MV 1000 单次用水最大值（单位：L）
static gw_u16 Add_Item_Unit_Con_MV(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Con_MV:",0);
} 
//Con_FV 1000 持续反转最大值（单位：L）
static gw_u16 Add_Item_Unit_Con_FV(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Con_FV:",0);
} 
//Stop_T 168 水表停走时间（单位：H）
static gw_u16 Add_Item_Unit_Stop_T(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Stop_T:",0);
} 
//CVT 20 控阀超时时间（单位：s）
static gw_u16 Add_Item_Unit_CVT(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"CVT:",0);
}
//ST_M 0 0 表示仓储模式，1 表示正常模式
static gw_u16 Add_Item_Unit_ST_M(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"ST_M:",1);
}
//dense 5 密集采集周期（单位：分钟）
static gw_u16 Add_Item_Unit_Dense(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"dense:",ps_flash->s_para.u16DensePeriodTime);
}
//Frozen 123 冻结流量值（单位：L）
static gw_u16 Add_Item_Unit_Frozen(gw_u8* pu8Buf,gw_u16 u16Index){
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"Frozen:",0);
}
//84_0_0   
static gw_u16 Add_Item_Unit_84_0(gw_u8* pu8Buf,gw_u16 u16Index){
    S_Flash_Data *ps_flash;
    ps_flash=Svc_Flash_Get_Data(); 
    return Add_Item_Unit_Int( pu8Buf,u16Index,(gw_u8 *)"/84/0/0:",ps_flash->s_para.u32ReportCycle); 
}
/**
 * @brief: 发送命令
 * @return {void}
 * @note: 
 * @see: 
 * @param 
 * @param 
 */
static void Ir_Send_Cmd(const gw_u8* Rsp_List,gw_u8 u8ListNum){
    gw_u8 	u8i;
    gw_u8 	u8CheckSum; 
    gw_u8 	*pu8Buf;
    gw_u16 	u16Len=0;  
	gw_u16 	u16Index;   
    char LenString[4];   
    pu8Buf=Svc_Com_Get_Buf();
    pu8Buf[0]=IR_FRAME_HEAD1;
    pu8Buf[1]=IR_FRAME_HEAD2;
    u16Index=2;

    for(u8i=0;u8i<u8ListNum;u8i++){   //填充元素
        if(ir_cmd_rsp[* Rsp_List].callrsp!=NULL){   
            u16Index=ir_cmd_rsp[* Rsp_List].callrsp(pu8Buf,u16Index);
        }
        Rsp_List++;
    } 
    u16Index=u16Index-2; //减去最后一个多加的空格和逗号
    pu8Buf[u16Index]='"';//
    u16Index=u16Index+1;
    pu8Buf[u16Index]=',';
    u16Index=u16Index+1;
    //处理长度
    sprintf(LenString,"%d",(int)u16Index+8-2);   //加8是加后面的"RC":"N"  其中N 是校验和会变 -2 是去掉[{
    u16Len=strlen(LenString); 
    if(u16Len==1){
        pu8Buf[9]=' ';
        pu8Buf[10]=' ';
        pu8Buf[11]=LenString[0];
    }
    else if(u16Len==2){
        pu8Buf[9]=' ';
        pu8Buf[10]=LenString[0];       
        pu8Buf[11]=LenString[1];
    }
    else if(u16Len==3){
        pu8Buf[9]=LenString[0]; 
        pu8Buf[10]=LenString[1];   
        pu8Buf[11]=LenString[2]; 
    }
    else{
      return;
    }        
    //处理校验
    u8CheckSum=CheckRc(&pu8Buf[2], 0,u16Index-3); //长度减2去掉头 去掉最后的逗号
    memcpy(&pu8Buf[u16Index],"\"RC\":\"",6);
    u16Index=u16Index+6;
    pu8Buf[u16Index]=u8CheckSum;		
    u16Index++;
    pu8Buf[u16Index]='"';
    u16Index++;
    //处理帧尾
    pu8Buf[u16Index]=IR_FRAME_TAIL2;
    u16Index++;
    pu8Buf[u16Index]=IR_FRAME_TAIL1;
    u16Index++; 
	Bsp_Com_Dis_Interrupts();    //关中断
	Bsp_Ir_Uart_Send_Bytes((gw_s8 *)"\r\n",2);  
    Bsp_Ir_Uart_Send_Bytes((gw_s8*)pu8Buf,u16Index);  
	Bsp_Ir_Uart_Send_Bytes((gw_s8 *)"\r\n",2); 
	Bsp_Com_En_Interrupts();       
    #if LOG_FUNC_ENABLE
        Svc_Log_Printf(LOG_INFO,"%s->\r\n",__FUNCTION__);//<<<<<<<<<<显示发送内容
        Svc_Log_Print("IR send:%s\r\n",pu8Buf);//<<<<<<<<<<显示发送内容
    #endif
		 
    return ;
}  
/*--------------------------------------------------重要代码入口  方便定位代码--------------------------------------------------------------------------------------------*/
/**
 * @brief: 红外数据帧解析
 * @return {void}
 * @note: 
 * @see: 
 * @param  {gw_u8*} pu8Data 待解析数据 
 * @param {gw_u16} u16Len
 */
void Svc_Ir_Parse(gw_u8* pu8Data,gw_u16 u16Len){
		gw_u8 	*Data_Field;
    gw_u16  u16FrameLen;           
    Svc_Ir_Set_Keep_Alive_Time(IR_OPEN_IR);//一旦接收到数据就置20s  
    /*长度校验*/
    if(u16Len<14){
        Svc_Log_Printf(LOG_ERROR,"%s->len err \r\n",__FUNCTION__);
        return;
    }
    /*帧头帧尾校验*/
    if((pu8Data[0]!=IR_FRAME_HEAD1)||
       (pu8Data[1]!=IR_FRAME_HEAD2)||
       (pu8Data[u16Len-1]!=IR_FRAME_TAIL1)||
       (pu8Data[u16Len-2]!=IR_FRAME_TAIL2)){
        Svc_Log_Printf(LOG_ERROR,"%s->Frame Head  Tail Error \r\n",__FUNCTION__);
        return;
    }    
    /*以 ,分割命令条目 1. 长度条目 2. 命令大类条目 3.命令小类条目 4.核对表号条目 */
    s_ir_data.u8ItemSize=Util_Data_String_Split((gw_s8*)pu8Data,',',(gw_s8 **)s_ir_data.FrameItem,FRAME_ITEM_MAX);
    if(s_ir_data.u8ItemSize<FRAME_ITEM_MAX){ //必须四条目
        Svc_Log_Printf(LOG_ERROR,"%s->string split fail! \r\n",__FUNCTION__);   
        return;
    }
    //比对第一条目
    if(strstr((const char *)s_ir_data.FrameItem[0], (const char *)"\"Len\":")!=NULL){        
        Data_Field=Util_Data_Get_Valid_String((gw_u8 *)s_ir_data.FrameItem[0],':',1);
        if(Data_Field==NULL){
            Svc_Log_Printf(LOG_ERROR,"%s->Get Frame Len fail!\r\n",__FUNCTION__);   
            return;
        }
        u16FrameLen=atoi((char*)Data_Field);
    }
    else{
        Svc_Log_Printf(LOG_ERROR,"%s-> Len Item Name Error!\r\n",__FUNCTION__);   
        return;
    }
    /*再次长度校验*/
    if((u16FrameLen+4)!=u16Len){
        Svc_Log_Printf(LOG_ERROR,"%s->Check Len Error! Len = %d! Frame Len =  \r\n",__FUNCTION__,u16Len,u16FrameLen);   
        return;
    } 
    /*和校验分割时去年了4个逗号 取长度时去掉了一个后双引号 44*4+34= 166 */
    if(CheckRc(&pu8Data[2],166,u16Len-13)!=pu8Data[u16Len-4]){
        Svc_Log_Printf(LOG_ERROR,"%s-> Check Sum Error\r\n",__FUNCTION__);
        return;
    }
	if(strstr((const char *)s_ir_data.FrameItem[1], (const char *)ir_cmd_data[E_IR_CMD_ALL].recv_cmd)!=NULL){
		Parse_Cmd_Code_All(s_ir_data.FrameItem[1]);
	}else{
    /*核对表号*/
        if(CmdCheckSn()==E_STATE_SUCCESS){
            Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[1],ir_cmd_data , E_CMD_MAX); //核对命令
        }			
	}         
} 
/*核对表号*/
gw_u8 CmdCheckSn(void){
    gw_u8 *Data_Field;             
    if(strstr((const char *)s_ir_data.FrameItem[3], (const char *)"\"22\":")!=NULL){ //比对第四条目       
        Data_Field=Util_Data_Get_Valid_String((gw_u8 *)s_ir_data.FrameItem[3],':',1);
        if(Data_Field==NULL){
            Svc_Log_Printf(LOG_ERROR,"%s->Get SN Error!\r\n",__FUNCTION__);   
            return E_STATE_ERROR;
        }
        if(CheckSn(Data_Field)==E_STATE_ERROR){/*核对表号*/  
            Svc_Log_Printf(LOG_ERROR,"%s->Check SN Error!\r\n",__FUNCTION__);   
            return E_STATE_ERROR;
        }
    }
    else{
        if(strstr((const char *)s_ir_data.FrameItem[3], (const char *)"\"2\":")!=NULL){ //比对第四条目 
            if(strstr((const char *)s_ir_data.FrameItem[2], (const char *)"\"22\":")!=NULL){ //比对第三条目
                Data_Field=Util_Data_Get_Valid_String((gw_u8 *)s_ir_data.FrameItem[3],':',1);
                if(Data_Field==NULL){
                    Svc_Log_Printf(LOG_ERROR,"%s->Get SN Error!\r\n",__FUNCTION__);   
                    return  E_STATE_ERROR;
                }
                if(CheckSn(Data_Field)==E_STATE_ERROR){/*核对表号*/  
                    Svc_Log_Printf(LOG_ERROR,"%s->Check SN Error!\r\n",__FUNCTION__);   
                    return E_STATE_ERROR;
                }
                if(strstr((const char *)s_ir_data.FrameItem[1], (const char *)"\"bn\":\"/3/0\"")==NULL){ //比对第二条目
                    Svc_Log_Printf(LOG_ERROR,"%s->Set SN Cmd Error!\r\n",__FUNCTION__);   
                    return E_STATE_ERROR;
                }
                //取设置的SN号
                Data_Field=Util_Data_Get_Valid_String((gw_u8 *)s_ir_data.FrameItem[2],':',1);
                if(Data_Field==NULL){
                    Svc_Log_Printf(LOG_ERROR,"%s->Get SN Error!\r\n",__FUNCTION__);   
                    return E_STATE_ERROR;
                }
                if(Parse_Cmd_Code_03_2(Data_Field)==E_STATE_ERROR){
                    Svc_Log_Printf(LOG_ERROR,"%s->Set SN Data Error!\r\n",__FUNCTION__);   
                    return  E_STATE_ERROR;
                }
            }
            else{
                Svc_Log_Printf(LOG_ERROR,"%s->Check SN Error!\r\n",__FUNCTION__);   
                return E_STATE_ERROR;
            }
        }
        else{
            Svc_Log_Printf(LOG_ERROR,"%s->Check SN Error!\r\n",__FUNCTION__);   
            return  E_STATE_ERROR;
        }
    }
   return E_STATE_SUCCESS;       
}

//匹配旧的 SN 号的值 范围 1~20 位
gw_s8 Parse_Cmd_Code_03_2(gw_u8 *FrameItemData){       
    gw_u8 u8i;    
    gw_u8 u8StrLen;
    gw_u8 u8Sn[14]={0};
    gw_u8 *Data_Field;     
    S_Flash_Data *ps_flash;       
    Data_Field=FrameItemData;        
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen!=14){
       return E_STATE_ERROR;    
    }
    for(u8i=0;u8i<14;u8i++){
        if(isdigit(*Data_Field)==0){
            return E_STATE_ERROR;
        } 
        if(u8i%2==1){
            u8Sn[u8i/2]=u8Sn[u8i/2]+(*Data_Field-'0');
        }
        else{
            u8Sn[u8i/2]=u8Sn[u8i/2]+((*Data_Field-'0')<<4);
        }
        Data_Field++;
    }
	ps_flash=Svc_Flash_Get_Data(); 
    memcpy(ps_flash->s_security.pu8MeterNum,u8Sn,7);
    Ir_Send_Cmd(E_IR_RSP_3_2_LIST,sizeof(E_IR_RSP_3_2_LIST));       
    if(Svc_Flash_Write_Device_Security(&ps_flash->s_security)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;
}
//如果有 2，就是设置 SN 号的值 范围 1~20 位
gw_s8 Parse_Cmd_Code_03_22(gw_u8 *FrameItemData){   
    return E_STATE_SUCCESS;
}
//设置时间戳
gw_s8 Parse_Cmd_Code_03_13(gw_u8 *FrameItemData){
    gw_u8		u8TimeTemp[6];
    gw_u8 	*Data_Field; 
    gw_u32 	u32Data;     
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);   
    if(Data_Field==NULL){
        return E_STATE_ERROR;
    }           
    u32Data=atol((char*)Data_Field);
    if(u32Data==0){
        return E_STATE_ERROR;
    }		
		Util_Time_Timestamp_To_Time(u32Data+8*3600+86400,u8TimeTemp);//时间戳转为日历<<<<<<<22.8.16yess
		
		if((u8TimeTemp[0]<50)||(u8TimeTemp[0]>130)){   //1970-2100年
				return E_STATE_ERROR;
		}
		u8TimeTemp[0]=u8TimeTemp[0]-30;           //本机从2000算起，红外软件是从1970年算起
		u32Data=Util_Time_Date_To_Timestamp(u8TimeTemp);		
    Svc_Cloud_Time_Calibrate(u32Data);   
    Ir_Send_Cmd(E_IR_RSP_3_13_LIST,sizeof(E_IR_RSP_3_13_LIST));
    return E_STATE_SUCCESS;
}
//设置表的类型 1：水表， 2：气表， 3：热量表， 4：...
gw_s8 Parse_Cmd_Code_03_17(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_3_17_LIST,sizeof(E_IR_RSP_3_17_LIST));
    return E_STATE_SUCCESS;      
}   
//设置计量模式 0：双干簧管； 1：单干簧管； 2：双霍尔； 3：直读； 
//4：无磁电感； 5：无磁线圈； 6：三霍尔； 7：单霍尔；
gw_s8 Parse_Cmd_Code_80_1(gw_u8 *FrameItemData){    
    Ir_Send_Cmd(E_IR_RSP_80_1_LIST,sizeof(E_IR_RSP_80_1_LIST));
    return E_STATE_SUCCESS;      
}
//PN 脉冲常数 1-1L/P； 2-10L/P； 3-100L/P； 4-1000L/P；
gw_s8 Parse_Cmd_Code_80_2(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field;     
    S_Flash_Data *ps_flash;
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);   
    if(Data_Field==NULL){
        return E_STATE_ERROR;
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen!=1){
       return E_STATE_ERROR;    
    }  
    ps_flash=Svc_Flash_Get_Data();    
    if(*Data_Field=='1'){
        ps_flash->s_para.u16PluseEqu=1;
    }
    else if(*Data_Field=='2'){
        ps_flash->s_para.u16PluseEqu=10;
    }
    else if(*Data_Field=='3'){
        ps_flash->s_para.u16PluseEqu=100;
    }
    else if(*Data_Field=='4'){
        ps_flash->s_para.u16PluseEqu=1000;
    }
    else{
        return E_STATE_ERROR;     
    }
    Ir_Send_Cmd(E_IR_RSP_80_2_LIST,sizeof(E_IR_RSP_80_2_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;         
}
//设置最大计量数 最大为 8 位
gw_s8 Parse_Cmd_Code_80_7(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field; 
    gw_u32 u32Data; 
    S_Flash_Data *ps_flash;  
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR;   
    }    
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen>8){
       return E_STATE_ERROR;    
    }          
    u32Data=atol((char*)Data_Field);
    if((u32Data==0)||(u32Data>100000000)){
        return E_STATE_ERROR;   
    }  
    ps_flash=Svc_Flash_Get_Data();
    ps_flash->s_para.u32MaxTotalUsage=u32Data;  
    
    Ir_Send_Cmd(E_IR_RSP_80_7_LIST,sizeof(E_IR_RSP_80_7_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;     
}
//设置表底数 可输入 0~99999999，具体以表端读数来
gw_s8 Parse_Cmd_Code_80_16(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field; 
    gw_u32 u32Data; 
    S_Flash_Data *ps_flash;   
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);  
    if(Data_Field==NULL){
        return E_STATE_ERROR;  
    }    
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen>8){
       return E_STATE_ERROR;    
    }        
    u32Data=atol((char*)Data_Field);
    if((u32Data==0)||(u32Data>100000000)){
        return E_STATE_ERROR;   
    }    
    Svc_Flash_Base_Usage_Calibrate(u32Data);
	ps_flash=Svc_Flash_Get_Data();  
    ps_flash->s_para.u32BaseUsage=u32Data; 
    Ir_Send_Cmd(E_IR_RSP_80_16_LIST,sizeof(E_IR_RSP_80_16_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;   
}
//计费功能 0：失能； 1：使能；
gw_s8 Parse_Cmd_Code_80_31(gw_u8 *FrameItemData){    
    Ir_Send_Cmd(E_IR_RSP_80_31_LIST,sizeof(E_IR_RSP_80_31_LIST));    
    return E_STATE_SUCCESS;
}
//设置可用余量报警值 （保留）
gw_s8 Parse_Cmd_Code_80_24(gw_u8 *FrameItemData){   
    Ir_Send_Cmd(E_IR_RSP_80_24_LIST,sizeof(E_IR_RSP_80_24_LIST));    
    return E_STATE_SUCCESS; 
}
//设置透支量（保留）
gw_s8 Parse_Cmd_Code_80_26(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_80_26_LIST,sizeof(E_IR_RSP_80_26_LIST));    
    return E_STATE_SUCCESS; 
}

//设置控阀 0：开阀； 1：关阀
gw_s8 Parse_Cmd_Code_81_0(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_81_0_LIST,sizeof(E_IR_RSP_81_0_LIST));    
    return E_STATE_SUCCESS;
}
//设置阀门类型 0：两线； 1：五线阀； 2：无阀；
gw_s8 Parse_Cmd_Code_81_3(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_81_3_LIST,sizeof(E_IR_RSP_81_3_LIST));    
    return E_STATE_SUCCESS;
}
//设置疏通阀门周期 单位次数/月 （0~4）
gw_s8 Parse_Cmd_Code_81_4(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_81_4_LIST,sizeof(E_IR_RSP_81_4_LIST));    
    return E_STATE_SUCCESS;
}
//设置磁攻击关阀 0：失能； 1：使能；
gw_s8 Parse_Cmd_Code_81_5(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_81_5_LIST,sizeof(E_IR_RSP_81_5_LIST));    
    return E_STATE_SUCCESS; 
}
//设置控阀超时时间 <= 4000 单位 s ；
gw_s8 Parse_Cmd_Code_81_7(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_81_7_LIST,sizeof(E_IR_RSP_81_7_LIST));    
    return E_STATE_SUCCESS; 
} 

//查询压力值
gw_s8 Parse_Cmd_Code_82_10(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_82_10_LIST,sizeof(E_IR_RSP_82_10_LIST));    
    return E_STATE_SUCCESS;
}
//查询冻结数据（日冻/月冻），返回的冻结流量（单位L），值为时间 
//例如： 日冻/月冻 191017/1910； 返回-1 表示没冻结数据
gw_s8 Parse_Cmd_Code_82_11(gw_u8 *FrameItemData){		
		gw_u8 u8StrLen;
    gw_u8 *Data_Field; 
		gw_u32 u32Data;
		E_Result_State  		e_result_state;
		S_Flash_Day_Usage   S_Flash_Updata_Day_Usage_Que;
		S_Cloud_Data 				*ps_cloud_data;  
		S_Flash_Data 				*ps_flash; 
    ps_cloud_data=Svc_Cloud_Get_Data();  
    ps_flash=Svc_Flash_Get_Data();  
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);     
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen!=6){
       return E_STATE_ERROR;    
    }  
		u32Data=atol((char*)Data_Field);
		s_ir_data.u8QueFrozenTime[0]=u32Data/10000;
		s_ir_data.u8QueFrozenTime[1]=(u32Data%10000)/100;
		s_ir_data.u8QueFrozenTime[2]=u32Data%100;
		s_ir_data.u8QueFrozenTime[3]=0;
		s_ir_data.u8QueFrozenTime[4]=0;
		s_ir_data.u8QueFrozenTime[5]=0;
		#if LOG_FUNC_ENABLE   
		if((s_ir_data.u8QueFrozenTime[0] == ps_cloud_data->pu8LastTime[0])&&
			(s_ir_data.u8QueFrozenTime[0] == ps_cloud_data->pu8LastTime[0])&&
			(s_ir_data.u8QueFrozenTime[0] == ps_cloud_data->pu8LastTime[0])){
					S_Flash_Updata_Day_Usage_Que =  ps_flash->s_usage_info.s_day_usage;						
					Creat_Upload_Day_Real_Data_Printf(&S_Flash_Updata_Day_Usage_Que);					
					Creat_Upload_Day_Hour_Data_Printf(&S_Flash_Updata_Day_Usage_Que);					
					Creat_Upload_Day_Dense_Data_Printf(&S_Flash_Updata_Day_Usage_Que);						
					Creat_Upload_Day_Alarm_Data_Printf(&S_Flash_Updata_Day_Usage_Que); 					
			}
			else{
				e_result_state=Read_Day_Usage(&S_Flash_Updata_Day_Usage_Que,s_ir_data.u8QueFrozenTime);//取前一天数据
				if(e_result_state==E_STATE_SUCCESS){						
						Creat_Upload_Day_Real_Data_Printf(&S_Flash_Updata_Day_Usage_Que);						
						Creat_Upload_Day_Hour_Data_Printf(&S_Flash_Updata_Day_Usage_Que);						
						Creat_Upload_Day_Dense_Data_Printf(&S_Flash_Updata_Day_Usage_Que);						
						Creat_Upload_Day_Alarm_Data_Printf(&S_Flash_Updata_Day_Usage_Que); 						
				}
				else{
						Svc_Cloud_Time_Printf("IR QUE Day Data Read Error Time =",s_ir_data.u8QueFrozenTime);
				}		
			}
		#endif   
    Ir_Send_Cmd(E_IR_RSP_82_11_LIST,sizeof(E_IR_RSP_82_11_LIST));    
    return E_STATE_SUCCESS; 
}
//查询 log 0 查询 log
gw_s8 Parse_Cmd_Code_82_0(gw_u8 *FrameItemData){			

		Ir_Send_Cmd(E_IR_RSP_82_0_LIST,sizeof(E_IR_RSP_FULL_LIST));    
		// Ir_Send_Cmd(E_IR_RSP_82_0_LIST,sizeof(E_IR_RSP_ALL_LIST));         
    return E_STATE_SUCCESS;
}   

//设置压力告警阈值上限（单位：Kpa） （保留不做）
gw_s8 Parse_Cmd_Code_83_14(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_14_LIST,sizeof(E_IR_RSP_83_14_LIST));    
    return E_STATE_SUCCESS;
}
//设置压力告警阈值下限 （单位：Kpa） （保留不做）
gw_s8 Parse_Cmd_Code_83_15(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_15_LIST,sizeof(E_IR_RSP_83_15_LIST));    
    return E_STATE_SUCCESS; 
}
//设置压力传感器是否启用，0：不启用； 1：启用 （保留不做）
gw_s8 Parse_Cmd_Code_83_16(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_16_LIST,sizeof(E_IR_RSP_83_16_LIST));    
    return E_STATE_SUCCESS; 
}
//密集压力采样时间间隔 单位：小时 最小为 1，范围1~24 （保留不做）
gw_s8 Parse_Cmd_Code_83_17(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_17_LIST,sizeof(E_IR_RSP_83_17_LIST));    
    return E_STATE_SUCCESS;
}
//密集流量采样使能 1：使能； 0：失能
gw_s8 Parse_Cmd_Code_83_20(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field; 
    gw_u32 u32Data; 
    S_Flash_Data *ps_flash;   
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0); 
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen!=1){
       return E_STATE_ERROR;    
    }     
    u32Data=atol((char*)Data_Field);
		ps_flash=Svc_Flash_Get_Data();    
    ps_flash->s_para.u8DenseEnable=u32Data;    
    Ir_Send_Cmd(E_IR_RSP_83_20_LIST,sizeof(E_IR_RSP_83_20_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;      
}
//设置过流值（单位 L/H） 范围： 1~999999999
gw_s8 Parse_Cmd_Code_83_18(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field;
    gw_u32 u32Data; 
    S_Flash_Data *ps_flash;        
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);     
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen>9){
       return E_STATE_ERROR;    
    }  
    u32Data=atol((char*)Data_Field);
    if((u32Data==0)||(u32Data>1000000000)){
        return E_STATE_ERROR;   
    }  
		ps_flash=Svc_Flash_Get_Data();  
    ps_flash->s_para.u32LargeFlowCutPoint=u32Data;    
    Ir_Send_Cmd(E_IR_RSP_83_18_LIST,sizeof(E_IR_RSP_83_18_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;    
}
//设置过流持续时间（单位：H） 范围 2 个字节
gw_s8 Parse_Cmd_Code_83_7(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field;
    gw_u32 u32Data;
    S_Flash_Data *ps_flash;      
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen>5){
       return E_STATE_ERROR;    
    }  
    u32Data=atoi((char*)Data_Field);
    if((u32Data==0)||(u32Data>65536)){
        return E_STATE_ERROR;   
    }   
		ps_flash=Svc_Flash_Get_Data();  
    ps_flash->s_para.u8LargeFlowDuration=u32Data;  
    Ir_Send_Cmd(E_IR_RSP_83_7_LIST,sizeof(E_IR_RSP_83_7_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;    
}
//设置持续用水时间 （单位：H） 范围 2 个字节
gw_s8 Parse_Cmd_Code_83_8(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_8_LIST,sizeof(E_IR_RSP_83_8_LIST));    
    return E_STATE_SUCCESS;
}
//设置单次用水最大值（单位：L） 范围 4 个字节
gw_s8 Parse_Cmd_Code_83_9(gw_u8 *FrameItemData){
		Ir_Send_Cmd(E_IR_RSP_83_9_LIST,sizeof(E_IR_RSP_83_9_LIST));    
    return E_STATE_SUCCESS;
}
//持续反转最大值（单位：L） 范围 4 个字节
gw_s8 Parse_Cmd_Code_83_10(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_10_LIST,sizeof(E_IR_RSP_83_10_LIST));    
    return E_STATE_SUCCESS;
}
//水表停走时间（单位：H） 范围 2 个字节
gw_s8 Parse_Cmd_Code_83_11(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_83_11_LIST,sizeof(E_IR_RSP_83_11_LIST));    
    return E_STATE_SUCCESS; 
}
//设置上报周期 单位：秒 最小位 900 （可设范围02592000s，030 天）
gw_s8 Parse_Cmd_Code_84_0(gw_u8 *FrameItemData){
    gw_u8 u8StrLen;
    gw_u8 *Data_Field;    
    gw_u32 u32Data;
    S_Flash_Data *ps_flash;  
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if((u8StrLen>5)||(u8StrLen==0)||(u8StrLen==2)){
       return E_STATE_ERROR;    
    }  
    u32Data=atol((char*)Data_Field);
    if((u32Data!=0)&&((u32Data<900)||(u32Data>86400))){
        return E_STATE_ERROR;   
    }   
//    if((u32Data!=0)&&(u32Data!=3600)&&(u32Data!=7200)&&(u32Data!=10800)
//        &&(u32Data!=14400)&&(u32Data!=21600)&&(u32Data!=28800)&&(u32Data!=43200)&&(u32Data!=86400)){
//        return E_STATE_ERROR;   
//    }   
    ps_flash=Svc_Flash_Get_Data();    
    ps_flash->s_para.u32ReportCycle=u32Data;    
		ps_flash->s_para.u8CommCycle = u32Data/3600;
		
    Ir_Send_Cmd(E_IR_RSP_84_0_LIST,sizeof(E_IR_RSP_84_0_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;  
    
}
//0 终端复位
gw_s8 Parse_Cmd_Code_84_1(gw_u8 *FrameItemData){
		S_Flash_Data *ps_flash;
		ps_flash=Svc_Flash_Get_Data();   
		Svc_Rtc_Set_Time_Flash();  	  
        Svc_Flash_Write_Usage(&ps_flash->s_usage_info);   	
		NVIC_SystemReset();
		return E_STATE_SUCCESS;
}
//2 NB 上报失败重发次数
gw_s8 Parse_Cmd_Code_84_2(gw_u8 *FrameItemData){
    gw_u8 	u8StrLen;
    gw_u8 	*Data_Field;
    gw_u32 	u32Data;
    S_Flash_Data *ps_flash;
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen!=1){
       return E_STATE_ERROR;    
    }        
    u32Data=atol((char*)Data_Field);
    if((u32Data==0)||(u32Data>2)){
        return E_STATE_ERROR;   
    }  
		ps_flash=Svc_Flash_Get_Data();    
    ps_flash->s_para.u8ResendTimes=u32Data;   
    Ir_Send_Cmd(E_IR_RSP_84_2_LIST,sizeof(E_IR_RSP_84_2_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;    
}
//0 NB 上报
gw_s8 Parse_Cmd_Code_84_4(gw_u8 *FrameItemData){
    gw_u8 *Data_Field;
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    Svc_Cloud_Resend_Reset(); 
    Svc_Cloud_Post_Event(E_Cloud_Event_Upload);
    Ir_Send_Cmd(E_IR_RSP_84_4_LIST,sizeof(E_IR_RSP_84_4_LIST));
    return E_STATE_SUCCESS; 
}
//设置上报区间，前面两位表示上报起始时间点，单位小时。后面两位乘以 30 分钟表示离散时间段，
//比如 0046 表示从 0 点到 23 点离散上报 ，可设范围 0~23 点
gw_s8 Parse_Cmd_Code_84_5(gw_u8 *FrameItemData){
    gw_u8 	u8StrLen;
    gw_u8 	*Data_Field;    
    gw_u32 	u32Data;
    S_Flash_Data *ps_flash;  
		S_Flash_Device_Para *ps_device_para; 
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',0);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if(u8StrLen>4){
       return E_STATE_ERROR;    
    }  
    u32Data=atol((char*)Data_Field);

    if((u32Data==0)||(u32Data>=2400)){
        return E_STATE_ERROR;   
    }     
    if(((u32Data/100)+((u32Data%100)*30/60))>=24){ //超过一天
        return E_STATE_ERROR; 
    }
    ps_flash=Svc_Flash_Get_Data();
	ps_device_para = &ps_flash->s_para;
    memset(ps_device_para->u8DiscreteStartTime,0,sizeof(ps_device_para->u8DiscreteStartTime));
    memset(ps_device_para->u8DiscreteStopTime,0,sizeof(ps_device_para->u8DiscreteStopTime));
    ps_device_para->u8DiscreteStartTime[3]=u32Data/100;  //取起始时间小时
    ps_device_para->u8DiscreteStopTime[3]=(u32Data%100)*30/60; //取结束时间小时
    ps_device_para->u8DiscreteStopTime[4]=((u32Data%100)*30)%60;//取结束时间分钟  
	ps_device_para->u16ReportInterval=u32Data;
    // Svc_Log_Print("u32Data = %d u8DiscreteStartTime[3] = %d  u8DiscreteStopTime[3] = %d u8DiscreteStopTime[4] = %d\r\n",u32Data,ps_device_para->u8DiscreteStartTime[3],ps_device_para->u8DiscreteStopTime[3], ps_device_para->u8DiscreteStopTime[4]);	
    Ir_Send_Cmd(E_IR_RSP_84_5_LIST,sizeof(E_IR_RSP_84_5_LIST));
    if(Svc_Flash_Write_Device_Para(ps_device_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS;  
}
//0：非实时下行 ，1：实时下行 （仅 NBw 支持）
gw_s8 Parse_Cmd_Code_84_10(gw_u8 *FrameItemData){
		Ir_Send_Cmd(E_IR_RSP_84_10_LIST,sizeof(E_IR_RSP_84_10_LIST));    
    return E_STATE_SUCCESS;   
}

//PSM 模式 0：失能 1：使能
gw_s8 Parse_Cmd_Code_99_21(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_99_21_LIST,sizeof(E_IR_RSP_99_21_LIST));    
    return E_STATE_SUCCESS; 
}
//网络协议 0：CAOP 1：UDP
gw_s8 Parse_Cmd_Code_99_23(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_99_23_LIST,sizeof(E_IR_RSP_99_23_LIST));    
    return E_STATE_SUCCESS; 
}
//设置 APN 电信：ctnb； 移动：cmnbiot； 联通：nbiot
gw_s8 Parse_Cmd_Code_99_3(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_99_3_LIST,sizeof(E_IR_RSP_99_3_LIST));
    return E_STATE_SUCCESS;    
}
//设置 IP 端口
gw_s8 Parse_Cmd_Code_99_4(gw_u8 *FrameItemData){
		gw_u8 *p;
    gw_u8 *Data_Field;  		
    gw_u8 u8StrLen;  
    S_Flash_Data *ps_flash; 
		S_Flash_Nb_Info *ps_nb_Info; 
    ps_flash=Svc_Flash_Get_Data();   
		ps_nb_Info=&ps_flash->s_para.s_nb_info;
    Data_Field=Util_Data_Get_Valid_String((gw_u8 *)FrameItemData,':',1);
    if(Data_Field==NULL){
        return E_STATE_ERROR; 
    }
    u8StrLen=strlen((const char *)Data_Field);
    if((u8StrLen==0)||(u8StrLen>31)){
        return E_STATE_ERROR; 
    }  		
		p=(gw_u8*)strchr((char const*)Data_Field,':');   
		if(p==NULL){
				return E_STATE_ERROR;
		}
		*p=',';
	  if(CheckIP(Data_Field)==E_STATE_ERROR){ //判断是否有效IP
				return E_STATE_ERROR;
		}
		memset(ps_nb_Info->IpInfo,0,sizeof(ps_nb_Info->IpInfo));
    memcpy(ps_nb_Info->IpInfo,Data_Field,u8StrLen); 
    Ir_Send_Cmd(E_IR_RSP_99_4_LIST,sizeof(E_IR_RSP_99_4_LIST));
    if(Svc_Flash_Write_Device_Para(&ps_flash->s_para)==E_STATE_ERROR){                 //flash异常，无法写入            
        return E_STATE_ERROR;
    }
    return E_STATE_SUCCESS; 
}
//升级 MCU
gw_s8 Parse_Cmd_Code_99_5(gw_u8 *FrameItemData){
	 return E_STATE_ERROR;
}
//设置 PLMN(字符串) 电信：46011； 移动：46000； 联通
gw_s8 Parse_Cmd_Code_99_6(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_99_6_LIST,sizeof(E_IR_RSP_99_6_LIST));
    return E_STATE_SUCCESS;    
}
//设置频点 BAND，比如 5
gw_s8 Parse_Cmd_Code_99_7(gw_u8 *FrameItemData){   
    Ir_Send_Cmd(E_IR_RSP_99_7_LIST,sizeof(E_IR_RSP_99_7_LIST));
    return E_STATE_SUCCESS; 
}
//设置 RF 信道组，可设为 0 、 1 、 2、 3
gw_s8 Parse_Cmd_Code_99_29(gw_u8 *FrameItemData){
    Ir_Send_Cmd(E_IR_RSP_99_29_LIST,sizeof(E_IR_RSP_99_29_LIST));    
    return E_STATE_SUCCESS; 
}  


gw_s8 Parse_Cmd_Code_03(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_03,E_CMD_MAX_3);  
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_80(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_80,E_CMD_MAX_80);   
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_81(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_81,E_CMD_MAX_81);  
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_82(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_82,E_CMD_MAX_82); 
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_83(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_83,E_CMD_MAX_83); 
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_84(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_84,E_CMD_MAX_84);  
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_99(gw_u8 *FrameItemData){
    Svc_Ir_Cmd_Parse(s_ir_data.FrameItem[2],ir_cmd_data_99,E_CMD_MAX_99);   
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_Imei(gw_u8 *FrameItemData){     
    Ir_Send_Cmd(E_IR_RSP_IMEI_LIST,sizeof(E_IR_RSP_IMEI_LIST));
		return E_STATE_SUCCESS;
}
gw_s8 Parse_Cmd_Code_All(gw_u8 *FrameItemData){     
    Ir_Send_Cmd(E_IR_RSP_ALL_LIST,sizeof(E_IR_RSP_ALL_LIST));
		return E_STATE_SUCCESS;
}

gw_u8 Svc_Ir_Cmd_Parse(gw_u8 *FrameItemData,const S_Ir_Cmd_Data *Cmd_Data,gw_u8 CmdMaxNum){  //查找并解析命令
    gw_u8  u8i; 
    gw_u8* source;
    const char* target; 
    source=FrameItemData;    
		if(source==NULL){
			return E_STATE_ERROR;  
		}
    for(u8i=0;u8i<CmdMaxNum;u8i++){        
        target=Cmd_Data[u8i].recv_cmd;
				if(target==NULL){
						return E_STATE_ERROR;  
				}
        if(strstr((const char *)source, (const char *)target)!=NULL){
            if((Cmd_Data[u8i].callback!=NULL)){
                if(Cmd_Data[u8i].callback(FrameItemData)==E_STATE_SUCCESS){
                    return E_STATE_SUCCESS; 
                }      
            } 
            return E_STATE_ERROR; 
        }
    }
    return E_STATE_ERROR;    
}

gw_u8 CheckIP(gw_u8 *buf){	
		gw_u8 u8i;
		gw_u8	*p,*p1;
    gw_u8 u8Ip[32]={0};		
		gw_u32 u32Data;
		memcpy(u8Ip,buf,32);
		u8Ip[31]=0;
		p=u8Ip;
		if(p==NULL){		
			return E_STATE_ERROR;  
		}
		for(u8i=0;u8i<3;u8i++){			//取前三个IP地址
			p1=(gw_u8	*)strchr((char *)p,'.');
			if(p1==NULL){
				return E_STATE_ERROR; 
			}
			*p1=0;
			u32Data=atol((char*)p);
			if((u32Data==0)||(u32Data>255)){
					return E_STATE_ERROR;  
			}
			p1=p1+1;
			p=p1;
			if(p1==NULL){
				return E_STATE_ERROR; 
			}
		}
		p1=(gw_u8	*)strchr((char *)p,',');
		if(p1==NULL){
			return E_STATE_ERROR; 
		}
		*p1=0;
		u32Data=atol((char*)p);  //取第四个IP地址
		if((u32Data==0)||(u32Data>255)){
				return E_STATE_ERROR;  
		}
		p1=p1+1;
		p=p1;
		if(p1==NULL){
			return E_STATE_ERROR; 
		}		
		//取端口号
		u32Data=atol((char*)p);
		if((u32Data==0)||(u32Data>65535)){
				return E_STATE_ERROR;  
		}
		return E_STATE_SUCCESS;
}

gw_u8 CheckSn(gw_u8 *buf){
    gw_u8 u8Sn[15]={0};
    gw_u8 u8i;
    gw_u8 u8StrLen;
    S_Flash_Data *s_flash_ir;
    s_flash_ir=Svc_Flash_Get_Data();         
    u8StrLen=strlen((const char *)buf);
//    if(u8StrLen!=14){					23.2.14yess - 注释
//       return E_STATE_ERROR;    
//    }
    for(u8i=0;u8i<7;u8i++){
        u8Sn[u8i*2]=((s_flash_ir->s_security.pu8MeterNum[u8i]>>4)&0x0f)+'0'; 
        u8Sn[u8i*2+1]=(s_flash_ir->s_security.pu8MeterNum[u8i]&0x0f)+'0';
    }
		u8Sn[14]=0;
    if(strcmp((char*)buf,(char*)&u8Sn[14-u8StrLen])==0){//23.2.14yess - 修改
        return E_STATE_SUCCESS;
    }
    return E_STATE_ERROR; 
}
gw_u8 CheckRc(gw_u8 *buf, gw_u8 u8Differ,gw_u32 u32len){
    gw_u8 u8sum = 0;
    gw_u32 u32i = 0;
    for ( u32i = 0; u32i < u32len; u32i++){    
        u8sum += buf[u32i];
    }
    u8sum=u8sum+u8Differ;
    u8sum = u8sum%26 +'A'; // 这样能保证返回的校验码，是从 A 到 Z 的字符
    return u8sum;
}

/**
 * @brief: Ir获取当前状态
 * @param  {void}
 * @return {E_IR_State} IR状态
 * @note: 
 * @see: 
 */
E_IR_State Svc_Ir_Core_Get_Cur_State(void){
    return s_ir_data.e_ir_state;
}

/**
 * @brief: IR设置状态
 * @return {void}
 * @note: 
 * @see: 
 * @param {E_IR_State} ir_cur_state IR状态
 */
void Svc_Ir_Set_Cur_State(E_IR_State ir_cur_state){
    #if LOG_FUNC_ENABLE      
	    Svc_Log_Printf(LOG_INFO,"%s:%d\r\n",__FUNCTION__,ir_cur_state);  
    #endif
    s_ir_data.e_ir_state=ir_cur_state;
}
// /**
//  * @brief: 等待下发命令
//  * @param  {void}
//  * @return {gw_u8} 剩余等待时间
//  * @note: 
//  * @see: 
//  */
// gw_u8 Svc_Ir_Wait_Cmd(void){
//     return s_ir_data.u8KeepAliveTime;
// }