Pila de software de Python para un puente de HTTP a FTP

Para entender esta solicitud, necesito explicar un poco la historia de fondo.

Información de contexto

Tenemos un dispositivo que solía funcionar sobre UDP y era razonablemente rápido. Una razón era que cualquier lado podía iniciar la transferencia de datos y otra razón era que los datos estaban presentes con menos sobrecarga. Se tomó la decisión de que este dispositivo tuviera un nuevo firmware y ahora usa HTTP y XML como protocolo, y es lento.

Una razón es que la comunicación la inicia solo el dispositivo (sondeo) y si el servidor tiene información para enviar, debe esperar hasta que el dispositivo solicite datos. El intervalo de sondeo es fijo y no se adapta de forma inteligente si los datos estaban disponibles o no.

La segunda razón en mi humilde opinión es que los datos no se transmiten al dispositivo en el formato que necesita. Cualquier discusión para implementar nuestra transferencia de datos a través de HTTP de una manera diferente no fue aceptada y rechazada por las razones más extrañas.

Mi última oportunidad de convencer a algunas personas es implementar yo mismo un prototipo del preprocesamiento necesario. Aquí está mi idea: no cambio la implementación del servidor ni el firmware del dispositivo. En cambio, conecto una Raspberry Pi con 2 adaptadores de red como un hombre en el medio que hace a) un sondeo un poco más sofisticado yb) convierte los datos de HTTP al formato necesario del dispositivo y los coloca directamente en los archivos correctos. Para fines de servicio, el dispositivo es compatible con SFTP, que puedo habilitar.

He calculado una transferencia de datos ~ 50 veces más rápida para a) y un procesamiento ~ 600 veces más rápido para b), por lo que parece que vale la pena como un proyecto de pasatiempo para los fines de semana.

Pila de software

Tengo Raspberry y obtuve un poco de conocimiento con Raspbian , así que me gustaría usarlo como sistema operativo. A continuación, creo que me recomendaron Python varias veces y me he tomado el tiempo de familiarizarme un poco con él, por lo que este será mi primer proyecto de Python del "mundo real". No me importan las versiones de Python, en duda, preferiría la versión 3 más nueva.

A continuación, necesitaría algunas bibliotecas para no reinventar la rueda:

  • un cliente HTTP - para obtener datos del servidor
  • un analizador XML - para leer los datos de entrada HTTP
  • una clase de archivo INI: para leer la configuración inicial del dispositivo y escribir los datos de configuración modificados
  • un objeto Java para el deserializador de Python: para leer los datos de configuración inicial del dispositivo
  • un serializador de objetos de Python a Java: para escribir datos de configuración modificados
  • un cliente SFTP: para transferir la configuración inicial del dispositivo y escribir la configuración modificada en el dispositivo. Este debe soportar la autenticación por certificados.
  • un servidor HTTP - para manejar las solicitudes del dispositivo. Para que esto funcione, solo tengo que proporcionar dos respuestas codificadas diferentes dependiendo de si he enviado datos a través de FTP o no.

Opcional: para que sea perfecto, me gustaría que funcione con cualquiera de nuestros dispositivos e implementar una función de detección automática, es decir, detecta la dirección IP y el puerto HTTP del dispositivo. Dado que ningún otro dispositivo está conectado al segundo puerto Ethernet, el adaptador de red podría ponerse en modo promiscuo y rastrear las solicitudes HTTP entrantes.

  • una biblioteca de red: para activar el modo promiscuo para un adaptador de red (en el lado del dispositivo), distinguir los paquetes entrantes por protocolo (HTTP para un análisis más detallado, simplemente descartar otros) y analizar los paquetes HTTP (obtener la dirección IP de origen y destino, TCP de origen y destino puerto, máscara de red y URL)

Inicio (pseudocódigo):

set-promiscuous-mode(true)
while (!autodetected):
    wait-packet()
    httpinfo=analyze-packet()
set-promiscuous-mode(false)
configure-network-adapter(httpinfo.IP+1)

start-http-server(httpinfo.destinationport)
start-http-client(httpinfo)

Servidor HTTP (pseudocódigo):

while(listen()):
    if (ftp-data-written):
        send-reload-response()
        ftp-data-written=false
    else:
        send-empty-reponse()

Cliente HTTP:

certificate=read-crt-file()
ini=ftp-client-get(ini, certificate)
java=ftp-client-get(java, certificate)
while(true):
    response=send-http-request()
    if (is-empty(response)):
        sleep(10)
        continue
    else if (is-ini-data(response)):
        ini=merge-ini-data(ini, response)
        ftp-client-put(ini, certificate)
        ftp-data-written=true
    else if (is-java-data(response)):
        java=merge-java-data(java, response)
        ftp-client-put(java, certificate)
        ftp-data-written=true

Respuestas (1)

Tienes toda una lista de la compra. Sugiero echar un vistazo a:

  1. la documentación de las bibliotecas estándar : más de la mitad de sus requisitos se encuentran en las bibliotecas estándar y
  2. el Python Package Index PyPi donde encontrará la mayoría, si no todo, del resto .

Si todavía hay algunos que faltan, haga una pregunta más específica aquí.