|
|
View previous topic :: View next topic |
Author |
Message |
Orcino
Joined: 07 Sep 2003 Posts: 56
|
Send file FTP with SIM900 |
Posted: Fri Jul 14, 2017 7:11 am |
|
|
Hello guys,
I need to send some data coming from a PC to an FTP server, through the PIC a SIM900D module.
The data is sent in packets of 1024 bytes via serial to the PIC, which stores in a buffer and sends via SIM900D to the FTP server.
For testing, I'm sending text files.
The file is sent, but arrives out of order.
The buffer size in the PIC is 1024. Could this be a problem ?
Code: |
#include <24FJ128GB204.h>
#build (stack=256)
#device PASS_STRINGS=IN_RAM
|
Code: |
#define sizeBufferBT 1024
char bufferRxBT[sizeBufferBT];
|
Code: |
for(i=0; i < numberPackets; i++)
{
if(sendComandoAT(ATFTPPUT2_1024,respFTPPUT2,20000)) // send AT+FTPPUT=2,1024
fputs(OK_SEND_PCTE,BT); // Requests the PC The sending of the bytes
while((flagBufferRead==0) && (++ timeOutRx < 5000) ) // Wait for the buffer to fill
{
delay_ms(1);
}
delay_ms(200);
for(contBytes=0;contBytes < 1024; contBytes++)
{
fprintf(GPRS,"%c",bufferRxBT[contBytes]); // send data for FTP server
}
if(waitAnsewrGPRS(respFTPPUT,10000)) // Wait answer SIM900
clearBufferBT(); // clear buffer for next packet
}
sendComandoAT(ATFTPPUT2_0,respFTPPUT,20000); // fprintf(GPRS,"AT+FTPPUT=2,0");
clearBufferBT();
delay_ms(1000);
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Fri Jul 14, 2017 7:51 am |
|
|
What is returned when you open the FTP session.
When you send "AT+FTPPUT=1", the modem will respond with "OK", and then a few moments later, with "AT+FTPPUT:1,1,xxxxx", where 'xxxxx' is the maximum FTP session packet size supported by the provider. Your packet, must be no larger than this number.
If you need to sens amounts larger than this, then it needs to be split up and sent in smaller packets.
It might be better for you to use the EXTPUT option offered by the SIM900. With this the packet is loaded into the SIM900's memory, and the modem then automatically sends it using the largest packet size supported by the network. This is only available on reasonably recent firmware (anything over the last couple of years). Otherwise even if your network supports 1024 bytes, it is easy to move to another provider, and find that the maximum packet size is only something like 376 bytes. Minimum guaranteed is only a few hundred bytes. Most networks support about 1.5K.
However I'd guess your actual problem is you are overflowing the buffer in the PIC. If you are using the standard CCS internal 'hidden' buffer code, this simply overwrites data if you overflow. Because of the way the counters are handled you have to ensure that the value from tx_buffer_available is 2 or larger, before a character is added to the buffer.
So instead of using the fprintf, use:
Code: |
void GSMputc(int chr) {
while (tx_buffer_available(GPRS) < 2)
; //prevent buffer overflow
fputc(chr,GPRS);
}
//then where you use fprintf, use:
GSMPutc(bufferRxBT[contBytes]); // send data for FTP server
|
Which will wait when the buffer is full. |
|
|
Orcino
Joined: 07 Sep 2003 Posts: 56
|
|
Posted: Fri Jul 14, 2017 11:28 am |
|
|
Thanks Ttelmah,
When I add "TRANSMIT_BUFFER", the device does not send data to the PC via bluetooth (UART2).
What could be happening ?
Code: |
#pin_select U1TX=PIN_C1
#pin_select U1RX=PIN_C2
#use rs232(UART1, baud=9600,ERRORS,stream=GPS)
#pin_select U2TX=PIN_B7
#pin_select U2RX=PIN_B8
#use rs232(UART2, baud=9600, ERRORS,stream=BT)
#pin_select U3TX=PIN_C4
#pin_select U3RX=PIN_C3
#use rs232(UART3, baud=19200, ERRORS,stream=GPRS,TRANSMIT_BUFFER=4)
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Fri Jul 14, 2017 1:05 pm |
|
|
TXISR is needed in the setup as well.
Otherwise the buffer has to be polled.
However I must admit I assumed you were using buffered transmit already.
What does the FTP open return as the maximum size?. |
|
|
Orcino
Joined: 07 Sep 2003 Posts: 56
|
|
Posted: Fri Jul 14, 2017 1:52 pm |
|
|
The SIM900D, after AT+FTPPUT=2,1024, return +FTPPUT: 1294.
I have a receive buffer, 1024 bytes, which receives the data from the PC.
After the full buffer, the firmware will read and send via GPRS.
Orcino |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Fri Jul 14, 2017 2:40 pm |
|
|
If you are intending ever to use it on a different GSM provider, or even at different sites, then you need to assume that on some at least, 1024 will not be supported as a single transaction.
So, use the EXTPUT command instead.
This is awfully documented. You can use it to extend or overwrite.
Setup just as for normal FTP. So APN (if needed), USER, and PWD for the access point. Then SERV (server name), UN (user name), & PW (login password). Then the filename, and path. Then select the mode (APPE, or STOR), for append or overwrite. Then turn on EXTPUT (AT+FTPEXTPUT=2,0,1024,30000) (for a 1024 byte transmission, and 30 second timeout). Wait to receive back +FTPEXTPUT:0,1024, and then just send your 1024 bytes. It'll send 'OK' when 1024 bytes have been transferred to the modem. Then just send "AT+FTPPUT=1". It'll reply 'OK', and then when the transmission has finished, "+FTPPUT:1,0". It automatically does the transmission using as many transactions as are needed.With 30000 selected in the command, it'll timeout if the data doesn't send in 30 seconds, and give an error - either +FTPPUT:1,nnnn where nnnn is the error number, or +CME ERROR:yyyy where yyyy is a CME error (things like a DNS failure etc..).
I had problems ages ago, when just moving a few miles, picked up a different cell tower, which supported different maximum block sizes. |
|
|
Orcino
Joined: 07 Sep 2003 Posts: 56
|
|
Posted: Sat Jul 15, 2017 8:34 am |
|
|
I will update the firmware of the module and follow its tip.
Thanks again.
Orcino |
|
|
NVergunst
Joined: 20 Oct 2017 Posts: 7 Location: Canada
|
|
Posted: Fri Oct 20, 2017 2:36 pm |
|
|
Ttelmah wrote: | If you are intending ever to use it on a different GSM provider, or even at different sites, then you need to assume that on some at least, 1024 will not be supported as a single transaction.
So, use the EXTPUT command instead.
This is awfully documented. You can use it to extend or overwrite.
Setup just as for normal FTP. So APN (if needed), USER, and PWD for the access point. Then SERV (server name), UN (user name), & PW (login password). Then the filename, and path. Then select the mode (APPE, or STOR), for append or overwrite. Then turn on EXTPUT (AT+FTPEXTPUT=2,0,1024,30000) (for a 1024 byte transmission, and 30 second timeout). Wait to receive back +FTPEXTPUT:0,1024, and then just send your 1024 bytes. It'll send 'OK' when 1024 bytes have been transferred to the modem. Then just send "AT+FTPPUT=1". It'll reply 'OK', and then when the transmission has finished, "+FTPPUT:1,0". It automatically does the transmission using as many transactions as are needed.With 30000 selected in the command, it'll timeout if the data doesn't send in 30 seconds, and give an error - either +FTPPUT:1,nnnn where nnnn is the error number, or +CME ERROR:yyyy where yyyy is a CME error (things like a DNS failure etc..).
I had problems ages ago, when just moving a few miles, picked up a different cell tower, which supported different maximum block sizes. |
Hello,
Sorry to hijack this thread, but I am doing FTPEXTPUT with a SIMCOM SIM808 module and their tech-support has been useless. That's why I am trying some Google-Fu and found your post.
I am grasping at straws here, but I am unable to make a reliable FTPEXTPUT connection. You make mention of "Then select the mode (APPE, or STOR), for append or overwrite". Do you have any example code for this? This is the only thing I appear not to be doing, I really hope this magically fixes things...
My code looks like:
Code: |
AT+CGREG?
AT+SAPBR=0,1
AT+FTPPUT=1
AT+FTPEXTPUT=0
AT+SAPBR=3,1,"Contype","GPRS";
AT+SAPBR=3,1,"APN","wholesale"
AT+SAPBR=1,1
AT+SAPBR=2,1
AT+FTPCID=1
AT+FTPTYPE=I
AT+FTPSERV="ftp.***.com"
AT+FTPUN="***"
AT+FTPPW="***"
AT+FTPPUTNAME="FTPEXT.txt"
AT+FTPPUTPATH="/"
AT+FTPEXTPUT=1
AT+FTPEXTPUT=2,0,100,10000
AT+FTPPUT=1
AT+FTPEXTPUT=0
|
I have been able to get files to upload this way, some of the time.. Other times I just get "ERROR" out of the device with no error code, and other times it just hangs on the FTPPUT=1 command never giving me an OK. Recently it has been giving me ERROR immediately after AT+FTPEXTPUT=1.
If it is ERRORing because I haven't told it to overwrite an internal file handler, that would potentially make sense. If you have any working code for this it is super appreciated as it appears like nobody is using this] |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Fri Oct 20, 2017 2:57 pm |
|
|
Error on FTPPUT, almost certainly means it has not dropped the previous connection. I have never worked out 'why', you tell it to drop the connection at the end, but for some (unknown) reason it seems still sometimes to be open...
Sequence I'm using is:
Initially send AT+SAPBR, with CONTYPE, APN, USER, and PWD. Save to NVRAM and jump on to 'a'.
For all subsequent entries I test the GPRS context with AT+CGATT?. If I get an IP address then jump straight on, otherwise try re-attaching. If OK return to 'a'. Otherwise hang up and try again.
'a' Now send AT+FTPCID=1, and set server name, user name password, filename and path to send.
Now AT+FTPPUTOPT="APPE" or "STOR" as applicable.
Now the AT+FTPEXTPUT=1 to open the extended mode context.
Now AT+FTPEXTPUT=2,0,size,40000 - I've found the timeout needs to be this long...
Then wait for +FTPEXTPUT: and send 'size' number of bytes.
Wait for OK. If ERROR hand up everything and retry.
Now send AT+FTPPUT=1 which starts the physical transfer.
Wait for +FTPPUT:1,0
Send AT+FTPEXTPUT=0 & exit
It is much cheaper to leave the main context open, and only reconnect if CGATT says it has dropped. |
|
|
NVergunst
Joined: 20 Oct 2017 Posts: 7 Location: Canada
|
|
Posted: Fri Oct 20, 2017 3:56 pm |
|
|
Ttelmah wrote: | Error on FTPPUT, almost certainly means it has not dropped the previous connection. I have never worked out 'why', you tell it to drop the connection at the end, but for some (unknown) reason it seems still sometimes to be open... |
Interested. The device thinks the FTP connection is still alive you mean? I can see the FTP server logs in realtime and I can see that very quickly after closing the FTP connection by serial command to the SIM808, the server sees the connection close.
Ttelmah wrote: |
Sequence I'm using is:
Initially send AT+SAPBR, with CONTYPE, APN, USER, and PWD. Save to NVRAM and jump on to 'a'.
For all subsequent entries I test the GPRS context with AT+CGATT?. If I get an IP address then jump straight on, otherwise try re-attaching. If OK return to 'a'. Otherwise hang up and try again.
|
Good advice. In my app it basically sits a long time then wakes up, does stuff, then goes back to sleep. The time from waking up registering on the network and getting an IP is minimal and OK. Then the time between getting the IP and actually using it is always less than 10 seconds. So I do not believe I am dropping the network in that short time causing my problems.
Ttelmah wrote: |
'a' Now send AT+FTPCID=1, and set server name, user name password, filename and path to send.
Now AT+FTPPUTOPT="APPE" or "STOR" as applicable. |
Ok, I see you were talking about the overwrite/append for the server side. Default of overwrite works fine in my case. So not the issue... :(
Ttelmah wrote: |
Now the AT+FTPEXTPUT=1 to open the extended mode context.
Now AT+FTPEXTPUT=2,0,size,40000 - I've found the timeout needs to be this long...
Then wait for +FTPEXTPUT: and send 'size' number of bytes.
Wait for OK. If ERROR hand up everything and retry.
Now send AT+FTPPUT=1 which starts the physical transfer.
Wait for +FTPPUT:1,0
Send AT+FTPEXTPUT=0 & exit |
That's pretty much the flow I have, but it doesn't seem to work...
Ttelmah wrote: |
It is much cheaper to leave the main context open, and only reconnect if CGATT says it has dropped. |
True. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Sat Oct 21, 2017 3:40 am |
|
|
If the simple FTPEXTPUT command is giving 'ERROR' directly like this without saying anything else, I'd say you don't have firmware that supports this.
Check your firmware version and update if necessary. |
|
|
NVergunst
Joined: 20 Oct 2017 Posts: 7 Location: Canada
|
|
Posted: Sat Oct 21, 2017 3:43 am |
|
|
Ttelmah wrote: | If the simple FTPEXTPUT command is giving 'ERROR' directly like this without saying anything else, I'd say you don't have firmware that supports this.
Check your firmware version and update if necessary. |
That was the first thing I checked. Simcom app support gave me the firmware updater and new firmware and they say all is well now. Apparently not. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Sat Oct 21, 2017 10:39 am |
|
|
I notice your syntax is incorrect for the FTPTYPE command. Might not be helping.
The syntax is:
AT+FTPTYPE="I"
Must have the inverted commas. |
|
|
NVergunst
Joined: 20 Oct 2017 Posts: 7 Location: Canada
|
|
Posted: Sat Oct 21, 2017 8:51 pm |
|
|
Ttelmah wrote: | I notice your syntax is incorrect for the FTPTYPE command. Might not be helping.
The syntax is:
AT+FTPTYPE="I"
Must have the inverted commas. |
Good catch. I changed that, no change in the outcome... :(
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19559
|
|
Posted: Sun Oct 22, 2017 1:48 am |
|
|
You seem to be sending an FTPPUT=1 before the FTPEXTPUT. The FTPPUT=1 is what triggers the transfer. You can't setup the extended transfer after having triggered the transfer.
Look at the application notes for FTP transfers on this modem. Follow the sequence exactly. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|