[SOLVED] FTP client. how to work ?

Can someone help me port this library?
Post Reply
acronis
Posts: 143
Joined: Thu Mar 02, 2017 12:32 pm

[SOLVED] FTP client. how to work ?

Post by acronis » Wed Aug 09, 2017 3:53 am

http://playground.arduino.cc/Code/FTP

Code: Select all

/*
    FTP passive client for IDE v1.0.1 and w5100/w5200
    Posted October 2012 by SurferTim
    Modified 6 June 2015 by SurferTim
 */

#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
// comment out next line to write to SD from FTP server
#define FTPWRITE

// this must be unique
 byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };  

// change to your network settings
 IPAddress ip( 192, 168, 2, 2 );    
 IPAddress gateway( 192, 168, 2, 1 );
 IPAddress subnet( 255, 255, 255, 0 );

// change to your server
 IPAddress server( 1, 2, 3, 4 );

 EthernetClient client;
 EthernetClient dclient;

char outBuf[128];
char outCount;

// change fileName to your file (8.3 format!)
char fileName[13] = "test.txt";

void setup()
{
   Serial.begin(9600);

   digitalWrite(10,HIGH);

   if(SD.begin(4) == 0)
   {
     Serial.println(F("SD init fail"));          
   }

   Ethernet.begin(mac, ip, gateway, gateway, subnet); 
   digitalWrite(10,HIGH);
   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()
{
#ifdef FTPWRITE
   fh = SD.open(fileName,FILE_READ);
#else
   SD.remove(fileName);
   fh = SD.open(fileName,FILE_WRITE);
#endif

   if(!fh)
   {
     Serial.println(F("SD open fail"));
     return 0;    
   }

#ifndef FTPWRITE  
   if(!fh.seek(0))
   {
     Serial.println(F("Rewind fail"));
     fh.close();
     return 0;    
   }
#endif

   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;
   }

   if(!eRcv()) return 0;

   client.println(F("USER myuser"));

   if(!eRcv()) return 0;

   client.println(F("PASS mypassword"));

   if(!eRcv()) return 0;

   client.println(F("SYST"));

   if(!eRcv()) return 0;

   client.println(F("Type I"));

   if(!eRcv()) return 0;

   client.println(F("PASV"));

   if(!eRcv()) return 0;

   char *tStr = strtok(outBuf,"(,");
   int array_pasv[6];
   for ( int i = 0; i < 6; i++) {
     tStr = strtok(NULL,"(,");
     array_pasv[i] = atoi(tStr);
     if(tStr == NULL)
     {
       Serial.println(F("Bad PASV Answer"));    

     }
   }

   unsigned int hiPort,loPort;

   hiPort = array_pasv[4] << 8;
   loPort = array_pasv[5] & 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;
   }

#ifdef FTPWRITE 
   client.print(F("STOR "));
   client.println(fileName);
#else
   client.print(F("RETR "));
   client.println(fileName);
#endif

   if(!eRcv())
   {
     dclient.stop();
     return 0;
   }

#ifdef FTPWRITE
   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);

#else
   while(dclient.connected())
   {
     while(dclient.available())
     {
       char c = dclient.read();
       fh.write(c);      
       Serial.write(c); 
     }
   }
#endif

   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);

   respCode = client.peek();

   outCount = 0;

   while(client.available())
   {  
     thisByte = client.read();    
     Serial.write(thisByte);

     if(outCount < 127)
     {
       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();
}
Hello.

There is a wonderful FTP client that works perfectly.
But it works in any one direction


// comment out next line to write to SD from FTP server
#define FTPWRITE


How to make this code in one program and send the file to FTP and read a file from an FTP server ?

Code: Select all

  // send the file to FTP server
#define FTPWRITE 
   fileName = "cardID.txt";                                                     
    if (doFTP())
    {
      tft.println(F("FTP OK"));
    }
    else
    {
      tft.println(F("FTP FAIL"));
    }


how to count it, trace it back ?
if you do
#undef FTPWRITE
that doesn't work

I need to work in two sides and c the sd card to the ftp server , and FTP server to sd card

User avatar
RogerClark
Posts: 7443
Joined: Mon Apr 27, 2015 10:36 am
Location: Melbourne, Australia
Contact:

Re: FTP client. how to work ?

Post by RogerClark » Tue Aug 15, 2017 12:22 am

You are confusing FTP Client with FTP Server

You need to post to the Arduino.cc forum about obtaining a FTP server library

Post Reply