CaptivePortal

ESP32 открывает «captive portal» при подключении

Я использую пример SimpleWiFiServer по умолчанию, который поставляется в качестве примера из ESP32:

#include #include #include #define LED_BUILTIN 2 // Set the GPIO pin where you connected your test LED or comment this line out if your dev board has a built-in LED // Set these to your desired credentials. const char *ssid = "MyNetwork"; //const char *password = "YourPassword"; WiFiServer server(80); void setup() < pinMode(LED_BUILTIN, OUTPUT); Serial.begin(115200); Serial.println(); Serial.println("Configuring access point. "); // You can remove the password parameter if you want the AP to be open. //tcpip_adapter_dns_info_t dns_info; //dns_info.ip.u_addr.ip4.addr = IPAddress(192,168,4,1); //tcpip_adapter_set_dns_info(TCPIP_ADAPTER_IF_AP, TCPIP_ADAPTER_DNS_MAIN, &dns_info); WiFi.softAP(ssid); IPAddress myIP = WiFi.softAPIP(); Serial.print("AP IP address: "); Serial.println(myIP); server.begin(); Serial.println("Server started"); >void loop() < WiFiClient client = server.available(); // listen for incoming clients if (client) < // if you get a client, Serial.println("New Client."); // print a message out the serial port String currentLine = ""; // make a String to hold incoming data from the client while (client.connected()) < // loop while the client's connected if (client.available()) < // if there's bytes to read from the client, char c = client.read(); // read a byte, then Serial.write(c); // print it out the serial monitor if (c == '\n') < // if the byte is a newline character // if the current line is blank, you got two newline characters in a row. // that's the end of the client HTTP request, so send a response: if (currentLine.length() == 0) < // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) // and a content-type so the client knows what's coming, then a blank line: client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); // the content of the HTTP response follows the header: client.print("Click here to turn ON the LED.
"); client.print("Click here to turn OFF the LED.
"); // The HTTP response ends with another blank line: client.println(); // break out of the while loop: break; > else < // if you got a newline, then clear currentLine: currentLine = ""; >> else if (c != '\r') < // if you got anything else but a carriage return character, currentLine += c; // add it to the end of the currentLine >// Check to see if the client request was "GET /H" or "GET /L": if (currentLine.endsWith("GET /H")) < digitalWrite(LED_BUILTIN, HIGH); // GET /H turns the LED on >if (currentLine.endsWith("GET /L")) < digitalWrite(LED_BUILTIN, LOW); // GET /L turns the LED off >> > // close the connection: client.stop(); Serial.println("Client Disconnected."); > >

Это инициализирует ESP32 в качестве точки доступа. На телефоне я могу видеть сеть MyNetwork. Если я подключусь к нему, а затем открою свой браузер и перейду на 192.168.4.1, я смогу увидеть страницу по умолчанию.

Как я могу изменить этот код, чтобы при подключении к этой сети он автоматически открывал мой браузер, переходя в http://192.168.4.1 ?

Исследуя в Интернете, я нашел эту библиотеку, которая делает это WifiManager . Эта библиотека поможет вам подключиться к существующей сети Wi-Fi. Я не хочу этого делать. Я хочу только, чтобы при подключении к сети моя страница по умолчанию открывалась точно так же, как при подключении к гостевым сетям в отелях и т. Д.

Другие люди в Интернете изменили WiFiAPP.cpp и добавил эти три строки кода :

tcpip_adapter_dns_info_t dns_info; dns_info.ip.u_addr.ip4.addr = IPAddress(192,168,4,1); tcpip_adapter_set_dns_info(TCPIP_ADAPTER_IF_AP, TCPIP_ADAPTER_DNS_MAIN, &dns_info); 

Это только приводит к сбою моего esp32 и не работает.

Кто-нибудь придумал простой способ открыть всплывающее окно (закрытый портал), указывающее на http://192.168.4.1 после подключения к точке доступа ESP32?

Наконец, я нашел этот пример , но он использует esp8266.

Как вы получаете такие вещи, как автоматическое открытие браузера при подключении Wi-Fi, зависит от вашей операционной системы. Это не то, о чем я когда-либо слышал. Обычно нужно настроить «закрытый портал», который перенаправляет все запросы на себя, поэтому вы открываете браузер и везде, где вы пытаетесь зайти, он отвечает страницей портала. В комплектной библиотеке DNSServer есть пример, который делает это., @Majenko

Читайте также:  Wifi windows 10 1607

Извините, я хотел сказать, что английский «captive portal» — это не мой родной язык. @Majenko, @Tono Nam

