GyverLibs / GyverPortal

Простой конструктор веб интерфейса для esp8266 и ESP32
MIT License
311 stars 25 forks source link

Почему может не работать DNS сервер? #75

Closed kbln closed 1 year ago

kbln commented 1 year ago

Версия библиотеки 3.6.3 МК esp8266 Версия SDK 3.1.1 Версия Arduino IDE 1.8.19

При прошивке вашего проекта wifiLogin в режиме WIFI_AP редирект не срабатывает, хотя по идее должен. При этом, стандартные примеры DNS сервера работают, а через Портал почему-то нет( В чем может быть проблема? У вас редирект работает?

GyverLibs commented 1 year ago

Какой редирект? Dns позволяет найти плату по имени.local, редиректа не должно быть

kbln commented 1 year ago

Сорри, может непонятно выразился, ты говоришь про MDNS (он работает), а я про DNSServer, который должен перенаправлять нас на айпишник esp при подключении, но почему-то не перенаправляет

GyverLibs commented 1 year ago

Хм. А его как то отдельно включать можно?

kbln commented 1 year ago

Нашел в чем причина, но как ее решить пока не понял. Если убрать поддержку скачивания файлов с сервера, то DNSServer начинает работать

define GP_NO_DOWNLOAD

AlexGyver commented 1 year ago

Ого, вот это интересно, спасибо.... надо чинить

AlexGyver commented 1 year ago

а у меня работает нормально...

AlexGyver commented 1 year ago

поддержка скачивания не должна влиять. Если скачивание не настроено, файл запрошен но юзер его не отправил - сервер ответит 200, точно так же как если отключить поддержку скачивания

kbln commented 1 year ago

Мне тоже это кажется странным, но перепроверил еще раз, без этого дефайна у меня редирект не работает

#define GP_NO_DOWNLOAD      // без этого не работает DNSServer

#include <GyverPortal.h>
GyverPortal ui;

void build() {
  GP.BUILD_BEGIN(GP_DARK);
  GP.TITLE("Hello!");
  GP.BUILD_END();
}

void setup() {
  WiFi.mode(WIFI_AP);
  WiFi.softAP("WiFi Config");

  ui.attachBuild(build);
  ui.start();
}

void loop() {
  ui.tick();
}
AlexGyver commented 1 year ago

дефайн закрывает всего два места в коде, можно определить какое. В portal.h попробуй закомментировать по очереди их, сам дефайн в скетче соответственно не нужен

один

    #ifdef GP_NO_DOWNLOAD
} else if (_uri.startsWith(F("/favicon.ico"))) {    // иконка
    server.send(200);
    return;
    #endif

два

    #if defined(FS_H) && !defined(GP_NO_DOWNLOAD)
} else if (downOn && !server.args() && _uri[0] == '/' && _uri.indexOf('.') > 0) {   // файл
    if (_autoD && _fs) sendFile(_fs->open(_uri, "r"));  // авто скачивание
    else _fileDF = 1;                                   // ручное скачивание (в action)
    #endif
AlexGyver commented 1 year ago

также сразу после server.onNotFound([this]() { можно добавить вывод в порт, посмотреть что телефон запрашивает у сервера, это тоже в portal.h

server.onNotFound([this]() {
  Serial.print(server.uri());
  if (server.args()) {
      Serial.print('?');
      for (int i = 0; i < server.args(); i++) {
          Serial.print(server.argName(i));
          Serial.print('=');
          Serial.print(server.arg(i));
          if (i < server.args() - 1) Serial.print('&');
      }
  }
  Serial.println();
kbln commented 1 year ago

проблема где-то тут

    #if defined(FS_H) && !defined(GP_NO_DOWNLOAD)
} else if (downOn && !server.args() && _uri[0] == '/' && _uri.indexOf('.') > 0) {   // файл
    if (_autoD && _fs) sendFile(_fs->open(_uri, "r"));  // авто скачивание
    else _fileDF = 1;                                   // ручное скачивание (в action)
    #endif
AlexGyver commented 1 year ago

нужно отладочный кусок вставить, посмотреть что запрашивает клиент

AlexGyver commented 1 year ago

я бы сам поковырялся, но у меня работает) не могу повторить баг

kbln commented 1 year ago

Это выдало без дефайна /hotspot-detect.html Это с дефайном:

/hotspot-detect.html
/hotspot-detect.html
/hotspot-detect.html
/GP_STYLE.css?v3.6.3=44089
/GP_SCRIPT.js?v3.6.3=0
/GP_time?unix=1679052377&gmt=360
/hotspot-detect.html
AlexGyver commented 1 year ago

вот это интересно, мой андроид не запрашивает такого. Ну тогда понятно что происходит - смарт запрашивает страницу hotspot-detect.html, портал показывает ему дулю 200, а при отключенном DOWNLOAD портал отправляет страницу

AlexGyver commented 1 year ago

добавить код

} else if (_uri.startsWith(F("/hotspot-detect.html"))) {
    _showPage = 1;

например вот сюда image

AlexGyver commented 1 year ago

если заведётся, добавлю в обновление тогда

kbln commented 1 year ago

Сработало!

AlexGyver commented 1 year ago

отлично, тогда эту заплатку добавлю себе)