Servidor FTP con acceso a tarjeta MicroSD en la Esp32-S3




Presentación


Este proyecto es exclusivamente asincronico y como la libreria que sirve al Servidor FTP esta en elaboracion no he incorporado sus funciones a la libreria libAsinEsp32S3.py por lo que debe usarse también la libreria especifica libAsinServFTP.py.

El mismo consiste en un servidor FTP que una vez conectado mediante un programa cliente a la placa permite subir, bajar, leer, borrar y editar los archivos que esten en la propia placa como en la trajeta MicroSD.

Las pruebas como cliente las he realizado con el nautilus de Ubuntu y con gFTP



Materiales


Placa Esp32-S3 con display


Montaje del proyecto en la placa Esp32-S3


Para utilizar la placa Esp32-S3 con MicroPython es necesario flashear primero la misma con el firmware correspondiente. En el caso de este proyecto se utilizo el provisto por la pagina de ESP32 GENERIC S3

Una vez instalado el firmware en la placa utilizando la utilidad que viene provista por el IDE Thonny, o por aquella que ustedes utilicen ademas del firmware quedara grabado en la placa un archivo boot.py que debe ser borrado y en su reemplazo copiar los archivos que se incluyen en el codigo desarrollado a continuacion.


Consideraciones previas


Para este proyecto ademas de la libreria libAsinEsp32S3.py fue necesario usar las siguientes librerias:

ST7735.py

sysfont.py

sdcard.py

asyncio

Tambien se elaboro una libreria especifica para el servidor FTP como ya fije la libAsinServFTP.py cuyo codigo es:




Descarga la libreria


Descargar Libreria Sincrónica

Código


El codigo se ha escrito en dos archivos boot.py, main.py.

El archivo boot.py solamente contiene la ruta para las librerias /lib/ ya que para un mejor ordenamiento en esa carpeta se colocaron las librerias.

El archivos main.py contiene la parte principal del programa, que consta simplemente de dos funciones una de la clase Tarjeta que lee el contenido del archivo y otra de la clase Pantalla que escribe ese contenido en la pantalla.

Una vez copiado todos los archivos se deberían verse en la carpeta /lib las librerias y en la carpeta /(raiz) boot.py y main.py: en una estructura similara ala siguiente.


boot.py




        import sys
        sys.path.append("/lib")
      
    

main.py




    


import uasyncio as asyncio
import usocket as socket
from libAsinEsp32S3 import Conexion, Pantalla, Tarjeta
from libAsinServFTP import FTPServer  # Importar la clase FTPClass

pantalla = Pantalla()
tarjeta = Tarjeta()

red = "Marcar2"
clave = "chacho2020"

async def mostrar_mensaje(cadena):
    señal = "mensaje="
    inicio = cadena.find(señal)
    
    if inicio != -1:
        texto = cadena[inicio + len(clave):]
        mensaje = texto.replace("+", " ")
        await pantalla.escribir(mensaje)

async def conectar_wifi():
    pantalla.escribir("Iniciando...")
    global red
    global clave

    wifi = Conexion(red, clave)
    await wifi.conectar()

    if await wifi.esperar():
        await pantalla.escribir("Conexión OK")
    else:
        await pantalla.escribir("Error de conexión")

async def iniciar_servidor_ftp():
    global red
    global clave
    wifi = Conexion(red, clave)
    config = wifi.configuracion()
    ip_address = config[0]  # Obtener la IP dinámica
    print(f"Iniciando servidor FTP en {ip_address}:21")
    await pantalla.escribir(f"FTP en {ip_address}:21")
    
    servidor_ftp = FTPServer(ip_address, port=21)
    await servidor_ftp.run()

async def main():
    global red
    global clave
    await conectar_wifi()
    
    # Obtener la IP dinámica
    wifi = Conexion(red, clave)
    config = wifi.configuracion()
    ip_address = config[0]
    print(f"IP asignada: {ip_address}")
    await pantalla.escribir(f"IP: {ip_address}")
    
    # Ejecutar el servidor
    await asyncio.gather(
        iniciar_servidor_ftp()
    )

# Ejecutar el programa principal
asyncio.run(main())

        
    



Cerrar