@Majenko у меня телефон на Android v8 . при подключении к точке доступа он автоматически переходит на страницу захваченного портала . мой предыдущий телефон требовал ручного просмотра любой незашифрованной (http:) веб-страницы, @jsotola

@jsotola Обычно это то, что телефон делает сам по себе. Яблоки попробуйте открыть страницу http://captive.apple.com/hotspot-detect.html и если он вернет что-либо, кроме «Успеха», он откроет браузер для входа в систему., @Majenko

@Majenko♦ я понимаю, что телефон делает это сам по себе . я неправильно понял ваш первый комментарий . спасибо за полезную apple.com ссылка, @jsotola

2 ответа

Лучший ответ:

Благодаря @Majenko я смог найти то, что искал в Интернете, по этой ссылке . Когда я погуглил «плененный портал» вместо фраз, которые я использовал, я нашел гораздо больше примеров.

Этот код открывает «закрытый портал», как только я подключусь к точке доступа esp32.

#include #include const byte DNS_PORT = 53; IPAddress apIP(192, 168, 1, 1); DNSServer dnsServer; WiFiServer server(80); String responseHTML = "" "" "

Hello World!

This is a captive portal example. All requests will " "be redirected here.

"; void setup() < WiFi.disconnect(); //added to start with the wifi off, avoid crashing WiFi.mode(WIFI_OFF); //added to start with the wifi off, avoid crashing WiFi.mode(WIFI_AP); WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); WiFi.softAP("DNSServer CaptivePortal example"); // if DNSServer is started with "*" for domain name, it will reply with // provided IP to all DNS request dnsServer.start(DNS_PORT, "*", apIP); server.begin(); >void loop() < dnsServer.processNextRequest(); WiFiClient client = server.available(); // listen for incoming clients if (client) < String currentLine = ""; while (client.connected()) < if (client.available()) < char c = client.read(); if (c == '\n') < if (currentLine.length() == 0) < client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); client.print(responseHTML); break; >else < currentLine = ""; >> else if (c != '\r') < currentLine += c; >> > client.stop(); > >

При предоставлении HTTP-сервера у вас обычно есть два варианта:

  1. Использование класса веб-сервера и набор обработчиков для корневых файлов. Анализ и обработка HTTP-заголовка выполняются библиотекой.
  2. Используйте WifiServer и получайте HTTP-сообщение с включенным заголовком и обработчиком самостоятельно.

Если вы выполняете номер 1 и притворяетесь, что используете, подключившись к устройству Android, я предлагаю добавить обработчик для случая ошибки, отображающей захваченный портал:

server.onNotFound(handleRoot); 

Я заметил, что для Android 10 необходимо правильно обнаружить захваченный портал и заставить телефон показывать сообщение «Нажмите, чтобы войти в сеть». Если нет, вы должны перейти на любой HTTP-адрес и позволить DNS выполнить эту работу за вас (не HTTPS).

Источник

Автооткрытие страницы при подключении к WiFi

Всех приветствую, накатал небольшой скетч, штрудируя просторы форумов и видеоуроков.
Прошу помощи в доработке, ткнуть носом нужную кучу.. информации.
Скетч создаёт точку доступа и при подключении к ней на андроиде либо автоматом открывается веб-интерфейс, либо всплывает уведомление, нажав на которое — открывается интерфейс.
Так вот, на яблочной мобилке это не работает, может кто знает в чём причина?
Суть кода — перенаправление любого веб запроса на интерфейс, можно в браузере вбить любой адрес (хоть «йух.рф») откроет интерфейс ЕСП. Т.е. андроид при подключении к новой сети пингует что-то и вместо этого перенаправляется на интерфейс ЕСПхи.
Интерфейс можно залить любой через ФТП, главное чтобы назывался index.html (Спасибо за это каналу iomoio)
Логопас от ФТП «login»,»pass»
IP Esp изменён на 192, 168, 10, 1

