Autor Tema: Servidor FTP con un ESP32 como cliente  (Leído 312 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Icat

  • PIC10
  • *
  • Mensajes: 44
Servidor FTP con un ESP32 como cliente
« 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.

Código: [Seleccionar]
/******************************************************************************
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.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2286
Re:Servidor FTP con un ESP32 como cliente
« Respuesta #1 en: 10 de Marzo de 2021, 12:29:05 »

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.

Código: [Seleccionar]
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

Desconectado Icat

  • PIC10
  • *
  • Mensajes: 44
Re:Servidor FTP con un ESP32 como cliente
« Respuesta #2 en: 10 de Marzo de 2021, 16:06:42 »
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.
 

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2286
Re:Servidor FTP con un ESP32 como cliente
« Respuesta #3 en: 12 de Marzo de 2021, 10:37:27 »
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 (gratuito) y Acrylic (diferentes opciones de pago).

un saludo