#include "app_ftp.h"
static tFTPCtrlDef FTP_DownloadCtrl;
static unsigned char FTP_DataIP[4]; //FTP服务器数据通道IP
static unsigned short FTP_DataPort; //FTP服务器数据通道端口
extern unsigned short ConvertHexCharToHex(unsigned char *pStrsData,unsigned short len,unsigned char *pHexData);
unsigned char IsCommendValid(uint16_t Responses)
{
if((Responses == R_150)||(Responses == R_200)||(Responses == R_220)||(Responses == R_226)
||(Responses == R_227)||(Responses == R_230)||(Responses == R_331)||(Responses == R_530))
{
return 1;
}
else
{
return 0;
}
}
void FTP_Commend_Analysis(unsigned char *pdata,FUN_COMM comm)
{
uint16_t Responses;
char tmp[256];
uint8_t dat[30]={0};
unsigned char i;
char * tok=0;
// /************************************************打印************************************************/
// #ifdef NET_PRINTF
// memset(tmp,0,sizeof(tmp));
// strcpy(tmp,(char*)pdata);
// NetSocketTcpSend(NET_SOCKET_4, (unsigned char*)tmp, strlen(tmp));
// #endif
// /************************************************打印************************************************/
Responses =(pdata[0]-'0')*100+(pdata[1]-'0')*10+(pdata[2]-'0');
if(IsCommendValid(Responses))
{
FTP_DownloadCtrl.Waiting_Flag = 0;
}
else
{
return;
}
switch(Responses)
{
case R_220: //服务器OK
{
FTP_DownloadCtrl.ServerReady_Flag = 1;
// FTP_DownloadCtrl.UserLogin_Flag = 0;
}break;
case R_230:
{
FTP_DownloadCtrl.UserLogin_Flag = 2;
}break;
case R_227: //进入被动模式,接收FTP服务器的IP和端口号
{
strtok((char*)pdata,"(");
//读取IP
for(i=0;i<4;i++)
{
tok = strtok(NULL,",");
if(tok == 0)
{
return;
}
FTP_DataIP[i] = atoi(tok);
}
//读取端口号
FTP_DataPort = 0;
for(i=0;i<2;i++)
{
tok = strtok(NULL,",");
if(tok == 0)return;
FTP_DataPort<<=8;
FTP_DataPort += atoi(tok);
}
FTP_DownloadCtrl.PASV_Flag = 1;
}break;
case R_331:
{
FTP_DownloadCtrl.UserLogin_Flag = 1;
}break;
case R_530:
{
FTP_DownloadCtrl.UserLogin_Flag = 0;
}break;
}
}
void FTP_FileDownloadCtrl(FUN_COMM comm)
{
unsigned char i;
unsigned int FileOffset;
unsigned int Flash_Addr;
FRESULT res; // FatFs function common result code
short int Total_Datalen;
unsigned int FileSize;
unsigned short int Pack_Datalen;
char tmp[MAX_DATALEN];
CPU_BOOL Ret;
unsigned int retlen;
// unsigned int Offset = 0;
unsigned char GetDataFlag;//下载到数据标志,用来判断是否更新了文件
if(FTP_DownloadCtrl.Waiting_Flag == 1) //正在等待应答,则不动作
{
return;
}
if(NetSocketStatusGet(NET_SOCKET_2) == DEF_OFF)
{
return;
}
if(FTP_DownloadCtrl.UserLogin_Flag == 0) //未登陆,先发送用户名
{
memset(tmp,0,sizeof(tmp));
sprintf(tmp,"USER %s\r\n",inifile_net_param.ftpuser);
FTP_DownloadCtrl.Waiting_Flag = 1;
comm((unsigned char*)tmp,strlen(tmp));
}
else if(FTP_DownloadCtrl.UserLogin_Flag == 1) //发送密码
{
memset(tmp,0,sizeof(tmp));
sprintf(tmp,"PASS %s\r\n",inifile_net_param.ftpkey);
FTP_DownloadCtrl.Waiting_Flag = 1;
comm((unsigned char*)tmp,strlen(tmp));
}
else if(FTP_DownloadCtrl.DownLoadFlag == 1)//有下载任务
{
if(FTP_DownloadCtrl.PASV_Flag == 0)
{
if(BspW5500RdReg(BSP_W5500_SOCKET_REG_SR(NET_SOCKET_3)) != BSP_W5500_SOCKET_REG_ESTABLISHED)
{
memset(tmp,0,sizeof(tmp));
sprintf(tmp,"PASV\r\n");
FTP_DownloadCtrl.Waiting_Flag = 1;
comm((unsigned char*)tmp,strlen(tmp));
}
}
else
{
if(NetSocketStatusGet(NET_SOCKET_3) == DEF_ON)
{
/****************擦除待下载文件地址************/
if(strcmp(FTP_DownloadCtrl.LocalName,"NETCFG.INI")==0)
{
Flash_Addr = FLASH_ADDR_NETCFG;
SPI1_EraseSector(FLASH_ADDR_NETCFG);
}
else if(strcmp(FTP_DownloadCtrl.LocalName,"CANCFG.INI")==0)
{
Flash_Addr = FLASH_ADDR_CANCFG;
SPI1_EraseSector(FLASH_ADDR_CANCFG);
}
else if(strcmp(FTP_DownloadCtrl.LocalName,"CFGUP.INI")==0)
{
Flash_Addr = FLASH_ADDR_FILEUPDATE;
SPI1_EraseSector(FLASH_ADDR_FILEUPDATE);
}
else if(strcmp(FTP_DownloadCtrl.LocalName,"PROG.BIN")==0)
{
Flash_Addr = FLASH_ADDR_APPBIN;
for(i=0;i<32;i++)
{
SPI1_EraseSector(FLASH_ADDR_APPBIN+(i*4096));
}
}
memset(tmp,0,sizeof(tmp));
sprintf(tmp,"RETR %s%s\r\n",FTP_DownloadCtrl.FileDir,FTP_DownloadCtrl.FileName);
//发送下载命令,开始下载
NetSocketTcpSend(NET_SOCKET_2, (unsigned char*)tmp, strlen(FTP_DownloadCtrl.FileDir)+strlen(FTP_DownloadCtrl.FileName)+7);
FileOffset = 0;
FileSize = 0;
printf("begin download %s\r\n",FTP_DownloadCtrl.FileName);
while(1)
{
Total_Datalen = BspW5500SocketGetRXSize(NET_SOCKET_3);
if(Total_Datalen > 0)
{
FileSize+=Total_Datalen;
printf("download len:%d\r\n",Total_Datalen);
while(1)
{
memset(tmp,0,MAX_DATALEN);
//判断包长度
if(Total_Datalen > MAX_DATALEN)
{
Pack_Datalen = MAX_DATALEN;
}
else
{
Pack_Datalen = Total_Datalen;
}
memset(tmp,0,sizeof(tmp));
Ret = NetSocketTcpReceive(NET_SOCKET_3, (unsigned char*)tmp, Pack_Datalen);
if(Ret == DEF_TRUE)
{
if(strcmp(FTP_DownloadCtrl.FileName,"PROG.bin")!=0)
{
if(Pack_Datalen < MAX_DATALEN)//添加‘/0’,方便使用str函数
{
tmp[Pack_Datalen] = 0;
Pack_Datalen++;
}
}
// if((FileOffset%0x1000)+FileOffset>0x1000)
// {
//
// }
SPI1_BufferWrite((u8 *)tmp,Flash_Addr+FileOffset,Pack_Datalen);
FileOffset+=Pack_Datalen;
Total_Datalen-=Pack_Datalen;
if(Total_Datalen<=0)break;
}
else
{
/*-*/
}
}
}
else
{
if(BspW5500RdReg(BSP_W5500_SOCKET_REG_SR(NET_SOCKET_3)) != BSP_W5500_SOCKET_REG_ESTABLISHED)//已断开连接
{
SetNetSocketStatus(NET_SOCKET_3,DEF_OFF);
printf("download %s finish\r\n",FTP_DownloadCtrl.FileName);
printf("File size: %d \r\n",FileSize);
//清空FTP控制器所有状态,退出控制
memset(&FTP_DownloadCtrl,0,sizeof(FTP_DownloadCtrl));
return;
}
}
}
}
}
}
}
int Get_UpdateFileMD5(unsigned char* Value,char* FileDir)
{
FRESULT res; // FatFs function common result code
char tmp[512];
unsigned int TotalCount;
unsigned int offset = 0;
unsigned int Flash_Addr;
unsigned short int OnceLen; //单次读文件长度
MD5_CTX context;
unsigned char md5Buffer[16],i;
MD5Init(&context);
if(strcmp(FileDir,"NETCFG.INI") == 0)
{
Flash_Addr = FLASH_ADDR_NETCFG;
}
else if(strcmp(FileDir,"CANCFG.INI") == 0)
{
Flash_Addr = FLASH_ADDR_CANCFG;
}
else if(strcmp(FileDir,"PROG.BIN") == 0)
{
Flash_Addr = FLASH_ADDR_APPBIN;
}
/********获取文件长度********/
TotalCount = Flash_Get_FileSize(FileDir);
// printf("Get %s file size:%d\r\n",FileDir,TotalCount);
while(1)
{
if(TotalCount >= 512)
{
OnceLen = 512;
TotalCount-=OnceLen;
}
else
{
OnceLen = TotalCount;
TotalCount = 0;
}
SPI1_BufferRead((unsigned char*)tmp,Flash_Addr+offset,OnceLen);//
offset+=OnceLen;
MD5Update(&context,(uint8_t *)tmp,OnceLen);
if(TotalCount<=0)break;
}
MD5Final(&context,md5Buffer);
memcpy(Value,md5Buffer,16);
}
/*********************************接口函数****************************************/
eDOWNLOADRETURN FTP_DownloadBegin(char* FielDir,char* FileName,char* LocalDir,char* LocalName)
{
if(FTP_DownloadCtrl.DownLoadFlag == 0)
{
printf("Add download task:%s\r\n",LocalName);
FTP_DownloadCtrl.DownLoadFlag = 1;
s