Чтобы понять эту просьбу, мне нужно немного объяснить предысторию.
У нас есть устройство, которое раньше работало через UDP, и оно было достаточно быстрым. Одна из причин заключалась в том, что любая сторона могла инициировать передачу данных, а другая причина заключалась в том, что данные присутствовали с меньшими затратами. Было принято решение, что это устройство получило новую прошивку и теперь использует HTTP и XML в качестве протокола - и это медленно.
Одна из причин заключается в том, что связь инициируется только устройством (опрос), и если у сервера есть информация для отправки, ему необходимо дождаться, пока устройство запросит данные. Интервал опроса фиксирован и не зависит от того, были ли данные доступны или нет.
Вторая причина ИМХО в том, что данные передаются на устройство не в том формате, который ему нужен. Любые обсуждения реализации нашей передачи данных по HTTP другим способом не принимались и отклонялись по самым странным причинам.
Мой последний шанс убедить нескольких человек — реализовать прототип необходимой предварительной обработки самостоятельно. Вот моя идея: я не меняю ни реализацию сервера, ни прошивку устройства. Вместо этого я подключаю Raspberry Pi с двумя сетевыми адаптерами в качестве человека посередине, который выполняет а) немного более сложный опрос и б) преобразует данные из HTTP в необходимый формат устройства и помещает их прямо в правильные файлы. В сервисных целях устройство поддерживает SFTP, который я могу включить.
Я подсчитал, что передача данных в 50 раз быстрее для а) и в 600 раз быстрее для б), так что это кажется достойным хобби-проекта на выходных.
У меня есть Raspberry, и я немного познакомился с Raspbian , поэтому я хотел бы использовать ее в качестве ОС. Далее, я думаю, что Python мне рекомендовали несколько раз, и я нашел время, чтобы немного с ним ознакомиться, так что это будет мой первый «реальный» проект Python. Меня не волнуют версии Python, сомневаюсь, что я бы предпочел более новую версию 3.
Далее мне понадобится несколько библиотек, чтобы не изобретать велосипед:
Необязательно: чтобы сделать его идеальным, я хотел бы, чтобы он работал с любым из наших устройств и реализовал функцию автоматического обнаружения, то есть он определяет IP-адрес и HTTP-порт устройства. Поскольку никакое другое устройство не подключено ко второму порту Ethernet, сетевой адаптер можно перевести в неразборчивый режим и прослушивать входящие HTTP-запросы.
Запуск (псевдокод):
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
У вас довольно большой список покупок. Я бы предложил ознакомиться с:
Если есть еще какие-то, которые отсутствуют, задайте здесь более целенаправленный вопрос.