TODOPIC
Misceláneas - Interés General => Off Topic => Mensaje iniciado por: Icat en 09 de Marzo de 2021, 16:57:43
-
Muy buenas estoy tratando de conectarme a un servidor FTP con mi ESP32 y a pesar de que me he visto ya obligado de copiar el ejemplo dado por la librería "ESP_FTPClient.h" me sigue dando un error de que el servidor esta Offline, cosa que no es cierta pues a través de mi PC soy capaz de conectarme. Os dejo por aquí el código ejemplo, a ver si alguien me puede iluminar un poco porque no hago más que darme cabezazos XDD.
/******************************************************************************
ESP32-CAM remote image access via FTP. Take pictures with ESP32 and upload it via FTP making it accessible for the outisde network.
Leonardo Bispo
July - 2019
https://github.com/ldab/ESP32_FTPClient
Distributed as-is; no warranty is given.
******************************************************************************/
#include "Arduino.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <ESP32_FTPClient.h>
#define WIFI_SSID ""
#define WIFI_PASS ""
char ftp_server[] = "files.000webhost.com";
char ftp_user[] = "";
char ftp_pass[] = "";
ESP32_FTPClient ftp (ftp_server,ftp_user,ftp_pass);
void setup()
{
Serial.begin( 115200 );
WiFi.begin( WIFI_SSID, WIFI_PASS );
Serial.println("Connecting Wifi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("\nMax Free Heap: ");
Serial.println(ESP.getMaxAllocHeap());
Serial.println("");
ftp.OpenConnection();
//Change directory
ftp.ChangeWorkDir("/public_html/zyro/gallery_gen");
// Create a new file to use as the download example below:
ftp.InitFile("Type A");
ftp.NewFile("helloworld.txt");
ftp.Write("Hi, I'm a new file");
ftp.CloseFile();
//Download the text file or read it
String response = "";
ftp.InitFile("Type A");
ftp.DownloadString("helloworld.txt", response);
Serial.println("The file content is: " + response);
// Get the file size
const char * fileName = "myPhoto.png";
size_t fileSize = 0;
String list[128];
// Get the directory content in order to allocate buffer
// my server response is type=file;size=18;modify=20190731140703;unix.mode=0644;unix.uid=10183013;unix.gid=10183013;unique=809g7c8e92e4; helloworld.txt
ftp.InitFile("Type A");
ftp.ContentList("", list);
for( uint8_t i = 0; i < sizeof(list); i++)
{
uint8_t indexSize = 0;
uint8_t indexMod = 0;
if(list[i].length() > 0)
{
list[i].toLowerCase();
if( list[i].indexOf(fileName) > -1 )
{
indexSize = list[i].indexOf("size") + 5;
indexMod = list[i].indexOf("modify") - 1;
fileSize = list[i].substring(indexSize, indexMod).toInt();
}
// Print the directory details
Serial.println(list[i]);
}
else
break;
}
// Print file size
Serial.println("\nFile size is: " + String(fileSize));
//Dynammically alocate buffer
unsigned char * downloaded_file = (unsigned char *) malloc(fileSize);
// And download the file
ftp.InitFile("Type I");
ftp.DownloadFile(fileName, downloaded_file, fileSize, false);
//Create a new Directory
ftp.InitFile("Type I");
ftp.MakeDir("myNewDir");
//Enter the directory
ftp.ChangeWorkDir("/public_html/zyro/gallery_gen/myNewDir");
//And upload the file to the new directory
ftp.NewFile( fileName );
ftp.WriteData(downloaded_file, fileSize);
ftp.CloseFile();
free(downloaded_file);
ftp.CloseConnection();
}
void loop()
{
}
Obviamente he ajustado debidamente en el código mi SSID y contraseña así como las credenciales del servidor FTP.
Muchisimas gracias por vuestro tiempo.
Un saludo, Icat.
-
Hola,
yo intentaría simplificar las cosas al máximo y probaría el que -creo- es el punto de partida de tu ejemplo, también en Github: https://github.com/blackcodetavern/ESP32_FTPClient
Fíjate que en esta línea se añaden un par de parámetros al código: timeout y verbose.
ESP32_FTPClient ftp (ftp_server,ftp_user,ftp_pass, 5000, 2);
El timeout evita que la comunicación se quede 'pasmando' si no hay una respuesta del servidor y verbose -que no sé cómo traducir- proporciona detalles sobre dicha comunicación, dándote una información más concisa de lo que pueda estar sucediendo.
Si este ejemplo básico te funciona ya tendrás un punto de partida sólido sobre el que ampliar tu código. En caso contrario, probaría lo siguiente:
- Cambiar de servidor ftp. Puede que 000webhost.com no esté funcionando o haya modificado algún requisito de conexión(*).
- Comprobar que la configuración del router no esté bloqueando la comunicación.
Comenta el autor en Github haber tenido problemas con una librería...
- Comprobar que las tengo todas actualizadas.
- Comprobar que puedo acceder desde algún gestor ftp (FileZilla, WinSCP, etc).
No se me ocurre nada más en este momento...
(*) Si no conoces otro servidor ftp sobre el que hacer la prueba, contáctame por privado.
saludos
-
Muchas gracias por tu respuesta.
Comentar que justo hoy pude establecer conexión con mi FTP en localhost, pero No con el que tengo que conectar a distancia, tengo su dirección incluso con "Filezilla client" he sacado la IP de dicho servidor, pero tengo exactamente el mismo problema.
Respecto de los argumentos de "tiemeout" y el "verbose" he estado probando con ellos y sin ellos y como digo no ha habido forma.
La idea es que periódicamente el ESP32 se conecte a dicho servidor y compruebe si hay un archivo que actualice su firmware (aun no se muy bien como hacerlo pero ya me daré contra la pared cuando llegue a ella XD)
Ahora bien una cosa que me ha dejado sorprendido es que haciendo ping a la IP que saque con "Filezilla" recibo respuesta (algo que en teoría ya sabía, porque con el buscador de archivos puedo conectarme al FTP, pero por probar que no falte).
Un saludo, y una vez más muchísimas gracias.
-
Si en local funciona entonces es probable que sea el router el que está bloqueando el acceso.
Verbose es el equivalente a la ventana 'Registro de mensajes' en FileZilla. Nos da el detalle de peticiones del cliente / respuestas del servidor y a partir de ahí, en caso de error, visualizar qué ha fallado.
En FileZilla menú Edición > Opciones > Depuración puedes activar diferentes niveles de información si necesitas verlo con más detalle.
Ni timeout ni verbose son necesarios cuando las cosas van bien...
Para descartar el router podrías crear un punto de acceso wifi con el móvil y realizar la conexión a través de éste, saltándote el router. Te consumirá muy pocos datos hacer la prueba.
***
El problema en estos casos es que vamos a ciegas y no hay forma de saber en que punto está fallando la comunicación si no podemos monitorizarla de alguna manera.
Hay bastantes aplicaciones que nos permiten visualizar el intercambio de tramas cuando la comunicación se establece desde el propio pc (sobre todo http, no tantas para ftp), pero la cosa cambia cuando la comunicación es vía wifi desde un dispositivo externo.
Te dejo un par de opciones que permiten el modo monitor con gran parte de las tarjetas wifi actuales y que podrían servirte en este o futuros casos: Wireshark (https://www.wireshark.org/) (gratuito) y Acrylic (https://www.acrylicwifi.com/) (diferentes opciones de pago).
un saludo