Как задержать исходящий поток данных в Snap

Я могу отправлять запросы GET через экран Wi-Fi (ESP8266) на Arduino Mega, и у меня работает Snap-Webserver, который обслуживает статический каталог с большими .txt-файлами (~ 1 МБ).

К сожалению, я не могу анализировать входящие данные с помощью Arduino так же быстро, как они отправляются. Я теряю около ~ 50% входящих данных.

Есть ли возможность настроить Snap, что бы он задерживал исходящий поток данных? Было бы идеально, если бы я мог сказать Snap подождать ~ 10 мс после разделителя в .txt-файле (например, '\ n').


person Cirquit    schedule 08.08.2015    source источник
comment
Это звучит странно. В стандартной настройке базовым транспортным уровнем для HTTP является TCP, который обеспечивает надежную доставку. Чтобы процитировать статью Википедии TCP использует сквозной протокол управления потоком, чтобы отправитель не отправлял данные слишком быстро, чтобы получатель TCP мог их надежно получить и обработать.   -  person Petr    schedule 08.08.2015
comment
Я тоже так думал, но единственное, что я вижу, это потеря данных, и я просто могу понять, почему это происходит. Может ли быть так, что драйвер для экрана WiFi не реализует TCP так, как вы описали?   -  person Cirquit    schedule 08.08.2015
comment
Вы можете переписать код Arduino, чтобы сделать несколько вызовов GET с заголовком Range:.   -  person ErikR    schedule 08.08.2015
comment
@Cirquit Прежде чем пытаться реализовать какое-либо решение для дросселирования, я бы посоветовал попытаться глубже понять источник проблемы. В частности, для использования таких инструментов, как Wireshark или tcpdump и посмотрите, что происходит, как выглядит сетевой трафик, доставляются ли все данные и т. д. В противном случае ваш обходной путь может просто замаскировать другую проблему, которая вернется, чтобы укусить вас позже.   -  person Petr    schedule 08.08.2015
comment
Я нашел ошибку в своем коде. К сожалению, это открыло еще одну проблему, где возможным решением было бы ограничение размера фрагмента из tcp. Проблема заключается в Arduino Mega, которая имеет только 2 КБ оперативной памяти, но фрагменты, которые я получаю, почти всегда составляют от 4 КБ. Даже если бы я мог иногда сохранять входящие данные, если бы я хотел их найти или разделить, Arduino просто останавливал бы все.   -  person Cirquit    schedule 08.08.2015


Ответы (1)


Я бы вставил прокси-сервер для дросселирования данных.

Вот простой прокси, написанный на 100 строк Python, который можно легко изменить, чтобы добавить задержки вывода:

http://voorloopnul.com/blog/a-python-proxy-in-less-than-100-lines-of-code/

person ErikR    schedule 08.08.2015
comment
Я не знаю никакого питона, но я сделаю все возможное, чтобы это заработало. Собираюсь сообщить / принять это, как только получу какие-то результаты! - person Cirquit; 08.08.2015
comment
К сожалению, я не заметил никаких изменений, даже когда манипулировал задержкой/размером пакета. Я изменил on_recv, чтобы он разбивал входящие данные на куски через мой разделитель *, а затем при повторении списка я использовал time.sleep(1) после каждой отправки. Он должен был ждать 1 секунду после каждого фрагмента, но этого не произошло :( lpaste.net/138291 - person Cirquit; 08.08.2015
comment
Ладно, я понял! Я добавил собственный разделитель, чтобы запрос GET не разделялся с моими данными. lpaste.net/138292 - person Cirquit; 08.08.2015