#include // Библиотека для создания Wi-Fi подключения (клиент или точка доступа) #include // Библиотека для управления устройством по HTTP (например из браузера) #include // Библиотека для работы с файловой системой #include // Библиотека для работы с SPIFFS по FTP #include #include unsigned int status = WL_IDLE_STATUS; const byte DNS_PORT = 53; const char *ssid = "MyWiFi"; IPAddress apIP(192, 168, 10, 1); DNSServer dnsServer; ESP8266WebServer HTTP(80); // Определяем объект и порт сервера для работы с HTTP FtpServer ftpSrv; // Определяем объект для работы с модулем по FTP (для отладки HTML) void setup() < WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); WiFi.softAP(ssid); dnsServer.setTTL(300);// Создаём точку доступа dnsServer.setErrorReplyCode(DNSReplyCode::NoError); dnsServer.start(DNS_PORT, "*", apIP); SPIFFS.begin(); // Инициализируем работу с файловой системой HTTP.begin(); // Инициализируем Web-сервер ftpSrv.begin("login","pass"); // Поднимаем FTP-сервер для удобства отладки работы HTML (логин: relay, пароль: relay) delay(500); HTTP.on("/generate_204", handleRoot); HTTP.onNotFound([]()< // Описываем действия при событии "Не найдено" if(!handleFileRead(HTTP.uri())) // Если функция handleFileRead (описана ниже) возвращает значение false в ответ на поиск файла в файловой системе HTTP.send(404, "text/plain", "Not Found"); // возвращаем на запрос текстовое сообщение "File isn't found" с кодом 404 (не найдено) >); > void loop() < if (WiFi.status() == WL_CONNECTED) < MDNS.update();>dnsServer.processNextRequest(); HTTP.handleClient(); // Обработчик HTTP-событий (отлавливает HTTP-запросы к устройству и обрабатывает их в соответствии с выше описанным алгоритмом) ftpSrv.handleFTP(); // Обработчик FTP-соединений > void handleRoot() < HTTP.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); HTTP.sendHeader("Pragma", "no-cache"); HTTP.sendHeader("Expires", "-1"); handleFileRead("/"); >bool handleFileRead(String path) < // Функция работы с файловой системой if(path.endsWith("/")) path += "index.html"; // Если устройство вызывается по корневому адресу, то должен вызываться файл index.html (добавляем его в конец адреса) String contentType = getContentType(path); // С помощью функции getContentType (описана ниже) определяем по типу файла (в адресе обращения) какой заголовок необходимо возвращать по его вызову if(SPIFFS.exists(path))< // Если в файловой системе существует файл по адресу обращения Serial.println("settings"); File file = SPIFFS.open(path, "r"); // Открываем файл для чтения size_t sent = HTTP.streamFile(file, contentType); // Выводим содержимое файла по HTTP, указывая заголовок типа содержимого contentType file.close(); // Закрываем файл return true; // Завершаем выполнение функции, возвращая результатом ее исполнения true (истина) >return false; // Завершаем выполнение функции, возвращая результатом ее исполнения false (если не обработалось предыдущее условие) > String getContentType(String filename)< // Функция, возвращающая необходимый заголовок типа содержимого в зависимости от расширения файла if (filename.endsWith(".html")) return "text/html"; // Если файл заканчивается на ".html", то возвращаем заголовок "text/html" и завершаем выполнение функции else if (filename.endsWith(".css")) return "text/css"; // Если файл заканчивается на ".css", то возвращаем заголовок "text/css" и завершаем выполнение функции else if (filename.endsWith(".js")) return "application/javascript"; // Если файл заканчивается на ".js", то возвращаем заголовок "application/javascript" и завершаем выполнение функции else if (filename.endsWith(".png")) return "image/png"; // Если файл заканчивается на ".png", то возвращаем заголовок "image/png" и завершаем выполнение функции else if (filename.endsWith(".jpg")) return "image/jpeg"; // Если файл заканчивается на ".jpg", то возвращаем заголовок "image/jpg" и завершаем выполнение функции else if (filename.endsWith(".gif")) return "image/gif"; // Если файл заканчивается на ".gif", то возвращаем заголовок "image/gif" и завершаем выполнение функции else if (filename.endsWith(".ico")) return "image/x-icon"; // Если файл заканчивается на ".ico", то возвращаем заголовок "image/x-icon" и завершаем выполнение функции return "text/plain"; // Если ни один из типов файла не совпал, то считаем что содержимое файла текстовое, отдаем соответствующий заголовок и завершаем выполнение функции >

Источник

Читайте также:  App android wifi wps

Как вывести окно авторизации при подключении к сети wi-fi?

Задача что бы при подключении к сети wi-fi, открывался браузер со страницей авторизации.
Пользуясь данной статьей — Каким образом Windows определяет наличие выхода в . и этой — Как Windows определяет подключение к Интернету

1. Закрыл любой доступ кроме прокси, 192.168.1.1:8080
2. Разрешил любой DNS запрос 53 (UDP)

Но при подключении к сети, не открывается браузер, система в обще не считает, что у нее нет доступа к интернет, как ни в чем не бывало.

Если зайти в браузер и набрать любой сайт, без проблем проходит редирект на страницу с авторизацией. Это не подходит, так как пользователь должен сразу понимать, что у него нет интернета, так как браузер не всегда нужен, а система ему об этом не сообщает.

Куда посоветуете смотреть? Как Windows еще понимает, что есть или нет интернет? Почему она считает что есть доступ к интернет?

Ниже результаты работы проверок:
SQUI редирект на сервер авторизации:

192.168.1.72 TCP_DENIED/302 350 GET http://www.msftncsi.com/ncsi.txt - HIER_NONE/- text/html 192.168.1.72 TCP_DENIED/302 350 GET http://www.msftconnecttest.com/redirect - HIER_NONE/- text/html
Microsoft Windows [Version 10.0.18362.356] (c) Корпорация Майкрософт (Microsoft Corporation), 2019. Все права защищены. C:\Users\ynnek>ping www.msftconnecttest.com Обмен пакетами с 4-c-0003.c-msedge.net [13.107.4.52] с 32 байтами данных: Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Статистика Ping для 13.107.4.52: Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь) C:\Users\ynnek>ping www.msftncsi.com Обмен пакетами с a1961.g2.akamai.net [88.221.132.25] с 32 байтами данных: Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Превышен интервал ожидания для запроса. Статистика Ping для 88.221.132.25: Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь)
> > dns.msftncsi.com Server: UnKnown Address: 192.168.1.1 Non-authoritative answer: Name: dns.msftncsi.com Addresses: fd3e:4f5a:5b81::1 131.107.255.255

5d972c134b1ca892012380.png

Ну и после всех проверок, Windows «думает» что она в интернет.

Читайте также:  Windows creators update wifi

Источник

Как настроить всплывающее окно при подключении к Wi-Fi?

Такая задача, имеется локальная сеть с возможностью подключения к интернету. Нужно чтобы при подключении к этой сети сразу появлялось всплывающее окно с рекламой(открывался сайт в дефолтном браузере либо как-нибудь по-другому). Нашел в сети кучу хотспотов вроде chillispot и wifidog, но во-первых на них практически нет внятной русской документации, а во-вторых, насколько я понял, они перенаправляют при попытке доступа к интернету, а мне нужно именно всплывающее окно сразу при подключении к сети(например как тут). Сам я не специалист по части сетей. Посоветуйте какой-нибудь способ, не требующий больших познаний в данной области. Заранее благодарен.

по поводу всплывающего окна вы не правы, видео не фейк, на устройствах IOS, подключаешься к рекламным точкам доступа, выскакивает то самое всплывающее окно, в котором перенаправляет на страничку с рекламой, а у меня проблема стоит в обратном, нужно чтобы при подключении открывался браузер Safari, а далее перенаправлял на страничку, вот такие дела, на других ОС подобного нет, только на IOS.

Да давно уже разобрался с настройкой хотспота. На других ОС, кстати, подобная технология тоже имеется. На Windows Phone открывается браузер по умолчанияю, а андроид просто предупреждает, что сеть требует авторизацию и, при желании, также открывает страницу в браузере.

Вообще-то, большинство устройств при подключении к сети проверяют подключена ли эта сеть к интернету — это раз.
Во-вторых, окно с рекламой может всплыть только в браузере, который еще нужно открыть. Просто так на неком абстрактном телефоно-планшето-ноутбуке-компьютере под управлением адроид-виндовс-айос-линукса окно с рекламой не появится.

Так как вы хотите, чтобы «сразу при подключении» — сделать не получится. Поэтому задача сводится к созданию хотспота с рекламой, а таких вопросов здесь куча — воспользуйтесь поиском. Не ленитесь переводить документацию.

Сам я не специалист по части сетей. Посоветуйте какой-нибудь способ, не требующий больших познаний в данной области.

Comphard

Совершенно не понимаю, как может быть реализовано то, что продемонстрировано на видео.
Вы уверены, что там именно так все и работает в реальной жизни?

Jump

Это можно сделать в прошивке телефона. Завязываете запуск приложения на определенное событие, например подключение к сети.

hazratgs

Недавно верстал блок с рекламой как раз вот для такого плана. Как я помню там настроили эту систему с помощью microtick роутера.

Jump

Ваш роутер умеет самостоятельно запускать программы на компьютерах и телефонах, без ведома пользователя?
Вообще то это называется взлом. И имеется соответствующая статья в УК.

hazratgs

Артем: Ты не понял, я не имел ввиду такой же функционал как на фейковом видео, а то что примерно тоже самое но только в браузере можно реализовать в microtick. При первом обращении показывать рекламу и дальше когда нужно.

Источник

Оцените статью
Adblock
detector