ESP32 со статическим IP-адресом, выступающим в качестве клиента, подключающегося к ESP32, выступающему в качестве точки доступа.

У меня есть плата ESP32 в качестве клиента со статическим IP-адресом. Клиент со статическим IP-адресом подключается ко второму ESP32, который действует как точка доступа. Соединение установлено, и точка доступа распознает новое подключенное устройство.

Проблема в том, что если клиент имеет статический IP-адрес, точка доступа отображает IP-адрес клиента как 0.0.0.0. Если у клиента не установлен статический IP-адрес, точка доступа отображает правильный IP-адрес.

Код клиента:

#include <WiFi.h>

const char* ssid = "ESP32-AP";
const char* password = "123456789";
IPAddress ip(192, 168, 0, 101);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);

  // Configure the static IP address
  WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connected to WiFi network");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  static long general_t1 = 0;

  if (millis() - general_t1 > 2000) {
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    general_t1 = millis();
  }
}

Код точки доступа:

#include <Arduino.h>
#include <WiFi.h>
#include "esp_wifi.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const char *ssid = "ESP32-AP";      // Имя SSID
const char *password = "123456789"; // Пароль SSID — установите значение NULL, чтобы иметь открытую точку доступа.
const int channel = 10;             // Номер канала Wi-Fi от 1 до 13
const bool hide_SSID = false;       // Чтобы отключить широковещательную передачу SSID -> SSID не будет отображаться при базовом сканировании Wi-Fi.
const int max_connection = 5;       // Максимальное количество одновременно подключенных клиентов к точке доступа

IPAddress local_ip(192, 168, 0, 1);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

//*** void display_connected_devices() ************************************** *********************
void display_connected_devices() {
  wifi_sta_list_t wifi_sta_list;
  tcpip_adapter_sta_list_t adapter_sta_list;
  esp_wifi_ap_get_sta_list(&wifi_sta_list);
  tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list);
  String deviceInfo = "";

  if (adapter_sta_list.num == 0) {
    deviceInfo = "No Device connected";
  }
  else {
    for (int i = 0; i < adapter_sta_list.num; i++) {
      tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i];
      deviceInfo += "Device " + String(i) + " = ";
      deviceInfo += IPAddress((&station.ip)->addr).toString();
      deviceInfo += "\n";
    }
  }

  // Отображение накопленной информации об устройстве
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("AP IP: " + WiFi.softAPIP().toString());
  display.setCursor(0, 20);
  display.println(deviceInfo);
  display.display();
  display.clearDisplay();
}

//************************************************ *************************************************
//** void setup()
//************************************************ *************************************************
void setup() {
  Serial.begin(115200);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;)
      ;
  }

  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(25, 10);
  display.println(F("ESP-32"));
  display.setCursor(25, 30);
  display.println(F("Router"));
  display.display();
  delay(2000);

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  WiFi.softAP(ssid, password, channel, hide_SSID, max_connection);
  Serial.print("[+] AP Created with IP Gateway ");
  Serial.println(WiFi.softAPIP());
}

//************************************************ *************************************************
//** void loop()
//************************************************ *************************************************
void loop() {
  display_connected_devices();
  delay(5000);
}

, 👍2

Обсуждение

в WiFi нет IP-адресов. Устройство SoftAP может отображать IP-адрес только из записей DHCP-сервера или, возможно, из таблицы ARP после того, как клиент выполнит некоторую связь TCP/IP с устройством SoftAP., @Juraj

Спасибо за ответ. Есть ли способ узнать IP?, @Carlos Costa


1 ответ


1

Не углубляясь в API, как говорит @Jurai, он перечисляет IP-адреса от DHCP-сервера на точке доступа, которые ничего не знают о статических IP-адресах.

  1. Когда вы устанавливаете статический IP-адрес для "Клиента" - просто используйте его (192.168.0.101) (правило KISS)
  2. На точке доступа реализован веб-API, позволяющий клиенту регистрироваться
  3. Используйте обнаружение многоадресной рассылки mDNS (также известное как Avahi, также известное как Bonjour) espressif- skd doc arduino-esp32 библиотека ESPmDNS

Какова ваша цель использования статического IP-адреса на клиенте?

,

Есть несколько тестовых стендов, которые контролируются esp32. У каждого тестового стенда есть номер, и идея состоит в том, чтобы иметь один и тот же соответствующий номер внутри IP-адреса. Четыре октета IP-адреса будут такими же, как номер тестового стенда. Я справился с этой ситуацией, заставив клиента отправить свой IP-адрес точке доступа после установления соединения. Спасибо за помощь., @Carlos Costa