Создать один сервер в режиме точки доступа, а другой - в режиме станции.

Я пытаюсь подключить один 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.

, 👍0


1 ответ


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

2

Это не задокументировано, но вы можете создать 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();
,

Это сработало! Большое спасибо. Но мне также пришлось удалить команду SoftAPConfig(). Есть идеи, почему?, @Gabriel Sollero

это было до или после internalServer = WiFiServer(WiFi.softAPIP(), 81);? SoftAPConfig должен быть перед ним, чтобы иметь правильный IP-адрес SoftAP., @Juraj

можно ли иметь доступный сервер на обоих интерфейсах одновременно?, @dandavis

@dandavis, по умолчанию он прослушивает все активированные интерфейсы., @Juraj