FTP client con GSM Shield
ciao tutti,
ho appena acquistato un gsm shield(http://arduino.cc/en/main/arduinogsmshield).
il mio obbiettivo è riuscire usare la gsm shield per connettermi ad un mio server ftp e uploadare dei file di log.
usando arduino ethernet tutto bene(http://playground.arduino.cc//code/ftp).
invece con la gsm shield ho un grosso problema:
arduino stabilisce la prima connessione, invia username, password...
la connessione dati però non va buon fine.
mi chiedo se la libreria sia in grado di stabilire più connessioni simultanee e se ho sbagliato qualcosa in questa unione veloce di codice. spero di avere più risposte di lui(http://forum.arduino.cc/index.php?topic=167790.0)...
ho appena acquistato un gsm shield(http://arduino.cc/en/main/arduinogsmshield).
il mio obbiettivo è riuscire usare la gsm shield per connettermi ad un mio server ftp e uploadare dei file di log.
usando arduino ethernet tutto bene(http://playground.arduino.cc//code/ftp).
invece con la gsm shield ho un grosso problema:
code: [select]
/*
ftp passive client ide v1.0.1 , w5100/w5200
posted october 2012 surfertim
*/
#include <memoryfree.h>
#include <sd.h>
#include <spi.h>
#include <gsm.h>
// comment out next line write sd ftp server
#define ftpwrite
// pin number
#define pinnumber ""
// apn data
#define gprs_apn "mobile.vodafone.it" // replace gprs apn
#define gprs_login "" // replace gprs login
#define gprs_password "" // replace gprs password
// initialize library instance
gprs gprs;
gsm gsmaccess;
gsmclient client;
gsmclient dclient;
// url, path & port (for example: arduino.cc)
//char server[] = "arduino.cc";
byte server[]= {xxxxxxxxx};
char path[] = "/";
int port = 21; // port 80 default http
char outbuf[30];
char outcount;
// change filename file (8.3 format!)
char filename[13] = "test.txt";
void setup()
{
serial.begin(9600);
if(sd.begin(4) == 0) //changed 53 use mega
{
serial.println(f("sd init fail"));
}
serial.println("starting arduino web client.");
// connection state
boolean notconnected = true;
serial.print("freememory()=");
serial.println(freememory());
// after starting modem gsm.begin()
// attach shield gprs network apn, login , password
while(notconnected)
{
if((gsmaccess.begin()==gsm_ready) &
(gprs.attachgprs(gprs_apn, gprs_login, gprs_password)==gprs_ready))
notconnected = false;
else
{
serial.println("not connected");
delay(1000);
}
}
serial.println("connecting...");
delay(2000);
serial.println(f("ready. press f or r"));
}
void loop()
{
byte inchar;
inchar = serial.read();
if(inchar == 'f')
{
if(doftp()) serial.println(f("ftp ok"));
else serial.println(f("ftp fail"));
}
if(inchar == 'r')
{
readsd();
}
}
file fh;
byte doftp()
{
fh = sd.open(filename,file_read);
/*if(!fh)
{
serial.println(f("sd open fail"));
return 0;
}
serial.println(f("sd opened"));*/
if (client.connect(server,21)) {
serial.println(f("command connected"));
}
else {
fh.close();
serial.println(f("command connection failed"));
return 0;
}
delay(3000);
if(!ercv()) return 0;
client.println(f("user xxx"));
if(!ercv()) return 0;
client.println(f("pass xxx"));
if(!ercv()) return 0;
client.println(f("syst"));
if(!ercv()) return 0;
client.println(f("pasv"));
if(!ercv()) return 0;
char *tstr = strtok(outbuf,"(,");
serial.print("la risposta e ");
serial.println(tstr);
int array_pasv[6];
serial.println(tstr);
( int = 0; < 5; i++) {
tstr = strtok(null,"(,");
array_pasv[i] = atoi(tstr);
if(tstr == null)
{
serial.println(f("bad pasv answer"));
}
}
unsigned int hiport,loport;
serial.println(array_pasv[3]);
serial.println(array_pasv[4]);
hiport = array_pasv[3] << 8;
loport = array_pasv[4] & 255;
serial.print(f("data port: "));
hiport = hiport | loport;
serial.println(hiport);
if (dclient.connect(server,hiport)) {
serial.println(f("data connected"));
}
else {
serial.println(f("data connection failed"));
client.stop();
fh.close();
return 0;
}
client.print(f("stor "));
client.println(filename);
if(!ercv())
{
dclient.stop();
return 0;
}
serial.println(f("writing"));
byte clientbuf[64];
int clientcount = 0;
while(fh.available())
{
clientbuf[clientcount] = fh.read();
clientcount++;
if(clientcount > 63)
{
dclient.write(clientbuf,64);
clientcount = 0;
}
}
if(clientcount > 0) dclient.write(clientbuf,clientcount);
dclient.stop();
serial.println(f("data disconnected"));
if(!ercv()) return 0;
client.println(f("quit"));
if(!ercv()) return 0;
client.stop();
serial.println(f("command disconnected"));
fh.close();
serial.println(f("sd closed"));
return 1;
}
byte ercv()
{
byte respcode;
byte thisbyte;
while(!client.available()){ delay(1); serial.print("non disponibile");};
respcode = client.peek();
boolean ciao=false;
outcount = 0;
while(client.available())
{
thisbyte = client.read();
serial.write(thisbyte);
if(((char)thisbyte)=='(')
ciao=true;
if(ciao){
if(outcount < 29)
{
outbuf[outcount] = thisbyte;
outcount++;
outbuf[outcount] = 0;
}}
}
if(respcode >= '4')
{
efail();
return 0;
}
return 1;
}
void efail()
{
byte thisbyte = 0;
client.println(f("quit"));
while(!client.available()) delay(1);
while(client.available())
{
thisbyte = client.read();
serial.write(thisbyte);
}
client.stop();
serial.println(f("command disconnected"));
fh.close();
serial.println(f("sd closed"));
}
void readsd()
{
fh = sd.open(filename,file_read);
if(!fh)
{
serial.println(f("sd open fail"));
return;
}
while(fh.available())
{
serial.write(fh.read());
}
fh.close();
}
arduino stabilisce la prima connessione, invia username, password...
la connessione dati però non va buon fine.
mi chiedo se la libreria sia in grado di stabilire più connessioni simultanee e se ho sbagliato qualcosa in questa unione veloce di codice. spero di avere più risposte di lui(http://forum.arduino.cc/index.php?topic=167790.0)...
quindi nessuno usa ftp?
Arduino Forum > International > Italiano > Software (Moderator: leo72) > FTP client con GSM Shield
arduino
Comments
Post a Comment