temp:1

Change-Id: I596535a352526ed1a7345e54996a7f34aeb8953a
diff --git a/mbtk/libmbtk_ftp/mbtk_ftp_at.c b/mbtk/libmbtk_ftp/mbtk_ftp_at.c
new file mode 100755
index 0000000..3541e2b
--- /dev/null
+++ b/mbtk/libmbtk_ftp/mbtk_ftp_at.c
@@ -0,0 +1,593 @@
+/*************************************************************
+ Description:
+ $file_description$
+ Author:
+ LiuBin
+ Date:
+ 2020/10/28 11:49:08
+ *************************************************************/
+#include "mbtk_ftp.h"
+#include "mbtk_list.h"
+#include "mbtk_sock.h"
+#include "mbtk_str.h"
+#include "mbtk_sock2.h"
+#include<linux/msg.h>
+
+/*************************************************************
+ typedef struct:local at
+ *************************************************************/
+typedef struct
+{
+    char host[64];
+    uint16 port;
+    mbtk_ftp_auth_type_enum auth_type;
+    bool ftp_type;
+    bool use_cert;
+    char name[FTP_SERVER_USER_NAME_MAX+1];
+    char pass[FTP_SERVER_USER_PASS_MAX+1];
+    mbtk_ftp_handle at_ftp_handle;
+    char remote_path[MBTK_FTP_FILE_NAME_MAX+1];
+    char local_path[MBTK_FTP_FILE_NAME_MAX+1];
+    int rest_size;
+    int read_size;
+    int put_len;
+} mbtk_at_init_parameter;
+
+mbtk_at_init_parameter mbtk_at_ftp_par_at={0};
+
+/*************************************************************
+ Variables:local
+ *************************************************************/
+static list_node_t *ftp_client_list = NULL;
+
+/*************************************************************
+ Variables:public
+ *************************************************************/
+
+/*************************************************************
+ Local Function Declaration
+ *************************************************************/
+
+/*************************************************************
+ Local Function Definitions
+ *************************************************************/
+
+//at
+struct my_msg   //消息队列结构体
+{
+	long int my_msg_type;
+    char *ptr;
+}mbtk_at_msg;
+
+int msgid;
+
+int mbtk_at_msgid(int *at_msgid)
+{
+    msgid = *at_msgid;
+    return 0;
+}
+
+void mbtk_at_printf(void *data)
+{
+    char *ptr = malloc(strlen(data)+1);
+    memset(ptr,0,strlen(data)+1);
+    memcpy(ptr, data, strlen(data)+1);
+    mbtk_at_msg.ptr = ptr;
+	mbtk_at_msg.my_msg_type=3;
+	msgsnd(msgid,&mbtk_at_msg,sizeof(&mbtk_at_msg),0);   //发送数据到缓冲区
+}
+
+int mbtk_at_ftp(int parameter,int port,char *addr, char *pass, char *name,int at_auth_type ,bool ftp_type, bool use_cert)
+{
+    int at_ftp_ret = 0;
+
+    LOGI("%s %d", __FUNCTION__, __LINE__);
+    switch (parameter) {
+    case 0: {
+        mbtk_at_ftp_par_at.port = port;
+        break;
+        }
+    case 1: {
+        memset(mbtk_at_ftp_par_at.host, 0, strlen(mbtk_at_ftp_par_at.host)+1);
+        memcpy(mbtk_at_ftp_par_at.host, addr, strlen(addr)+1);
+        break;
+        }
+    case 2: {
+        memset(mbtk_at_ftp_par_at.pass, 0, strlen(mbtk_at_ftp_par_at.pass)+1);
+        memcpy(mbtk_at_ftp_par_at.pass, pass, strlen(pass)+1);
+        break;
+        }
+    case 3: {
+        memset(mbtk_at_ftp_par_at.name, 0, strlen(mbtk_at_ftp_par_at.name)+1);
+        memcpy(mbtk_at_ftp_par_at.name, name, strlen(name)+1);
+        break;
+        }
+    case 4: {
+        mbtk_at_ftp_par_at.auth_type = at_auth_type;
+        mbtk_at_ftp_par_at.use_cert = use_cert;
+        break;
+        }
+    case 5: {
+        mbtk_at_ftp_par_at.ftp_type = ftp_type;
+        break;
+        }
+    default :
+        at_ftp_ret = -1;
+        return at_ftp_ret;
+    }
+    return at_ftp_ret;
+}
+
+int mbtk_at_get_ftp_info(int parameter,int *port,char *addr, char *pass, char *name, int *at_auth_type ,int *ftp_type, int *use_cert)
+{
+    int at_ftp_ret = 0;
+
+    LOGI("%s %d", __FUNCTION__, __LINE__);
+    switch (parameter) {
+    case 0: {
+        *port = mbtk_at_ftp_par_at.port;
+        break;
+        }
+    case 1: {
+        memset(addr, 0, strlen(addr)+1);
+        memcpy(addr, mbtk_at_ftp_par_at.host, strlen(mbtk_at_ftp_par_at.host)+1);
+        break;
+        }
+    case 2: {
+        memset(pass, 0, strlen(pass)+1);
+        memcpy(pass, mbtk_at_ftp_par_at.pass, strlen(mbtk_at_ftp_par_at.pass)+1);
+        break;
+        }
+    case 3: {
+        memset(name, 0, strlen(name)+1);
+        memcpy(name, mbtk_at_ftp_par_at.name, strlen(mbtk_at_ftp_par_at.name)+1);
+        break;
+        }
+    case 4: {
+        *at_auth_type = mbtk_at_ftp_par_at.auth_type;
+        *use_cert = mbtk_at_ftp_par_at.use_cert;
+        break;
+        }
+    case 5: {
+        *ftp_type = mbtk_at_ftp_par_at.ftp_type;
+        break;
+        }
+    default :
+        at_ftp_ret = -1;
+    }
+    return at_ftp_ret;
+}
+
+int mbtk_at_ftp_mkrmdel(int cmd,char *dir)
+{
+    int at_ftp_ret = 0;
+
+    LOGI("%s %d", __FUNCTION__, __LINE__);
+
+    char send_buf[1024];
+
+    mbtk_at_ftp_par_at.at_ftp_handle = mbtk_ftp_init(mbtk_at_ftp_par_at.host, mbtk_at_ftp_par_at.port, mbtk_at_ftp_par_at.auth_type,
+                                    0, mbtk_at_ftp_par_at.use_cert);
+    mbtk_ftp_data_type_set(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.ftp_type);//FTP_DATA_TYPE_I = 2 FTP_DATA_TYPE_A = 0
+    if(mbtk_at_ftp_par_at.at_ftp_handle < 0)
+            at_ftp_ret = -1;
+
+    at_ftp_ret = mbtk_ftp_login(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.name,mbtk_at_ftp_par_at.pass);
+    if(at_ftp_ret != 0)
+    {
+        printf("ftp_login err:%d\n",at_ftp_ret);
+    }
+    memset(mbtk_at_ftp_par_at.remote_path, 0, strlen(mbtk_at_ftp_par_at.remote_path)+1);
+    memcpy(mbtk_at_ftp_par_at.remote_path,dir,strlen(dir)+1);
+    switch (cmd)
+    {
+        case 0:
+        {
+            at_ftp_ret = mbtk_ftp_dir_mkdir(mbtk_at_ftp_par_at.at_ftp_handle,dir);
+            if(at_ftp_ret != 0)
+            {
+                printf("+CFTPMKD: FAIL,<%d>\n",at_ftp_ret);
+                sprintf(send_buf,"+CFTPMKD: FAIL,<%d>\n",at_ftp_ret);
+            }
+            else
+            {
+                printf("+CFTPMKD: SUCCESS\n");
+                sprintf(send_buf,"+CFTPMKD: SUCCESS\n");
+            }
+            break;
+        }
+        case 1:
+        {
+            at_ftp_ret = mbtk_ftp_dir_rmdir(mbtk_at_ftp_par_at.at_ftp_handle,dir);
+            if(at_ftp_ret != 0)
+            {
+                printf("+CFTPRMD: FAIL,<%d>\n",at_ftp_ret);
+                sprintf(send_buf,"+CFTPRMD: FAIL,<%d>\n",at_ftp_ret);
+            }
+            else
+            {
+                printf("+CFTPRMD: SUCCESS\n");
+                sprintf(send_buf,"+CFTPRMD: SUCCESS\n");
+            }
+            break;
+        }
+        case 2:
+        {
+            at_ftp_ret = mbtk_ftp_file_del(mbtk_at_ftp_par_at.at_ftp_handle,dir);
+            if(at_ftp_ret != 0)
+            {
+                printf("+CFTPDELE: FAIL,<%d>\n",at_ftp_ret);
+                sprintf(send_buf,"+CFTPDELE: FAIL,<%d>\n",at_ftp_ret);
+            }
+            else
+            {
+                printf("+CFTPDELE: SUCCESS\n");
+                sprintf(send_buf,"+CFTPDELE: SUCCESS\n");
+            }
+            break;
+        }
+        default:
+            break;
+    }
+
+    mbtk_at_printf(send_buf);
+    mbtk_at_printf("end");
+    mbtk_ftp_quit(mbtk_at_ftp_par_at.at_ftp_handle);
+    mbtk_ftp_deinit(mbtk_at_ftp_par_at.at_ftp_handle);
+    return at_ftp_ret;
+}
+
+int mbtk_at_ftp_upload(char *remote_path,char *local_path, int size_byte, int rest_size)
+{
+    int at_ftp_ret=-1;
+    int len_size;
+    char send_buf[1024];
+
+    mbtk_at_ftp_par_at.at_ftp_handle = mbtk_ftp_init(mbtk_at_ftp_par_at.host, mbtk_at_ftp_par_at.port, mbtk_at_ftp_par_at.auth_type,
+                                    0, mbtk_at_ftp_par_at.use_cert);
+    mbtk_ftp_data_type_set(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.ftp_type);//FTP_DATA_TYPE_I = 2 FTP_DATA_TYPE_A = 0
+    if(mbtk_at_ftp_par_at.at_ftp_handle < 0)
+        at_ftp_ret = -1;
+
+    at_ftp_ret = mbtk_ftp_login(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.name,mbtk_at_ftp_par_at.pass);
+    if(at_ftp_ret != 0)
+    {
+        printf("ftp_login err:%d\n",at_ftp_ret);
+    }
+
+    memset(mbtk_at_ftp_par_at.remote_path, 0, strlen(mbtk_at_ftp_par_at.remote_path)+1);
+    memcpy(mbtk_at_ftp_par_at.remote_path, remote_path, strlen(remote_path)+1);
+    if(local_path!=NULL)
+    {
+        memset(mbtk_at_ftp_par_at.local_path, 0, strlen(mbtk_at_ftp_par_at.local_path)+1);
+        memcpy(mbtk_at_ftp_par_at.local_path, local_path, strlen(local_path)+1);
+    }
+    mbtk_at_ftp_par_at.put_len = size_byte;
+    mbtk_at_ftp_par_at.rest_size = rest_size;
+
+    {
+        FILE *fp;
+        fp=fopen(local_path,"r");
+        if(NULL==fp)
+            printf("Read file error\n");
+        else
+        {
+            printf("Open file success\n");
+            fseek(fp,0,SEEK_END); //将文件读写指针移动到文件尾
+            len_size=ftell(fp); //ftell函数获取从文件尾移动到文件开头的偏移量
+            fclose(fp);
+        }
+    }
+    if(local_path == NULL)
+    {
+        at_ftp_ret = mbtk_ftp_upload_start(mbtk_at_ftp_par_at.at_ftp_handle, remote_path,
+                          NULL, size_byte);
+        if(at_ftp_ret != 0)
+        {
+            printf("+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+            sprintf(send_buf,"+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+        }
+        else
+        {
+            at_ftp_ret = mbtk_ftp_upload_send(mbtk_at_ftp_par_at.at_ftp_handle,"" ,size_byte);
+            if(at_ftp_ret != 0)
+            {
+                printf("+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+                sprintf(send_buf,"+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+            }
+            else
+            {
+                printf("+CFTPPUT: SUCCESS,<%d>\n",len_size);
+                sprintf(send_buf,"+CFTPPUT: SUCCESS,<%d>\n",len_size);
+            }
+        }
+        mbtk_ftp_upload_end(mbtk_at_ftp_par_at.at_ftp_handle);
+    }
+    else
+    {
+        at_ftp_ret = mbtk_ftp_upload_start(mbtk_at_ftp_par_at.at_ftp_handle, remote_path,
+                          local_path, size_byte);
+        if(at_ftp_ret != 0)
+        {
+            printf("+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+            sprintf(send_buf,"+CFTPPUT: FAIL,<%d>\n",at_ftp_ret);
+        }
+        else
+        {
+            printf("+CFTPPUT: SUCCESS,<%d>\n",len_size);
+            sprintf(send_buf,"+CFTPPUT: SUCCESS,<%d>\n",len_size);
+        }
+    }
+    mbtk_at_printf(send_buf);
+    mbtk_at_printf("end");
+    mbtk_ftp_quit(mbtk_at_ftp_par_at.at_ftp_handle);
+    mbtk_ftp_deinit(mbtk_at_ftp_par_at.at_ftp_handle);
+    return at_ftp_ret;
+}
+
+void mbtk_at_ftp_data_cb(void *data, uint32 data_len)
+{
+    char resp_buf[2150];
+    printf("\n=====data_cb data[%s]=====\n=====data_cb data_len[%d]=====\n",data, data_len);
+
+    memset(resp_buf,0,2150);
+    sprintf(resp_buf, "+CFTPGET:");
+    mbtk_at_printf(resp_buf);
+
+    if(data_len > 1021)
+    {
+        memset(resp_buf,0,2150);
+        memcpy(resp_buf,data,1021);
+        mbtk_at_printf(resp_buf);
+        memset(resp_buf,0,2150);
+        sprintf(resp_buf, "<%d>", 1021);
+        mbtk_at_printf(resp_buf);
+
+        memset(resp_buf,0,2150);
+        sprintf(resp_buf, "+CFTPGET:");
+        mbtk_at_printf(resp_buf);
+        memset(resp_buf,0,2150);
+        memcpy(resp_buf,data+1021,data_len-1021);
+        mbtk_at_printf(resp_buf);
+        memset(resp_buf,0,2150);
+        sprintf(resp_buf, "<%d>", data_len-1021);
+        mbtk_at_printf(resp_buf);
+    }
+    else
+    {
+        memset(resp_buf,0,2150);
+        memcpy(resp_buf,data,data_len);
+        mbtk_at_printf(resp_buf);
+
+        memset(resp_buf,0,2150);
+        sprintf(resp_buf, "<%d>", data_len);
+        mbtk_at_printf(resp_buf);
+    }
+
+}
+
+int mbtk_at_ftp_download(void *remote_path, void *local_path, int data_cbc, int rest_size, int read_size)
+{
+
+    int at_ftp_ret=-1;
+    int len_size;
+
+    mbtk_at_ftp_par_at.at_ftp_handle = mbtk_ftp_init(mbtk_at_ftp_par_at.host, mbtk_at_ftp_par_at.port, mbtk_at_ftp_par_at.auth_type,
+                                    0, mbtk_at_ftp_par_at.use_cert);
+    mbtk_ftp_data_type_set(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.ftp_type);//FTP_DATA_TYPE_I = 2 FTP_DATA_TYPE_A = 0
+    if(mbtk_at_ftp_par_at.at_ftp_handle < 0)
+        at_ftp_ret = -1;
+
+    at_ftp_ret = mbtk_ftp_login(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.name,mbtk_at_ftp_par_at.pass);
+    if(at_ftp_ret != 0)
+    {
+        printf("ftp_login err:%d\n",at_ftp_ret);
+    }
+
+    memset(mbtk_at_ftp_par_at.remote_path, 0, strlen(mbtk_at_ftp_par_at.remote_path)+1);
+    memcpy(mbtk_at_ftp_par_at.remote_path, remote_path, strlen(remote_path)+1);
+    if(local_path!=NULL)
+    {
+        memset(mbtk_at_ftp_par_at.local_path, 0, strlen(mbtk_at_ftp_par_at.local_path)+1);
+        memcpy(mbtk_at_ftp_par_at.local_path, local_path, strlen(local_path)+1);
+    }
+    mbtk_at_ftp_par_at.rest_size = rest_size;
+    mbtk_at_ftp_par_at.read_size = read_size;
+
+    // Download file: /data
+    uint32 len_count = 0;
+    uint32 len;
+    int download_time = 0;
+    char resp_buf[1024];
+    int ret;
+
+    uint32 file_size = mbtk_ftp_file_size(mbtk_at_ftp_par_at.at_ftp_handle, remote_path);
+    if(file_size > 0)
+    {
+        if(rest_size > file_size)
+        {
+            printf("+CTPGETFILE: FAIL,<err>");
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "+CTPGETFILE: FAIL,<%d>\r\n",901);
+            mbtk_at_printf(resp_buf);
+            //ret = ATRESP(30163, 0, 0, resp_buf);
+            goto exit;
+        }
+        printf("Will download file:/data[%d]\n", file_size);
+        /*
+        memset(resp_buf,0,1024);
+        sprintf(resp_buf, "Will download file:/data[%d]",file_size);
+        mbtk_at_printf(resp_buf);
+        */
+        // Start download
+        if(data_cbc == 0)//to file
+        {
+            len = mbtk_ftp_download_start(mbtk_at_ftp_par_at.at_ftp_handle, remote_path, local_path, NULL);
+            /*
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "download size:/len[%d]",len);
+            mbtk_at_printf(resp_buf);
+            */
+        }
+        else if(data_cbc == 1)
+        {
+            len = mbtk_ftp_download_start(mbtk_at_ftp_par_at.at_ftp_handle, remote_path, NULL, mbtk_at_ftp_data_cb);
+            /*
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "download size:/len[%d]",len);
+            mbtk_at_printf(resp_buf);
+            */
+        }
+        else
+        {
+            printf("+CTPGETFILE: FAIL,<err>");
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "+CTPGETFILE: FAIL,<%d>\r\n",902);
+            mbtk_at_printf(resp_buf);
+            //ret = ATRESP(30163, 0, 0, resp_buf);
+            goto exit;
+        }
+        if(len > 0)
+        {
+            len_count += len;
+            download_time++;
+            printf("Download[time-%d] size:[%d / %d]\n", download_time, len_count, file_size);
+            /*
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf,"Download[time-%d] size:[%d / %d]\n", download_time, len_count, file_size);
+            mbtk_at_printf(resp_buf);
+            */
+            while (len_count < file_size
+                   && download_time <= 10 // Try 10 times.
+                   && (len = mbtk_ftp_download_continue(mbtk_at_ftp_par_at.at_ftp_handle)) > 0)
+            {
+                len_count += len;
+                download_time++;
+                printf("Download[time-%d] size:[%d / %d]\n", download_time, len_count, file_size);
+                /*
+                memset(resp_buf,0,1024);
+                sprintf(resp_buf,"Download[time-%d] size:[%d / %d]\n", download_time, len_count, file_size);
+                mbtk_at_printf(resp_buf);
+                */
+            }
+
+            printf("Download complete - [%d / %d].\n",len_count, file_size);
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "+CFTPGETFILE: SUCCESS,<%d>\r\n",len_count);
+            mbtk_at_printf(resp_buf);
+            //ret = ATRESP(30163, 0, 0, resp_buf);
+        }
+        else
+        {
+            printf("FTP download fail[%d / %d].\n",len_count, file_size);
+            memset(resp_buf,0,1024);
+            sprintf(resp_buf, "+CTPGETFILE: FAIL,<%d / %d> len=%d",len_count, file_size,len);
+            mbtk_at_printf(resp_buf);
+            //ret = ATRESP(30163, 0, 0, resp_buf);
+            goto exit;
+        }
+    }else {
+        printf("File error.\n");
+        memset(resp_buf,0,1024);
+        sprintf(resp_buf, "+CTPGETFILE: FAIL,<%d>\r\n",904);
+        mbtk_at_printf(resp_buf);
+        //ret = ATRESP(30163, 0, 0, resp_buf);
+        goto exit;
+    }
+
+
+exit:
+    if(file_size != len_count)
+        mbtk_at_ftp_par_at.rest_size = len_count;
+
+    //mbtk_at_printf(resp_buf);
+    mbtk_at_printf("end");
+    mbtk_ftp_quit(mbtk_at_ftp_par_at.at_ftp_handle);
+    mbtk_ftp_deinit(mbtk_at_ftp_par_at.at_ftp_handle);
+    return at_ftp_ret;
+
+}
+
+void ftp_ls_at_cb_func(void *file_list_cb)
+{
+    int ret;
+    char resp_buf[1024 + 1];
+    printf("+CFTPLIST:\r\n%s\n", ((mbtk_ftp_file_info_s *)file_list_cb)->name);
+    sprintf(resp_buf, "%s",((mbtk_ftp_file_info_s *)file_list_cb)->name);
+    mbtk_at_printf(resp_buf);
+    //ret = ATRESP(30163, 0, 0, resp_buf);
+}
+
+
+int mbtk_at_ftp_list(char *ftp_path)
+{
+    int at_ftp_ret=-1;
+    int len_size;
+    char resp_buf[1024];
+
+    mbtk_at_ftp_par_at.at_ftp_handle = mbtk_ftp_init(mbtk_at_ftp_par_at.host, mbtk_at_ftp_par_at.port, mbtk_at_ftp_par_at.auth_type,
+                                    0, mbtk_at_ftp_par_at.use_cert);
+    mbtk_ftp_data_type_set(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.ftp_type);//FTP_DATA_TYPE_I = 2 FTP_DATA_TYPE_A = 0
+    if(mbtk_at_ftp_par_at.at_ftp_handle < 0)
+        at_ftp_ret = -1;
+
+    at_ftp_ret = mbtk_ftp_login(mbtk_at_ftp_par_at.at_ftp_handle,mbtk_at_ftp_par_at.name,mbtk_at_ftp_par_at.pass);
+    if(at_ftp_ret != 0)
+    {
+        printf("ftp_login err:%d\n",at_ftp_ret);
+    }
+
+    memset(mbtk_at_ftp_par_at.remote_path, 0, strlen(mbtk_at_ftp_par_at.remote_path)+1);
+    memcpy(mbtk_at_ftp_par_at.remote_path, ftp_path, strlen(ftp_path)+1);
+
+    at_ftp_ret = mbtk_ftp_cd(mbtk_at_ftp_par_at.at_ftp_handle, ftp_path);
+    if(FTP_ERR_SUCCESS != at_ftp_ret) {
+        printf("mbtk_ftp_cd() fail:%d\n", at_ftp_ret);
+        sprintf(resp_buf,"+CFTPLIST: FAIL:%d\n", at_ftp_ret);
+        goto exit;
+    }
+    mbtk_at_printf("+CFTPLIST:");
+    mbtk_ftp_file_info_s list_head;
+    list_head.ftp_ls_cb_typedef = ftp_ls_at_cb_func;
+    at_ftp_ret = mbtk_ftp_dir_ls(mbtk_at_ftp_par_at.at_ftp_handle, &list_head);
+    if(FTP_ERR_SUCCESS != at_ftp_ret) {
+        printf("mbtk_ftp_dir_ls() fail:%d\n", at_ftp_ret);
+        sprintf(resp_buf,"+CFTPLIST: FAIL:%d\n", at_ftp_ret);
+        goto exit;
+    }
+    else
+    {
+        printf("+CFTPLIST: SUCCESS\r\n");
+        sprintf(resp_buf,"+CFTPLIST: SUCCESS\r\n");
+    }
+exit:
+    mbtk_at_printf(resp_buf);
+    mbtk_at_printf("end");
+    mbtk_ftp_quit(mbtk_at_ftp_par_at.at_ftp_handle);
+    mbtk_ftp_deinit(mbtk_at_ftp_par_at.at_ftp_handle);
+    return at_ftp_ret;
+}
+
+int mbtk_at_get_ftp_data_info(char *remote_path, char *local_path, int *rest_size, int *read_size, int *put_len)
+{
+    if(remote_path != NULL)
+    {
+        memset(remote_path, 0, strlen(remote_path)+1);
+        memcpy(remote_path, mbtk_at_ftp_par_at.remote_path, strlen(mbtk_at_ftp_par_at.remote_path)+1);
+    }
+    if(local_path != NULL)
+    {
+        memset(local_path, 0, strlen(local_path)+1);
+        memcpy(local_path, mbtk_at_ftp_par_at.local_path, strlen(mbtk_at_ftp_par_at.local_path)+1);
+    }
+    if(rest_size != NULL)
+        *rest_size = mbtk_at_ftp_par_at.rest_size;
+    if(read_size != NULL)
+        *read_size = mbtk_at_ftp_par_at.read_size;
+    if(put_len != NULL)
+        *put_len = mbtk_at_ftp_par_at.put_len;
+    return 0;
+}
+
+
+