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

Как добавить обновление на вебсервер

selan61

Member
Здравствуйте. Есть простенький вебсервер. Код взял отсюда
1_5.png
Код:
[
/* Терморегулятор одиночный

*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------------------------------------
#define ONE_WIRE_BUS      0                    // pin DS18B20
#define HeaterPin         2                    // Heater pin 0-отключено, 1-включено
//------------------------------------------------------------------------
const char* ssid = "ХХХ";
const char* password = "ХХХ";
//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature t(&oneWire);
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
//------------------------------------------------------------------------
int temper;
int reg_t = 20;
int gis=1;
String ind;
bool OUT,UPDATE;
//------------------------------------------------------------------------
void setup(void){
  pinMode(HeaterPin, OUTPUT);                           // выход управления нагрузкой
  t.begin();
  t.setResolution(10);                                 // 10 бит

  delay(1000);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  while(WiFi.status() != WL_CONNECTED){delay(500); Serial.print(".");}
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/",       [](){web();});
  server.on("/obn",    [](){web();});
  server.on("/update", [](){web_upd();});
  server.on("/reg+",   [](){reg_t++;web();});
  server.on("/reg-",   [](){reg_t--;web();});
  server.on("/reg+10", [](){reg_t=reg_t+10;web();});
  server.on("/reg-10", [](){reg_t=reg_t-10;web();});


  server.begin();
  Serial.println("HTTP server started");
}
//------------------------------------------------------------------------
void loop(void){
    server.handleClient();
    t.requestTemperatures();
    temper = t.getTempCByIndex(0);
  if(reg_t<=0)  {reg_t=0;}
  if(reg_t>=125){reg_t=125;}
  if(reg_t >= temper + gis){digitalWrite(HeaterPin,HIGH);ind="ВКЛ"; OUT=true;}
  if(reg_t <= temper - gis){digitalWrite(HeaterPin,LOW); ind="ВЫКЛ";OUT=false;}
    yield();
}
//------------------------------------------------------------------------
void web(){
String webPage = "<!DOCTYPE HTML><html>";
       webPage += "<meta charset='utf-8'><meta name='viewport' content='width=540, user-scalable=no' />";
       webPage += "<style>table {background-color:#F5F5F5;border-radius: 5px;}</style>";
       webPage += "<TABLE align='center' width='520' BORDER='1' cellspacing='0' cellpadding='5'><tr><td colspan='3' bgcolor='#006400' align='center'>";
       webPage += "<font color='#FFFFFF'><h2>Терморегулятор 0...125 &#176;C</font></td></tr></h2>";
       webPage += "<meta http-equiv='Refresh' content='5; URL=/obn' />"; // автоматическое обновление страницы каждые 5 секунд
       webPage += "<tr><td>Температура</td><td align='center'><a href=\"obn\"><button>Обновить</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += temper;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td>Регулировка температуры</td><td align='center'><a href=\"reg+\"><button>+1&nbsp;&nbsp;</button>";
       webPage += "</a><a href=\"reg-\"><button>-1&nbsp;&nbsp;</button></a><br><a href=\"reg+10\"><button>+10</button></a>";
       webPage += "<a href=\"reg-10\"><button>-10</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += reg_t;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td colspan='2'>Нагрев</td>";
       if(OUT){webPage +="<td align='center' bgcolor='#50FF50'><big><b>";}
       else   {webPage +="<td align='center' bgcolor='#FF5050'><big><b>";}
       webPage += ind;
       webPage += "</b></big></td></tr></html>";
       webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"update\"><button>Обновить</button></a></td></tr></html>";
    
    server.send(200, "text/html", webPage);
     delay(300);
}
//-----------------------------------------------------
void web_upd(){
  if(!UPDATE){
    httpUpdater.setup(&server);
     Serial.print("WiFi.localIP:  ");
     Serial.println(WiFi.localIP());
     Serial.println("HTTP UpdateServer started");
      yield();
    UPDATE = true;}
}
//END---------------------------------------------------------------------
Но у меня такая проблема хочу добавить обновление прошивки через ESP8266HTTPUpdateServer. Но что то никак не получается.
Создаю дополнительно ESP8266HTTPUpdateServer httpUpdater; и флаг UPDATE;
Добавляю на страницу ESP8266 строку с кнопкой "обновить". Она вызывает событие
server.on("/update", [](){web_upd();});
Запускается
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server);
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Однако на сервер обновления не переходит. Подобная процедура у меня проверена и работает на обычных проектах без веб серверов. А тут на получается, к одному серверу надо как то подключить второй. Я не пойму, надо ли останавливать работающий сервер и запускать новый httpServer или можно как привязаться к работающему server.
Не могли бы Вы меня наставить на путь истинный? Автору писал, но он не смог помочь.
 

Сергей_Ф

Moderator
Команда форума
Здравствуйте. Есть простенький вебсервер. Код взял отсюда
Посмотреть вложение 11662
Код:
[
/* Терморегулятор одиночный

*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//------------------------------------------------------------------------
#define ONE_WIRE_BUS      0                    // pin DS18B20
#define HeaterPin         2                    // Heater pin 0-отключено, 1-включено
//------------------------------------------------------------------------
const char* ssid = "ХХХ";
const char* password = "ХХХ";
//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature t(&oneWire);
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
//------------------------------------------------------------------------
int temper;
int reg_t = 20;
int gis=1;
String ind;
bool OUT,UPDATE;
//------------------------------------------------------------------------
void setup(void){
  pinMode(HeaterPin, OUTPUT);                           // выход управления нагрузкой
  t.begin();
  t.setResolution(10);                                 // 10 бит

  delay(1000);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  while(WiFi.status() != WL_CONNECTED){delay(500); Serial.print(".");}
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/",       [](){web();});
  server.on("/obn",    [](){web();});
  server.on("/update", [](){web_upd();});
  server.on("/reg+",   [](){reg_t++;web();});
  server.on("/reg-",   [](){reg_t--;web();});
  server.on("/reg+10", [](){reg_t=reg_t+10;web();});
  server.on("/reg-10", [](){reg_t=reg_t-10;web();});


  server.begin();
  Serial.println("HTTP server started");
}
//------------------------------------------------------------------------
void loop(void){
    server.handleClient();
    t.requestTemperatures();
    temper = t.getTempCByIndex(0);
  if(reg_t<=0)  {reg_t=0;}
  if(reg_t>=125){reg_t=125;}
  if(reg_t >= temper + gis){digitalWrite(HeaterPin,HIGH);ind="ВКЛ"; OUT=true;}
  if(reg_t <= temper - gis){digitalWrite(HeaterPin,LOW); ind="ВЫКЛ";OUT=false;}
    yield();
}
//------------------------------------------------------------------------
void web(){
String webPage = "<!DOCTYPE HTML><html>";
       webPage += "<meta charset='utf-8'><meta name='viewport' content='width=540, user-scalable=no' />";
       webPage += "<style>table {background-color:#F5F5F5;border-radius: 5px;}</style>";
       webPage += "<TABLE align='center' width='520' BORDER='1' cellspacing='0' cellpadding='5'><tr><td colspan='3' bgcolor='#006400' align='center'>";
       webPage += "<font color='#FFFFFF'><h2>Терморегулятор 0...125 &#176;C</font></td></tr></h2>";
       webPage += "<meta http-equiv='Refresh' content='5; URL=/obn' />"; // автоматическое обновление страницы каждые 5 секунд
       webPage += "<tr><td>Температура</td><td align='center'><a href=\"obn\"><button>Обновить</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += temper;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td>Регулировка температуры</td><td align='center'><a href=\"reg+\"><button>+1&nbsp;&nbsp;</button>";
       webPage += "</a><a href=\"reg-\"><button>-1&nbsp;&nbsp;</button></a><br><a href=\"reg+10\"><button>+10</button></a>";
       webPage += "<a href=\"reg-10\"><button>-10</button></a></td><td bgcolor='#FFFFFF' align='center'><big><b>";
       webPage += reg_t;
       webPage += " &#176;C</b></big></td></tr>";
       webPage += "<tr><td colspan='2'>Нагрев</td>";
       if(OUT){webPage +="<td align='center' bgcolor='#50FF50'><big><b>";}
       else   {webPage +="<td align='center' bgcolor='#FF5050'><big><b>";}
       webPage += ind;
       webPage += "</b></big></td></tr></html>";
       webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"update\"><button>Обновить</button></a></td></tr></html>";
   
    server.send(200, "text/html", webPage);
     delay(300);
}
//-----------------------------------------------------
void web_upd(){
  if(!UPDATE){
    httpUpdater.setup(&server);
     Serial.print("WiFi.localIP:  ");
     Serial.println(WiFi.localIP());
     Serial.println("HTTP UpdateServer started");
      yield();
    UPDATE = true;}
}
//END---------------------------------------------------------------------
Но у меня такая проблема хочу добавить обновление прошивки через ESP8266HTTPUpdateServer. Но что то никак не получается.
Создаю дополнительно ESP8266HTTPUpdateServer httpUpdater; и флаг UPDATE;
Добавляю на страницу ESP8266 строку с кнопкой "обновить". Она вызывает событие
server.on("/update", [](){web_upd();});
Запускается
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server);
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Однако на сервер обновления не переходит. Подобная процедура у меня проверена и работает на обычных проектах без веб серверов. А тут на получается, к одному серверу надо как то подключить второй. Я не пойму, надо ли останавливать работающий сервер и запускать новый httpServer или можно как привязаться к работающему server.
Не могли бы Вы меня наставить на путь истинный? Автору писал, но он не смог помочь.
У вас обновление где лежит? Вот к тому серверу и надо подключиться клиентом и забрать его. А вы делаете сервер обновления на самом esp, как я понял. Разберитесь в двух примерах клиента и сервера ESP8266HTTPUpdateClient/ESP8266HTTPUpdateServer.
 

selan61

Member
Спасибо за ответ. Обновление у меня бин-файл, лежит на компе. Проблема именно в том, что уже работает один вебсервер, который выводит страничку. И к нему по клику надо подключить второй вебсервер, который бы вышел на стандартную страницу обновления
upd.png
Вроде добился, заработало. Но надо вручную вводить адрес/update. А как сделать, что бы автоматически переходило на эту ссылку?
 

Сергей_Ф

Moderator
Команда форума
Спасибо за ответ. Обновление у меня бин-файл, лежит на компе. Проблема именно в том, что уже работает один вебсервер, который выводит страничку. И к нему по клику надо подключить второй вебсервер, который бы вышел на стандартную страницу обновления
Посмотреть вложение 11663
Вроде добился, заработало. Но надо вручную вводить адрес/update. А как сделать, что бы автоматически переходило на эту ссылку?
Что значит автоматически переходило? Откуда?
Если у вас есть сервер, так добавьте к нему нужные обработчики с любыми адресами и/или кнопками.
 

selan61

Member
Извините, пока ждал ответа, переделал и заработало, но не до конца. Надо вручную вводить адрес/update.
Сделал так. Кнопка
Код:
webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"upd\"><button>Обновить</button></a></td></tr></html>";
Вызывает событие
Код:
server.on("/upd", [](){web_upd();});
Событие вызывает функцию
Код:
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server, "/update");
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Которая, однократно запускает сервер httpUpdater, и ставит флаг UPDATE = true. Но на странице ничего не выводится.
Теперь если вручную набрать адрес/update, выводится страница обновления прошивки. что и надо было сделать. С этим разобрался. Остался вопрос, что надо вставить в функцию web_upd(), что бы после запуска сервера httpUpdater, страница сама перенаправлялась на адрес/update?
 

Сергей_Ф

Moderator
Команда форума
Извините, пока ждал ответа, переделал и заработало, но не до конца. Надо вручную вводить адрес/update.
Сделал так. Кнопка
Код:
webPage += "<tr><td align='center'>Обновление прошивки</td><td align='center'colspan='2'><a href=\"upd\"><button>Обновить</button></a></td></tr></html>";
Вызывает событие
Код:
server.on("/upd", [](){web_upd();});
Событие вызывает функцию
Код:
void web_upd(){
if(!UPDATE){
httpUpdater.setup(&server, "/update");
Serial.print("WiFi.localIP: ");
Serial.println(WiFi.localIP());
Serial.println("HTTP UpdateServer started");
yield();
UPDATE = true;}
}
Которая, однократно запускает сервер httpUpdater, и ставит флаг UPDATE = true. Но на странице ничего не выводится.
Теперь если вручную набрать адрес/update, выводится страница обновления прошивки. что и надо было сделать. С этим разобрался. Остался вопрос, что надо вставить в функцию web_upd(), что бы после запуска сервера httpUpdater, страница сама перенаправлялась на адрес/update?
Мне кажется, вы не совсем понимаете что делает http update . Вам наверное нужен web update, а вовсе не то что вы пытаетесь использовать.

 
Последнее редактирование:

selan61

Member
Мне кажется, вы не совсем понимаете что делает http update . Вам наверное нужен web update, а вовсе не то что вы пытаетесь использовать.
Да, не понимаю в чем различие. Для меня это только название сервера. Но он делает, то что мне надо. Взял из примера
 

Сергей_Ф

Moderator
Команда форума
Да, не понимаю в чем различие. Для меня это только название сервера. Но он делает, то что мне надо. Взял из примера
Так у вас пример WebUpdate, а не HttpUpdate!! Блин!. Почти идентичные название библиотек Ардуино :( HTTPServerUpdate и httpUpdate.
Вы хотите по нажатию кнопки на главной странице перейти на страницу обновления? Ну так поставьте переход для неё, зачем вы поставили href=upd?
Вы и так можете перейти по адресу /update, без всяких UPDATE = true;

 

selan61

Member
Почти идентичные название библиотек
Ну в этом я не виноват, сам по началу запутался.
Ну так поставьте переход для неё, зачем вы поставили href=upd?
Вы и так можете перейти по адресу /update, без всяких UPDATE = true;
Увы, я так и думал, но не работает. А вот через /upd работает. UPDATE = true; обязательно, для однократного запуска сервера обновления.
Переход по адресу /update возможен только после запуска сервера обновления, поэтому и сделан такой двойной переход.
Вы мне может подскажете как сделать, что бы после запуска сервера обновления, заставить страницу перейти на адрес /update.
 

Сергей_Ф

Moderator
Команда форума
Которая, однократно запускает сервер httpUpdater.
Это не запуск сервера. Это регистрация обработчика события на сервере. Зачем его поместили в условный оператор, да ещё в другом обработчике?
Зарегистрируйте обработчик без условий в setup() и будет переходить по /update всегда!

Но на странице ничего не выводится.
И не должно. Обратитесь к нему по адресу /update и увидите страницу.
 

Сергей_Ф

Moderator
Команда форума
server.on("/update", [](){web_upd();});
Это регистрация обработчика web_upd на сервере server
httpUpdater.setup(&server);
и это регистрация обработчика httpUpdate на сервере server, в другой записи и с более сложным функционалом, который описан в библиотеки.

Естественно, что на один адрес /update два обработчика поставить нельзя! Нужно выбрать второй вариант.

Это всё надо выполнить один раз в setup().
Затем надо описать переход на страницу /update по нажатию кнопки "Обновить" на вашей заглавной странице. Всё.
 

selan61

Member
Код:
server.on("/update", [](){web_upd();});
Это регистрация обработчика web_upd на сервере server
Затем надо описать переход на страницу /update по нажатию кнопки "Обновить" на вашей заглавной странице. Всё.
Так я об этом и спрашиваю. Как описать переход на адрес /update.
Это всё надо выполнить один раз в setup().
Зачем мне в setup? Мне надо, что бы запускалось по кнопке. У меня уже всё работает. Не хватает автоперехода на адрес /update. Не понимаю как его описать.
 

Сергей_Ф

Moderator
Команда форума
Зачем мне в setup? Мне надо, что бы запускалось по кнопке.
Это не запуск!!! Это регистрация обработчика. Зачем вы остальные обработчики в setup описываете?

У меня уже всё работает.
Ну тогда в чём вопрос?

Не понимаю как его описать.
я вам дал все ссылки. Вы упорно их игнорируете и лепите несусветную чушь в коде. Уж извините.
А esp тупо исполняет то, что вы ей приказали.
 

selan61

Member
Вопрос изначально был, как заставить вебстраницу по кнопке переходить на адрес /update
 

Сергей_Ф

Moderator
Команда форума
вы всего на 5 лет старше меня.
заставить вебстраницу по кнопке переходить на адрес /update
Код:
<form action="update">
   <button>Обновить</button>
Но ваш href по идеи тоже должен работать, только обработчик должен быть уже определён. А у вас его нет.

всегда работает адрес /update . А я хотел бы, что бы он срабатывал по кнопке
какой в этом смысл?
 
Сверху Снизу