Реализация сервера на 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 шт):
При написании понял, что такой большой проект требует объектного подхода (разделения кодового полотна на отдельные файлы).
Да - желательно, но не обязательно. Очень многие программисты Ардуино используют обычный 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 байтику.