Хранение большого объема данных и работа с ним в Arduino (база данных)

frundik
Offline
Зарегистрирован: 02.08.2016

Добрый день.

Есть Ардуино с GPS, SD,  GPRS  шилдами.

Ардуино собирает данные GPS и еще с 10 разнообразных датчиков. Периодически (и это не системно -  возможно раз в час, а возможно раз в день или даже раз в месяц)  Ардуино попадает в зону действия GSM сети и получает возможность сгрузить данные на удаленный сервер. Но.... собранные данные он все равно должен продолжать хранить. 

Так как данные собираются/записываются каждые 2-3 секунды - то массив данных получается довольно внушительным + необходимость учета того что уже было отправлено на удаленный сервер, а что нет.

Я далеко не профессионал в Ардуино и эта задача меня поставила в тупик. В данный момент у меня получился какой-то гомункул - данные после каждого считывания записываются в отдельный файл и хранятся на SD, когда получается подключиться к сети и Ардуино имеет возможность "поделится" данными с сервером то после выгрузки Ардуино перемещает файлы, данные из которых удалось отправить на сервер, в отдельную папку (тем самым  условно помечая их как "отправленные".

Но это решение ужасно из-за исполинского количества файлов и дикого неудобства работы с таким количеством файлов,  а писать все в один файл (или несколько) тоже, мне кажется, не вариант потому что каким-то образом нужно организовать пометку "отправлено/неотправленно на сервер".

В общем прошу помочь советом в решении. Может у кого-то более изящное решение.

Спасибо.

5N62V
Offline
Зарегистрирован: 25.02.2016

frundik пишет:

В общем прошу помочь советом в решении. Может у кого-то более изящное решение.

Спасибо.

Мне кажется не надо после "сброса" данных на сервер их куда-то перетаскивать. Достаточно просто хранить адрес байта или строки, которая была крайней в прошлом сеансе.  В следующий раз начинать передачу данных с запомненного места.

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Можно создать 1 (один) буферный файл для сбора данных либо с каждого отдельного датчика (по файлу на датчик), либо на весь массив данных за один сеанс опроса. Пишете в этот файл(ы) весь месяц показания добавлением в конец. По мере возможности отдаете из этого файла данные по ГСМ. Храните в EEPROM указатель на следующий "неотданный" пакет данных. Все

По прошествии времени переименовываете этот файл для истории и начинаете новый

rkit
Offline
Зарегистрирован: 23.11.2016

Хранить что-то после отправки на сервер уже не нужно. Файлов больше одного тоже не нужно. Можно вообще файловую систему выкосить для экономии циклов и памяти.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

поставить EEPROM, хранить позицию последней успешной отправки и при следующем попадании в сеть отправлять только свежее

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

rkit пишет:

Хранить что-то после отправки на сервер уже не нужно. 

А ТС утверждает что нужно! :)

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Там на практике другая проблема может возникнуть. С такой частотой опроса датчиков если писать на карту каждый сеанс опроса, то карте скоро настанет кирдык. Однозначно надо сокращать частоту сеансов записи, либо каждый день новый файл создавать, чтобы не долбить постоянно одни ячейки флэша

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Rumata пишет:

rkit пишет:

Хранить что-то после отправки на сервер уже не нужно. 

А ТС утверждает что нужно! :)

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

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

ua6em пишет:

ять зачем, если в базу скидывается?

Ну, что там за "база" нам достоверно не известно. Может и сервер не его, а какой-нибудь "народный". Ну и если есть локально все данные, то может и удаленный сервер не понадобится. 

С практической точки зрения вижу это как затыкание места на флэшке, чтобы на затиралась до дыр в одном месте. при получении данных с частотой 3 секунды за сутки один кластер fat32 перезапишется 28,8 тыс. раз. Пара недель работы с единственным файлом и усё