• Система автоматизации с открытым исходным кодом на базе 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
Нажимаю на кнопку, запрос отправляется, но страница не меняется
Опять же, если вручную написать этот запрос в адресной строке, то страница меняется на нужную
 
Сверху Снизу