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

Решено Web сервер - ! нужна авторизация

kab

New member
@Alex1
Пробуем еще вариант
в первоначальном Вашем коде
вместо
t += (sensors.getTempCByIndex(0));

делаем

t += ( substring( sensors.getTempCByIndex(0),1,5));

Последнюю цифру 5 может быть понадобится подобрать "по месту"
 

Alex1

New member
@kab
t += ( substring( sensors.getTempCByIndex(0),1,5));
ошибка выходит
'substring' was not declared in this scope
 

kab

New member
@kab
t += ( substring( sensors.getTempCByIndex(0),1,5));
ошибка выходит
'substring' was not declared in this scope
Да, на память получается не очень эффективно
Похоже в начале скетча надо ввести что-то типа
#INCLUDE "String.h"
или
#INCLUDE "Strings.h"

но я не уверен. Надо смотреть примеры.

Скорее всего
#INCLUDE "String"
 
Последнее редактирование:

kab

New member
Да, на память получается не очень эффективно
Похоже в начале скетча надо ввести что-то типа
#INCLUDE "String.h"
или
#INCLUDE "Strings.h"

но я не уверен. Надо смотреть примеры.

Скорее всего
#INCLUDE "String"
А может и так
t += ( Substring( sensors.getTempCByIndex(0),1,5));
или
t += ( SubString( sensors.getTempCByIndex(0),1,5));

без #INCLUDE
 

Alex1

New member
способ вывести целое с нужным количеством ведущих нулей.
Для чисел с плавающей точкой в форматах «e», «E» и «f» этот элемент означает число знаков после десятичной точки. Результат округляется.
printf("f = %.2f", 12.3456);
f = 12.35
Нашёл кусок пояснения тулил и так и так, конечно без результата
 

kab

New member
способ вывести целое с нужным количеством ведущих нулей.
Для чисел с плавающей точкой в форматах «e», «E» и «f» этот элемент означает число знаков после десятичной точки. Результат округляется.
printf("f = %.2f", 12.3456);
f = 12.35
Нашёл кусок пояснения тулил и так и так, конечно без результата
Тут некоторая проблема в том, что неизвестно, какого типа данные возвращает sensors.getTempCByIndex(0).

Если это число с дробной частью, то процедура
sprintf(str, "%5.1f",sensors.getTempCByIndex(0));
должна была сработать.

