stm32_ota/ABM开发板(BOOT源码)/BOOTV2.1/HARDWARE/LTE/EC20/ec20ftp.c

402 lines
16 KiB
C
Raw Normal View History

2024-12-17 20:03:43 +08:00
#include "ec20ftp.h"
#include <stdlib.h>
#include "syslib.h" //#define STR2(R) STR1(R)
/********************************************************************************
* @file ec20ftp.c
* @author <EFBFBD><EFBFBD><EFBFBD>վű<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣϵͳ<EFBFBD><EFBFBD><EFBFBD>޹<EFBFBD>˾ Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief <EFBFBD>Quectelģ<EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FTPӲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************
* @attention
* Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
* contextID:<EFBFBD><EFBFBD>·ID
* EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD>Χ1~16<EFBFBD><EFBFBD>ÿһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹ<EFBFBD><EFBFBD>FTPЭ<EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>·ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>contextID=3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ftp<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
*******************************************************************************/
/*****************************************
*<EFBFBD>ڲ<EFBFBD>ʹ<EFBFBD>õij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
****************************************/
uint8_t ftpLocalIp[MAX_IP_LEN] ; //FTP<54><50>·<EFBFBD><C2B7><EFBFBD><EFBFBD>IPP
#define FTP_CMDPACK_LEN 256 //FTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>
/********************************************************
ec20ģ<EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD>
*********************************************************/
enum eFtpCmdNum
{
SETCONTEXTID =0, SETACCOUNT =1, SETFILETYPE =2, SETTRANSMODE =3, SETRSTIMEOUT =4,
FTPLOGIN =5, GETLOGINSTATE =6, SETDIRECTORY =7, GETDIRECTORY =8, LISTFILENAME =9,
GETFILESIZE =10, DOWNFILE =11, GETHASDOWNSIZE =12, RENAMEFILE =13, FTPLOGOUT = 14
} ;//ö<><C3B6>ec20ģ<30><C4A3>FTP<54><50><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ö<EFBFBD><C3B6>
volatile EC20_CMD_DATA_s sFtpCmd[15]=
{
// cmdNum cmdStr, timeout(100ms), trueStr, trueOffset falseStr revResult rtyNum
{SETCONTEXTID, "AT+QFTPCFG=\"contextid\",%d\r\n", 10, "OK", -1, "ERROR", TIMEOUT, 2 }, //<2F>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>150S
{SETACCOUNT, "AT+QFTPCFG=\"account\",\"%s\",\"%s\"\r\n",10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{SETFILETYPE, "AT+QFTPCFG=\"filetype\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{SETTRANSMODE, "AT+QFTPCFG=\"transmode\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>ģʽ
{SETRSTIMEOUT, "AT+QFTPCFG=\"rsptimeout\",%d\r\n" , 10, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD>س<EFBFBD>ʱʱ<CAB1><CAB1>
{FTPLOGIN, "AT+QFTPOPEN=\"%s\",%d\r\n", (20*10), "OK", -1, "ERROR", TIMEOUT, 2 }, //FTP<54><50>¼
{GETLOGINSTATE, "AT+QFTPSTAT\r\n", 10, "+QFTPSTAT: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><>0<EFBFBD><30>Opening 1<><31>idle 2<><32>Transferring 3<><33>Closing 4<><34>Closed<65><64>
{SETDIRECTORY, "AT+QFTPCWD=\"%s\"\r\n" , 10, "+QFTPCWD: 0,0", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7>
{GETDIRECTORY, "AT+QFTPPWD\r\n" , 10, "+QFTPPWD: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD>ģʽ
{LISTFILENAME, "AT+QFTPNLST=\"%s\"\r\n" , 10, "+QFTPNLST: 0", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7> <20>г<EFBFBD>FTPĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{GETFILESIZE, "AT+QFTPSIZE=\"%s\"\r\n" , 10, "+QFTPSIZE: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD> <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1>+QFTPSIZE: 0,36048
{DOWNFILE, "AT+QFTPGET=\"%s\",\"COM:\",%d,%d\r\n" , 40, "\r\nOK\r\n\r\n+QFTPGET: 0", -1, "ERROR", TIMEOUT, 1 }, //<2F>ļ<EFBFBD><C4BC><EFBFBD>+<2B><>ʼƫ<CABC><C6AB><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
{GETHASDOWNSIZE, "AT+QFTPLEN\r\n" , 10, "+OK", -1, "ERROR", TIMEOUT, 2 }, //ftpĿ¼·<C2BC><C2B7> <20>г<EFBFBD>FTPĿ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{RENAMEFILE, "AT+QFTPRENAME=\"%s\",\"%s\"\r\n" , 20, "+QFTPRENAME: 0", -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>+<2B><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
{FTPLOGOUT, "AT+QFTPCLOSE\r\n", (2*10), "+QFTPCLOSE", -1, "ERROR", TIMEOUT, 2 }, //FTP<54>˳<EFBFBD><CBB3><EFBFBD>¼
} ; //EC20ģ<30><C4A3>module<6C><65><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>EC20_CMD_DATA_s<5F><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> static const char *FtpCmdNumToString(enum eFtpCmdNum result)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٳ<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> eFtpCmdNum<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ö<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊö<EFBFBD>ٵij<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
**************************************************************************************************/
static inline const char *FtpCmdNumToString(enum eFtpCmdNum result)
{
switch (result)
{
ENUM_CHIP_TYPE_CASE(SETCONTEXTID)
ENUM_CHIP_TYPE_CASE(SETACCOUNT)
ENUM_CHIP_TYPE_CASE(SETFILETYPE)
ENUM_CHIP_TYPE_CASE(SETTRANSMODE)
ENUM_CHIP_TYPE_CASE(SETRSTIMEOUT)
ENUM_CHIP_TYPE_CASE(FTPLOGIN)
ENUM_CHIP_TYPE_CASE(GETLOGINSTATE)
ENUM_CHIP_TYPE_CASE(SETDIRECTORY)
ENUM_CHIP_TYPE_CASE(GETDIRECTORY)
ENUM_CHIP_TYPE_CASE(LISTFILENAME)
ENUM_CHIP_TYPE_CASE(GETFILESIZE)
ENUM_CHIP_TYPE_CASE(DOWNFILE)
ENUM_CHIP_TYPE_CASE(GETHASDOWNSIZE)
ENUM_CHIP_TYPE_CASE(RENAMEFILE)
ENUM_CHIP_TYPE_CASE(FTPLOGOUT)
}
return "<EFBFBD>޴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_Config( void )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *psFtp FtpP_s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_Config( FtpP_s *psFtp )
{
RunResult runResult = TIMEOUT ;
runResult = EC20_SendFtpCmd(SETCONTEXTID, NULL, psFtp->contextId ) ;
if( runResult != RUNOK )
return runResult ;
runResult = EC20_SendFtpCmd(SETACCOUNT, NULL, psFtp->userName, psFtp->password ) ;
AppLogPrintf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Username:%s, Password:%s .", psFtp->userName, psFtp->password ) ;
if( runResult != RUNOK )
return runResult ;
EC20_SendFtpCmd(SETFILETYPE, NULL, psFtp->eFiletype ) ;
EC20_SendFtpCmd(SETTRANSMODE, NULL, psFtp->eTransmode ) ;
EC20_SendFtpCmd(SETRSTIMEOUT, NULL, psFtp->rsptimeout ) ;
return runResult ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_PDP_Init( FtpP_s *psFtp )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>FTP<EFBFBD><EFBFBD>·
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_PDP_Init( FtpP_s *psFtp )
{
RunResult runResult = TIMEOUT ;
uint8_t *ftpLocalIp = portMalloc(MAX_IP_LEN) ;
runResult = Query_Context( psFtp->contextId, ftpLocalIp ) ; //<2F><>ѯpsFtp->contextId<49>Ƿ񼤻<C7B7>
if( RUNOK == runResult ) /*psFtp->contextId<49>Ѽ<EFBFBD><D1BC><EFBFBD>*/ //ȥ<><C8A5><EFBFBD><EFBFBD>-><3E>ٴμ<D9B4><CEBC><EFBFBD>
{
// runResult = Deact_Context(HTTP_CONTEXTID) ;
// if( RUNOK != runResult ) /*HTTP_CONTEXTIDȥ<44><C8A5><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>*/ //ֱ<>ӷ<EFBFBD><D3B7>ش<EFBFBD><D8B4><EFBFBD>
// {
// return RUNERR ;
// }
return RUNOK ;
}
runResult = ActivePDP(psFtp->contextId, ftpLocalIp) ;
if( RUNOK == runResult )
{
AppLogPrintf("FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD>%s", ftpLocalIp) ;
}
portFree(ftpLocalIp) ;
return(runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Login( FtpP_s *psFtp )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>¼FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *psFtp FtpP_s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_Login(FtpP_s *psFtp)
{
RunResult runResult = TIMEOUT ;
runResult = EC20_SendFtpCmd(FTPLOGIN, NULL, psFtp->ftpServerIP, psFtp->ftpServerPort ) ;
if( runResult != RUNOK )
return runResult ;
int checkCsTimes = 10 ; //10*2S<32>ȴ<EFBFBD>FTP<54><50><EFBFBD><EFBFBD>idle״̬
while( checkCsTimes-- )
{
Wait_For_Nms(2000) ;
runResult = EC20_SendFtpCmd(GETLOGINSTATE, NULL ) ;
if( RUNOK == runResult )
{
if( (sFtpCmd[GETLOGINSTATE].trueOffset > 0)&&
(ec20AtBuf[sFtpCmd[GETLOGINSTATE].trueOffset+13] == 0x31))
{
runResult =RUNOK ;
break;
}
else
{
runResult =RUNERR ;
}
}
}
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Logout( FtpP_s *psFtp )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>dz<EFBFBD>FTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *psFtp FtpP_s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_Logout(FtpP_s *psFtp)
{
RunResult runResult = TIMEOUT ;
runResult = EC20_SendFtpCmd(FTPLOGOUT, NULL ) ;
return runResult ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> Ftp_Set_Dir( FtpP_s *psFtp )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ftp<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *psFtp FtpP_s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_Set_Dir( FtpP_s *psFtp )
{
RunResult runResult = TIMEOUT ;
runResult = EC20_SendFtpCmd(SETDIRECTORY, NULL, psFtp->ftpDirectory ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ŀ¼
if( runResult != RUNOK )
return runResult ;
runResult = EC20_SendFtpCmd(GETDIRECTORY, NULL ) ;
if( RUNOK == runResult )
{
if( (sFtpCmd[GETDIRECTORY].trueOffset > 0)&&
(kmp(ec20AtBuf, (const char*)psFtp->ftpDirectory) > 0)) //ȷ<>ϲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>Ŀ¼Ϊ<C2BC>û<EFBFBD><C3BB><EFBFBD><EFBFBD>õ<EFBFBD>Ŀ¼
{
runResult =RUNOK ;
}
else
{
runResult =RUNERR ;
}
}
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_Find_File( uint8_t *dir, uint8_t *fileName )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>dirĿ¼<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪfileName<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *dir <EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>Ŀ¼
* @param2 *fileName <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 RUNOK <EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD>
* @param2 RUNTIMEOUT <EFBFBD><EFBFBD>Ŀ¼<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ļ<EFBFBD>
* @param3 RUNERR <EFBFBD>г<EFBFBD>dirĿ¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20AtBuf[EC20_ATBUF_LEN] 256<EFBFBD>ֽڣ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>dir<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(EC20_ATBUF_LEN-50)ʱҲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
**************************************************************************************************/
RunResult Ftp_Find_File( uint8_t *dir, uint8_t *fileName )
{
if( RUNOK != EC20_SendFtpCmd(LISTFILENAME, NULL, dir ))
return RUNERR ;
if( kmp(ec20AtBuf, (const char*)fileName) > 0 )
return RUNOK ;
else
return TIMEOUT ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> u32 Ftp_Get_FileSize( uint8_t *fileName )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ѯ*fileName <EFBFBD>ļ<EFBFBD><EFBFBD>Ĵ<EFBFBD>С
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *fileName <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>ѯ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 u32 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>bytes<EFBFBD><EFBFBD>
**************************************************************************************************/
u32 Ftp_Get_FileSize( uint8_t *fileName )
{
RunResult runResult = TIMEOUT ;
u32 fileSize = 0 ;
uint8_t fileSizeBuf[7] = {0} ;
runResult = EC20_SendFtpCmd(GETFILESIZE, NULL, fileName ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>Ŀ¼
if( runResult != RUNOK )
return 0 ;
CopyValues(fileSizeBuf, (uint8_t*)&ec20AtBuf[ sFtpCmd[GETFILESIZE].trueOffset+13], 0x0D, 6) ;
fileSize = atoi((const char*)fileSizeBuf) ;
return (fileSize) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult Ftp_File_Rename( uint8_t *oldName, uint8_t *newName )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *oldName <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* @param2 *newName <EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 runResult RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult Ftp_File_Rename( uint8_t *oldName, uint8_t *newName )
{
RunResult runResult = TIMEOUT ;
runResult = EC20_SendFtpCmd(RENAMEFILE, NULL, oldName, newName ) ; //
return (runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> int Ftp_Down_File( uint8_t *fileName, uint32_t startPos, uint16_t transLen)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪfileName<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>startPosλ<EFBFBD>ÿ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>transLen<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *fileName <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
* @param2 startPos <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>λ<EFBFBD><EFBFBD>
* @param3 transLen <EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 headPos <EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"CONNECT"<EFBFBD><EFBFBD>ec20FtpBuf<EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>󷵻<EFBFBD>-1
* ע <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʱ<EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>FTP_MODE,<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ec20FtpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ec20FtpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>CONNECT<EFBFBD><EFBFBD>+QFTPGET: 0,2048֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>CONNECT 0x0D 0x0A <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x0D 0x0A OK 0x0D 0x0A 0x0D 0x0A +QFTPGET: 0,2048<EFBFBD><EFBFBD>
**************************************************************************************************/
int Ftp_Down_File( uint8_t *fileName, uint32_t startPos, uint16_t transLen)
{
int headPos = -1 ;
uint8_t revTimes = 0 ;
ftpDataMode = true ; //EC20<32><30><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽ<C4A3>л<EFBFBD><D0BB><EFBFBD>FTPģʽ
Ec20FtpBufReset() ; //FTP<54><50><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
UARTx_SendString(EC20_UART, (uint8_t *)sFtpCmd[DOWNFILE].cmdStr, fileName, startPos, transLen ) ;
while( revTimes++ < sFtpCmd[DOWNFILE].timeout )
{
Wait_For_Nms(100) ;
headPos = kmp(ec20FtpBuf, "CONNECT")+9 ; //<2F><><EFBFBD>ص<EFBFBD><D8B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD>ĵط<C4B5><D8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݿ<EFBFBD>ʼ<EFBFBD><CABC> <20><>ec20FtpBuf<75>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
sFtpCmd[DOWNFILE].trueOffset = kmp(&ec20FtpBuf[transLen+headPos], sFtpCmd[DOWNFILE].trueStr) ; //+QFTPGET: 0,2048<34><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ݽ<EFBFBD>β<EFBFBD><CEB2> <20><>ec20FtpBuf<75>е<EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
if( sFtpCmd[DOWNFILE].trueOffset == 0)
{
if( headPos >= 0 ) //CONNECT<43><54>+QFTPGET: 0,2048֮<38><D6AE><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD> <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
{
break ;
}
else
{
headPos = -1 ;
break ;
}
}
else if( kmp(ec20FtpBuf, sFtpCmd[DOWNFILE].falseStr) >= 0)
{
headPos = -1 ;
break ;
}
}
ftpDataMode = false ; //EC20<32><30><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽ<C4A3>г<EFBFBD>FTPģʽ
return (headPos) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_SendFtpCmd( uint8_t cmdNum, char *format,... )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tcp<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 cmdNum EC20_CMD_DATA_s<EFBFBD><EFBFBD>cmdNum<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param2 char *format,... <EFBFBD>ɱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_SendFtpCmd( uint8_t cmdNum, char *format,... )
{
uint8_t revTimes = 0 ;
RunResult status = TIMEOUT ;
uint8_t retryTimes = sFtpCmd[cmdNum].rtyNum ;
char *cmdPack = NULL ;
format = sFtpCmd[cmdNum].cmdStr ;
cmdPack = portMalloc(FTP_CMDPACK_LEN*sizeof(uint8_t)) ;
if( cmdPack == NULL )
{
ErrorLogPrintf("EC20 FtpCmdPack <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>!") ;
portFree(cmdPack) ;
return RUNERR ;
}
va_list ap;
va_start (ap, format);
int outLen = vsnprintf(cmdPack, FTP_CMDPACK_LEN, (const char*)format, ap); //vsprintf (temp, cmd, ap); //<2F><><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ܵ<EFBFBD>temp<6D><70>
if((outLen<=0)||( outLen > FTP_CMDPACK_LEN))
{
ErrorLogPrintf("FTP cmdPack <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D><><EFBFBD><EFBFBD>FTP_CMDPACK_LEN<45><4E>ֵ<EFBFBD><D6B5>") ;
status = RUNERR ;
goto tcpCmdOut ;
}
while(retryTimes--)
{
Ec20AtBufReset() ;
revTimes = 0 ;
UARTx_SendData(EC20_UART, cmdPack, outLen ) ; //DMA<4D><41><EFBFBD><EFBFBD>
while( revTimes++ < sFtpCmd[cmdNum].timeout )
{
Wait_For_Nms(100) ;
sFtpCmd[cmdNum].trueOffset = kmp(ec20AtBuf, sFtpCmd[cmdNum].trueStr) ;
if( sFtpCmd[cmdNum].trueOffset >= 0)
{
status = RUNOK ;
goto tcpCmdOut ;
}
else if( kmp(ec20AtBuf, sFtpCmd[cmdNum].falseStr) >= 0)
{
status = RUNERR ;
goto tcpCmdOut ;
}
}
Wait_For_Nms( 1000 ) ;
}
tcpCmdOut:portFree(cmdPack) ;
va_end(ap) ;
DebugLogPrintf("%s %s\r\n[%s]", FtpCmdNumToString((enum eFtpCmdNum)cmdNum), RunResultToString(status), ec20AtBuf ) ;
return (status) ;
}