• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266WebServer

CLDIKE

New member
Я конечно с терминами не особо знаком, но постараюсь донести суть вопроса
Я создал веб сервер, занёс во флеш память с помощью SPIFFS html файл, и когда нужно отправляю его с помощью функции streamFile()
В аргументы передаю содержимое файла и "text/html"
И всё в принципе то работает, но когда я попытался в ответ на другой http запрос(в том же коде, то есть на том же сервере) отправить другой html файл, таким же образом(чисто ради эксперемента), у меня продолжала отображаться та страничка, которая была в первом html файле
Не знаю нормально ли я объяснил, но было бы не плохо, если бы кто-нибудь объяснил, как работает эта функция streamFile() и как её использовать(ну или что я делаю не так)
Я вот вроде искал, но нормальную документацию по этой библиотеке в целом, найти не смог
 

CodeNameHawk

Moderator
Команда форума
Я вот вроде искал, но нормальную документацию по этой библиотеке в целом, найти не смог
Начните с примеров а ардуиноиде.
Конечно очень сложно найти то, что другие не прячут.
https://arduino-esp8266.readthedocs.io/en/latest/index.html
https://github.com/esp8266/Arduino/...s/WiFiManualWebServer/WiFiManualWebServer.ino
https://www.google.ru/search?newwin...AEAoAECoAEBqgEHZ3dzLXdperABCg&sclient=gws-wiz
 

CLDIKE

New member
Я посмотрел код по ссылке
Мне кажется WiFi server и WebServer это не одно и тоже, мне нужен был именно WebServer
Ну видимо нужно всё по примерам из библиотеки изучать
В любом случае спасибо за помощь
 

tretyakov_sa

Moderator
Команда форума
Не знаю нормально ли я объяснил, но было бы не плохо, если бы кто-нибудь объяснил, как работает эта функция streamFile() и как её использовать(ну или что я делаю не так)
Я вот вроде искал, но нормальную документацию по этой библиотеке в целом, найти не смог
Так ваш код где? А так только гадать.
 

CLDIKE

New member
C++:
#include <ESP8266FtpServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>

byte relay = LED_BUILTIN;
String ssid = "MyESP";
bool stat = false;

ESP8266WebServer HTTP(80);

FtpServer ftpSrv;

void setup() {

  pinMode(relay,OUTPUT);
  Serial.begin(115200);
  WiFi.softAP(ssid);
  SPIFFS.begin();
  HTTP.begin();
  ftpSrv.begin("relay","relay");
  Serial.print("\nMy IP to connect via Web-Browser or FTP: ");
  Serial.println(WiFi.softAPIP());
  Serial.println("\n");

  //HTTP запросов
  HTTP.on("/relay_switch", [](){
    HTTP.send(200,"text/plain",relay_switch());
  });

  HTTP.on("/relay_status", [](){
    HTTP.send(200,"text/plain",relay_status());
    File in = SPIFFS.open("/in.html","r");
    size_t sen = HTTP.streamFile(in,"text/html");
    in.close();
  });//Я хотел чтоб он и тут таким же образом отправил страницу, только из файла in.html, но после этого запроса ничего не происходит, я посмотрел в консоли в хроме, там запрос нормально проходит

  HTTP.on("/",[](){
    File file = SPIFFS.open("/index.html","r");
    size_t sent = HTTP.streamFile(file,"text/html");
    file.close();
    });//Вот этот запрос он нормально обрабатывает и выводит страницу которая написана в файле index.html

  HTTP.onNotFound([](){
   if(!handleFileRead(HTTP.uri())){
      HTTP.send(404,"text/plain","Not Found");
    }
  });
}



void loop() {
HTTP.handleClient();
ftpSrv.handleFTP();
}

bool handleFileRead(String path){
  if(path.endsWith("/")){ path += "index.html";}
  String contentType = getContentType(path);
  if(SPIFFS.exists(path)){
    File file = SPIFFS.open(path,"r");
    size_t sent = HTTP.streamFile(file,contentType);
    file.close();
   Serial.println(HTTP.uri());
    return true;
  }
  else{return false;}
}

String getContentType(String filename){
  if(filename.endsWith(".html")){return "text/html";}
  else if(filename.endsWith(".css")){return "text/css";}
  else if(filename.endsWith(".js")){return "application/javascript";}
  else if(filename.endsWith(".png")){return "image/png";}
  else if(filename.endsWith(".jpg")){return "image/jpeg";}
  else if(filename.endsWith(".gif")){return "image/gif";}
  else if(filename.endsWith(".ico")){return "image/x-icon";}
  else{return "text/plain";}
}

String relay_switch(){
  if (stat){
    stat = false;
    }
  else{stat = true;}
  digitalWrite(relay,stat);
  return String(stat);
}

String relay_status(){return String(stat);}
 
Последнее редактирование модератором:

CLDIKE

New member
Только так получилось

Я сейчас попробовал в ручную написать нужный запрос в адресной строке, и судя по всему сервер всё таки отправил мне нужную страничку
Так что видимо я уже где-то в java скрипте там накосячил
Но в принципе можете посмотреть мой код, мало ли там что-нибудь неприятное есть
 

tretyakov_sa

Moderator
Команда форума
Но в принципе можете посмотреть мой код, мало ли там что-нибудь неприятное есть
HTTP.on("/relay_status", [](){
HTTP.send(200,"text/plain",relay_status());
File in = SPIFFS.open("/in.html","r");
size_t sen = HTTP.streamFile(in,"text/html");
in.close();
});
HTTP.send(200,"text/plain",relay_status());
В ответ на запрос /relay_status ты сразу отправляешь ответ HTTP.send(200,"text/plain",relay_status());
Это приводит к тому что size_t sen = HTTP.streamFile(in,"text/html"); уже отправлять некуда соединение закрыто, браузер дождался ответа.
За комментируй эту строку.
 

CLDIKE

New member
HTTP.send(200,"text/plain",relay_status());
В ответ на запрос /relay_status ты сразу отправляешь ответ HTTP.send(200,"text/plain",relay_status());
Это приводит к тому что size_t sen = HTTP.streamFile(in,"text/html"); уже отправлять некуда соединение закрыто, браузер дождался ответа.
За комментируй эту строку.
Ну я закоментировал, но картина та же, запрос вроде как работаетСнимок экрана (10).png
 

CLDIKE

New member
Нажимаю на кнопку, запрос отправляется, но страница не меняется
Опять же, если вручную написать этот запрос в адресной строке, то страница меняется на нужную
 
Сверху Снизу