А если sensors.getTempCByIndex(0) возвращает строку (что кажется мне более вероятным), то лишний разряд проше всего отрезать substring`ом.

substring можно использовать и в первом варианте, но выражение будет чуть сложнее.

Почему на substring ругается при компиляции - посмотрю на домашнем компьютере, когда доберусь до него.
 

Alex1

New member
@kab Из примеров авторизация , не пойму почему так всего много если работает на двух строчках. Ну ладно, форма ввода покрасивее необычная....
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char* ssid = "***********";
const char* password = "*************";

ESP8266WebServer server(80);

//Check if header is present and correct
bool is_authentified(){
  Serial.println("Enter is_authentified");
  if (server.hasHeader("Cookie")){  
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
    if (cookie.indexOf("ESPSESSIONID=1") != -1) {
      Serial.println("Authentification Successful");
      return true;
    }
  }
  Serial.println("Authentification Failed");
  return false;   
}

//login page, also called for disconnect
void handleLogin(){
  String msg;
  if (server.hasHeader("Cookie")){  
    Serial.print("Found cookie: ");
    String cookie = server.header("Cookie");
    Serial.println(cookie);
  }
  if (server.hasArg("DISCONNECT")){
    Serial.println("Disconnection");
    String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
    if (server.arg("USERNAME") == "admin" &&  server.arg("PASSWORD") == "admin" ){
      String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
      server.sendContent(header);
      Serial.println("Log in Successful");
      return;
    }
  msg = "Wrong username/password! try again.";
  Serial.println("Log in Failed");
  }
  String content = "<html><body><form action='/login' method='POST'>To log in, please use : admin/admin<br>";
  content += "User:<input type='text' name='USERNAME' placeholder='user name'><br>";
  content += "Password:<input type='password' name='PASSWORD' placeholder='password'><br>";
  content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
  content += "You also can go <a href='/inline'>here</a></body></html>";
  server.send(200, "text/html", content);
}

//root page can be accessed only if authentification is ok
void handleRoot(){
  Serial.println("Enter handleRoot");
  String header;
  if (!is_authentified()){
    String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
    server.sendContent(header);
    return;
  }
  String content = "<html><body><H2>hello, you successfully connected to esp8266!</H2><br>";
  if (server.hasHeader("User-Agent")){
    content += "the user agent used is : " + server.header("User-Agent") + "<br><br>";
  }
  content += "You can access this page until you <a href=\"/login?DISCONNECT=YES\">disconnect</a></body></html>";
  server.send(200, "text/html", content);
}

//no need authentification
void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void){
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  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("/", handleRoot);
  server.on("/login", handleLogin);
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works without need of authentification");
  });

  server.onNotFound(handleNotFound);
  //here the list of headers to be recorded
  const char * headerkeys[] = {"User-Agent","Cookie"} ;
  size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
  //ask server to track these headers
  server.collectHeaders(headerkeys, headerkeyssize );
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}
А теперь всё таки главный вопрос , как продолжить что бы был переход на основную программу и переход на главную страницу ??

На 2х строчках у меня получилось, но вот на старом телефоне на симбе из за этого думаю просто теперь не открывается
 

kab

New member
@Alex1
подробнее опишите, как ошибка видится на телефоне (я на своем проверял - было нормально)
 

Alex1

New member
@Alex1
подробнее опишите, как ошибка видится на телефоне (я на своем проверял - было нормально)
Обратите внимание он не на андроиде а на симбиане, Я им не пользуюсь просто попробовал, белый фон и всё и часики. На остальном работает, вот для совместимости скорее вариант что выше , я так думаю
 

kab

New member
@Alex1
как продолжить что бы был переход на основную программу и переход на главную страницу ??
Хорошо, попробуй этот вариант:
-для примера объединяем основу (из поста №47) и код управления реле (из поста №1)- далее "функционал":
1. в основе убери (закомментируй) строчку, начинающуюся с "server.on("/","
2. соответствующую строчку (строчки - признак окончания - ";") из функционала перенеси на место удаленной
3. рядом добавь остальное начинающее с "server.on" c функционала. Каждую команду - до ";"

продолжение в следующем посте
 

kab

New member
@Alex1
ПРОДОЛЖЕНИЕ
1. из функционала в основу добавь все строчки, начинающиеся с

String webPage()

и до конца
2. Из функционала в основу перенести строку 20
3. попробуй скомпилировать и запустить
4. Попробовать войти, добавив к IP-адресу "/login" -без кавычек
- сообщи, что получилось (Это еще промежуточный этап)
 
Последнее редактирование:

kab

New member
@Alex1

Возвращаясь к температуре - пробуем:
Код:
String t = ("<p style=\"text-align: center; font-family:Courier New; color:#05FFD6; font-size: 13px; margin-top: -10px;  padding: 1px 1px; background-color:#BF4A05; \"\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n Temp: &shy;");
String str=sensors.getTempCByIndex(0);     //added by  kab
//t += (sensors.getTempCByIndex(0));    //comment by kab
t += (str.substring(0,4));     //added by kab может и не 4 - надо подобрать
t +=  "  C`";
htmlRes += (t);
 

Alex1

New member
@Alex1

Хорошо, попробуй этот вариант:
-для примера объединяем основу (из поста №47) и код управления реле (из поста №1)- далее "функционал":
1. в основе убери (закомментируй) строчку, начинающуюся с "server.on("/","
2. соответствующую строчку (строчки - признак окончания - ";") из функционала перенеси на место удаленной
3. рядом добавь остальное начинающее с "server.on" c функционала. Каждую команду - до ";"

продолжение в следующем посте
Без server.on - просто вечная загрузка получается
 

Alex1

New member
@kab
Это не работает, вчера пол вечера в поиске провел, оказывается с этим датчиком не всё так просто, там надо не целые числа, а биты округлять, не зря прямого ответа в сети нет, только поправочный код на 20 строк, Я думаю он этого не стоит, а вот напряжение 3200мв, Я всё таки для красоты в 3.2в привел, особенно если учесть дикую погрешность внутреннего цапа, что б тысячные измерять. Был бы признателен, если победите правильную авторизацию, поделитесь как она работает из поста выше. На этой слишком большая не совместимось, ибо зачем тогда писать трёх этажные библиотеки, если всё так просто
 

kab

New member
@Alex1
По поводу авторизации:
-!!! А где я написал, что в таком виде надо компилировать????!!!!!
Просмотри внимательно два моих сообщения на эту тему, и затем внимательно выполни!
Иначе у нас с тобой ничего не получится
 

kab

New member
@kab
Это не работает, вчера пол вечера в поиске провел, оказывается с этим датчиком не всё так просто, там надо не целые числа, а биты округлять, не зря прямого ответа в сети нет, только поправочный код на 20 строк, Я думаю он этого не стоит, а вот напряжение 3200мв,
После строчки String str=sensors.getTempCByIndex(0); -это уже строка!!! И отрезать лишние позиции - не проблема...

Всё-таки попробуй код из поста №52 Просто интересно...
 

Alex1

New member
@kab ругается на String str
Вот проще вариант, ни на что не ругается но и ничего не делает
printf("f = %.2f", 12.3456);
f = 12.35
 

kab

New member
@Alex1
где-то в районе 20-00 мск будешь за компом? Можно пообщаться по Skype или Viber
 
Сверху Снизу