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

Непонятная ошибка работы WEB страницы при переходе с ESP8266 на ESP32.

Статус
В этой теме нельзя размещать новые ответы.

Сергей_Ф

Moderator
Команда форума
не поленился, скомпилировал два кода примера HelloServer для esp8266 и для esp32C3. Подставил ваши данные для хандлера /outp.В обоих случаях результат одинаков:
Снимок экрана в 2025-01-27 19-31-54.png
const char outp[] PROGMEM = R"EOF([{"type":"dir","name":"System Volume Information","size":"-"}
,{"type":"file","name":"config.json","size":"176"}
,{"type":"file","name":"index.htm","size":"19948"}
,{"type":"file","name":"bd.htm","size":"5808"}
,{"type":"file","name":"bminus.png","size":"2046"}
,{"type":"file","name":"bplus.png","size":"2152"}
,{"type":"file","name":"files.htm","size":"4888"}
,{"type":"file","name":"Chart.min.js","size":"172812"}
,{"type":"file","name":"charts.htm","size":"12337"}
,{"type":"file","name":"configuration.htm","size":"7440"}
,{"type":"file","name":"edit.htm","size":"9542"}
,{"type":"file","name":"extra_clean_paper.png","size":"15455"}
,{"type":"file","name":"mc.css","size":"5728"}
,{"type":"file","name":"settime.htm","size":"14063"}
,{"type":"file","name":"utils.js","size":"3318"}
,{"type":"file","name":"ace.js","size":"340569"}
,{"type":"file","name":"Chart.min.css","size":"521"}
,{"type":"file","name":"data_20230603.txt","size":"9595"}
,{"type":"file","name":"data_20250127.txt","size":"10406"}]
)EOF";

void handleOutp() {
server.setContentLength( CONTENT_LENGTH_UNKNOWN );
server.send (200, "text/json", "");
server.sendContent_P ( outp );
}

так что ищите ошибку в другом месте.
Надеюсь реальный вывод у вас идёт в одну строку, а не так как у меня. JSON не любит неожиданные переносы строки, да и обычно тип у него application/json
 

Сергей_Ф

Moderator
Команда форума
Хм. А вот заголовки у них разные
curl -i esp8266.local/outp
HTTP/1.1 200 OK
Content-Type: text/json
Accept-Ranges: none
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=2000

curl -i esp32.local/outp
HTTP/1.1 200 OK
Content-Type: text/json
Accept-Ranges: none
Transfer-Encoding: chunked
Connection: close
Попробуйте выставить заголовок как у esp8266. И ещё, раз уж вы всё равно формируете строку, почему бы не выставить реальное значение ContentLength?
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
Попробуйте заменить ваш printDirectory на такой
C++:
void printDirectory() {
  if( !HTTP.hasArg("dir") )
    return HTTP.send(500, "text/plain", "BAD ARGS");
 
  String path = HTTP.arg("dir");
  Serial.println(path);
  if( path != "/" && !SD.exists((char *)path.c_str()))
    return HTTP.send(500, "text/plain", "BAD PATH");
 
  File dir = SD.open((char *)path.c_str());
  path = String();
  if( !dir.isDirectory() ){
    dir.close();
    return HTTP.send(500, "text/plain", "NO DIR");
  }

  dir.rewindDirectory();
 
  HTTP.setContentLength(CONTENT_LENGTH_UNKNOWN);
  HTTP.send(200, "text/json", "");
  HTTP.sendContent("[");
  Serial.print("[");
  for (int cnt = 0; true; ++cnt) {
    File entry = dir.openNextFile();
    if ( !entry )
      break;

    String output;
    if (cnt > 0)
      output = ',';

    output += "{\"type\":\"";
    output += (entry.isDirectory()) ? "dir" : "file";
    output += "\",\"name\":\"";
    output += entry.name();
    output += "\",\"size\":\"";
    if (! entry.isDirectory())
      output += entry.size();
    else
      output += "-";

    output += "\"}";
    Serial.print(output);
    HTTP.sendContent(output);
    entry.close();
  }
  dir.close();
  Serial.println("]");
  HTTP.sendContent("]");
  HTTP.sendContent("");
}
 
А где это задается. ЧТо-то кроме
http.addHeader("Content-Type", "text/plain");

ничего не нашел на счет задания заголовка.
 

Сергей_Ф

Moderator
Команда форума
А где это задается. ЧТо-то кроме
http.addHeader("Content-Type", "text/plain");

ничего не нашел на счет задания заголовка.
таким образом можно задать любой заголовок, не только Content-Type. Но попробуйте сначала заменить printDirectory на мой вариант.
Я проверить не могу, поскольку ВЕСЬ код вы так и не выложили
 
Попробуйте заменить ваш printDirectory на такой
Заработало. Я сравнил с моей функцией, отличие только в том, что вы dir.close() сделали до отправки завершающей скобки и в конце отправили пустую строку. Неужели эта пустая строка помогла? А можете сказать что при этом изменилось? Типа какого-то завершения не было?
 

Сергей_Ф

Moderator
Команда форума
Заработало. Я сравнил с моей функцией, отличие только в том, что вы dir.close() сделали до отправки завершающей скобки и в конце отправили пустую строку. Неужели эта пустая строка помогла? А можете сказать что при этом изменилось? Типа какого-то завершения не было?
нет. Дело не в dir.close(). Смотрите внимательно, а лучше читайте документацию.
Библиотека для esp8266 некоторые ошибки пользователя прощала, для esp32 требуется корректно формировать весь контент и она не прощает "мелочей".
 
Последнее редактирование:
Я взял обе функции, положил их на две странички рядом и построчно прошелся по ним. Отличие только в конце.
У моей функции
Код:
 HTTP.sendContent("]");
dir.close();
У вашей
Код:
  dir.close();
  Serial.println("]");
  HTTP.sendContent("]");
  HTTP.sendContent("");
Т.е. если не брать, что вы dir.close() сделали перед отправкой скобки завершающей, то разница только в том, что вы пустую строку отправили в конце.
 

Сергей_Ф

Moderator
Команда форума
У вас в коде для esp8266 непонятным образом было смешано отправка контента в режиме chunked с отправкой целой строки. 8266 это простила и сформировала корректный ответ с указанием времени завершения через 2 секунды. Ваш код на js дожидался эти 2 секунды и потом парсил ответ.
Библиотека для 32 ответ сформировала корректный, но не дождалась завершения, поскольку его у вас не было. Я не только послал завершающую пустую строку, но и избавил вас от ненужного гигантского String outp, который вы зачем-то определили. Не нужно так делать! Режим chunked позволяет работать маленькими порциями и передавать данные любого размера, даже значительно превышающего размер памяти esp. А если вы сформировали целую строку для отправки, то и отправляйте её целиком с указанием реального размера.
Как говориться "вы либо трусы наденьте, либо крестик снимите".
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу