stm32_ota/ABM开发板(APP源码)/YcOS版本/APPV3.0/USER/USERCMD/usercmd.c
2024-12-17 20:03:43 +08:00

711 lines
31 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "usercmd.h"
#include "flash.h"
#include "usart.h"
#include "sysport.h"
#include "user_tcp.h"
#include "userapp.h"
#include "logflash.h"
#include "key.h"
/******************************************************************************
*供外部使用的常变量定义
*******************************************************************************/
FrameQueue_s sUsercmdQueue ; //定义帧环形缓冲区,用于存放用户配置命令
/*用来保存FLASH内的配置信息*/
IAPFlash_u uIapFlash ; //定义IAPFlash_u共用体变量
APPFlash_u uAppFlash ; //定义APPFlash_u共用体变量
/*命令处理异常*/
char *noCmdErr = "命令不支持" ;
char *paramErr = "参数不合法!" ;
char *formErr = "命令格式错误!" ;
/*********************************************************************************************************************
* 名 称void InitIapFlashConfig( IAPFlash_u *config )
* 功 能先从FLASH读出IAPFlash信息然后对IAPFlash_u类型的全局变量初始化最终再写入FLASH中
* 说 明读取RunAppNum更新FLASH中的RunAppNum标志位
*********************************************************************************************************************/
void InitIapFlashConfig( IAPFlash_u *config )
{
InitQueueMem(&sUsercmdQueue) ; //初始化用于存放用户配置命令的环形缓冲区sUsercmdQueue
Get_uIapFlash(config) ; //从FLASH中读取IAP信息到共用体变量uIapFlash中
config->sIapFlash.Head = '[' ; //帧头初始化
config->sIapFlash.IapFlag = 0x30 ; //升级标志位初始化
#if defined APP0_CODE
config->sIapFlash.RunAppNum =0x30 ; //当前APP为APP0
strcpy((char*)config->sIapFlash.BootVers, "No Boot") ;
#elif defined APP1_CODE
config->sIapFlash.RunAppNum =0x31 ; //当前APP为APP1
#elif defined APP2_CODE
config->sIapFlash.RunAppNum =0x32 ; //当前APP为APP2
#elif defined APP3_CODE
config->sIapFlash.RunAppNum =0x33 ; //当前APP为APP3
#endif
config->sIapFlash.JumpResult = 0x31 ; //系统从boot跳转到APP成功将JumpResult位设置为true并写入FLASH。//如果BOOT启动判断该为为false则判定APP有问题直接运行应急程序APP1
if((uint8_t)config->sIapFlash.FtpFolder[0] == 0xFF ) /*未配置过FtpFolder*/
{
memset( config->sIapFlash.FtpFolder, 0, FOLDER_MAXLEN) ;
strcpy( config->sIapFlash.FtpFolder, "/ABM") ; //如果未配置FtpFolder则将默认路径设置为/ABM
}
if( (uint8_t)config->sIapFlash.FtpUsername[0] == 0xFF ) /*FLASH中存储ftp用户名的字段有效*/
{
memset( config->sIapFlash.FtpUsername, 0, USERNAME_MAXLEN) ;
strcpy( config->sIapFlash.FtpUsername, "ABM") ; //如果未配置FtpUsername则将FTP默认用户名设置为ABM
}
if( (uint8_t)config->sIapFlash.FtpPassword[0] == 0xFF ) /*FLASH中存储ftp用户名密码的字段无效*/
{
memset( config->sIapFlash.FtpPassword, 0, PASSWORD_MAXLEN) ;
strcpy( config->sIapFlash.FtpPassword, "Shop344794749") ; //如果未配置FtpUsername则将FTP默认用户名密码设置为Shop344794749
}
if( (uint8_t)config->sIapFlash.FtpIP[0] == 0xFF ) /*FLASH中存储FtpIP字段无效*/
{
memset( config->sIapFlash.FtpIP, 0, MAX_IP_LEN) ;
strcpy( config->sIapFlash.FtpIP, "121.41.79.87") ; //如果未配置FtpIP则将FTP服务器IP设置为"121.41.79.87"
}
if( ((uint8_t)config->sIapFlash.TcpIP[0] == 0xFF) ||
((uint8_t)config->sIapFlash.TcpIP[0] == 0x00)) /*FLASH中存储FtpIP字段无效*/
{
memset( config->sIapFlash.TcpIP, 0, MAX_IP_LEN) ;
strcpy( config->sIapFlash.TcpIP, TCP_CONNECTID0_SERVERIP0) ;//如果未配置FtpIP则将FTP服务器IP设置为TCP_CONNECTID0_SERVERIP0
}
else /*FLASH中存储FtpIP字段有效将s_Channal0缺省IP修改为配置IP*/
{
SetAppTcpIP(&sChannal0, uIapFlash.sIapFlash.TcpIP ) ; //更新TCP服务器的IP
}
if( ((uint8_t)config->sIapFlash.TcpPort[0] == 0xFF) ||
((uint8_t)config->sIapFlash.TcpPort[0] == 0x00) ) /*FLASH中存储FtpIP字段无效*/
{
memset( config->sIapFlash.TcpPort, 0, PORT_MAXLEN) ;
char port[PORT_MAXLEN] = {0} ;
itoa(TCP_CONNECTID0_SERVERPORT0, port, 10);
strcpy( config->sIapFlash.TcpPort, port) ; //如果未配置TcpPort则将FTP服务器IP设置为TCP_CONNECTID0_SERVERPORT0
}
else
{
SetAppTcpPort(&sChannal0, uIapFlash.sIapFlash.TcpPort ) ; //更新TCP服务器的port
}
config->sIapFlash.Tail = ']' ; //帧尾初始化
Set_uIapFlash(config) ; //将初始化信息重新写入FLASH中
}
/**************************************************************************************************
* 名 称: void Get_uIapFlash(IAPFlash_u *config)
* 功能说明: 从内部flash中IAPCONFIG_AREA_ADDR地址读取一页获取FLASH中的IAP信息
* 入口参数:
* @param1 *uIapInfo IAPFlash_u共用体变量指针
**************************************************************************************************/
void Get_uIapFlash(IAPFlash_u *config)
{
memset( config->iapFlashBuffer , 0, IAPFLASHCONFIGLEN) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN) ;
}
/**************************************************************************************************
* 名 称: void Set_uIapFlash(IAPFlash_u *config)
* 功能说明: 将新的IAP信息写入FLASH
* 入口参数:
* @param1 *uIapInfo IAPFlash_u共用体变量指针
**************************************************************************************************/
void Set_uIapFlash(IAPFlash_u *config)
{
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, config->iapFlashBuffer, IAPFLASHCONFIGLEN) ;
}
/*********************************************************************************************************************
* 名 称void InitAppFlashConfig( APPFlash_u *config )
* 功 能先从FLASH读出APPFlash信息然后对APPFlash_u类型的全局变量初始化最终再写入FLASH中
* 说 明先读取FLASH中存储的配置信息然后做校验不合法的标志位全部初始化为默认值最后再写入FLASH
*********************************************************************************************************************/
void InitAppFlashConfig( APPFlash_u *config )
{
Get_uAppFlash(config) ; //从FLASH中读取IAP信息到共用体变量uAppFlash中
Set_uAppFlash(config) ;
}
/**************************************************************************************************
* 名 称: void Get_uIapFlash(APPFlash_u *config)
* 功能说明: 从内部flash中APPFLASHCONFIGLEN地址读取一页获取FLASH中的APP信息
* 入口参数:
* @param1 *uIapInfo IAPFlash_u共用体变量指针
**************************************************************************************************/
void Get_uAppFlash(APPFlash_u *config)
{
memset( config->appFlashBuffer, 0, APPFLASHCONFIGLEN) ;
Read_Flash_Byte(APPCONFIG_AREA_ADDR, config->appFlashBuffer, APPFLASHCONFIGLEN ) ;
}
/**************************************************************************************************
* 名 称: Set_uIapFlash(APPFlash_u *config)
* 功能说明: 将新的IAP信息写入FLASH
* 入口参数:
* @param1 *uIapInfo IAPFlash_u共用体变量指针
**************************************************************************************************/
void Set_uAppFlash(APPFlash_u *config)
{
Write_Flash_OnePage(APPCONFIG_AREA_ADDR, config->appFlashBuffer, APPFLASHCONFIGLEN) ;
}
/****************************************************************************
* 名 称void Cmd_Process( char *cmdBuf, int bufLen )
* 功 能:对用户控制命令进行处理
* 入口参数:
* @param1 cmdBuf 指向控制命令的指针
* @param2 bufLen 控制命令数据的长度
* 说 明对用户控制命令进行处理实际就是响应命令动作并且将新的参数保存到对应的FLASH区域
* 格 式:(L0072MAC:31FFD405524E353728902251;10&CMD_RST$X)
****************************************************************************/
void Cmd_Process( char *cmdBuf, int bufLen )
{
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
char state ;
switch( psBuf->cmdCode[1] ) /*解析操作码第2字节*/
{
case 0x30: //重启指令
{
state = RestartCmdProcess( cmdBuf, bufLen ) ;
break ;
}
case 0x31: //Config指令
{
state = GetConfigCmdProcess( cmdBuf, bufLen ) ;
break ;
}
case 0x32: //IapFlag指令
{
state = IapFlagCmdProcess( cmdBuf, bufLen ) ;
break ;
}
case 0x33: //RunAppNum指令
{
state = RunAppNumCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x34: //FtpFolder指令
{
state = FtpFolderCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x35: //FtpUsername指令
{
state = FtpUsernameCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x36: //FtpPassword指令
{
state = FtpPasswordCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x37: //FtpIP指令
{
state = FtpIPCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x38: //TcpIP指令
{
state = TcpIPCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x39: //TcpIP指令
{
state = TcpPortCmdProcess( cmdBuf, bufLen) ;
break ;
}
case 0x40: //音量等级指令
{
state = VolumeRankCmdProcess() ;
break ;
}
default : //指令号不合法,不存在该指令
{
state = 'N' ;
break ;
}
}
if( state == 'P' ) //指令负载中参数不合法
{
CmdResponse( cmdBuf, paramErr) ;
}
else if(state == 'I') //指令格式错误
{
CmdResponse( cmdBuf, formErr) ;
}
else if(state == 'N')
{
CmdResponse( cmdBuf, noCmdErr) ;
}
}
/**************************************************************************************************
* 名 称: char RestartCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“软重启”命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen 命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (L0072MAC:31FFD405524E353728902251;10&CMD_RST$X)
************************************************************************************************/
char RestartCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
if( kmp((&(psBuf->loadHead)+1), "CMD_RST") == 0 ) //LOAD:CMD_RST
{
state = 'S' ; //标志指令处理成功
CmdResponse( cmdBuf, "*SET* User control device restart!") ; //通过TCP上传命令处理回码
Wait_For_Nms(1*TICK_RATE_HZ) ; //等待1S
TcpDisconnetc() ;
Wait_For_Nms(1*TICK_RATE_HZ) ; //等待1S
EC20_CLOSE() ;
WriteLogToFlash("重启命令软重启!") ;
SystemSoftReset() ;
}
else
{
state = 'P' ; //指令参数不合法
}
return state ;
}
/**************************************************************************************************
* 名 称: char GetConfigCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“GET_IAP”命令:获取存储在内部flash中IAPCONFIG_AREA_ADDR地址的IAP配置信息
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen 命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (L0072MAC:31FFD405524E353728902251;01&GET_IAP$X)
************************************************************************************************/
char GetConfigCmdProcess(char *cmdBuf, int bufLen)
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读uIapFlash配置
if( kmp((&(psBuf->loadHead)+1), "GET_IAP") == 0 ) //LOAD:GET_IAP
{
char *backBuf = portMalloc(512) ;
Query_AppVersion((char*)gateApp.appVers) ;
snprintf(backBuf, 512, "*GET* IapFlag:[%c]! RunAppNum:[APP%c]! JumpResult:[%c]! BootVers:[%s]! AppVers:[%s]! Csq:[%s]! Ec20Vol:[%s]! \
SimIccid:[%s]! FtpUsername:[%s]! FtpPassword:[%s]! FtpFolder:[%s]! FtpIP:[%s]! TcpIP:[%s]! TcpPort:[%s]!",
uIapFlash.sIapFlash.IapFlag, uIapFlash.sIapFlash.RunAppNum, uIapFlash.sIapFlash.JumpResult, uIapFlash.sIapFlash.BootVers, gateApp.appVers,\
sEc20Param.csq, sEc20Param.ec20Voltage, sEc20Param.simICCID, uIapFlash.sIapFlash.FtpUsername,uIapFlash.sIapFlash.FtpPassword,\
uIapFlash.sIapFlash.FtpFolder, uIapFlash.sIapFlash.FtpIP, uIapFlash.sIapFlash.TcpIP, uIapFlash.sIapFlash.TcpPort) ;
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
state = 'S' ; //指令执行成功
portFree(backBuf) ;
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
return state ;
}
/**************************************************************************************************
* 名 称: char IapFlagCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“IapFlag”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (L0012MAC:31FFD405524E353728902251;12&1$X)
************************************************************************************************/
char IapFlagCmdProcess(char *cmdBuf, int bufLen)
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* IapFlag:[%c]! ", uIapFlash.sIapFlash.IapFlag) ;
if((psBuf->cmdCode[0] == 0x31) && (kmp(psBuf->loadLen, "001") == 0) ) //SET命令&&此命令负载长度为1字节
{
if( IS_IapFlag_ALL_PERIPH( *(&(psBuf->loadHead)+1)) ) //负载参数合法校验
{
uIapFlash.sIapFlash.IapFlag = *(&(psBuf->loadHead)+1) ; //改配置将负载值赋值给uIapFlash.sIapFlash.IapFlag
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* IapFlag:[%c]!", uIapFlash.sIapFlash.IapFlag ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else
{
state = 'P' ; //指令负载中参数不合法
}
}
else if((psBuf->cmdCode[0] == 0x30) && (kmp(psBuf->loadLen, "001") == 0) ) //GET命令&&此命令负载长度为1字节
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char RunAppNumCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“RunAppNum”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (L0012MAC:31FFD405524E353728902251;13&1$X)
************************************************************************************************/
char RunAppNumCmdProcess( char *cmdBuf, int bufLen )
{char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
Query_AppVersion((char*)gateApp.appVers) ;
int len = snprintf(backBuf, 256, "*GET* RunAppNum:[APP%c] ! *GET* AppVersion:[%s] !", uIapFlash.sIapFlash.RunAppNum, gateApp.appVers) ;
if((psBuf->cmdCode[0] == 0x31) && (kmp(psBuf->loadLen, "001") == 0) ) //SET命令&&此命令负载长度为1字节
{
if( IS_RunAppNum_ALL_PERIPH( *(&(psBuf->loadHead)+1) ) ) //负载参数合法
{
uIapFlash.sIapFlash.RunAppNum = *(&(psBuf->loadHead)+1) ; //改配置
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* RunAppNum:[APP%c]重启后生效!", uIapFlash.sIapFlash.RunAppNum ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载参数不合法
{
state = 'P' ; //指令负载中参数不合法
}
}
else if((psBuf->cmdCode[0] == 0x30) && (kmp(psBuf->loadLen, "001") == 0) ) //GET命令&&此命令负载长度为1字节
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char FtpFolderCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“FtpFolder”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (L0042MAC:31FFD405524E353728902251;14&/ftp$X)
************************************************************************************************/
char FtpFolderCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* FtpFolder:[%s]!", uIapFlash.sIapFlash.FtpFolder) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.FtpFolder, 0, FOLDER_MAXLEN ) ;
strncpy(uIapFlash.sIapFlash.FtpFolder, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpFolder拷贝到uIapFlash.sIapFlash.FtpFolder中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* FtpFolder:[%s]!", uIapFlash.sIapFlash.FtpFolder ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char FtpUsernameCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“FtpUsername”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (c0032MAC:31FFD405524E353728902251;15&ABM$X)
************************************************************************************************/
char FtpUsernameCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* FtpUsername:[%s]!", uIapFlash.sIapFlash.FtpUsername) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.FtpUsername, 0, USERNAME_MAXLEN ) ;
strncpy(uIapFlash.sIapFlash.FtpUsername, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpUsername拷贝到uIapFlash.sIapFlash.FtpUsername中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* FtpUsername:[%s]!", uIapFlash.sIapFlash.FtpUsername ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char FtpPasswordCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“FtpPassword”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (c0130MAC:35FFDC054D52323238780843;16&Shop344794749$X)
************************************************************************************************/
char FtpPasswordCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* FtpPassword:[%s]!", uIapFlash.sIapFlash.FtpPassword) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.FtpPassword, 0, PASSWORD_MAXLEN ) ;
strncpy(uIapFlash.sIapFlash.FtpPassword, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpPassword拷贝到uIapFlash.sIapFlash.FtpPassword中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* FtpPassword:[%s]!", uIapFlash.sIapFlash.FtpPassword ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char FtpIPCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“FtpIP”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (c0120MAC:35FFDC054D52323238780843;17&121.41.79.87$X)
************************************************************************************************/
char FtpIPCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* FtpIP:[%s]!", uIapFlash.sIapFlash.FtpIP) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.FtpIP, 0, MAX_IP_LEN ) ;
strncpy(uIapFlash.sIapFlash.FtpIP, (&(psBuf->loadHead)+1), loadLen) ; //将新的FtpIP拷贝到uIapFlash.sIapFlash.FtpIP中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* FtpIP:[%s]!", uIapFlash.sIapFlash.FtpIP ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char TcpIPCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“TcpIP”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (c0120MAC:35FFDC054D52323238780843;18&121.41.79.87$X)
************************************************************************************************/
char TcpIPCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* TcpIP:[%s]!", uIapFlash.sIapFlash.TcpIP) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.TcpIP, 0, MAX_IP_LEN ) ;
strncpy(uIapFlash.sIapFlash.TcpIP, (&(psBuf->loadHead)+1), loadLen) ; //将新的TcpIP拷贝到uIapFlash.sIapFlash.TcpIP中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* TcpIP:[%s]!", uIapFlash.sIapFlash.TcpIP ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
/**************************************************************************************************
* 名 称: char TcpPortCmdProcess( char *cmdBuf, int bufLen )
* 说 明: 解析“TcpPort”字段命令
* 入口参数:
* @param1 *cmdBuf: 命令数据帧指针
* @param2 bufLen命令数据帧长度
* 出口参数:
* @param1 state: 指令处理结果S成功P参数错误I负载格式错误
* 数据帧格式: (c0040MAC:35FFDC054D52323238780843;19&7000$X)
************************************************************************************************/
char TcpPortCmdProcess( char *cmdBuf, int bufLen )
{
char state ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
unsigned int loadLen = (psBuf->loadLen[0]-0x30)*100 + (psBuf->loadLen[1]-0x30)*10 + (psBuf->loadLen[2]-0x30) ;
Read_Flash_Byte(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //读配置
char *backBuf = (char*)portMalloc(256) ;
int len = snprintf(backBuf, 256, "*GET* TcpPort:[%s]!", uIapFlash.sIapFlash.TcpPort) ;
if((psBuf->cmdCode[0] == 0x31) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //SET命令&&此命令负载长度校验成功
{
memset(uIapFlash.sIapFlash.TcpPort, 0, MAX_IP_LEN ) ;
strncpy(uIapFlash.sIapFlash.TcpPort, (&(psBuf->loadHead)+1), loadLen) ; //将新的TcpPort拷贝到uIapFlash.sIapFlash.TcpPort中
Write_Flash_OnePage(IAPCONFIG_AREA_ADDR, uIapFlash.iapFlashBuffer, IAPFLASHCONFIGLEN ) ; //保存配置
snprintf((backBuf+len), 256-len, "*SET* TcpPort:[%s]!", uIapFlash.sIapFlash.TcpPort ) ;
state = 'S' ; //指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else if((psBuf->cmdCode[0] == 0x30) && ( *(&(psBuf->loadHead)+loadLen+1) == '$' ) ) //GET命令&&此命令负载长度校验成功
{
state = 'S' ; //读指令执行成功
CmdResponse( cmdBuf, backBuf) ; //通过TCP上传命令处理回码
}
else //负载(负载长度)不合法
{
state = 'I' ; //指令负载中参数不合法
}
portFree(backBuf) ;
return state ;
}
char VolumeRankCmdProcess(void)
{
return 'S' ;
}
/**************************************************************************************************
* 名 称: RunResult CmdResponse(char *cmdBuf, char *format, ...)
* 说 明: 硬件回复收到的命令帧
* 入口参数:
* @param1 pCmdcode: 接收的命令类型
* @param2 char *format,... 可变参变量
* @param3 ... :可变参数
* 出口参数:
* @param1 status: RunResult枚举类型数据
* 数据帧格式:(R0193MAC:35FFDC054D52323238780843;00&*GET* IapFlag:[0]! $X)
* 注 意: 最大负载长度为TCP_LOADBUF_MAXLEN
************************************************************************************************************/
RunResult CmdResponse(char *cmdBuf, char *backBuf)
{
RunResult status = RUNOK ;
TcpFrame_S *psBuf = (TcpFrame_S*)cmdBuf ;
static uint8_t counter = 0x30 ;
char *upDataBuf = (char*)portMalloc(TCP_LOADBUF_MAXLEN+sizeof(TcpFrame_S)+32) ; //分配内存长度为负载长度+TcpFrame_S结构体长度
TcpFrame_S *sTcpFrameData = (TcpFrame_S *)upDataBuf ; //tcp数据帧变量
int outLen = snprintf(&(sTcpFrameData->loadHead)+1 , TCP_LOADBUF_MAXLEN, "%s", backBuf ) ; //到此为止所有的参数情况已经汇总到upDataBuf了
if((outLen<=0)||( outLen > TCP_LOADBUF_MAXLEN))
{
ErrorLogPrintf("%s,%d:upDataBuf spillover",__FILE__, __LINE__) ;
portFree(upDataBuf) ;
return RUNERR ;
}
sTcpFrameData->head = '(' ;
sTcpFrameData->loadLen[0] = outLen/100 + 0x30;
sTcpFrameData->loadLen[1] = outLen%100/10 + 0x30 ;
sTcpFrameData->loadLen[2] = outLen%10 + 0x30;
sTcpFrameData->frameNum = counter ;
counter ++ ;
if( counter > 0x39 ) //防止counter字符数字溢出
{
counter = 0x30 ;
}
strncpy(sTcpFrameData->macHead, "MAC:", 4) ;
GetDeviceMacAddress(sTcpFrameData->macid, STRMACID) ;
sTcpFrameData->macTail = ';' ;
memcpy(sTcpFrameData->cmdCode, psBuf->cmdCode, 2) ;
sTcpFrameData->loadHead = '&' ;
if( psBuf->frameType == TCPCMDFRAME ) //TCP server下发的命令
{
sTcpFrameData->frameType = TCPCMDBACKFRAME ;
strncat(upDataBuf, "$X)", 3) ; //TcpFrame_S结构体的最后三个字节拼接到 upDataBuf尾部
if( RW_OK != InsertQueueMemData(&sTcp0Queue, upDataBuf, strlen(upDataBuf)))
{
ErrorLogPrintf("%s,%d:sTcp0Queue spillover", __FILE__, __LINE__) ;
}
}
else //COM上位机发来的命令
{
sTcpFrameData->frameType = COMCMDBACKFRAME ;
strncat(upDataBuf, "$X)", 3) ; //TcpFrame_S结构体的最后三个字节拼接到 upDataBuf尾部
UARTx_SendData(UART_DEBUG, upDataBuf, strlen(upDataBuf)+1) ;
}
portFree(upDataBuf) ;
return (status) ;
}