This is FTPClient Program.
Dependencies: SDFileSystem WIZnetInterface_Ricky mbed-src
Diff: main.cpp
- Revision:
- 0:ae81a181c789
- Child:
- 2:3aa502df9b3b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jul 21 15:40:35 2015 +0000 @@ -0,0 +1,393 @@ +#include "mbed.h" +#include "SDFileSystem.h" +#include "EthernetInterface.h" + +/* FTP */ +#define USER "user " +#define PASS "pass " +#define PASV "pasv " +#define PORT "port " +#define LIST "list " +#define STOR "stor " +#define RETR "retr " +#define END "\r\n" +#define FTP_SERVER_PORT 21 +#define MAX_SS 256 +bool gMenuStart = false; +bool gDataSockReady = false; +bool gDataPutGetStart = false; +bool FTPServerLogin = false; +int remote_port; +char ftpServer_data_ip_addr[4]={0,}; +char ftpServer_data_ip_addr_str[20]={0,}; +static char buf[256]; +enum CommandFirst { + f_nocmd, + f_dir, + f_put, + f_get, +}; +enum CommandSecond { + s_nocmd, + s_dir, + s_put, + s_get, +}; +enum ftpc_datasock_state{ + DATASOCK_IDLE, + DATASOCK_READY, + DATASOCK_START +}; +struct Command { + enum CommandFirst First; + enum CommandSecond Second; +}; +struct ftpc { + enum ftpc_datasock_state dsock_state; +}; +struct ftpc FTPClient; +struct Command FTPCommand; + +/* SD Card filesystem */ +SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 +FILE *ftpfile; +char ftpfilename[32]; +/* UART */ +Serial pc(USBTX, USBRX); +char gMsgBuf[10]; +int User_Keyboard_MSG_Cnt; + +/* Fuction*/ +char* User_Keyboard_MSG(void); +int pportc(char * arg); + + +int main() { + + char Msg_c; + int size; + int remain_datasize; + int remain_filesize; + int send_byte; + + + pc.baud(115200); + + pc.printf("Hello FTPClient World!\r\n"); + + uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45}; + const char ip_addr[] = "192.168.0.123"; + const char mask_addr[] = "255.255.255.0"; + const char gateway_addr[] = "192.168.0.1"; + const char ftpServer_control_ip_addr[] = "192.168.0.230"; + + + EthernetInterface eth; + eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static + eth.connect(); + + TCPSocketConnection FTP_CONTROL_SOCK; + TCPSocketConnection FTP_DATA_SOCK; + + mkdir("/sd/FTPClient", 0777); + //while 1 + while(true) + { + //while 2 + while(!FTP_CONTROL_SOCK.is_connected()){ + pc.printf("Connecting...FTPServer\r\nIP:%s, PORT:%d\r\n", ftpServer_control_ip_addr, FTP_SERVER_PORT); + FTP_CONTROL_SOCK.connect(ftpServer_control_ip_addr, FTP_SERVER_PORT); + FTP_CONTROL_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s + }//end of while 2 + + //while 3 + while(true) + { + /* User Interface */ + //gMenuStart if + if(gMenuStart){ + gMenuStart = false; + pc.printf("\r\n----------------------------------------\r\n"); + pc.printf("Press menu key\r\n"); + pc.printf("----------------------------------------\r\n"); + pc.printf("1> View FTPServer Directory\r\n"); + pc.printf("2> View My Directory\r\n"); + pc.printf("3> Put File to Server\r\n"); + pc.printf("4> Get File from Server\r\n"); + pc.printf("----------------------------------------\r\n"); + //while 4 + while(true){ + Msg_c = pc.getc(); + // Msg_c if + if(Msg_c=='1'){ + FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + FTPCommand.First = f_dir; + break; + } + else if(Msg_c=='2'){ + pc.printf("Open directory on /sd/FTPClient\r\n"); + DIR *d = opendir("/sd/FTPClient"); + struct dirent *p; + while((p = readdir(d)) != NULL) { + pc.printf("%s\r\n", p->d_name); + } + closedir(d); + gMenuStart = true; + break; + } + else if(Msg_c=='3'){ + FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + FTPCommand.First = f_put; + break; + } + else if(Msg_c=='4'){ + FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + FTPCommand.First = f_get; + break; + } + else{ + pc.printf("Retry...\r\n"); + gMenuStart = true; + break; + }//end of Msg_c if + }//end of while 4 + }//end of gMenuStart if + + //gDataSockReady if + if(gDataSockReady){ + gDataSockReady = false; + //FTPCommand.First switch case + switch(FTPCommand.First){ + case f_dir: + FTP_CONTROL_SOCK.send(LIST, sizeof(LIST)-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + break; + case f_put: + pc.printf(">put file name?"); + User_Keyboard_MSG(); + FTP_CONTROL_SOCK.send(STOR, sizeof(STOR)-1); + FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + break; + case f_get: + pc.printf(">get file name?"); + User_Keyboard_MSG(); + FTP_CONTROL_SOCK.send(RETR, sizeof(RETR)-1); + FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + break; + default: + pc.printf("Command.First = default\r\n"); + break; + }//end of FTPCommand.First switch case + }//end of gDataSockReady if + /* received from FTPServer */ + int n = FTP_CONTROL_SOCK.receive(buf, sizeof(buf)); + if (n <= 0) break; + buf[n] = '\0'; + pc.printf("Received message from server: '%s' \n", buf); + + //buf if + if (!strncmp(buf, "220", 3)){ + pc.printf("\r\nInput your User ID > "); + User_Keyboard_MSG(); + FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); + FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + } + else if(!strncmp(buf, "331", 3)){ + pc.printf("\r\nInput your Password > "); + User_Keyboard_MSG(); + FTP_CONTROL_SOCK.send(PASS, sizeof(PASS)-1); + FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + } + else if(!strncmp(buf, "230", 3)){ + gMenuStart = true; + } + else if(!strncmp(buf, "227", 3)){ + if (pportc(buf) == -1){ + pc.printf("Bad port syntax\r\n"); + } + else{ + pc.printf("Go Open Data Sock...\r\n "); + FTPClient.dsock_state = DATASOCK_READY; + } + } + else if(!strncmp(buf, "150", 3)){ + switch(FTPCommand.First){ + case f_dir: + FTPCommand.First = f_nocmd; + FTPCommand.Second = s_dir; + gDataPutGetStart = true; + break; + case f_get: + FTPCommand.First = f_nocmd; + FTPCommand.Second = s_get; + gDataPutGetStart = true; + break; + case f_put: + FTPCommand.First = f_nocmd; + FTPCommand.Second = s_put; + gDataPutGetStart = true; + break; + default : + printf("Command.First = default\r\n"); + break; + } + } + else if(!strncmp(buf, "226", 3)){ + gMenuStart = true; + } + else if(!strncmp(buf, "530", 3)){ + FTPServerLogin = true; + } + else if(!strncmp(buf, "500", 3)){ + gDataPutGetStart = false; + FTPCommand.Second = s_nocmd; + gMenuStart = true; + FTP_DATA_SOCK.close(); + }//end of buf if + + if(FTPServerLogin){ + FTPServerLogin = false; + pc.printf("\r\nID or Password is wrong...Retry\r\n"); + pc.printf("\r\nInput your User ID > "); + User_Keyboard_MSG(); + FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); + FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + } + + //DATASOCK_READY if + if(FTPClient.dsock_state == DATASOCK_READY){ + while(!FTP_DATA_SOCK.is_connected()){ + pc.printf("Connecting...FTPServer Data sock\r\nIP:%s, PORT:%d\r\n", ftpServer_data_ip_addr_str, remote_port); + FTP_DATA_SOCK.connect(ftpServer_control_ip_addr, remote_port); + FTP_DATA_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s + } + FTPClient.dsock_state = DATASOCK_IDLE; + gDataSockReady = true; + }//end of DATASOCK_READY if + + //gDataPutGetStart if + if(gDataPutGetStart){ + //FTPCommand.Second switch case + switch(FTPCommand.Second){ + case s_dir: + pc.printf("dir waiting...\r\n"); + pc.printf("FTPServer Directory\r\n"); + while(true){ + memset(buf, 0, sizeof(buf)); + size = FTP_DATA_SOCK.receive(buf, sizeof(buf)); + buf[size] = '\0'; + if(size>0){ + pc.printf("%s", buf); + } + else{ + break; + } + } + pc.printf("FTPServer Directory\r\n%s\r\n", buf); + gDataPutGetStart = false; + FTPCommand.Second = s_nocmd; + FTP_DATA_SOCK.close(); + break; + case s_get: + pc.printf("get waiting...\r\n"); + sprintf(ftpfilename, "/sd/FTPClient/%s", gMsgBuf); + ftpfile = fopen(ftpfilename, "w"); + while(true){ + memset(buf, 0, sizeof(buf)); + remain_datasize = FTP_DATA_SOCK.receive(buf, sizeof(buf)); + if(remain_datasize>0){ + for (int i = 0; i < (int)remain_datasize; i++) { + fprintf(ftpfile, "%c", buf[i]); + } + pc.printf("#"); + } + else{ + break; + } + } + fclose(ftpfile); + gDataPutGetStart = false; + FTPCommand.Second = s_nocmd; + FTP_DATA_SOCK.close(); + break; + case s_put: + pc.printf("put waiting...\r\n"); + sprintf(ftpfilename, "/sd/FTPClient/%s", gMsgBuf); + ftpfile = fopen(ftpfilename, "r"); + fseek(ftpfile, 0, SEEK_END); // seek to end of file + remain_filesize = ftell(ftpfile); // get current file pointer + fseek(ftpfile, 0, SEEK_SET); // seek back to beginning of file + do{ + memset(buf, 0, sizeof(buf)); + if(remain_filesize > MAX_SS) + send_byte = MAX_SS; + else + send_byte = remain_filesize; + fread (buf, 1, send_byte, ftpfile); + FTP_DATA_SOCK.send(buf, send_byte); + remain_filesize -= send_byte; + pc.printf("#"); + }while(remain_filesize!=0); + fclose(ftpfile); + gDataPutGetStart = false; + FTPCommand.Second = s_nocmd; + FTP_DATA_SOCK.close(); + break; + + }//end of FTPCommand.Second switch case + }//end of gDataPutGetStart if + }//end of while 3 + }//end of while 1 +} +char* User_Keyboard_MSG(void) +{ + User_Keyboard_MSG_Cnt = 0; + memset(gMsgBuf, 0, sizeof(gMsgBuf)); + do{ + gMsgBuf[User_Keyboard_MSG_Cnt] = pc.getc(); + if(gMsgBuf[User_Keyboard_MSG_Cnt]==0x08){ + User_Keyboard_MSG_Cnt--; + } + else{ + User_Keyboard_MSG_Cnt++; + } + }while(gMsgBuf[User_Keyboard_MSG_Cnt-1]!=0x0d); + return gMsgBuf; +} +int pportc(char * arg) +{ + int i; + char* tok=0; + strtok(arg,"("); + for (i = 0; i < 4; i++) + { + if(i==0) tok = strtok(NULL,",\r\n"); + else tok = strtok(NULL,","); + ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok); + if (!tok){ + pc.printf("bad pport : %s\r\n", arg); + return -1; + } + } + remote_port = 0; + for (i = 0; i < 2; i++){ + tok = strtok(NULL,",\r\n"); + remote_port <<= 8; + remote_port += atoi(tok); + if (!tok){ + pc.printf("bad pport : %s\r\n", arg); + return -1; + } + } + pc.printf("ip : %d.%d.%d.%d, port : %d\r\n", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3], remote_port); + sprintf(ftpServer_data_ip_addr_str, "%d.%d.%d.%d", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3]); + return 0; +}