网上很多朋友因为成本方面的原因,没有购买WAVECOM的收费插件,想自已实现远程升级,遇到一些问题,主要是数据怎么下载到模块中,其实只要能连上网,数据下载不是问题,我们即然可以创建基于TCP 的SOCKET,那么,做一个FTP Client又有何难的,甚至自己写一个基于TCP的数据传输协议又如何呢?
下面我公布我所实现的基于TCP 的FTP Client的OpenAT实现。
代码是基于 WaveCom Q26平台做的,WIP的版本高一点,Q24的WIP版本低一点,只在某些地方有点不一致,我就不列举了,这个代码是我运行正常的系统中的复制,所以我可以保证绝对没有问题,如果你在调试中出现错误,说明是你自己的问题,请先检查。
#include "FTP.h"
//外部引用 开始
extern struct _device DEVICE; //基本设备配置
extern DOTA_T DOTA; //用于本地更新的配置
//外部引用 结束
// 本地变量声明 开始
wip_channel_t FTP_CHANNEL = (wip_channel_t)NULL; /*ftpChannel,ftp通道_命令*/
wip_channel_t FTP_DATA_CHANNEL = (wip_channel_t)NULL; /*ftpDataChannel,ftp数据通道*/
typedef struct _ftp_config{
u8 FTP_SERVER[SERVER_CHAR_LEN]; // FTP 服务器地址
u8 FTP_PORT; // FTP 服务器端口号,FTP默认为 21
u8 FTP_USER[20]; // 登录 FTP 服务器所需的用户名
u8 FTP_PASS[20]; // 登录 FTP 服务器所需的密码
u8 FTP_FILE[50]; // 从服务器上下载的文件
}FTP_CFG;
FTP_CFG FTP; // FTP本地配置
u32 FTP_RX_FILE_LENGTH = 0; //本地已接收的远程文件大小
u32 FTP_REMOTE_FILE_LENGTH = 0; //远程文件大小
u8 FTP_DOWN_FILE_IS_OK = 0; //FTP 下载文件是否完成
#define FTP_DATA_TIMEOUT_ERROR_COUNT 5 //如果5秒钟还未收到从FTP传来的数据,那么说明FTP连接可能超时了
u32 FTP_DATA_TIMEOUT_COUNT = 0; //FTP 从远程下载文件超时计数
//u32 FTP_DATA_TIMER_COUNTER = 0; //timer 计数器
//adl_rtcTime_t ftp_time_last; //系统时钟,最后一次同步的时间
adl_tmr_t *ftp_data_tmr = NULL; //FTP数据传输监控timer
//FTP 文件缓存 定义
//#define FTP_FILE_BUF_LEN (1024 * 10) //FTP缓存大小 100 KB
//u32 FTP_RX_FILE_BUF_LEN = 0; // FTP 已接收的缓存文件长度
//u8 *FTP_RX_FILE_BUF; //FTP缓存
// 本地变量声明 结束
// 文件内部函数声明 开始
bool FTP_CMD_SEND(u8 *data,u16 len);
void FTP_Quit( void );
void FTP_Login(int argc,int cmdIndex,const u8 **argv);
void FTP_Password(int argc,int cmdIndex,const u8 **argv);
void FTP_TransferData_Complete(int argc,int cmdIndex,const u8 **argv);
void FTP_PASVParse(int argc,int cmdIndex,const u8 **argv);
void FTP_NoFileOnRemote(int argc,int cmdIndex,const u8 **argv);
void FTP_ServerBusy(int argc,int cmdIndex,const u8 **argv);
void FTP_RestFile(int argc,int cmdIndex,const u8 **argv);
void FTP_Login(int argc,int cmdIndex,const u8 **argv);
void FTP_ConnectTimeout(int argc,int cmdIndex,const u8 **argv);
void FTP_SetTransferType_OK(int argc,int cmdIndex,const u8 **argv);
void FTP_StartTransferData(int argc,int cmdIndex,const u8 **argv);
void FTP_DataAbort(int argc,int cmdIndex,const u8 **argv);
void FTP_Logined(int argc,int cmdIndex,const u8 **argv);
bool Create_FTP_Client( void );
void FTP_Rest( void );
void FTP_Monitor_Handle(u8 id, void *context );
void Start_FTP_Monitor( void );
void Stop_FTP_Monitor( void );
// 文件内部函数声明 结束
// +-----------------------------------------------------------+
// | 编写:唐登安 最后修改时间:2009-09-04 |
// | |
// | 功能描述:FTP回调函数 具体功能看注释 |
// | |
// +-----------------------------------------------------------+
CMD_CALLBACK FTP_CMD[]={
//TEST
{"220", NULL, FTP_Login }, //发用户名
{"331", NULL, FTP_Password }, //发密码
{"230", NULL, FTP_Logined }, //Ftp登陆成功
{"530", NULL, FTP_ConnectTimeout }, //ftp 登录超时
{"200", NULL, FTP_SetTransferType_OK }, //ftp 设置传输模式OK
{"150", NULL, FTP_StartTransferData }, //Ftp开始下载数据
{"226", NULL, FTP_TransferData_Complete}, //ftp 下载数据完成
{"227", NULL, FTP_PASVParse }, //解析被动模式的服务器端口
{"550", NULL, FTP_NoFileOnRemote }, //远程服务器没有文件
{"350", NULL, FTP_RestFile }, //断点续传远程文件
{"425", NULL, FTP_ServerBusy }, //服务器忙
{"426", NULL, FTP_DataAbort }, //数据连接中断
{NULL, NULL, NULL } //最后一个,终止
};
//+========================================================+
//| |
//| 程序用途: 初始化 FTP 配置 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: ftpServer: FTP 服务器
//| ftpPort: FTP 服务端口
//| ftpUser: FTP 用户名
//| ftpPass: FTP 密码
//| |
//+========================================================+
void Init_FTP( u8 *ftpServer, u8 ftpPort, u8 *ftpUser, u8 *ftpPass ,u8 *ftpFile)
{
u8 i;
u8 fileName[11]="";
//容错:如果FTP已经创建,那么不需要继续创建
if ( FTP_CHANNEL != NULL )
{
#ifdef ftpDebug
Debug_Printf("Init_FTP recall/r/n");
#endif
Close_FTP();
Close_FTP_DataClient();
/*
if ( FTP_RX_FILE_BUF != NULL )
{
adl_memRelease( FTP_RX_FILE_BUF );
}*/
}
strcpy( FTP.FTP_PASS, ftpPass );
strcpy( FTP.FTP_SERVER, ftpServer );
strcpy( FTP.FTP_USER, ftpUser );
strcpy( FTP.FTP_FILE, ftpFile );
FTP.FTP_PORT = ftpPort;
// //分配内存空间,用于 FTP 下载文件存储,此内存大小于 FTP_FILE_BUF_LEN 定义
// FTP_RX_FILE_BUF = adl_memGet( FTP_FILE_BUF_LEN );
// if ( FTP_RX_FILE_BUF == NULL )
// {
//#ifdef ftpDebug
// Debug_Printf("Ftp memGet Fail!!!!!!!!Not Enough Memory/r/n");
//#endif
// return ;
// }
// memset( FTP_RX_FILE_BUF, 0, sizeof( FTP_RX_FILE_BUF ) );
// FTP_RX_FILE_BUF_LEN = 0;
//连接FTP服务器 -- 移至AD完成初始化后
//Create_FTP_Client();
//初始化 AD
AD_Init();
}
//+========================================================+
//| |
//| 程序用途: 关闭 FTP通道 |
//| |
//| 初次创建: 唐登安 2009-09-07 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void
//+========================================================+
void Close_FTP( void )
{
if ( FTP_CHANNEL == NULL ) return;
wip_abort( FTP_CHANNEL );
wip_close( FTP_CHANNEL );
}
//+========================================================+
//| |
//| 程序用途: 关闭 FTP 数据通道 |
//| |
//| 初次创建: 唐登安 2009-09-07 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void
//+========================================================+
void Close_FTP_DataClient( void )
{
if ( FTP_DATA_CHANNEL == NULL ) return ;
wip_abort( FTP_DATA_CHANNEL );
wip_close( FTP_DATA_CHANNEL );
}
//+========================================================+
//| |
//| 程序用途: 关闭 FTP通道 成功回调 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void
//+========================================================+
void FTP_Finalized( void )
{
#ifdef ftpDebug
Debug_Printf("FTP_Finalized/r/n");
#endif
//Create_FTP_Client();
}
// +-----------------------------------------------------------+
// | 函数编写:唐登安 最后修改时间: 2009-09-04 |
// | |
// | 功能描述:TCP FtpClient [命令] 回调 |
// | |
// | 参数说明: |
// | |
// | 函数返回:void |
// | |
// | 修正问题:void |
// +-----------------------------------------------------------+
void FTP_CallBack(wip_event_t *ev, void *ctx)
{
u8 msg[1500] = "";
u16 len = 0;
switch(ev->kind){
//读取到数据
case WIP_CEV_READ:{
//网络通信正常,收到数据
#ifdef ftpDebug
Debug_Printf("WIP_CEV_READ/r/n");
#endif
memset( msg, 0, sizeof( msg ) );
len = wip_read( FTP_CHANNEL, msg, sizeof( msg ) );
FTP_DATA_TIMEOUT_COUNT = 0;
#ifdef ftpDebug
Debug_Printf("RX:%s/r/n",msg);
#endif
//执行Ftp命令
Create_CallBackHandle( FTP_CMD, msg, ' ' );
break;
}
case WIP_CEV_WRITE:{
#ifdef ftpDebug
Debug_Printf("WIP_CEV_WRITE/r/n");
#endif
break;
}
case WIP_CEV_ERROR:{
#ifdef ftpDebug
Debug_Printf("WIP_CEV_ERROR=%d/r/n",ev->content.error.errnum);
#endif
break;
}
case WIP_CEV_PEER_CLOSE:{
#ifdef ftpDebug
Debug_Printf("WIP_CEV_PEER_CLOSE/r/n");
#endif
break;
}
default:{
#ifdef ftpDebug
Debug_Printf("TcpCallback Other Error/r/n");
#endif
}
}
}
//+========================================================+
//| |
//| 程序用途: 从命令通道向FTP发数据 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: TRUE:成功 FALSE:失败 |
//| |
//| 参数说明: void
//| |
//+========================================================+
bool FTP_CMD_SEND(u8 *data,u16 len)
{
int writeret = wip_write( FTP_CHANNEL, data, len );
#ifdef ftpDebug
Debug_Printf("FtpWrite=%d/r/n",writeret);
#endif
if( writeret < 0 ){
return FALSE;
}
return TRUE;
}
//+========================================================+
//| |
//| 程序用途: 创建 FTP 客户端 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: TRUE:创建成功 FALSE:创建失败 |
//| |
//| 参数说明: void
//| |
//+========================================================+
bool Create_FTP_Client( void )
{
static u8 state = 0 ;
FTP_CHANNEL = wip_TCPClientCreateOpts(
FTP.FTP_SERVER, //FTP 服务器
FTP.FTP_PORT, //FTP 端口号
FTP_CallBack, //FTP 回调
&state,
WIP_COPT_KEEPALIVE, 300, //保持连接 3 分钟
WIP_COPT_FINALIZER, FTP_Finalized, //关闭 FTP 回调
WIP_COPT_END
);
#ifdef ftpDebug
Debug_Printf("FtpClient Create %d /r/n", FTP_CHANNEL );
#endif
if( FTP_CHANNEL == NULL )
{
#ifdef ftpDebug
Debug_Printf("FtpClient Create Error /r/n");
#endif
return FALSE;
}
Start_FTP_Monitor(); //启动ftp数据传输监控
return TRUE;
}
// +-----------------------------------------------------------+
// | 函数编写:唐登安 最后修改时间:2009-09-04 |
// | |
// | 功能描述:TCP FtpDataClient [数据] 回调 |
// | |
// | 参数说明: |
// | |
// | 函数返回:void |
// | |
// | 修正问题:增加数据下载完成发送退出ftp命令 |
// +-----------------------------------------------------------+
void FTP_Data_CallBack( wip_event_t *ev, void *ctx )
{
u8 _tcpBuffer[2048] = "";//设置 2 Kbyte的临时空间
u8 cmd[100]="";
s16 len = 0; /* 修正:原来这里读取的数据是无符号型,但有可能网络原因返回 <0 的值 */
u8 tmp;
u8 fileName[50] = "";
switch(ev->kind){
//读取到数据
case WIP_CEV_READ:{
memset( _tcpBuffer, 0, sizeof( _tcpBuffer ) );
len = wip_read( FTP_DATA_CHANNEL, _tcpBuffer, sizeof( _tcpBuffer ) );
if( len < 1 ) /* 容错 */
{
#ifdef ftpDebug
Debug_Printf("Ftp Data Read Error :%d/r/n",len);
#endif
return;
}
FTP_DATA_TIMEOUT_COUNT = 0; //FTP数据接收置0,表示收到从ftp传来的数据
FTP_RX_FILE_LENGTH += len; //接收到的数据长度
AD_WriteData( _tcpBuffer, len ); //向 AD 写入数据
//如果下载的数据已经完成,即安装文件
if( FTP_RX_FILE_LENGTH == FTP_REMOTE_FILE_LENGTH )
{
// //文件下载成功
// sprintf( fileName, "//%s", FTP.FTP_FILE );
// tmp = CreateFile ( fileName, FTP_RX_FILE_BUF, FTP_RX_FILE_BUF_LEN ); // 向U盘写入数据
// #ifdef ftpDebug
// Debug_Printf("Create %s Udisk,FileLen:%d Created:%d/r/n", fileName, FTP_RX_FILE_BUF_LEN, tmp );
// #endif
// FTP_RX_FILE_BUF_LEN = 0;
// adl_memRelease( FTP_RX_FILE_BUF );
Stop_FTP_Monitor(); //文件下载完成,可以关闭FTP监控timer
FTP_Quit(); //退出登录
AD_Install(); //安装程序
}
break;
}
case WIP_CEV_WRITE:{
#ifdef ftpDebug
Debug_Printf("FtpDataCallback:WIP_CEV_WRITE/r/n");
#endif
break;
}
case WIP_CEV_ERROR:{
#ifdef ftpDebug
Debug_Printf("FtpDataCallback:WIP_CEV_ERROR=%d/r/n",ev->content.error.errnum);
#endif
break;
}
case WIP_CEV_PEER_CLOSE:{
#ifdef ftpDebug
Debug_Printf("FtpDataCallback:WIP_CEV_PEER_CLOSE/r/n");
#endif
break;
}
//创建成功
case WIP_CEV_OPEN:{
//开始下载
FTP_Rest();
break;
}
default:{
#ifdef ftpDebug
Debug_Printf("FtpDataCallback:TcpCallback Other Error %d/r/n", ev->kind );
#endif
}
}
}
// +-----------------------------------------------------------+
// | 函数编写: 唐登安 最后修改时间:2009-09-04 |
// | |
// | 功能描述: 创建FTP命令TCP链接 |
// | |
// | 参数说明: ftpPort:数据侦听端口|
// | |
// | 函数返回: 是否成功 |
// | |
// | 修正问题: |
// +-----------------------------------------------------------+
bool Create_FTP_DataClient(u16 ftpPort)
{
FTP_DATA_CHANNEL = wip_TCPClientCreate(
FTP.FTP_SERVER,
ftpPort,
FTP_Data_CallBack,
NULL
);
if( FTP_DATA_CHANNEL == NULL )
{
#ifdef ftpDebug
Debug_Printf("FtpDataClient Create Error/r/n");
#endif
return FALSE;
}
#ifdef tcpDebug
Debug_Printf("FtpDataClient Create %d/r/n", FTP_DATA_CHANNEL );
#endif
return TRUE;
}
//+========================================================+
//| |
//| 程序用途: FTP 退出登录 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void |
//| |
//+========================================================+
void FTP_Quit( void )
{
FTP_CMD_SEND( "quit", strlen( "quit" ) );
#ifdef ftpDebug
Debug_Printf( "FTP_QUIT/r/n");
#endif
//if( FTP_RX_FILE_BUF != NULL )
//{
// //释放由 FTP 占用的空间
// adl_memRelease( FTP_RX_FILE_BUF );
//}
Stop_FTP_Monitor(); /* 释放 ftp 文件下载监视器 */
}
//+========================================================+
//| |
//| 程序用途: FTP 登录 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void |
//| |
//+========================================================+
void FTP_Login(int argc,int cmdIndex,const u8 **argv)
{
u8 cmd[100] = "";
wm_sprintf(cmd,"USER %s/r/n", FTP.FTP_USER );
#ifdef ftpDebug
Debug_Printf("FTP_Login/r/ncmd=%s/r/n",cmd);
#endif
FTP_CMD_SEND( cmd, strlen(cmd) );
}
//+========================================================+
//| |
//| 程序用途: FTP 登录密码 |
//| |
//| 初次创建: 唐登安 2009-09-04 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void |
//| |
//+========================================================+
void FTP_Password(int argc,int cmdIndex,const u8 **argv)
{
u8 pass[100]="";
wm_sprintf(pass,"PASS %s/r/n",FTP.FTP_PASS);
#ifdef ftpDebug
Debug_Printf("FTP_Password/r/ncmd=%s/r/n",pass);
#endif
FTP_CMD_SEND(pass,strlen(pass));
}
//用户登录成功
void FTP_Logined(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_Logined/r/n");
#endif
//登录成功后,设置为数据状态
FTP_CMD_SEND("TYPE I/r/n",strlen("TYPE I/r/n"));
}
//ftp 登录超时
void FTP_ConnectTimeout(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_ConnectTimeout/r/n");
#endif
}
//ftp 设置传输模式 成功
void FTP_SetTransferType_OK(int argc,int cmdIndex,const u8 **argv)
{
u8 cmd[220]="";
#ifdef ftpDebug
Debug_Printf("Set Transfer Type OK/r/n");
#endif
//获取服务器 端口
wm_sprintf(cmd,"PASV/r/n");
FTP_CMD_SEND(cmd,strlen(cmd));
}
//ftp 解析 PASV 端口
void FTP_PASVParse(int argc,int cmdIndex,const u8 **argv)
{
u8 cmd[100]="",msg[100]="";
u8 count=0;
u8 *argvv[10];//只接收 10 个参数
//ftp 服务器端口
u16 serverPort=20;
argv[ strlen( argv ) - 2 ] = '/0';
wm_sprintf(cmd, "%s", argv[argc-1]);
count = ParseArg(cmd, ',', argvv);
#ifdef ftpDebug
wm_sprintf(msg,"argv=%s/r/narglen=%d/r/n",argvv[count-1],count);
Debug_Printf(msg);
#endif
serverPort = atol(argvv[count-2])*256;
serverPort += atol(argvv[count-1]);
#ifdef ftpDebug
wm_sprintf(msg,"server port=%d/r/n",serverPort);
Debug_Printf(msg);
#endif
//关闭数据接收客户端
//close_FtpDataChannel();
//创建数据接收客户端
//create_FtpDataClient(DOTA.ftpServer,serverPort);
Create_FTP_DataClient( serverPort );
}
//ftp 开始下载数据
void FTP_StartTransferData(int argc,int cmdIndex,const u8 **argv)
{
u8 cmd[100]="",plen[15]="";
memset(plen,0,sizeof(plen));
memcpy(plen,argv[argc-2],strlen(argv[argc-2]));
plen[0]='0';
FTP_REMOTE_FILE_LENGTH = STR_TO_U32( plen,strlen( argv[argc-2] ) );
#ifdef ftpDebug
//Debug_Printf("FTP_StartTransferData/r/nParse plen=%s/r/n",plen);
//wm_sprintf(cmd,"Ftp File length=%d/r/n",FTP_REMOTE_FILE_LENGTH);
//Debug_Printf(cmd);
Debug_Printf("FTP_StartTransferData/r/nParse plen=%s/r/nu32:%d/r/n", plen, FTP_REMOTE_FILE_LENGTH );
#endif
}
//远程服务器没有文件
void FTP_NoFileOnRemote(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_NoFileOnRemote/r/n");
#endif
//close_FtpDataChannel();
//close_FtpChannel();
}
//ftp 下载数据完成
void FTP_TransferData_Complete(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_TransferData_Complete/r/n Received length=%d/r/n", FTP_RX_FILE_LENGTH );
#endif
//DOTA.Status=FtpDataTransferEnd;//下载数据完成
FTP_DOWN_FILE_IS_OK = 1;//文件下载完成
/* Install the application */
//AnDInstall();
#ifdef adDebug
if(FTP_RX_FILE_LENGTH != FTP_REMOTE_FILE_LENGTH )
{
Debug_Printf("Receive File Length Error/r/n");
}
#endif
}
//ftp 下载文件
void FTP_Retr()
{
u8 cmd[100]="";
#ifdef ftpDebug
Debug_Printf("FTP_Retr/r/n");
#endif
//开始下载数据
wm_sprintf(cmd,"RETR %s/r/n",FTP.FTP_FILE);
FTP_CMD_SEND( cmd, strlen(cmd) );
//开始监控ftp是否有数据传输
//AddFtpWatch();
}
//断点续传文件
void FTP_Rest( void )
{
u8 cmd[100]="";
#ifdef ftpDebug
Debug_Printf("REST()/r/n");
#endif
wm_sprintf(cmd,"REST %d/r/n",FTP_RX_FILE_LENGTH );
FTP_CMD_SEND( cmd, strlen(cmd) );
}
//ftp 服务器忙 回调
void FTP_ServerBusy(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_ServerBusy()/r/n");
#endif
}
//ftp 断点续传远程文件 回调
void FTP_RestFile(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_RestFile/r/n");
#endif
FTP_Retr();
}
//数据连接中断
void FTP_DataAbort(int argc,int cmdIndex,const u8 **argv)
{
#ifdef ftpDebug
Debug_Printf("FTP_DataAbort /r/n");
#endif
//restart_FtpChannel();
}
//+========================================================+
//| |
//| 程序用途: |
//| |
//| 初次创建: 唐登安 2009-09-07 |
//| |
//| 返 回 值: TRUE:成功 FALSE:失败 |
//| |
//| 参数说明:
//|
//| |
//+========================================================+
void FTP_Monitor_Handle(u8 id, void *context )
{
#ifdef ftpDebug
Debug_Printf("FTP_Monitor_Handle %d/r/n", FTP_DATA_TIMEOUT_COUNT );
#endif
if( ftp_data_tmr == NULL ) return;
//if( ( FTP_DATA_TIMER_COUNTER - FTP_DATA_TIMEOUT_COUNT ) > FTP_DATA_TIMEOUT_ERROR_COUNT )
//{
// //没有数据传输,超时,重新向ftp发命令
// Close_FTP(); //关闭ftp命令通道
// Close_FTP_DataClient(); //关闭ftp数据通道
// //重新启动ftp
// Create_FTP_Client();
//
// FTP_DATA_TIMEOUT_COUNT = 0; //重置监控状态
// FTP_DATA_TIMER_COUNTER = 0;
//}
//传输超时
if( FTP_DATA_TIMEOUT_COUNT > FTP_DATA_TIMEOUT_ERROR_COUNT )
{
Stop_FTP_Monitor(); //停止ftp监控timer
Close_FTP_DataClient(); //关闭ftp数据通道
Close_FTP(); //关闭ftp命令通道
FTP_DATA_TIMEOUT_COUNT = 0;
Create_FTP_Client(); //重新创建FTP
}
//FTP_DATA_TIMER_COUNTER ++;
FTP_DATA_TIMEOUT_COUNT ++; //数据监控状态递增
}
//+========================================================+
//| |
//| 程序用途: 关闭ftp数据传输监控 |
//| |
//| 初次创建: 唐登安 2009-09-07 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void
//|
//| |
//+========================================================+
void Stop_FTP_Monitor( void )
{
s8 sRet;
#ifdef ftpDebug
Debug_Printf("Stop_FTP_Monitor/r/n");
#endif
if ( ftp_data_tmr == NULL ) return;
sRet = adl_tmrUnSubscribe( ftp_data_tmr, FTP_Monitor_Handle, ADL_TMR_TYPE_100MS );
if( sRet > -1 ) //ftp monitor timer 停止成功
{
ftp_data_tmr = NULL; //如果撤销声明成功
}
#ifdef ftpDebug
else{
Debug_Printf("ftp monitor timer unsubscribe fail %d/r/n", sRet);
}
#endif
}
//+========================================================+
//| |
//| 程序用途: 启动ftp数据传输监控 |
//| |
//| 初次创建: 唐登安 2009-09-07 |
//| |
//| 返 回 值: void |
//| |
//| 参数说明: void
//|
//| |
//+========================================================+
void Start_FTP_Monitor( void )
{
#ifdef ftpDebug
Debug_Printf("Start_FTP_Monitor/r/n");
#endif
if ( ftp_data_tmr != NULL ) return;
ftp_data_tmr = adl_tmrSubscribe( TRUE, 10,ADL_TMR_TYPE_100MS, FTP_Monitor_Handle );
}