#include <SD.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESP32_FTPClient.h>
#include "octocat_pic.h"
#define BLOCK_SIZE (2 * TCP_MSS)
char ftp_server[] = "ftp.dlptest.com";
char ftp_user[] = "dlpuser";
char ftp_pass[] = "rNrKYTX9g7z3RgJRmxWuGHbeu";
// you can pass a FTP timeout and debbug mode on the last 2 arguments
ESP32_FTPClient ftp (ftp_server, ftp_user, ftp_pass, 5000, 2);
const int CS_PIN = 5;
const int DHT_PIN = 15;
const int LED_PIN = 13;
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
void writeFile(fs::FS &fs, const char * filename) {
// Apro il file passato come parametro
File file = fs.open(filename, "r");
if (!file) {
Serial.println("error opening file for reading!");
return;
}
// Sulla base di esperienza personale (con altra libreria), ho notato che dividendo
// lo stream dei dati in pacchetti con dimensione massima impostata a 2 volte
// la TCP Maximum Segment Size (TCP_MSS) si ottengono buone prestazioni in upload
// Fai delle prove variando la dimensione se vuoi, ma tieni a mente che il traffico
// TCP viaggia sempre a pacchetti che hanno una dimensione massima e quindi aumentare
// troppo la dimensione del buffer non porta alcun vantaggio ai fini pratici.
unsigned char data[BLOCK_SIZE];
int n_block = trunc(file.size() / BLOCK_SIZE);
int lastBytes = file.size() - (n_block * BLOCK_SIZE);
for (uint16_t pos = 0; pos < n_block; pos++) {
file.readBytes((char*)data, BLOCK_SIZE);
ftp.WriteData(data, BLOCK_SIZE);
}
file.readBytes((char*)data, lastBytes);
ftp.WriteData(data, lastBytes);
file.close();
}
void setup() {
Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
// Creo il file jpg sulla SD (il piano base Wokwi non consente l'upload di file esterni)
File imgFile = SD.open("/octocat.jpg", "w");
if (imgFile) {
imgFile.write(octocat_pic, sizeof(octocat_pic));
imgFile.close();
} else {
Serial.println("error opening file for writing!");
}
Serial.println("");
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.print("\nWifi connected. Local IP: ");
Serial.println(WiFi.localIP());
WiFi.mode(WIFI_STA);
ftp.OpenConnection();
// Make a new directory
ftp.InitFile("Type A");
ftp.MakeDir("pictures");
// Create the new file and send the image
ftp.ChangeWorkDir("pictures");
ftp.InitFile("Type I");
ftp.NewFile("octocat.jpg");
// ftp.WriteData( octocat_pic, sizeof(octocat_pic) );
writeFile(SD, "/octocat.jpg");
ftp.CloseFile();
ftp.CloseConnection();
}
void loop() {
delay(100);
// nothing happens after setup finishes.
}