Skip to content

Commit

Permalink
captive portal works, correct wifi_phy_mode
Browse files Browse the repository at this point in the history
  • Loading branch information
dontsovcmc committed Nov 13, 2023
1 parent 96ea78f commit 726ac44
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 122 deletions.
36 changes: 18 additions & 18 deletions ESP8266/data/static/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,25 +87,25 @@ function formError(html){
_fe.innerHTML = html;
_fe.classList.remove('hd');
}
function connectStatus(sc){
if (sc == 0) {
formError("Повторите настройку сначала");
} else if (sc == 1) {
formError("Роутер недоступен");
} else if (sc == 2) {
formError("Сканирование сетей завершено");
} else if (sc == 3) {
formError("Подключено");
} else if (sc == 4) {
formError("Ошибка подключения. Попробуйте ещё раз.<br>Если не помогло, то пропишите статический ip. Еще можно зарезервировать MAC адрес Ватериуса в роутере. Если ничего не помогло, пришлите нам <a class='link' href='http://192.168.4.1/ssid.txt'>файл</a> параметров wi-fi сетей.");
} else if (sc == 5) {
formError("Подключение разорвано");
} else if (sc == 6) {
formError("Некорректный пароль");
} else if (sc == 7) {
formError("Отключен от точки доступа");
}

function connectStatus(c) {
const t = {
0: 'Повторите настройку сначала',
1: 'Роутер недоступен',
2: 'Сканирование сетей завершено',
3: 'Подключено',
4: "Ошибка подключения. Попробуйте ещё раз.<br>Если не помогло, то пропишите статический ip. Еще можно зарезервировать MAC адрес Ватериуса в роутере. Если ничего не помогло, пришлите нам <a class='link' href='http://192.168.4.1/ssid.txt'>файл</a> параметров wi-fi сетей.",
5: 'Подключение разорвано',
6: 'Некорректный пароль',
7: 'Отключен от точки доступа',
};
if (t.hasOwnProperty(c)) {
formError(t[c]);
} else if (c > 0) {
formError('Неизвестная ошибка ' + c);
}
}

function getWifiList(_pages){
_init(_pages);

Expand Down
1 change: 1 addition & 0 deletions ESP8266/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ void setup()
{
LOG_BEGIN(115200); // Включаем логгирование на пине TX, 115200 8N1
LOG_INFO(F("Booted"));
LOG_INFO(F("Build: ") << __DATE__ << F(" ") << __TIME__);

static_assert((sizeof(Settings) == 960), "sizeof Settings != 960");

Expand Down
190 changes: 94 additions & 96 deletions ESP8266/src/portal/active_point.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ String template_bool(const uint8_t value)
}

/*
* Т.к. https://github.com/me-no-dev/ESPAsyncWebServer/issues/1249
*/
* Т.к. https://github.com/me-no-dev/ESPAsyncWebServer/issues/1249
*/
String replace_value(const String &var)
{
String out(var);
Expand All @@ -53,66 +53,65 @@ String get_counter_title(const uint8_t name)
{
switch (name)
{
case CounterName::WATER_COLD:
return F("Холодная вода");
case CounterName::WATER_HOT:
return F("Горячая вода");
case CounterName::ELECTRO:
return F("Электричество");
case CounterName::GAS:
return F("Газ");
case CounterName::HEAT:
return F("Тепло");
case CounterName::PORTABLE_WATER:
return F("Питьевая вода");
case CounterName::OTHER:
default:
return F("Другой");
case CounterName::WATER_COLD:
return F("Холодная вода");
case CounterName::WATER_HOT:
return F("Горячая вода");
case CounterName::ELECTRO:
return F("Электричество");
case CounterName::GAS:
return F("Газ");
case CounterName::HEAT:
return F("Тепло");
case CounterName::PORTABLE_WATER:
return F("Питьевая вода");
case CounterName::OTHER:
default:
return F("Другой");
}
}

String get_counter_img(const uint8_t name)
{
switch (name)
{
case CounterName::WATER_COLD:
return F("meter-cold.png");
case CounterName::WATER_HOT:
return F("meter-hot.png");
case CounterName::ELECTRO:
return F("");
case CounterName::GAS:
return F("");
case CounterName::HEAT:
return F("");
case CounterName::PORTABLE_WATER:
return F("");
case CounterName::OTHER:
default:
return F("");
}
case CounterName::WATER_COLD:
return F("meter-cold.png");
case CounterName::WATER_HOT:
return F("meter-hot.png");
case CounterName::ELECTRO:
return F("");
case CounterName::GAS:
return F("");
case CounterName::HEAT:
return F("");
case CounterName::PORTABLE_WATER:
return F("");
case CounterName::OTHER:
default:
return F("");
}
}


String get_counter_instruction(const uint8_t name)
{
switch (name)
{
case CounterName::WATER_COLD:
return F("Спускайте воду в унитазе пока устройство не перенесёт вас на следующую страницу");
case CounterName::WATER_HOT:
return F("Откройте кран горячей воды пока устройство не перенесёт вас на следующую страницу");
case CounterName::ELECTRO:
return F("Включите электроприбор. После моргания светодиода должна открыться следующая страница. Если не открывается, значит некорректное подключение или счётчик не поддерживается.");
case CounterName::GAS:
return F("Приход импульса от газового счётчика долго ожидать, нажмите Пропустить и продолжите настройку.");
case CounterName::HEAT:
return F("Приход импульса от счётчика тепла долго ожидать, нажмите Пропустить и продолжите настройку.");
case CounterName::PORTABLE_WATER:
return F("Откройте кран питьевой воды пока устройство не перенесёт вас на следующую страницу");
case CounterName::OTHER:
default:
return F("При приходе импульса от счётчика устройство перенесёт вас на следующую страницу");
case CounterName::WATER_COLD:
return F("Спускайте воду в унитазе пока устройство не перенесёт вас на следующую страницу");
case CounterName::WATER_HOT:
return F("Откройте кран горячей воды пока устройство не перенесёт вас на следующую страницу");
case CounterName::ELECTRO:
return F("Включите электроприбор. После моргания светодиода должна открыться следующая страница. Если не открывается, значит некорректное подключение или счётчик не поддерживается.");
case CounterName::GAS:
return F("Приход импульса от газового счётчика долго ожидать, нажмите Пропустить и продолжите настройку.");
case CounterName::HEAT:
return F("Приход импульса от счётчика тепла долго ожидать, нажмите Пропустить и продолжите настройку.");
case CounterName::PORTABLE_WATER:
return F("Откройте кран питьевой воды пока устройство не перенесёт вас на следующую страницу");
case CounterName::OTHER:
default:
return F("При приходе импульса от счётчика устройство перенесёт вас на следующую страницу");
}
}

Expand Down Expand Up @@ -204,7 +203,7 @@ String processor(const String &var)
return get_counter_instruction(sett.counter0_name);
if (var == FPSTR(PARAM_COUNTER1_INSTRUCTION))
return get_counter_instruction(sett.counter1_name);

if (var == FPSTR(PARAM_COUNTER0_TYPE))
return String(runtime_data.counter_type0);
if (var == FPSTR(PARAM_COUNTER1_TYPE))
Expand All @@ -227,7 +226,7 @@ String processor(const String &var)
if (var == FPSTR(PARAM_DHCP_OFF))
return template_bool(sett.dhcp_off);

//
//
if (var == FPSTR(PARAM_BUILD_DATE_TIME))
return String(__DATE__) + String(" ") + String(__TIME__);

Expand All @@ -236,28 +235,28 @@ String processor(const String &var)

void onNotFound(AsyncWebServerRequest *request)
{
LOG_INFO(F("onNotFound ") << request->url());
LOG_INFO(F("onNotFound ") << request->host() << request->url());
request->send(404);
};

void onRedirectIP(AsyncWebServerRequest *request)
{
LOG_INFO(request->url());
LOG_INFO(F("redirect ") << request->host() << request->url());
request->redirect(localIPURL);
}

void onRoot(AsyncWebServerRequest *request)
{
LOG_INFO(F("onRoot GET ") << request->url());

if (sett.factor1 == AUTO_IMPULSE_FACTOR)
{
{
// Первая настройка
request->send(LittleFS, "/start.html", F("text/html"), false, processor);
request->send(LittleFS, "/start.html", F("text/html"), false);
}
else
{
request->send(LittleFS, "/index.html", F("text/html"), false, processor);
request->send(LittleFS, "/index.html", F("text/html"), false);
}
}

Expand Down Expand Up @@ -296,8 +295,7 @@ void start_active_point(Settings &sett, const SlaveData &data, CalculatedData &c

wifi_set_mode(WIFI_AP_STA);


WiFi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));
// WiFi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));

// TODO выбирать channel исходя из настроек.
// Канал WiFi роутера к кому подсоединимся должен совпадать с каналом точки доступа ESP
Expand All @@ -316,7 +314,7 @@ void start_active_point(Settings &sett, const SlaveData &data, CalculatedData &c

LOG_INFO(F("Start DNS server"));
DNSServer *dns = new DNSServer();
//dns->setTTL(3600); //https://github.com/CDFER/Captive-Portal-ESP32/blob/main/src/main.cpp#L50C11-L50C25
// dns->setTTL(3600); //https://github.com/CDFER/Captive-Portal-ESP32/blob/main/src/main.cpp#L50C11-L50C25
dns->start(53, "*", WiFi.softAPIP());

LOG_INFO(F("DNS server started"));
Expand All @@ -329,32 +327,32 @@ void start_active_point(Settings &sett, const SlaveData &data, CalculatedData &c
// Главная страница
server->on("/", HTTP_GET, onRoot); //.setFilter(ON_AP_FILTER);

//CaptivePortal
//https://github.com/CDFER/Captive-Portal-ESP32/blob/main/src/main.cpp#L50C11-L50C25
// CaptivePortal
// https://github.com/CDFER/Captive-Portal-ESP32/blob/main/src/main.cpp#L50C11-L50C25

//======================== Webserver ========================
// WARNING IOS (and maybe macos) WILL NOT POP UP IF IT CONTAINS THE WORD "Success" https://www.esp8266.com/viewtopic.php?f=34&t=4398
// SAFARI (IOS) IS STUPID, G-ZIPPED FILES CAN'T END IN .GZ https://github.com/homieiot/homie-esp8266/issues/476 this is fixed by the webserver serve static function.
// SAFARI (IOS) there is a 128KB limit to the size of the HTML. The HTML can reference external resources/images that bring the total over 128KB
// SAFARI (IOS) popup browser has some severe limitations (javascript disabled, cookies disabled)

// Required
server->on("/connecttest.txt", [](AsyncWebServerRequest *request) {
LOG_INFO(request->url());
request->redirect("http://logout.net"); }); // windows 11 captive portal workaround
server->on("/wpad.dat", onNotFound); // Honestly don't understand what this is but a 404 stops win 10 keep calling this repeatedly and panicking the esp32 :)

// Background responses: Probably not all are Required, but some are. Others might speed things up?
// A Tier (commonly used by modern systems)
server->on("/generate_204", onRedirectIP); // android captive portal redirect
server->on("/redirect", onRedirectIP); // microsoft redirect
server->on("/hotspot-detect.html", onRedirectIP); // apple call home
server->on("/canonical.html", onRedirectIP); // firefox captive portal call home
server->on("/success.txt", onRedirectIP); // firefox captive portal call home
server->on("/ncsi.txt", onRedirectIP); // windows call home

server->on("/fwlink", HTTP_GET, onRoot); // Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.

// WARNING IOS (and maybe macos) WILL NOT POP UP IF IT CONTAINS THE WORD "Success" https://www.esp8266.com/viewtopic.php?f=34&t=4398
// SAFARI (IOS) IS STUPID, G-ZIPPED FILES CAN'T END IN .GZ https://github.com/homieiot/homie-esp8266/issues/476 this is fixed by the webserver serve static function.
// SAFARI (IOS) there is a 128KB limit to the size of the HTML. The HTML can reference external resources/images that bring the total over 128KB
// SAFARI (IOS) popup browser has some severe limitations (javascript disabled, cookies disabled)

// Required
server->on("/connecttest.txt", [](AsyncWebServerRequest *request)
{
LOG_INFO(request->url());
request->redirect("http://logout.net");
}); // windows 11 captive portal workaround
server->on("/wpad.dat", onNotFound); // Honestly don't understand what this is but a 404 stops win 10 keep calling this repeatedly and panicking the esp32 :)

// Background responses: Probably not all are Required, but some are. Others might speed things up?
// A Tier (commonly used by modern systems)
server->on("/generate_204", onRedirectIP); // android captive portal redirect
server->on("/redirect", onRedirectIP); // microsoft redirect
server->on("/hotspot-detect.html", onRedirectIP); // apple call home
server->on("/canonical.html", onRedirectIP); // firefox captive portal call home
server->on("/success.txt", onRedirectIP); // firefox captive portal call home
server->on("/ncsi.txt", onRedirectIP); // windows call home
server->on("/fwlink", HTTP_GET, onRoot); // Microsoft captive portal.

// TODO добавить .setLastModified( и https://github.com/GyverLibs/buildTime/releases/tag/1.0
server->serveStatic("/images/", LittleFS, "/images/").setCacheControl("max-age=600");
Expand Down Expand Up @@ -406,7 +404,7 @@ void start_active_point(Settings &sett, const SlaveData &data, CalculatedData &c
server->on("/setup_red.html", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/setup_red.html", F("text/html"), false, processor); });

// Отправка показаний
// Отправка показаний
server->on("/setup_send.html", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/setup_send.html", F("text/html"), false, processor); });

Expand All @@ -433,23 +431,23 @@ void start_active_point(Settings &sett, const SlaveData &data, CalculatedData &c
server->on("/wifi_settings.html", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/wifi_settings.html", F("text/html"), false, processor); });

// Файл характеристик всех найденных Wi-Fi сетей
// Файл характеристик всех найденных Wi-Fi сетей
server->on("/ssid.txt", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send(LittleFS, "/ssid.txt", F("text/plain")); });

/*API*/
server->on("/api/networks", HTTP_GET, onGetApiNetworks); // Список Wi-Fi сетей (из wifi_list.html)
server->on("/api/init_connect", HTTP_POST, onPostApiInitConnect); // Сохраняем настройки Wi-Fi + redirect: /api/connect
server->on("/api/call_connect", HTTP_GET, onGetApiCallConnect); // Поднимаем флаг старта подключения и redirect в wifi_connect.html
server->on("/api/connect_status", HTTP_GET, onGetApiConnectStatus); // Статус подключения (из wifi_connect.html)
server->on("/api/setup", HTTP_POST, onPostApiSetup); // Сохраняем настройки
server->on("/api/networks", HTTP_GET, onGetApiNetworks); // Список Wi-Fi сетей (из wifi_list.html)
server->on("/api/init_connect", HTTP_POST, onPostApiInitConnect); // Сохраняем настройки Wi-Fi + redirect: /api/connect
server->on("/api/call_connect", HTTP_GET, onGetApiCallConnect); // Поднимаем флаг старта подключения и redirect в wifi_connect.html
server->on("/api/connect_status", HTTP_GET, onGetApiConnectStatus); // Статус подключения (из wifi_connect.html)
server->on("/api/setup", HTTP_POST, onPostApiSetup); // Сохраняем настройки
server->on("/api/set_counter_name/0", HTTP_POST, onPostApiSetCounterName0); // Сохраняем тип счётчика и переносим на страницу настройки
server->on("/api/set_counter_name/1", HTTP_POST, onPostApiSetCounterName1); // Сохраняем тип счётчика и переносим на страницу настройки
server->on("/api/main_status", HTTP_GET, onGetApiMainStatus); // Информационные сообщения на главной странице
server->on("/api/status/0", HTTP_GET, onGetApiStatus0); // Статус 0-го входа (ХВС) (из setup_cold_welcome.html)
server->on("/api/status/1", HTTP_GET, onGetApiStatus1); // Статус 1-го входа (ГВС) (из setup_cold_welcome.html)
server->on("/api/turnoff", HTTP_GET, onGetApiTurnOff); // Выйти из режима настройки
server->on("/api/reset", HTTP_POST, onPostApiReset); // Сброс к заводским настройкам
server->on("/api/main_status", HTTP_GET, onGetApiMainStatus); // Информационные сообщения на главной странице
server->on("/api/status/0", HTTP_GET, onGetApiStatus0); // Статус 0-го входа (ХВС) (из setup_cold_welcome.html)
server->on("/api/status/1", HTTP_GET, onGetApiStatus1); // Статус 1-го входа (ГВС) (из setup_cold_welcome.html)
server->on("/api/turnoff", HTTP_GET, onGetApiTurnOff); // Выйти из режима настройки
server->on("/api/reset", HTTP_POST, onPostApiReset); // Сброс к заводским настройкам

server->begin();

Expand Down
Loading

0 comments on commit 726ac44

Please sign in to comment.