Программный стек Python для моста HTTP-FTP

Чтобы понять эту просьбу, мне нужно немного объяснить предысторию.

Исходная информация

У нас есть устройство, которое раньше работало через UDP, и оно было достаточно быстрым. Одна из причин заключалась в том, что любая сторона могла инициировать передачу данных, а другая причина заключалась в том, что данные присутствовали с меньшими затратами. Было принято решение, что это устройство получило новую прошивку и теперь использует HTTP и XML в качестве протокола - и это медленно.

Одна из причин заключается в том, что связь инициируется только устройством (опрос), и если у сервера есть информация для отправки, ему необходимо дождаться, пока устройство запросит данные. Интервал опроса фиксирован и не зависит от того, были ли данные доступны или нет.

Вторая причина ИМХО в том, что данные передаются на устройство не в том формате, который ему нужен. Любые обсуждения реализации нашей передачи данных по HTTP другим способом не принимались и отклонялись по самым странным причинам.

Мой последний шанс убедить нескольких человек — реализовать прототип необходимой предварительной обработки самостоятельно. Вот моя идея: я не меняю ни реализацию сервера, ни прошивку устройства. Вместо этого я подключаю Raspberry Pi с двумя сетевыми адаптерами в качестве человека посередине, который выполняет а) немного более сложный опрос и б) преобразует данные из HTTP в необходимый формат устройства и помещает их прямо в правильные файлы. В сервисных целях устройство поддерживает SFTP, который я могу включить.

Я подсчитал, что передача данных в 50 раз быстрее для а) и в 600 раз быстрее для б), так что это кажется достойным хобби-проекта на выходных.

Программный стек

У меня есть Raspberry, и я немного познакомился с Raspbian , поэтому я хотел бы использовать ее в качестве ОС. Далее, я думаю, что Python мне рекомендовали несколько раз, и я нашел время, чтобы немного с ним ознакомиться, так что это будет мой первый «реальный» проект Python. Меня не волнуют версии Python, сомневаюсь, что я бы предпочел более новую версию 3.

Далее мне понадобится несколько библиотек, чтобы не изобретать велосипед:

  • HTTP-клиент - для получения данных с сервера
  • анализатор XML - для чтения входных данных HTTP
  • класс файла INI - для чтения начальной конфигурации устройства и записи измененных данных конфигурации
  • объект Java для десериализатора Python - для чтения данных начальной конфигурации устройства
  • сериализатор объектов Python в Java — для записи измененных данных конфигурации
  • SFTP-клиент — для передачи исходной конфигурации с устройства и записи измененной конфигурации на устройство. Это должно поддерживать аутентификацию по сертификатам.
  • HTTP-сервер — для обработки запросов от устройства. Чтобы это сработало, мне нужно только предоставить два разных жестко закодированных ответа в зависимости от того, отправил ли я данные через FTP или нет.

Необязательно: чтобы сделать его идеальным, я хотел бы, чтобы он работал с любым из наших устройств и реализовал функцию автоматического обнаружения, то есть он определяет IP-адрес и HTTP-порт устройства. Поскольку никакое другое устройство не подключено ко второму порту Ethernet, сетевой адаптер можно перевести в неразборчивый режим и прослушивать входящие HTTP-запросы.

  • сетевая библиотека - для включения неразборчивого режима для сетевого адаптера (на стороне устройства), различения входящих пакетов по протоколу (HTTP для дальнейшего анализа, просто отбрасывайте другие) и анализа HTTP-пакетов (получение исходного и целевого IP-адреса, исходного и целевого TCP порт, маска сети, а также URL)

Запуск (псевдокод):

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)

HTTP-сервер (псевдокод):

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

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

Ответы (1)

У вас довольно большой список покупок. Я бы предложил ознакомиться с:

  1. документация по стандартным библиотекам — более половины ваших требований содержится в стандартных библиотеках и
  2. Python Package Index PyPi , где вы найдете большинство, если не все остальные .

Если есть еще какие-то, которые отсутствуют, задайте здесь более целенаправленный вопрос.