• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 скачивает файл не полностью

Topcat

New member
Прошу помочь с решением проблемы, которая, как сказали бы западные esp-шники "is driving me nuts".
Пишу скрипт, в процессе которого происходит следующее:
1. После включения происходит обращение к удаленному серверу (WiFiClient) и скачивание двух json-файлов (маленького (2кб) и большого (около 16кб)).
2. Через секунд пять эта операция повторяется заново.
3. В дальнейшем скачивания происходят каждые пять минут.

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

Код не привожу, так как он довольно большой, но если надо могу привести фрагмент со скачиванием. Не понимаю, в чем дело и куда копать - проблема с памятью? Проблема с коннектом? Какие-то глюки? Подскажите даже не решение, а хотя бы на что следует обратить внимание
 

Topcat

New member
А есть какая-то хитрость, чтобы обойти это? В первый-то раз скачивается полностью...
 

Topcat

New member
Решил проблему. Дело действительно оказалось в нехватке памяти. Сделал так: переменную с json объявляю не глобальной, а локальной. При открытии записываю файл во флеш, а затем, когда необходимо, считываю его в другую локальную переменную.
 

Алексей.

Active member
При открытии записываю файл во флеш, а затем, когда необходимо, считываю его в другую локальную переменную.
Не жалко вам флеша то? Ресурс его по количеству записей ограничен, постоянной записью вы можете его убить.
 

Topcat

New member
Вот тут pellepl/spiffs утверждается, что повторяемый каждую секунду цикл чтения/записи выведет память из строя через год. Уменьшение частоты обращения к файлу до раза в минуту увеличит срок жизни памяти до 58 лет.

А по поводу записи в RAM — я такой подход еще не использовал. Не подскажите, какая библиотека позволяет реализовать это?
 

CodeNameHawk

Moderator
Команда форума
Не подскажите, какая библиотека позволяет реализовать это?
Все ваши переменные и так в RAM находятся .
JSON для обработки данных требует много памяти.
Посылайте только те данные, которые изменились или посылайте их в чистом виде.
How to reduce memory usage?
 

nikolz

Well-known member

Алексей.

Active member
выкиньте JSON.
Делайте проще и все уместится.
О как! за одно и выкинуть удаленный сервер, зачем он такой нужен, а после этого уже можно и есп выкинуть.

Решал почти такую же задачу, получаю данные погоды с сервера, форекасты в джейсоне до 15К.
Данные структурированные один элементов содержит массив джейсонов каждый из которых по отдельности не превышает 500 байт и без проблем разбирается.
После выполнения http клиентом метода get, получаю большую строку контента, нахожу начало и конец массива, далее выделяю каждый элемент (каждый джейсон объект) и выполняю его разбор обычным StaticJsonBuffer.parseObject
Посмотрите update_forecast(const String& query)
 

nikolz

Well-known member
О как! за одно и выкинуть удаленный сервер, зачем он такой нужен, а после этого уже можно и есп выкинуть.

Решал почти такую же задачу, получаю данные погоды с сервера, форекасты в джейсоне до 15К.
Данные структурированные один элементов содержит массив джейсонов каждый из которых по отдельности не превышает 500 байт и без проблем разбирается.
После выполнения http клиентом метода get, получаю большую строку контента, нахожу начало и конец массива, далее выделяю каждый элемент (каждый джейсон объект) и выполняю его разбор обычным StaticJsonBuffer.parseObject
Посмотрите update_forecast(const String& query)
Так как формат принимаемых данных у вас фиксированный то можно все растащить без JSON и возможно даже на лету.
Для этого вполне хватит места а софт будет не больше 10 кбайт да и тот будет во флеш. А весь разбор делать надо на СИ.
Решал подобную задачу без JSON , когда делал торгового робота для биржи.
 
Сверху Снизу