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

Нужна помощь Запись файлов в SPIFFS

Gnork

New member
Проблема с этим самым SPIFFS.
В наличии NodeMCU v.2. Программирую через Arduino IDE. Записывал на нее вот этот проект. Все работает. Но теперь при попытке записать на нее любую программу (даже банальный blink) IDE после обычной заливки скетча начинает загрузку данных
Uploading 277680 bytes from здесь_длинный_путь_к_файлу ...ino.bin to flash at 0x00000000
После этого скетч запускается, но пытается подключиться к точке доступа, которая была записана в том самом первом проекте.
Как вернуть привычную загрузку?

upd
Вот как выглядит окно загрузки:
Archiving built core (caching) in: C:\Users\User\AppData\Local\Temp\arduino_cache_967000\core\core_esp8266_esp8266_nodemcuv2_CpuFrequency_80,FlashSize_4M1M,LwIPVariant_v2mss536,Debug_Disabled,DebugLevel_None____,UploadSpeed_115200_f61936733e373c5108210a0d8911cbdc.a
Скетч использует 273527 байт (26%) памяти устройства. Всего доступно 1044464 байт.
Глобальные переменные используют 34928 байт (42%) динамической памяти, оставляя 46992 байт для локальных переменных. Максимум: 81920 байт.
Uploading 277680 bytes from C:\Users\User\AppData\Local\Temp\arduino_build_996523/GatewayESP8266MQTTClient.ino.bin to flash at 0x00000000
................................................................................ [ 29% ]
................................................................................ [ 58% ]
................................................................................ [ 88% ]
................................ [ 100% ]
Строки "Archiving..." и "Uploading..." пишет красным.
 
Последнее редактирование:

Pilnikov

Active member
запустите FLASH_DOWNLOAD_TOOLS_V3.6.3 и нажмите в нем кнопку "Erase", после этого попробуйте.
 

Gnork

New member
Вроде помогло.
Чтобы два раза не ходить, спрошу здесь.
Загрузил скетч с подключением к точке доступа. Все залилось, подключилось, заработало.
Загружаю другой скетч для "автономной" работы (например blink). Он тоже загружается и начинает исправно мигать, но в терминал пишет, что опять подключился к той же точке, что и в предыдущем скетче. Почему? В этом скетче я этого не просил.
 

Pilnikov

Active member
у вас в настройках неправильно указан объем флэшки. выберите другую плату или поставьте генерик и настраивайте параметры ручками. но это уже не здесь это совсем не в тему.
 

clawham

New member
Привет всем! решил проблему загрузки файлов по воздуху так
1)делал вообще по примеру arduino - edit.htm собственно чтоб оно работало надо иметь на флеше сам файлик сжатый или как есть но если флеш форматнулась - как закидывать файлы? очень просто:
я сделал в коде заглушку на edit.htm - если он есть на флешке - выдаем его. ежели нет - выдаем мегаупрощенную форму загрузки файла
Выглядит это все так:
Код:
server.on("/edit", HTTP_GET, []() {
    if (!handleFileRead("/edit.htm")) {
      out="";
      HTTP_printHeader(out, "Simple uload form", 0);
      out += "<form method=\"post\" enctype=\"multipart/form-data\">";
      out += "<input type=\"file\" name=\"name\">";
      out += "<input class=\"button\" type=\"submit\" value=\"Upload\">";
      out += "</form>";

      HTTP_printTail(out);
      server.send(200, "text/html", out);
      server.client().stop();
    }
  });
//create file
  server.on("/edit", HTTP_PUT, handleFileCreate);
  //delete file
  server.on("/edit", HTTP_DELETE, handleFileDelete);
  //first callback is called after the request has ended with all parsed arguments
  //second callback handles file uploads at that location
  server.on("/edit", HTTP_POST, []() {
    server.send(200, "text/plain", "");
  }, handleFileUpload);
