49

Выдача произвольных файлов на севере ESP32 под Arduino IDE

Как показало гугление - вопрос выдачи через веб-сервер на микроконтроллере каких-либо файлов не попадающих под гребенку текстовых волнует очень многих.

А вот достойных решений в открытом доступе нет. Максимум что я видел это использование SD-карты и чтение уже с нее.

Дабы не пополнять стройные ряды мудаков "Вопрос решил, тему закрываю" выкладываю этот пост.


А ведь ларчик довольно просто открывается.

Есть путь настоящих самураев, записывая файл напрямую в энергонезависимую память и читая потом по ячейкам.

А можно всего лишь нужный файл перевести в Си-подобную переменную что бы ее понимал компилятор и мог с ней работать.


У каждого из методов есть свои плюсы. Здесь я опишу именно второй способ, так как он требует меньше всего трудозатрат при массовом внедрении в разных проектах.

Я написал простой исполняемый sh-файл который перебирает любой файл побайтово и создает заголовочный файл с массивом собственно байт.

https://github.com/SUNsung/bash_convert_to_byte_arr


Интерфейс простейший:

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

В итоге создается новый файл (или перезаписывается старый) имя которого совпадает с именем переменной.


Внутри уже сформирован массив байт:

... и указана размерность:

IDE вполне себе спокойно открывает такие файлы, будь они даже под 300Кб и компилятор так же отлично компилирует без всяких плясок занимая фактический размер, не больше и не меньше.


Дальше просто стандартное подключение файлов в С++:

И бонусом как в ардуино-подобной среде можно отдавать сразу на выгрузку:

Arduino & Pi

1.5K поста20.8K подписчиков

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

2
Автор поста оценил этот комментарий
Я конечно очень извиняюсь, а чем вас не устраивает файловая система, на которую мы отпилим небольшой кусочек флэша, и будем работать с файлами как с файлами? Просто загружая их на флэш память МК?
раскрыть ветку (1)
3
DELETED
Автор поста оценил этот комментарий

невозможностью прямой работы с ней как с кодовой частью.


не будет обновлятся по ОТА

требует отдельной загрузки и потом вызова и инициализации

не попадает под гребенку оптимизаторов



вообщем вот основных три причины почему нет.

это железка не для души а по работе, потому все должно быть максимально юзабельно даже на растоянии и спустя много много лет

0
Автор поста оценил этот комментарий

А чем base64 не угодил?

раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий

в base64 не загонишь пол мегабайта файла шрифтов

показать ответы
Автор поста оценил этот комментарий
Збс. Ещё бы сжатие какое прикрутить...
раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий

зачем?
если надо то сразу выдать уже сжатые файлы

таким макаром можно ВСЕ передавать
даже архивы

0
Автор поста оценил этот комментарий

Какая среда?

раскрыть ветку (1)
1
DELETED
Автор поста оценил этот комментарий

CLion

показать ответы
0
Автор поста оценил этот комментарий

Извини, не могу понять зачем полный сборник шрифтов на ардуине, тем более что ты будешь еще и "утюг" подключать? Можно и ноду накатить с каким то реактом, но зачем?

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

не ардуине, а ESP
веб-морда
нормально отрисованная веб морда

если все картинки в векторе и там все просто, то вот для шрифтов пришлось придумать изящное решение что бы не инициализировать отдельно протокол передачи бинарников

до етого пробовалось и шрифты в векторе отдавать и прочие изврашения
данное решение оказалось самым оптимальным

0
Автор поста оценил этот комментарий

1. Загонишь
2. Если пол мегабайта шрифтов то это проблема разработчика, потому шрифтов такого размера нету. Тем более шрифты это статика - практически никогда не обновляется.

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

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


я вот под задачу урезал до 200 кб в сумме
в шрифте оставили только те кофиги которые используются и все
была мысль вообще каждый отдельным файлом подтягивать но решили не усложнять


а возвращаясь к base - это таки текстовый формат хранения данных то есть будут микролаги при распаковке
плюс может вылезти что не будет работать на каком-то утюге

вообще так себе извращения
это из рубрики как юзать jquery в современном сайте ради красивой картинки

показать ответы
0
Автор поста оценил этот комментарий

Почём брал?

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

11$/месяц лицензия

показать ответы
2
Автор поста оценил этот комментарий
Я написал простой исполняемый sh-файл

Видимо, bin2c слишком просто, нужно обязательно изобрести велосипед

раскрыть ветку (1)
0
DELETED
Автор поста оценил этот комментарий

разный подход, разные задачи
да и банальная экономия


массив на 500к+ целочисленных елементов любая ide откроет и с поиском проблем не будет, а такой же массив но символьный, плюс "0x" как фактический мусор....


я чего то даже не думал что найдутся извращенцы что бы файл бинарно разбирать на HEX-блоки и хранить посимвольно


хотя путь один, да



UPD
кстати опять таки то решение кросплатформенное под строки, а мое уже таки под наборы байтов
через 1-wire мое пропихнется вообще без игр руками, а уже с символами будет "весело" надо будет проверять целостность каждого фрагмента или опять таки переводить с символа в байт и уже так передавать
да херня по сути но константа байт уже по умолчанию константа байт