Hello,
Working FTP client code, tested on ESP32
#include <WiFi.h>
#include <SD.h>
#include <SPI.h>
#define FTPWRITE
const char* ssid = "SSID";
const char* password = "PASSWORD";
IPAddress local_IP(192, 168, 0, 240);
IPAddress gateway(192, 168, 0, 230);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);
// FTP Server
IPAddress server( 192, 168, 0, 250 );
WiFiClient client;
WiFiClient dclient;
char outBuf[128];
char outCount;
// change fileName to your file (8.3 format!)
char fileName[13] = "test.txt";
void setup() {
Serial.begin(115200);
// Configures static IP address
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Serial.println("STA Failed to configure");
}
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
delay(10000);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
Serial.println("Connected to wifi");
printWifiStatus();
Serial.print("FTP server:");
Serial.println(server);
//}
}
void loop() {
doFTP();
}
File fh;
byte doFTP()
{
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 ftp_username"));
if (!eRcv()) return 0;
client.println(F("PASS ftp_password"));
if (!eRcv()) return 0;
client.println(F("SYST"));
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;
delay(10000);
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.println(F("CWD /TEST"));
if (!eRcv()) return 0;
client.print(F("STOR "));
client.println(fileName);
#endif
if (!eRcv())
{
dclient.stop();
return 0;
}
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("FTP 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;
}
}
return 1;
}
void printWifiStatus() {
Serial.println("");
Serial.println("WiFi connected.");
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet: ");
Serial.println(WiFi.subnetMask());
Serial.print("Primary DNS: ");
Serial.println(primaryDNS);
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
It create empty test.txt to FTP server in these lines:
#ifdef FTPWRITE
client.println(F("CWD /TEST"));
if (!eRcv()) return 0;
client.print(F("STOR "));
client.println(fileName);
#endif
Is it possible to fill test.txt with some string (eg. "test 12345") just before client.print(F("STOR "))?
How to do it?
I am not real programmer, just copy & paste programmer.
Hoping someone with better knowledge than me would reply, guide me please.
Thanks for the helpers!