In the previous post I explained how to make a connection and send data via TCP connection on SIM900 and similar modems. This post is going to be about FTP connection. FTP stands for “file transfer protocol.” FTP powers one of the fundamental Internet functions and is the prescribed method for the transfer of files between computers. It is also the easiest and most secure way to exchange files over the Internet.
Without going into much details I would show the related AT commands and brief description. Later I would include sample code for FTP upload/download using arduino and SIM900
AT command | Response | Description |
AT+SAPBR | OK | Configures GPRS profile. |
AT+FTPCID=1 | OK | Selects profile 1 for FTP. |
AT+FTPSERV=”****” | OK | Sets FTP server domain name or IP address. **** is the domain name or the IP. |
AT+FTPPORT=*** | OK | Sets FTP server port. *** is the port. |
AT+FTPUN=”***” | OK | Sets user name for FTP server access. *** is the user name. |
AT+FTPPW=”***” | OK | Sets password for FTP server access. *** is the password. |
AT+FTPPUTNAME=”****” | OK | Sets destiny name for the file.*** is the name of the file. |
AT+FTPPUTPATH=”****” | OK | Sets destiny file path. *** is the path of the file. |
AT+FTPPUT | OK | Use to put a file into the FTP server. |
AT+FTPGETNAME=”****” | OK | Sets origin name for the file.*** is the name of the file. |
AT+FTPGETPATH=”****” | OK | Sets origin file path. *** is the path of the file. |
AT+FTPGET | Use to get a file into the FTP server. |
Make sure you have a server and note the ftp port, we would consider using the default port 21. Switch on your modem and make sure pin code is disabled or properly entered and that GPRS connection is available.
- Configure GPRS by sending AT+SAPBR=3,1,”Contype”,”GPRS”r .
- Set APN by sending AT+SAPBR=3,1,”APN”,”your apn”r .replace your apn with APN for your network.
- Now set the username and password for the apn (replace username and password with correct values )
AT+SAPBR=3,1,”USER”,”username”r .
AT+SAPBR=3,1,”PASS”,”password”r - Connect to GPRS connection by sending AT+SAPBR=1,1r, when connected Modem will respond with OK
- Now select profile 1 for FTP by sending AT+FTPCID=1r
- Now set FTP server domain or ip using the command AT+FTPSERV=ftp.yourserver.comr
- Set FTP port by AT+FTPPORT=21r
- Now send FTP credentials using AT+FTPUN=user_namer and AT+FTPPW=”password”r
- To get a file from FTP send AT+FTPGETNAME=file_namer
- Now set the path of the file AT+FTPGETPATH=/path/r
- Now send AT+FTPGET=1r and wait for response from server, which starts with +FTPGET:1,1
- To upload a file to FTP server send AT+FTPPUTNAME=file_namer
- Now set path AT+FTPPUTPATH=/pathr
- Now send AT+FTPPUT=1 and wait for +FTPPUT:1,1 after which you need to send the content of file to be uploaded.
int8_t answer; int onModulePin = 2; char aux_str[30]; char incoming_data[120]; char test_str[ ]= "0000000011111111222222223333333344444444555555556666666677777777000000001111111122222222333333334444"; int data_size, aux; void setup(){ pinMode(onModulePin, OUTPUT); Serial.begin(115200); Serial.println("Starting..."); power_on(); delay(5000); Serial.println("Connecting to the network..."); while( (sendATcommand("AT+CREG?", "+CREG: 0,1", 500) || sendATcommand("AT+CREG?", "+CREG: 0,5", 500)) == 0 ); configure_FTP(); uploadFTP(); downloadFTP(); Serial.print("Incoming data: "); Serial.println(incoming_data); } void loop(){ } void configure_FTP(){ sendATcommand("AT+SAPBR=3,1,"Contype","GPRS"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,"APN","APN"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,"USER","user_name"", "OK", 2000); sendATcommand("AT+SAPBR=3,1,"PWD","password"", "OK", 2000); while (sendATcommand("AT+SAPBR=1,1", "OK", 20000) != 1); sendATcommand("AT+FTPCID=1", "OK", 2000); sendATcommand("AT+FTPSERV="ftp.yourserver.com"", "OK", 2000); sendATcommand("AT+FTPPORT=21", "OK", 2000); sendATcommand("AT+FTPUN="user_name"", "OK", 2000); sendATcommand("AT+FTPPW="password"", "OK", 2000); } void uploadFTP(){ sendATcommand("AT+FTPPUTNAME="file_name"", "OK", 2000); sendATcommand("AT+FTPPUTPATH="/path"", "OK", 2000); if (sendATcommand("AT+FTPPUT=1", "+FTPPUT:1,1,", 30000) == 1) { data_size = 0; while(Serial.available()==0); aux = Serial.read(); do{ data_size *= 10; data_size += (aux-0x30); while(Serial.available()==0); aux = Serial.read(); } while(aux != 0x0D); if (data_size >= 100) { if (sendATcommand("AT+FTPPUT=2,100", "+FTPPUT:2,100", 30000) == 1) { Serial.println(sendATcommand(test_str, "+FTPPUT:1,1", 30000), DEC); Serial.println(sendATcommand("AT+FTPPUT=2,0", "+FTPPUT:1,0", 30000), DEC); Serial.println("Upload done!!"); } else { sendATcommand("AT+FTPPUT=2,0", "OK", 30000); } } else { sendATcommand("AT+FTPPUT=2,0", "OK", 30000); } } else { Serial.println("Error openning the FTP session"); } } void downloadFTP(){ int x = 0; sendATcommand("AT+FTPGETNAME="file_name"", "OK", 2000); sendATcommand("AT+FTPGETPATH="/path"", "OK", 2000); if (sendATcommand("AT+FTPGET=1 ", "+FTPGET:1,1", 30000) == 1) { do{ if (sendATcommand2("AT+FTPGET=2,50", "+FTPGET:2,", "+FTPGET:1,", 30000) == 1) { data_size = 0; while(Serial.available()==0); aux = Serial.read(); do{ data_size *= 10; data_size += (aux-0x30); while(Serial.available()==0); aux = Serial.read(); }while(aux != 0x0D); Serial.print("Data received: "); Serial.println(data_size); if (data_size > 0) { while(Serial.available() < data_size); Serial.read(); for (int y = 0; y < data_size; y++) { incoming_data[x] = Serial.read(); x++; } incoming_data[x] = ' '; } else { Serial.println("Download finished"); } } else if (answer == 2) { Serial.println("Error from FTP"); } else { Serial.println("Error getting the file"); data_size = 0; } }while (data_size > 0); } else { Serial.println("Error openning the FTP session"); } } void power_on(){ uint8_t answer=0; // checks if the module is started answer = sendATcommand("AT", "OK", 2000); if (answer == 0) { digitalWrite(onModulePin,HIGH); delay(3000); digitalWrite(onModulePin,LOW); while(answer == 0){ // Send AT every two seconds and wait for the answer answer = sendATcommand("AT", "OK", 2000); } } } int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout){ uint8_t x=0, answer=0; char response[100]; unsigned long previous; memset(response, ' ', 100); // Initialize the string delay(100); while( Serial.available() > 0) Serial.read(); // Clean the input buffer Serial.println(ATcommand); // Send the AT command x = 0; previous = millis(); // this loop waits for the answer do{ if(Serial.available() != 0){ // if there are data in the UART input buffer, reads it and checks for the asnwer response[x] = Serial.read(); //Serial.print(response[x]); x++; // check if the desired answer is in the response of the module if (strstr(response, expected_answer) != NULL) { answer = 1; } } } // Waits for the asnwer with time out while((answer == 0) && ((millis() - previous) < timeout)); return answer; } int8_t sendATcommand2(char* ATcommand, char* expected_answer1, char* expected_answer2, unsigned int timeout){ uint8_t x=0, answer=0; char response[100]; unsigned long previous; memset(response, ' ', 100); // Initialize the string delay(100); while( Serial.available() > 0) Serial.read(); // Clean the input buffer Serial.println(ATcommand); // Send the AT command x = 0; previous = millis(); // this loop waits for the answer do{ // if there are data in the UART input buffer, reads it and checks for the asnwer if(Serial.available() != 0){ response[x] = Serial.read(); x++; // check if the desired answer 1 is in the response of the module if (strstr(response, expected_answer1) != NULL) { answer = 1; } // check if the desired answer 2 is in the response of the module if (strstr(response, expected_answer2) != NULL) { answer = 2; } } // Waits for the asnwer with time out }while((answer == 0) && ((millis() - previous) < timeout)); return answer; }
I want to download file of 300Kb, can i download it 1kb by 1kb and store it in sd card, and after that pop up data from it and do need ful?
Thanks in advance..!!
I am not sure, haven’t tried that.
Where the downloaded file will store. I want to download a binary file which size is around 270KB. any possibility there? Please help
Hi Dost Muhammad Shah,
Thank you for your generous post . Please do me few more favor. I can I save downloaded large file to simcom module and get it whenever i need .
Large file?? what is the size of the file?
Hi @Dost,
Great article and sorry to revive it more than 3 year later.
I used your article to send a file using the SIM5320 module to a server using FTP. Despite its working properly, it takes more than an hour to sent a 1Mb file which is way too long for what I expected.
Im wandering if it would be faster to just do a HTTP POST, or a TCP connection to the server.
Do you have any experience with any of those?
Thanks
Alex
Hi, It shouldn’t take an hour although I haven’t tested sending 1MB file with SIMCOM modules. FTP shouldn’t be slow in itself.
Hi, Thanks for your code, it work great.
But I have problem with AT+SAPBR=1,1.
If I run the code after SIM900 turn on less than 5 minutes, it will reply ERROR after 1 minutes 30 seconds.
If I wait for more than 5 minutes, every thing working fine.
After if get ERROR message, I need to restart SIM900 to get it working back.
Do you have any idea to over come this problem without restart SIM900?
Hi, can you help me , i use phone for sending data (atd07xxxxxxxx) without (;) all thing send and receive but when i try sim800l wih same commande i recive no carrier. please help
regard;
Hi,
I haven’t used data call so I am not sure what could be the reason!
Hi
is ti possible to make a live voice call over GPRS connection by Sim900? in fact i want to make a a devices that can make voice call by using gprs instead of normal GSM based voice call for cost saving.
hi,
I need a help. I am using SIM800 to upload .txt file to FTPS server. SIM800 support SSL. But the module not connecting to server. it gives +FTPPUT:1,64 (timeout error) only . I am using AT+FTPSSL=2(explicit SSL). Anyone have any idea please help me.
Hi Are you able to upload the files using FTPS ? Even I have same problem. It ends up with time out error. If you found solution please let me know. Thanks
Hi,
Is there any way to avoid to hardcode the filename used when uploading?
I would like to change the filename for each time i upload but im unsure how to do this.
Do you have ant suggestions?
you can pass it a parameter to uploadFTP() function, of-course after modifying the function to accept a parameter
Hi, after “Now send AT+FTPPUT=1 and wait for +FTPPUT:1,1 after which you need to send the content of file to be uploaded”,
I wait a lot of time I receive “OK” but “+FTPPUT:1,1,….” almost never (I seen only 2 or three time),
can You help Me ?
speed FTP file upload is very low of only 102 bytes / s , you think you might have an error
might be because of network issues like speed and signal strength or it an be because of server side issues!
Hi guys i need a help regarding FTP protocol.My objective is i need to transmit the .txt file from my GPRS (SIM-900)modem to web server.For that i followed some FTP AT commands as dms said. There i succeed to send the file from modem to web server.But here i faced a small problem i.e first i sent a .txt(data.txt) file as a name then after i need to enter some data to that file.But for my condition i don’t want to write the data again why because the file is already filled with data.Now i need to read that data.By using ftp get .I tried this but i didn’t read any thing back just it shows AT+FTPGET:2,0.
How to send the .txt file with some information.Not required to enter in the terminal.
Hi, have you tried using http POST using sim900?
Binfer is a better way to transfer files between computers. It can transfer entire folders. Visit http://www.binfer.com for details.