Реализация сервера на ESP8266

Работаю над сервером на МК esp8266 + micro SD shield. Цель - создать локальный google disk (или что-то похожее). То есть, работа с текстовыми файлами и таблицами, сохранение картинок и тд, но без подключения к интернету. И без google :-)

Вот первая (зачаточная) версия сервера: https://github.com/TimmMuranov/NotebookServer/blob/7d85f627908b851dc9a4fd95400f3b185716a520/TimServer_v1.ino

В ней можно только создавать, редактировать и удалять текстовые файлы (работает, но с божьей помощю)

При написании понял, что такой большой проект требует объектного подхода (разделения кодового полотна на отдельные файлы).

Однако, это мой первый подобный опыт и кроме того, что в начале/конце каждого файла надо добавлять #ifndef/#endif, я ничего не знаю.

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

Мне самому не нравятся километровые включения из html-строк, но оно сработало и я не знаю, как это улучшить...

Работаю в arduinoIDE, использую с/с++ со включением html/css/JS. ОС - debian.

РS, если кто-то знает уже готовые реализации подобного проекта - скиньте, пожалуйста


Ответы (1 шт):

Автор решения: Eugene X

При написании понял, что такой большой проект требует объектного подхода (разделения кодового полотна на отдельные файлы).

Да - желательно, но не обязательно. Очень многие программисты Ардуино используют обычный CodeFoldind (Сворачивание кусков кода).

Однако, это мой первый подобный опыт и кроме того, что в начале/конце каждого файла надо добавлять #ifndef/#endif, я ничего не знаю.

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

#endif

Не обязательно, нужны только в том случае, если у тебя несколько файлов ссылаются на один файл. Я так полагаю что ты просто хочешь вынести методы list, read, write, delete в отдельные файлы и на них будет ссылаться только TimServer.ino, в этом случае не нужно.

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

Это очень большая тема, я думаю что стоит изучить документацию всё что поподает под запрос в гугл - как правильно делать include в языке Си

Мне самому не нравятся километровые включения из html-строк, но оно сработало и я не знаю, как это улучшить...


String header_html = "<html><head>...";
String footer_html = "...</body></html>";



String body = "Hello World!";
int responseSize = header_html.length() + body.length(), footer_html.length();
server.sendHeader("Content-Length", String(responseSize));
server.send(200, "text/html", "");
server.sendContent(header_html);
server.sendContent(body);
server.sendContent(footer_html);
server.client().stop();

Работаю в arduinoIDE, использую с/с++ со включением html/css/JS. ОС - debian.

А какая разница? У меня и на яблоке avr-gcc одинаково работает.

РS, если кто-то знает уже готовые реализации подобного проекта - скиньте, пожалуйста

Ну вот неплохая реализация

Что ещё мог-бы посоветовать.

В handleOpen, ты читаешь файл по 1 байту.

file.available() - возвращает int

а

file.read() - может сразу сожрать кусок file.read(buffer, bytesToRead)

Что могло-бы выглядеть например вот так:

#define MAX_BUFFER 1024


char *buffer = (char *) malloc(MAX_BUFFER);
int avail = file.available();
while (avail > 0) {
  if (avail > MAX_BUFFER) avail = MAX_BUFFER;
  file.read(buffer, avail);
  server.sendContent_P(buffer, avail);
  avail = file.available();
}
file.close();
free(buffer);

Так ты не будешь дрочить несчастную SD карточку по 1 байтику.

→ Ссылка