This is FTPClient Program.
Dependencies: SDFileSystem WIZnetInterface_Ricky mbed-src
main.cpp@0:ae81a181c789, 2015-07-21 (annotated)
- Committer:
- Ricky_Kwon
- Date:
- Tue Jul 21 15:40:35 2015 +0000
- Revision:
- 0:ae81a181c789
- Child:
- 2:3aa502df9b3b
FTPClient with WIZwiki-W7500
;
; i'm so tired...hahaha
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ricky_Kwon | 0:ae81a181c789 | 1 | #include "mbed.h" |
Ricky_Kwon | 0:ae81a181c789 | 2 | #include "SDFileSystem.h" |
Ricky_Kwon | 0:ae81a181c789 | 3 | #include "EthernetInterface.h" |
Ricky_Kwon | 0:ae81a181c789 | 4 | |
Ricky_Kwon | 0:ae81a181c789 | 5 | /* FTP */ |
Ricky_Kwon | 0:ae81a181c789 | 6 | #define USER "user " |
Ricky_Kwon | 0:ae81a181c789 | 7 | #define PASS "pass " |
Ricky_Kwon | 0:ae81a181c789 | 8 | #define PASV "pasv " |
Ricky_Kwon | 0:ae81a181c789 | 9 | #define PORT "port " |
Ricky_Kwon | 0:ae81a181c789 | 10 | #define LIST "list " |
Ricky_Kwon | 0:ae81a181c789 | 11 | #define STOR "stor " |
Ricky_Kwon | 0:ae81a181c789 | 12 | #define RETR "retr " |
Ricky_Kwon | 0:ae81a181c789 | 13 | #define END "\r\n" |
Ricky_Kwon | 0:ae81a181c789 | 14 | #define FTP_SERVER_PORT 21 |
Ricky_Kwon | 0:ae81a181c789 | 15 | #define MAX_SS 256 |
Ricky_Kwon | 0:ae81a181c789 | 16 | bool gMenuStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 17 | bool gDataSockReady = false; |
Ricky_Kwon | 0:ae81a181c789 | 18 | bool gDataPutGetStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 19 | bool FTPServerLogin = false; |
Ricky_Kwon | 0:ae81a181c789 | 20 | int remote_port; |
Ricky_Kwon | 0:ae81a181c789 | 21 | char ftpServer_data_ip_addr[4]={0,}; |
Ricky_Kwon | 0:ae81a181c789 | 22 | char ftpServer_data_ip_addr_str[20]={0,}; |
Ricky_Kwon | 0:ae81a181c789 | 23 | static char buf[256]; |
Ricky_Kwon | 0:ae81a181c789 | 24 | enum CommandFirst { |
Ricky_Kwon | 0:ae81a181c789 | 25 | f_nocmd, |
Ricky_Kwon | 0:ae81a181c789 | 26 | f_dir, |
Ricky_Kwon | 0:ae81a181c789 | 27 | f_put, |
Ricky_Kwon | 0:ae81a181c789 | 28 | f_get, |
Ricky_Kwon | 0:ae81a181c789 | 29 | }; |
Ricky_Kwon | 0:ae81a181c789 | 30 | enum CommandSecond { |
Ricky_Kwon | 0:ae81a181c789 | 31 | s_nocmd, |
Ricky_Kwon | 0:ae81a181c789 | 32 | s_dir, |
Ricky_Kwon | 0:ae81a181c789 | 33 | s_put, |
Ricky_Kwon | 0:ae81a181c789 | 34 | s_get, |
Ricky_Kwon | 0:ae81a181c789 | 35 | }; |
Ricky_Kwon | 0:ae81a181c789 | 36 | enum ftpc_datasock_state{ |
Ricky_Kwon | 0:ae81a181c789 | 37 | DATASOCK_IDLE, |
Ricky_Kwon | 0:ae81a181c789 | 38 | DATASOCK_READY, |
Ricky_Kwon | 0:ae81a181c789 | 39 | DATASOCK_START |
Ricky_Kwon | 0:ae81a181c789 | 40 | }; |
Ricky_Kwon | 0:ae81a181c789 | 41 | struct Command { |
Ricky_Kwon | 0:ae81a181c789 | 42 | enum CommandFirst First; |
Ricky_Kwon | 0:ae81a181c789 | 43 | enum CommandSecond Second; |
Ricky_Kwon | 0:ae81a181c789 | 44 | }; |
Ricky_Kwon | 0:ae81a181c789 | 45 | struct ftpc { |
Ricky_Kwon | 0:ae81a181c789 | 46 | enum ftpc_datasock_state dsock_state; |
Ricky_Kwon | 0:ae81a181c789 | 47 | }; |
Ricky_Kwon | 0:ae81a181c789 | 48 | struct ftpc FTPClient; |
Ricky_Kwon | 0:ae81a181c789 | 49 | struct Command FTPCommand; |
Ricky_Kwon | 0:ae81a181c789 | 50 | |
Ricky_Kwon | 0:ae81a181c789 | 51 | /* SD Card filesystem */ |
Ricky_Kwon | 0:ae81a181c789 | 52 | SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 |
Ricky_Kwon | 0:ae81a181c789 | 53 | FILE *ftpfile; |
Ricky_Kwon | 0:ae81a181c789 | 54 | char ftpfilename[32]; |
Ricky_Kwon | 0:ae81a181c789 | 55 | /* UART */ |
Ricky_Kwon | 0:ae81a181c789 | 56 | Serial pc(USBTX, USBRX); |
Ricky_Kwon | 0:ae81a181c789 | 57 | char gMsgBuf[10]; |
Ricky_Kwon | 0:ae81a181c789 | 58 | int User_Keyboard_MSG_Cnt; |
Ricky_Kwon | 0:ae81a181c789 | 59 | |
Ricky_Kwon | 0:ae81a181c789 | 60 | /* Fuction*/ |
Ricky_Kwon | 0:ae81a181c789 | 61 | char* User_Keyboard_MSG(void); |
Ricky_Kwon | 0:ae81a181c789 | 62 | int pportc(char * arg); |
Ricky_Kwon | 0:ae81a181c789 | 63 | |
Ricky_Kwon | 0:ae81a181c789 | 64 | |
Ricky_Kwon | 0:ae81a181c789 | 65 | int main() { |
Ricky_Kwon | 0:ae81a181c789 | 66 | |
Ricky_Kwon | 0:ae81a181c789 | 67 | char Msg_c; |
Ricky_Kwon | 0:ae81a181c789 | 68 | int size; |
Ricky_Kwon | 0:ae81a181c789 | 69 | int remain_datasize; |
Ricky_Kwon | 0:ae81a181c789 | 70 | int remain_filesize; |
Ricky_Kwon | 0:ae81a181c789 | 71 | int send_byte; |
Ricky_Kwon | 0:ae81a181c789 | 72 | |
Ricky_Kwon | 0:ae81a181c789 | 73 | |
Ricky_Kwon | 0:ae81a181c789 | 74 | pc.baud(115200); |
Ricky_Kwon | 0:ae81a181c789 | 75 | |
Ricky_Kwon | 0:ae81a181c789 | 76 | pc.printf("Hello FTPClient World!\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 77 | |
Ricky_Kwon | 0:ae81a181c789 | 78 | uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45}; |
Ricky_Kwon | 0:ae81a181c789 | 79 | const char ip_addr[] = "192.168.0.123"; |
Ricky_Kwon | 0:ae81a181c789 | 80 | const char mask_addr[] = "255.255.255.0"; |
Ricky_Kwon | 0:ae81a181c789 | 81 | const char gateway_addr[] = "192.168.0.1"; |
Ricky_Kwon | 0:ae81a181c789 | 82 | const char ftpServer_control_ip_addr[] = "192.168.0.230"; |
Ricky_Kwon | 0:ae81a181c789 | 83 | |
Ricky_Kwon | 0:ae81a181c789 | 84 | |
Ricky_Kwon | 0:ae81a181c789 | 85 | EthernetInterface eth; |
Ricky_Kwon | 0:ae81a181c789 | 86 | eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static |
Ricky_Kwon | 0:ae81a181c789 | 87 | eth.connect(); |
Ricky_Kwon | 0:ae81a181c789 | 88 | |
Ricky_Kwon | 0:ae81a181c789 | 89 | TCPSocketConnection FTP_CONTROL_SOCK; |
Ricky_Kwon | 0:ae81a181c789 | 90 | TCPSocketConnection FTP_DATA_SOCK; |
Ricky_Kwon | 0:ae81a181c789 | 91 | |
Ricky_Kwon | 0:ae81a181c789 | 92 | mkdir("/sd/FTPClient", 0777); |
Ricky_Kwon | 0:ae81a181c789 | 93 | //while 1 |
Ricky_Kwon | 0:ae81a181c789 | 94 | while(true) |
Ricky_Kwon | 0:ae81a181c789 | 95 | { |
Ricky_Kwon | 0:ae81a181c789 | 96 | //while 2 |
Ricky_Kwon | 0:ae81a181c789 | 97 | while(!FTP_CONTROL_SOCK.is_connected()){ |
Ricky_Kwon | 0:ae81a181c789 | 98 | pc.printf("Connecting...FTPServer\r\nIP:%s, PORT:%d\r\n", ftpServer_control_ip_addr, FTP_SERVER_PORT); |
Ricky_Kwon | 0:ae81a181c789 | 99 | FTP_CONTROL_SOCK.connect(ftpServer_control_ip_addr, FTP_SERVER_PORT); |
Ricky_Kwon | 0:ae81a181c789 | 100 | FTP_CONTROL_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s |
Ricky_Kwon | 0:ae81a181c789 | 101 | }//end of while 2 |
Ricky_Kwon | 0:ae81a181c789 | 102 | |
Ricky_Kwon | 0:ae81a181c789 | 103 | //while 3 |
Ricky_Kwon | 0:ae81a181c789 | 104 | while(true) |
Ricky_Kwon | 0:ae81a181c789 | 105 | { |
Ricky_Kwon | 0:ae81a181c789 | 106 | /* User Interface */ |
Ricky_Kwon | 0:ae81a181c789 | 107 | //gMenuStart if |
Ricky_Kwon | 0:ae81a181c789 | 108 | if(gMenuStart){ |
Ricky_Kwon | 0:ae81a181c789 | 109 | gMenuStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 110 | pc.printf("\r\n----------------------------------------\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 111 | pc.printf("Press menu key\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 112 | pc.printf("----------------------------------------\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 113 | pc.printf("1> View FTPServer Directory\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 114 | pc.printf("2> View My Directory\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 115 | pc.printf("3> Put File to Server\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 116 | pc.printf("4> Get File from Server\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 117 | pc.printf("----------------------------------------\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 118 | //while 4 |
Ricky_Kwon | 0:ae81a181c789 | 119 | while(true){ |
Ricky_Kwon | 0:ae81a181c789 | 120 | Msg_c = pc.getc(); |
Ricky_Kwon | 0:ae81a181c789 | 121 | // Msg_c if |
Ricky_Kwon | 0:ae81a181c789 | 122 | if(Msg_c=='1'){ |
Ricky_Kwon | 0:ae81a181c789 | 123 | FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); |
Ricky_Kwon | 0:ae81a181c789 | 124 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 125 | FTPCommand.First = f_dir; |
Ricky_Kwon | 0:ae81a181c789 | 126 | break; |
Ricky_Kwon | 0:ae81a181c789 | 127 | } |
Ricky_Kwon | 0:ae81a181c789 | 128 | else if(Msg_c=='2'){ |
Ricky_Kwon | 0:ae81a181c789 | 129 | pc.printf("Open directory on /sd/FTPClient\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 130 | DIR *d = opendir("/sd/FTPClient"); |
Ricky_Kwon | 0:ae81a181c789 | 131 | struct dirent *p; |
Ricky_Kwon | 0:ae81a181c789 | 132 | while((p = readdir(d)) != NULL) { |
Ricky_Kwon | 0:ae81a181c789 | 133 | pc.printf("%s\r\n", p->d_name); |
Ricky_Kwon | 0:ae81a181c789 | 134 | } |
Ricky_Kwon | 0:ae81a181c789 | 135 | closedir(d); |
Ricky_Kwon | 0:ae81a181c789 | 136 | gMenuStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 137 | break; |
Ricky_Kwon | 0:ae81a181c789 | 138 | } |
Ricky_Kwon | 0:ae81a181c789 | 139 | else if(Msg_c=='3'){ |
Ricky_Kwon | 0:ae81a181c789 | 140 | FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); |
Ricky_Kwon | 0:ae81a181c789 | 141 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 142 | FTPCommand.First = f_put; |
Ricky_Kwon | 0:ae81a181c789 | 143 | break; |
Ricky_Kwon | 0:ae81a181c789 | 144 | } |
Ricky_Kwon | 0:ae81a181c789 | 145 | else if(Msg_c=='4'){ |
Ricky_Kwon | 0:ae81a181c789 | 146 | FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); |
Ricky_Kwon | 0:ae81a181c789 | 147 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 148 | FTPCommand.First = f_get; |
Ricky_Kwon | 0:ae81a181c789 | 149 | break; |
Ricky_Kwon | 0:ae81a181c789 | 150 | } |
Ricky_Kwon | 0:ae81a181c789 | 151 | else{ |
Ricky_Kwon | 0:ae81a181c789 | 152 | pc.printf("Retry...\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 153 | gMenuStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 154 | break; |
Ricky_Kwon | 0:ae81a181c789 | 155 | }//end of Msg_c if |
Ricky_Kwon | 0:ae81a181c789 | 156 | }//end of while 4 |
Ricky_Kwon | 0:ae81a181c789 | 157 | }//end of gMenuStart if |
Ricky_Kwon | 0:ae81a181c789 | 158 | |
Ricky_Kwon | 0:ae81a181c789 | 159 | //gDataSockReady if |
Ricky_Kwon | 0:ae81a181c789 | 160 | if(gDataSockReady){ |
Ricky_Kwon | 0:ae81a181c789 | 161 | gDataSockReady = false; |
Ricky_Kwon | 0:ae81a181c789 | 162 | //FTPCommand.First switch case |
Ricky_Kwon | 0:ae81a181c789 | 163 | switch(FTPCommand.First){ |
Ricky_Kwon | 0:ae81a181c789 | 164 | case f_dir: |
Ricky_Kwon | 0:ae81a181c789 | 165 | FTP_CONTROL_SOCK.send(LIST, sizeof(LIST)-1); |
Ricky_Kwon | 0:ae81a181c789 | 166 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 167 | break; |
Ricky_Kwon | 0:ae81a181c789 | 168 | case f_put: |
Ricky_Kwon | 0:ae81a181c789 | 169 | pc.printf(">put file name?"); |
Ricky_Kwon | 0:ae81a181c789 | 170 | User_Keyboard_MSG(); |
Ricky_Kwon | 0:ae81a181c789 | 171 | FTP_CONTROL_SOCK.send(STOR, sizeof(STOR)-1); |
Ricky_Kwon | 0:ae81a181c789 | 172 | FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:ae81a181c789 | 173 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 174 | break; |
Ricky_Kwon | 0:ae81a181c789 | 175 | case f_get: |
Ricky_Kwon | 0:ae81a181c789 | 176 | pc.printf(">get file name?"); |
Ricky_Kwon | 0:ae81a181c789 | 177 | User_Keyboard_MSG(); |
Ricky_Kwon | 0:ae81a181c789 | 178 | FTP_CONTROL_SOCK.send(RETR, sizeof(RETR)-1); |
Ricky_Kwon | 0:ae81a181c789 | 179 | FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:ae81a181c789 | 180 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 181 | break; |
Ricky_Kwon | 0:ae81a181c789 | 182 | default: |
Ricky_Kwon | 0:ae81a181c789 | 183 | pc.printf("Command.First = default\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 184 | break; |
Ricky_Kwon | 0:ae81a181c789 | 185 | }//end of FTPCommand.First switch case |
Ricky_Kwon | 0:ae81a181c789 | 186 | }//end of gDataSockReady if |
Ricky_Kwon | 0:ae81a181c789 | 187 | /* received from FTPServer */ |
Ricky_Kwon | 0:ae81a181c789 | 188 | int n = FTP_CONTROL_SOCK.receive(buf, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 189 | if (n <= 0) break; |
Ricky_Kwon | 0:ae81a181c789 | 190 | buf[n] = '\0'; |
Ricky_Kwon | 0:ae81a181c789 | 191 | pc.printf("Received message from server: '%s' \n", buf); |
Ricky_Kwon | 0:ae81a181c789 | 192 | |
Ricky_Kwon | 0:ae81a181c789 | 193 | //buf if |
Ricky_Kwon | 0:ae81a181c789 | 194 | if (!strncmp(buf, "220", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 195 | pc.printf("\r\nInput your User ID > "); |
Ricky_Kwon | 0:ae81a181c789 | 196 | User_Keyboard_MSG(); |
Ricky_Kwon | 0:ae81a181c789 | 197 | FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); |
Ricky_Kwon | 0:ae81a181c789 | 198 | FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:ae81a181c789 | 199 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 200 | } |
Ricky_Kwon | 0:ae81a181c789 | 201 | else if(!strncmp(buf, "331", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 202 | pc.printf("\r\nInput your Password > "); |
Ricky_Kwon | 0:ae81a181c789 | 203 | User_Keyboard_MSG(); |
Ricky_Kwon | 0:ae81a181c789 | 204 | FTP_CONTROL_SOCK.send(PASS, sizeof(PASS)-1); |
Ricky_Kwon | 0:ae81a181c789 | 205 | FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:ae81a181c789 | 206 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 207 | } |
Ricky_Kwon | 0:ae81a181c789 | 208 | else if(!strncmp(buf, "230", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 209 | gMenuStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 210 | } |
Ricky_Kwon | 0:ae81a181c789 | 211 | else if(!strncmp(buf, "227", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 212 | if (pportc(buf) == -1){ |
Ricky_Kwon | 0:ae81a181c789 | 213 | pc.printf("Bad port syntax\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 214 | } |
Ricky_Kwon | 0:ae81a181c789 | 215 | else{ |
Ricky_Kwon | 0:ae81a181c789 | 216 | pc.printf("Go Open Data Sock...\r\n "); |
Ricky_Kwon | 0:ae81a181c789 | 217 | FTPClient.dsock_state = DATASOCK_READY; |
Ricky_Kwon | 0:ae81a181c789 | 218 | } |
Ricky_Kwon | 0:ae81a181c789 | 219 | } |
Ricky_Kwon | 0:ae81a181c789 | 220 | else if(!strncmp(buf, "150", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 221 | switch(FTPCommand.First){ |
Ricky_Kwon | 0:ae81a181c789 | 222 | case f_dir: |
Ricky_Kwon | 0:ae81a181c789 | 223 | FTPCommand.First = f_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 224 | FTPCommand.Second = s_dir; |
Ricky_Kwon | 0:ae81a181c789 | 225 | gDataPutGetStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 226 | break; |
Ricky_Kwon | 0:ae81a181c789 | 227 | case f_get: |
Ricky_Kwon | 0:ae81a181c789 | 228 | FTPCommand.First = f_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 229 | FTPCommand.Second = s_get; |
Ricky_Kwon | 0:ae81a181c789 | 230 | gDataPutGetStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 231 | break; |
Ricky_Kwon | 0:ae81a181c789 | 232 | case f_put: |
Ricky_Kwon | 0:ae81a181c789 | 233 | FTPCommand.First = f_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 234 | FTPCommand.Second = s_put; |
Ricky_Kwon | 0:ae81a181c789 | 235 | gDataPutGetStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 236 | break; |
Ricky_Kwon | 0:ae81a181c789 | 237 | default : |
Ricky_Kwon | 0:ae81a181c789 | 238 | printf("Command.First = default\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 239 | break; |
Ricky_Kwon | 0:ae81a181c789 | 240 | } |
Ricky_Kwon | 0:ae81a181c789 | 241 | } |
Ricky_Kwon | 0:ae81a181c789 | 242 | else if(!strncmp(buf, "226", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 243 | gMenuStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 244 | } |
Ricky_Kwon | 0:ae81a181c789 | 245 | else if(!strncmp(buf, "530", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 246 | FTPServerLogin = true; |
Ricky_Kwon | 0:ae81a181c789 | 247 | } |
Ricky_Kwon | 0:ae81a181c789 | 248 | else if(!strncmp(buf, "500", 3)){ |
Ricky_Kwon | 0:ae81a181c789 | 249 | gDataPutGetStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 250 | FTPCommand.Second = s_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 251 | gMenuStart = true; |
Ricky_Kwon | 0:ae81a181c789 | 252 | FTP_DATA_SOCK.close(); |
Ricky_Kwon | 0:ae81a181c789 | 253 | }//end of buf if |
Ricky_Kwon | 0:ae81a181c789 | 254 | |
Ricky_Kwon | 0:ae81a181c789 | 255 | if(FTPServerLogin){ |
Ricky_Kwon | 0:ae81a181c789 | 256 | FTPServerLogin = false; |
Ricky_Kwon | 0:ae81a181c789 | 257 | pc.printf("\r\nID or Password is wrong...Retry\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 258 | pc.printf("\r\nInput your User ID > "); |
Ricky_Kwon | 0:ae81a181c789 | 259 | User_Keyboard_MSG(); |
Ricky_Kwon | 0:ae81a181c789 | 260 | FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); |
Ricky_Kwon | 0:ae81a181c789 | 261 | FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:ae81a181c789 | 262 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:ae81a181c789 | 263 | } |
Ricky_Kwon | 0:ae81a181c789 | 264 | |
Ricky_Kwon | 0:ae81a181c789 | 265 | //DATASOCK_READY if |
Ricky_Kwon | 0:ae81a181c789 | 266 | if(FTPClient.dsock_state == DATASOCK_READY){ |
Ricky_Kwon | 0:ae81a181c789 | 267 | while(!FTP_DATA_SOCK.is_connected()){ |
Ricky_Kwon | 0:ae81a181c789 | 268 | pc.printf("Connecting...FTPServer Data sock\r\nIP:%s, PORT:%d\r\n", ftpServer_data_ip_addr_str, remote_port); |
Ricky_Kwon | 0:ae81a181c789 | 269 | FTP_DATA_SOCK.connect(ftpServer_control_ip_addr, remote_port); |
Ricky_Kwon | 0:ae81a181c789 | 270 | FTP_DATA_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s |
Ricky_Kwon | 0:ae81a181c789 | 271 | } |
Ricky_Kwon | 0:ae81a181c789 | 272 | FTPClient.dsock_state = DATASOCK_IDLE; |
Ricky_Kwon | 0:ae81a181c789 | 273 | gDataSockReady = true; |
Ricky_Kwon | 0:ae81a181c789 | 274 | }//end of DATASOCK_READY if |
Ricky_Kwon | 0:ae81a181c789 | 275 | |
Ricky_Kwon | 0:ae81a181c789 | 276 | //gDataPutGetStart if |
Ricky_Kwon | 0:ae81a181c789 | 277 | if(gDataPutGetStart){ |
Ricky_Kwon | 0:ae81a181c789 | 278 | //FTPCommand.Second switch case |
Ricky_Kwon | 0:ae81a181c789 | 279 | switch(FTPCommand.Second){ |
Ricky_Kwon | 0:ae81a181c789 | 280 | case s_dir: |
Ricky_Kwon | 0:ae81a181c789 | 281 | pc.printf("dir waiting...\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 282 | pc.printf("FTPServer Directory\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 283 | while(true){ |
Ricky_Kwon | 0:ae81a181c789 | 284 | memset(buf, 0, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 285 | size = FTP_DATA_SOCK.receive(buf, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 286 | buf[size] = '\0'; |
Ricky_Kwon | 0:ae81a181c789 | 287 | if(size>0){ |
Ricky_Kwon | 0:ae81a181c789 | 288 | pc.printf("%s", buf); |
Ricky_Kwon | 0:ae81a181c789 | 289 | } |
Ricky_Kwon | 0:ae81a181c789 | 290 | else{ |
Ricky_Kwon | 0:ae81a181c789 | 291 | break; |
Ricky_Kwon | 0:ae81a181c789 | 292 | } |
Ricky_Kwon | 0:ae81a181c789 | 293 | } |
Ricky_Kwon | 0:ae81a181c789 | 294 | pc.printf("FTPServer Directory\r\n%s\r\n", buf); |
Ricky_Kwon | 0:ae81a181c789 | 295 | gDataPutGetStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 296 | FTPCommand.Second = s_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 297 | FTP_DATA_SOCK.close(); |
Ricky_Kwon | 0:ae81a181c789 | 298 | break; |
Ricky_Kwon | 0:ae81a181c789 | 299 | case s_get: |
Ricky_Kwon | 0:ae81a181c789 | 300 | pc.printf("get waiting...\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 301 | sprintf(ftpfilename, "/sd/FTPClient/%s", gMsgBuf); |
Ricky_Kwon | 0:ae81a181c789 | 302 | ftpfile = fopen(ftpfilename, "w"); |
Ricky_Kwon | 0:ae81a181c789 | 303 | while(true){ |
Ricky_Kwon | 0:ae81a181c789 | 304 | memset(buf, 0, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 305 | remain_datasize = FTP_DATA_SOCK.receive(buf, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 306 | if(remain_datasize>0){ |
Ricky_Kwon | 0:ae81a181c789 | 307 | for (int i = 0; i < (int)remain_datasize; i++) { |
Ricky_Kwon | 0:ae81a181c789 | 308 | fprintf(ftpfile, "%c", buf[i]); |
Ricky_Kwon | 0:ae81a181c789 | 309 | } |
Ricky_Kwon | 0:ae81a181c789 | 310 | pc.printf("#"); |
Ricky_Kwon | 0:ae81a181c789 | 311 | } |
Ricky_Kwon | 0:ae81a181c789 | 312 | else{ |
Ricky_Kwon | 0:ae81a181c789 | 313 | break; |
Ricky_Kwon | 0:ae81a181c789 | 314 | } |
Ricky_Kwon | 0:ae81a181c789 | 315 | } |
Ricky_Kwon | 0:ae81a181c789 | 316 | fclose(ftpfile); |
Ricky_Kwon | 0:ae81a181c789 | 317 | gDataPutGetStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 318 | FTPCommand.Second = s_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 319 | FTP_DATA_SOCK.close(); |
Ricky_Kwon | 0:ae81a181c789 | 320 | break; |
Ricky_Kwon | 0:ae81a181c789 | 321 | case s_put: |
Ricky_Kwon | 0:ae81a181c789 | 322 | pc.printf("put waiting...\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 323 | sprintf(ftpfilename, "/sd/FTPClient/%s", gMsgBuf); |
Ricky_Kwon | 0:ae81a181c789 | 324 | ftpfile = fopen(ftpfilename, "r"); |
Ricky_Kwon | 0:ae81a181c789 | 325 | fseek(ftpfile, 0, SEEK_END); // seek to end of file |
Ricky_Kwon | 0:ae81a181c789 | 326 | remain_filesize = ftell(ftpfile); // get current file pointer |
Ricky_Kwon | 0:ae81a181c789 | 327 | fseek(ftpfile, 0, SEEK_SET); // seek back to beginning of file |
Ricky_Kwon | 0:ae81a181c789 | 328 | do{ |
Ricky_Kwon | 0:ae81a181c789 | 329 | memset(buf, 0, sizeof(buf)); |
Ricky_Kwon | 0:ae81a181c789 | 330 | if(remain_filesize > MAX_SS) |
Ricky_Kwon | 0:ae81a181c789 | 331 | send_byte = MAX_SS; |
Ricky_Kwon | 0:ae81a181c789 | 332 | else |
Ricky_Kwon | 0:ae81a181c789 | 333 | send_byte = remain_filesize; |
Ricky_Kwon | 0:ae81a181c789 | 334 | fread (buf, 1, send_byte, ftpfile); |
Ricky_Kwon | 0:ae81a181c789 | 335 | FTP_DATA_SOCK.send(buf, send_byte); |
Ricky_Kwon | 0:ae81a181c789 | 336 | remain_filesize -= send_byte; |
Ricky_Kwon | 0:ae81a181c789 | 337 | pc.printf("#"); |
Ricky_Kwon | 0:ae81a181c789 | 338 | }while(remain_filesize!=0); |
Ricky_Kwon | 0:ae81a181c789 | 339 | fclose(ftpfile); |
Ricky_Kwon | 0:ae81a181c789 | 340 | gDataPutGetStart = false; |
Ricky_Kwon | 0:ae81a181c789 | 341 | FTPCommand.Second = s_nocmd; |
Ricky_Kwon | 0:ae81a181c789 | 342 | FTP_DATA_SOCK.close(); |
Ricky_Kwon | 0:ae81a181c789 | 343 | break; |
Ricky_Kwon | 0:ae81a181c789 | 344 | |
Ricky_Kwon | 0:ae81a181c789 | 345 | }//end of FTPCommand.Second switch case |
Ricky_Kwon | 0:ae81a181c789 | 346 | }//end of gDataPutGetStart if |
Ricky_Kwon | 0:ae81a181c789 | 347 | }//end of while 3 |
Ricky_Kwon | 0:ae81a181c789 | 348 | }//end of while 1 |
Ricky_Kwon | 0:ae81a181c789 | 349 | } |
Ricky_Kwon | 0:ae81a181c789 | 350 | char* User_Keyboard_MSG(void) |
Ricky_Kwon | 0:ae81a181c789 | 351 | { |
Ricky_Kwon | 0:ae81a181c789 | 352 | User_Keyboard_MSG_Cnt = 0; |
Ricky_Kwon | 0:ae81a181c789 | 353 | memset(gMsgBuf, 0, sizeof(gMsgBuf)); |
Ricky_Kwon | 0:ae81a181c789 | 354 | do{ |
Ricky_Kwon | 0:ae81a181c789 | 355 | gMsgBuf[User_Keyboard_MSG_Cnt] = pc.getc(); |
Ricky_Kwon | 0:ae81a181c789 | 356 | if(gMsgBuf[User_Keyboard_MSG_Cnt]==0x08){ |
Ricky_Kwon | 0:ae81a181c789 | 357 | User_Keyboard_MSG_Cnt--; |
Ricky_Kwon | 0:ae81a181c789 | 358 | } |
Ricky_Kwon | 0:ae81a181c789 | 359 | else{ |
Ricky_Kwon | 0:ae81a181c789 | 360 | User_Keyboard_MSG_Cnt++; |
Ricky_Kwon | 0:ae81a181c789 | 361 | } |
Ricky_Kwon | 0:ae81a181c789 | 362 | }while(gMsgBuf[User_Keyboard_MSG_Cnt-1]!=0x0d); |
Ricky_Kwon | 0:ae81a181c789 | 363 | return gMsgBuf; |
Ricky_Kwon | 0:ae81a181c789 | 364 | } |
Ricky_Kwon | 0:ae81a181c789 | 365 | int pportc(char * arg) |
Ricky_Kwon | 0:ae81a181c789 | 366 | { |
Ricky_Kwon | 0:ae81a181c789 | 367 | int i; |
Ricky_Kwon | 0:ae81a181c789 | 368 | char* tok=0; |
Ricky_Kwon | 0:ae81a181c789 | 369 | strtok(arg,"("); |
Ricky_Kwon | 0:ae81a181c789 | 370 | for (i = 0; i < 4; i++) |
Ricky_Kwon | 0:ae81a181c789 | 371 | { |
Ricky_Kwon | 0:ae81a181c789 | 372 | if(i==0) tok = strtok(NULL,",\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 373 | else tok = strtok(NULL,","); |
Ricky_Kwon | 0:ae81a181c789 | 374 | ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok); |
Ricky_Kwon | 0:ae81a181c789 | 375 | if (!tok){ |
Ricky_Kwon | 0:ae81a181c789 | 376 | pc.printf("bad pport : %s\r\n", arg); |
Ricky_Kwon | 0:ae81a181c789 | 377 | return -1; |
Ricky_Kwon | 0:ae81a181c789 | 378 | } |
Ricky_Kwon | 0:ae81a181c789 | 379 | } |
Ricky_Kwon | 0:ae81a181c789 | 380 | remote_port = 0; |
Ricky_Kwon | 0:ae81a181c789 | 381 | for (i = 0; i < 2; i++){ |
Ricky_Kwon | 0:ae81a181c789 | 382 | tok = strtok(NULL,",\r\n"); |
Ricky_Kwon | 0:ae81a181c789 | 383 | remote_port <<= 8; |
Ricky_Kwon | 0:ae81a181c789 | 384 | remote_port += atoi(tok); |
Ricky_Kwon | 0:ae81a181c789 | 385 | if (!tok){ |
Ricky_Kwon | 0:ae81a181c789 | 386 | pc.printf("bad pport : %s\r\n", arg); |
Ricky_Kwon | 0:ae81a181c789 | 387 | return -1; |
Ricky_Kwon | 0:ae81a181c789 | 388 | } |
Ricky_Kwon | 0:ae81a181c789 | 389 | } |
Ricky_Kwon | 0:ae81a181c789 | 390 | 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); |
Ricky_Kwon | 0:ae81a181c789 | 391 | 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]); |
Ricky_Kwon | 0:ae81a181c789 | 392 | return 0; |
Ricky_Kwon | 0:ae81a181c789 | 393 | } |