собственно процедура handleFileRead
Код:
bool handleFileRead(String path) {
  dout("_FSWEB:handleFileRead: " + path);
  if (path.endsWith("/")) {
    path += "index.htm";
  }
  String contentType = getContentType(path);
  String pathWithGz = path + ".gz";
  if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) {
    if (SPIFFS.exists(pathWithGz)) {
      path += ".gz";
    }
    File file = SPIFFS.open(path, "r");
    server.streamFile(file, contentType);
    file.close();
    return true;
  }
  return false;
}
ну а процедурки HTTP_printHeader и HTTP_printTail просто добавляют к out строке обычные html заголовки с проверкой примитивной пароля
Код:
void HTTP_printHeader(String &out,const char *title, uint16_t refresh){
  out += "<html>\n<head>\n<meta charset=\"utf-8\" />\n";
  if( refresh ){
     char str[10];
     sprintf(str,"%d",refresh);
     out += "<meta http-equiv='refresh' content='";
     out +=str;
     out +="'/>\n";
  }
  out += "<title>";
  out += title;
  out += "</title>\n";
  out += "<style>body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>\n</head>\n";
  out += "<body>\n";

  //out += "<img src=/logo>\n";
  out += "<p><b>Device: ";
  out += NetConfig.ESP_NAME;

  if( UID < 0 )out +=" <a href=\"/login\">Authorisation</a>\n";
  else out +=" <a href=\"/login?DISCONNECT=YES\">Exit</a>\n";
  out += "</b></p>";
  out += "<p><a href=\"/\">Главная</a> | ";
  out += "<a href=\"/config\">Настройки</a> | ";
  out += "<a href=\"/gauge.htm\">Стрелочные индикаторы</a> | ";
  out += "<a href=\"/stat\">Статистические данные</a></p>";
  if(Stat_Enabled==false)
  {
     out += "<h1>!STATISTICS CRC ERROR!!! DISABLED!</h1>\n";
  }
}
/**
* Выаод окнчания файла HTML
*/
void HTTP_printTail(String &out){
  out += "</body>\n</html>\n";
}

