• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. А если вы сформировали целую строку для отправки, то и отправляйте её целиком с указанием реального размера.
Как говориться "вы либо трусы наденьте, либо крестик снимите".
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу