Создать один сервер в режиме точки доступа, а другой - в режиме станции.
Я пытаюсь подключить один ESP8266 к WiFi в качестве веб-сервера в режиме станции и к другому ESP8266 в качестве сервера (без веб-страниц) в режиме точки доступа.
Проблема в том, что оба сервера создаются в режиме точки доступа между ESP, а один из них (веб-сервер) должен быть создан в режиме станции и доступен по WiFi. Единственный способ добраться до веб-сервера — это подключиться к точке доступа и получить доступ к ее IP-адресу (как к точке доступа) с моего компьютера.
Я хотел получить доступ к веб-серверу, подключенному к моему Wi-Fi, с помощью IP-адреса, который мой маршрутизатор дал хостинговому ESP, в то время как они оба могли бы общаться с использованием сервера без веб-страниц.
Я уже пробовал использовать один и тот же IP-адрес для обоих серверов, изменив порядок создания серверов и используя как ESP8266WiFi.h
, так и ESP8266WebServer.h
. Я читал кое-что о том, что последний не работает со слишком большим количеством кода внутри цикла, и, поскольку веб-страница, которую я хочу, довольно проста, я использую ESP8266WiFi.h
. Вот мой код:
#include <ESP8266WiFi.h>
//#include <ESP8266WebServer.h>
WiFiServer internalServer(81);
WiFiServer externalServer(80);
//ESP8266WebServer externalServer(80);
IPAddress IP(192, 168, 4, 15); // Default IP for the AP mode, the one I'm using.
IPAddress mask = (255, 255, 255, 0);
WiFiClient internalClient;
WiFiClient externalClient;
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
WiFi.mode(WIFI_AP_STA);
// Config. AP mode:
WiFi.softAP("my-access-point", "my-password");
WiFi.softAPConfig (IP, IP, mask);
// This connection is ok:
internalServer.begin();
Serial.println("Internal server created.");
while (!internalClient) { // waiting for the internal client to connect before continuing. This works fine.
internalClient = internalServer.available();
}
Serial.println("Internal client found.");
// Config. STA mode:
Serial.print("Connecting to Wi-Fi");
WiFi.begin("my-wifi", "my-wifi-password");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println(" Ready.");
// Config. external server.
// This connection isn't working
externalServer.begin();
Serial.print("External server created with IP: ");
Serial.println(WiFi.localIP()); // This is the IP I expected to use to connect to the external server.
// But it is accessible at 192.168.4.15.
void loop() {
// handling external client:
externalClient = externalServer.available();
if(!externalClient) { return; } // proceed only when there is a request.
String request = externalClient.readStringUntil('\r');
Serial.println("Request: " + request);
// The answer is just a hello world:
String answer = "..."
externalClient.println(answer)
Serial.println("Answer: " + answer);
handleInternalClient();
}
Предполагается, что внутренний клиент включает встроенный светодиод, когда он получает "вкл" от сервера, и выключает его, когда получает "выкл", и это работает нормально, поэтому я думаю, что код для него не нужен. . Если вам это нужно, пожалуйста, спросите.
Я хочу, чтобы другой ESP общался с этим через 192.168.4.15 в сети AP, а мой компьютер общался с ним через любой IP-адрес, который дал ему мой маршрутизатор, в моем WiFi.
@Gabriel Sollero, 👍0
1 ответ
Лучший ответ:
Это не задокументировано, но вы можете создать WiFiServer или ESP8266WebServer с IP-адресом. Если вы используете IP-адрес точки доступа, сервер будет доступен только на SoftAP. Если вы используете IP-адрес станции, сервер будет доступен только на интерфейсе STA.
Если IP-адрес интерфейса известен до setup()
, вы можете просто определить WiFiServer internalServer(apIP, 81);
вместо WiFiServer internalServer( 81);
. Но если IP-адрес должен быть сначала оценен в setup()
(из DHCP или файла конфигурации), то в следующем примере показано, как установить IP-адрес и порт WiFiServer в setup()
.
#include <ESP8266WiFi.h>
WiFiServer internalServer(81);
WiFiServer externalServer(80);
void setup() {
...
internalServer = WiFiServer(WiFi.softAPIP(), 81);
externalServer = WiFiServer(WiFi.localIP(), 80);
internalServer.begin();
externalServer.begin();
- Как разрешить междоменные запросы на ESP8266 WebServer
- Почему мы используем client.flush() в коде, когда мы подключаем Esp8266 к Интернету или серверу?
- Управление реле 5В с помощью Wemos D1 R1
- Веб-сервер ESP8266 недоступен через 2 минуты после сброса
- Веб-сервер ESP8266 отображает только текст, даже если тип контента — текст/HTML.
- Веб-сервер ESP8266 не отвечает
- Ошибка при компиляции скетча для Arduino Uno (ld return 1)
- Wemos D1 mini зависает через несколько минут
Это сработало! Большое спасибо. Но мне также пришлось удалить команду SoftAPConfig(). Есть идеи, почему?, @Gabriel Sollero
это было до или после
internalServer = WiFiServer(WiFi.softAPIP(), 81);
?SoftAPConfig
должен быть перед ним, чтобы иметь правильный IP-адрес SoftAP., @Jurajможно ли иметь доступный сервер на обоих интерфейсах одновременно?, @dandavis
@dandavis, по умолчанию он прослушивает все активированные интерфейсы., @Juraj