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);
}
@Carlos Costa, 👍2
Обсуждение1 ответ
Не углубляясь в API, как говорит @Jurai, он перечисляет IP-адреса от DHCP-сервера на точке доступа, которые ничего не знают о статических IP-адресах.
- Когда вы устанавливаете статический IP-адрес для "Клиента" - просто используйте его (192.168.0.101) (правило KISS)
- На точке доступа реализован веб-API, позволяющий клиенту регистрироваться
- Используйте обнаружение многоадресной рассылки mDNS (также известное как Avahi, также известное как Bonjour) espressif- skd doc arduino-esp32 библиотека ESPmDNS
Какова ваша цель использования статического IP-адреса на клиенте?
Есть несколько тестовых стендов, которые контролируются esp32. У каждого тестового стенда есть номер, и идея состоит в том, чтобы иметь один и тот же соответствующий номер внутри IP-адреса. Четыре октета IP-адреса будут такими же, как номер тестового стенда. Я справился с этой ситуацией, заставив клиента отправить свой IP-адрес точке доступа после установления соединения. Спасибо за помощь., @Carlos Costa
- Использование c_str() для String для IPAddress с NTPClient дает неправильные значения
- SNMP Manager — несколько IP-адресов — проблема
- ESP32 медленное время прохождения туда и обратно по Wi-Fi
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Несколько клиентских серверов через Wi-Fi
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
в WiFi нет IP-адресов. Устройство SoftAP может отображать IP-адрес только из записей DHCP-сервера или, возможно, из таблицы ARP после того, как клиент выполнит некоторую связь TCP/IP с устройством SoftAP., @Juraj
Спасибо за ответ. Есть ли способ узнать IP?, @Carlos Costa