/**
* Ввод имени и пароля
*/
void HTTP_handleLogin(){
  //String msg;
// Считываем куки
  if (server.hasHeader("Cookie")){
//    DebugDebugSerial.print("Found cookie: ");
    String cookie = server.header("Cookie");
//    DebugDebugSerial.println(cookie);
  }
  if (server.hasArg("DISCONNECT")){
    DebugSerial.println("Disconnect");
    String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESP_PASS=\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  if ( server.hasArg("PASSWORD") ){
    String pass = server.arg("PASSWORD");
 
    if ( HTTP_checkAuth((char *)pass.c_str()) >=0 ){
      String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESP_PASS="+pass+"\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
      server.sendContent(header);
      dout("HTTP_Login Success");
      return;
    }
  dout("HTTP_Login Failed");
  }
  out = "";
  HTTP_printHeader(out,"Authorization");
  out += "<form action='/login' method='POST'>\
    <table border=0 width='600'>\
      <tr>\
        <td width='200'>Введите пароль:</td>\
        <td width='400'><input type='password' name='PASSWORD' placeholder='password' size='32' length='32'></td>\
      </tr>\
      <tr>\
        <td width='200'><input type='submit' name='SUBMIT' value='Ввод'></td>\
        <td width='400'>&nbsp</td>\
      </tr>\
    </table>\
    </form><b> Bad password </b><br>";
  HTTP_printTail(out);
  server.send(200, "text/html", out);
  server.client().stop();
}

Собственно у меня вопрос к знатокам - ежели каждые две минуты на флешку в файл записывать строку 122 байта и каждый день открывать новый файл - флешка то разве быстро помрет? как я понял из исходников - spiffs не имеет нулевой дорожки где хранит каталог - каталог формируется на лету анализом содержимого флеши? тоесть запись новых файлов и их дописывание не мусолит одну и ту же ячейку флешки? ну тоесть у меня флешка походу умерла за месяц таких записей - типа 15000 дозаписей на 34 файла
 

Сергей_Ф

Moderator
Команда форума
@nikolz я совершенно серьезно задал вопрос. Поскольку память RTC не энергонезависимая, то указатель на данные будет потерян. Как их найти в этом случае? Или считать это риском за возможную простоту?
 

Сергей_Ф

Moderator
Команда форума
nikolz, спасибо, конечно, только вы не мне описали а clawham. Я то всё это знаю, но это не ответ на вопрос. А вопрос был
Собственно у меня вопрос к знатокам - ежели каждые две минуты на флешку в файл записывать строку 122 байта и каждый день открывать новый файл - флешка то разве быстро помрет?
Вы предлагаете сделать всё по другому, зачем то вводя неоправданную сложность с RTC. Зачем? Понятно было бы, если используется режим сна у esp, но тут то зачем усложнять?
 

Сергей_Ф

Moderator
Команда форума
основное, что я сказал - выкиньте spiffs на фиг если пишите всего один файл.
да никто с этим не спорит.
Вы на вопрос автора ответьте если знаете ответ.
Вариантов реализации записи во флэш, действительно, до фига, но дело не в этом. Вы в первом сообщении дали направление, в результате реализации которого автор мог потерять данные в самый неожиданный для себя момент. RTC подразумевает независимую память, а в esp она не может быть запитана независимо, без пайки под микроскопом. Я уточнил этот момент, что бы автор вопроса не попал в просак. И тут посыпались другие варианты. Неужели вы не понимаете, что вы так не помогаете совсем, а наоборот?
 

clawham

New member
Эууу ну че вы сцепились-то?
У меня на FS ещё с десятка полтора веб-страничек лежим, скрипты сертификаты.и фишка в том что я таки иногда их меняю/редактирую прямо в браузере. Потому файловая нужна. + файлы, которые я пишу каждые две минуты - это логи. они создаются каждый день новым файлом а потом дозаписываются.вопрос лиim состоял в том - какого хрена могло произойти с флешкой если кол-во дозаписей даже в теории всего 15000 произошло а ресурса у флеши какбы 100000 минимум и по сути оно ж не каждую дозапись насилует одну и ту же ячейку - на след день файл уже новый и место расположения его заголовка тоже новое - значит уже при дозаписинасиловать будут другую ячейку...Ну а вопрос с хранением критически важной инфы - решен кардинально - для ежечасовых/ежедневных общих замеров/статистики - подключена 24c64 и туда пишутся критически-важные данные притом не чаще раза в 6 минут и при этом - имеется три копии набора статистики и пишется поочередно то в первый то в второй то в третий - в каждом есть счетчик записей и при запуске - где счетчик больше - то и считается автуальной копией. если не сойдется CRC - берем предыдущую копию, сливаем act содержимое микрухи памяти на внешни сервер и отправляем письмо на почту о проблеме с CRC на конкретном устройстве. с этим пока вопросов нет + там какбы 1 милион циклов и выходит что по факту умноженное на 3.
Так что вопрос открытый - сколько ресурсу реального у тех eeprom что стоят в esp12 ? и как их проверять? создать файл на 3 мегабайта из нулей и проверить чтоб были нули а потом создать из единиц и проверить чтоб были единицы? Просто странно что так быстро сдохло....а ну и по поводу питания - у меня там стоит повербанк как упс так что пару дней даже без свчета - оно работает.

 

nikolz

Well-known member
Эууу ну че вы сцепились-то?
[/SPOILER]
Полагаю, про ресурс флешки вы сами ответили. Ничего нового Вам здесь не скажут.
Рекомендую для начала поковыряться в софте файловой системе и поискать там ошибки.
Например, раньше была проблема (сейчас не знаю так как нет надобности в этой файловой системе) не возможно было записать на весь объем свободной памяти.
 

clawham

New member
опанас....и может я вот и дошел до этого глюка? сколько там можно было записать?
 

nikolz

Well-known member
опанас....и может я вот и дошел до этого глюка? сколько там можно было записать?
у меня получалось где-то половина доступной памяти (давно это было).
Попробуйте почитать документацию на эту файловую систему. Там есть свои особенности, так как она сделана специально для флеш чтобы зря не тереть и равномерно писать и мало тратить оперативной памяти.
но это и создает и тормоза и нюансы.
 

CodeNameHawk

Moderator
Команда форума
Для начала узнаете Какая операционная система стоит на компьютере.
Потом находите какая программа может создать веб сервер на вашем компьютере, находите как её конфигурировать.
Последним этапом настраиваете роутер если это необходимо.
 

nikolz

Well-known member
можно сделать с помощью сокетов
на любом скриптовом языке
операционка не имеет значения
проще всего на луа
 
Сверху Снизу