ESP8266 Captive portal со всплывающим окном

Кому-нибудь когда-либо удавалось заставить захватывающий портал вызывать всплывающее окно для перенаправленного контента на определенную целевую страницу на Arduino или ESP8266? Я пробовал все под солнцем, и хотя мой андроид будет жаловаться на отсутствие подключения к Интернету и другие вещи, он никогда не запрашивает / не предлагает открыть браузер, как я видел это в некоторых точках доступа с открытым Wi-Fi со страницами входа . Я пытаюсь реализовать то, что на самом деле будет устройством, не подключенным к Интернету, в которое пользователи будут входить в удаленном месте, чтобы показать, что они прибыли, вроде как тайник, но с использованием входа в Wi-Fi. Я сделал глобус dnsServer (все имена на локальный IP-адрес), я сделал несколько перенаправлений URL-адресов. Я пробовал вводить конкретный контент (вместо перенаправления), но ничего не всплывает.

Соответствующий код:

#include <ESPAsyncWebServer.h>
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266mDNS.h>


IPAddress apIp ( 10, 10, 10, 10 );
AsyncWebServer asyncWebServer(80);
DNSServer dnsServer;
const char* captiveRedirect = "/index.htm";
String apSSID = "GeoCache";

dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start ( DNS_PORT, "*", apIp );

DBG_OUTPUT_PORT.println("Initializing MDNS for local hostname on AP");
if (MDNS.begin(apHostname)) {
    MDNS.addService("http", "tcp", 80);
    DBG_OUTPUT_PORT.println("MDNS responder started");
    DBG_OUTPUT_PORT.print("You can now connect to http://");
    DBG_OUTPUT_PORT.print(apHostname);
    DBG_OUTPUT_PORT.println(".local");
}

//Android captive portal. Maybe not needed. Might be handled by notFound handler.
asyncWebServer.addRewrite( new AsyncWebRewrite("/generate_204", captiveRedirect));
//asyncWebServer.on ( "/generate_204", returnOK );
//Microsoft captive portal. Maybe not needed. Might be handled by notFound handler.
asyncWebServer.addRewrite( new AsyncWebRewrite("/fwlink", captiveRedirect));
//asyncWebServer.on ( "/fwlink", returnOK );
//Microsoft windows 10
//asyncWebServer.on ( "/connecttest.txt", returnOK );
asyncWebServer.addRewrite( new AsyncWebRewrite("/connecttest.txt", captiveRedirect));
// apple devices
asyncWebServer.addRewrite( new AsyncWebRewrite("/hotspot-detect.html", captiveRedirect));
//asyncWebServer.on ( "/hotspot-detect.html", returnOK );
asyncWebServer.addRewrite( new AsyncWebRewrite("/library/test/success.html", captiveRedirect));
//asyncWebServer.on ( "/library/test/success.html", returnOK );
// kindle
asyncWebServer.addRewrite( new AsyncWebRewrite("/kindle-wifi/wifistub.html", captiveRedirect));
//asyncWebServer.on ( "/kindle-wifi/wifistub.html", returnOK );

asyncWebServer.on("/delete", HTTP_DELETE, handleDelete);
// upload a file to /upload
asyncWebServer.on("/upload", HTTP_POST, returnOK, handleUpload);
// Catch-All Handlers
asyncWebServer.onFileUpload(handleUpload);
//asyncWebServer.onRequestBody(onBody);

asyncWebServer.on("/signin", HTTP_GET, addLog);

asyncWebServer.onNotFound(handleNotFound);

asyncWebServer.begin();

WiFi.mode(WIFI_AP);
WiFi.softAPConfig ( apIp, apIp, IPAddress ( 255, 255, 255, 0 ) );
WiFi.softAP(apSSID);

person Scott    schedule 18.09.2017    source источник
comment
Я даже попытался установить специальное правило в моем handleNotFound, которое проверяет 'request- ›host () на локальный IP-адрес и локальное имя хоста для различных действий. Пока ничего не получилось.   -  person Scott    schedule 19.09.2017
comment
ну, черт, я видел, как это работает на тестовом скетче для чего-то, чего я сейчас не могу вспомнить. я знаю, что это бесполезно, кроме поощрения ...   -  person dandavis    schedule 19.09.2017
comment
как давно? Из того, что я могу разобрать, метод, который я сейчас использую, `` используется '' для работы со старыми версиями android / ios и `` может '' все еще работать на устройстве с жестким сбросом (у которого еще не было возможности кешировать DNS)   -  person Scott    schedule 21.09.2017
comment
Я только что попробовал пример скрытого портала в Windows, и он сработал, включая открытие вкладки из ниоткуда на странный URL-адрес, который перенаправлял на демонстрационный текст. на android 5.1 демонстрационный текст появлялся во встроенном браузере после нажатия на уведомление. оба были приличным пользовательским опытом ...   -  person dandavis    schedule 26.09.2017
comment
хм, мне вообще не повезло даже с запросами. И самый яркий пример, который я видел (мобильный рик-ролл), имеет открытую ветку от людей, делящихся моим опытом.   -  person Scott    schedule 27.09.2017


Ответы (1)


В loop () вы должны включить:

dnsServer.processNextRequest();

до

server.handleClient(); //Handling of incoming requests

затем создайте ненайденный маршрутизатор:

server.onNotFound([]() {
    char * msg = "HELLO<br>Default landing page<br>";
    server.send(200, "text/html", msg );
  });
person Ádám Lukács    schedule 30.05.2019
comment
Проблема в том, что он никогда не получает запрос, потому что, по-видимому, Android (с версии 4.4 до примерно версии 7) запрашивает только серверы имен Google (например, 8.8.8.8) для адреса хоста google generate_204. - person Scott; 01.06.2019
comment
Мое краткосрочное решение - настроить softAP на 8.8.8.8 в качестве IP-адреса, поскольку он не подключен к Интернету. Лучшим решением было бы подменить адреса 8.8.8.8 с помощью низкоуровневого кода lwIP. Но я не кодировал стек IP годами, да и то не на C. - person Scott; 01.06.2019