ESP-01 + UNO не обнаруживает шлюз

По-видимому, эта комбинация аппаратных средств не будет принимать ничего, кроме WiFiEsp.h вместе с SoftwareSerial.h (если кто-нибудь знает что-то лучше / новее, чем эти два, пожалуйста, дайте мне знать). Дело в том, что я могу подключаться к Wi-Fi, отправлять и получать данные (на сервер apache внутри моей домашней сети) просто отлично. После того, как мой проект был почти завершен, я решил подключить его к реальному серверу в Интернете, но обнаружил, что ESP-01 не смог обнаружить мой шлюз.

#include "WiFiEsp.h"
#include "SoftwareSerial.h"

int pinWifiRX = 6;
int pinWifiTX = 7;

char ssid[64]    = "*****";
char pass[32]    = "************";

SoftwareSerial Serial1(pinWifiRX, pinWifiTX);

int wifi_status;

void setup() {

  Serial.begin(9600);

  Serial1.begin(9600);
  while(!Serial1) (true);

  WiFi.init(&Serial1);

  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println(F("No shield"));
    while (true) {}
  }

  IPAddress localIp(192, 168, 1, 60);
  IPAddress subnetMask(255, 255, 255, 0);
  IPAddress gateway(192, 168, 1, 36);

  WiFi.config(localIp);  // <--- эта строка принята и работает, но остальные 3 дают ошибки компиляции
// WiFi.config(localIP, шлюз);
// WiFi.config(localIP, шлюз, маска подсети);
// WiFi.config(localIP, шлюз, маска подсети, шлюз);

  wifi_status = WiFi.begin(ssid, pass);

  if (wifi_status == WL_CONNECTED) {

    IPAddress ip;

    ip = WiFi.localIP();
    Serial.print(F("[WiFiEsp] IP Address: "));
    Serial.println(ip);

    ip = WiFi.subnetMask();
    Serial.print(F("[WiFiEsp] Subnet Mask: "));
    Serial.println(ip);

    ip = WiFi.gatewayIP();
    Serial.print(F("[WiFiEsp] Gateway: "));
    Serial.println(ip);

// ip = WiFi.getDNS(); // <--- функция не существует
  }

}

void loop() {}

Приводит к:

[WiFiEsp] Initializing ESP module
[WiFiEsp] Initilization successful - 2.2.1
[WiFiEsp] IP address set 192.168.1.60
[WiFiEsp] Connected to *****
[WiFiEsp] IP Address: 192.168.1.60
[WiFiEsp] Subnet Mask: 255.255.255.0
[WiFiEsp] Gateway: 192.168.1.0

Как можно видеть, маска подсети является правильной, но она "обнаруживает" Geteway 192.168.1.0, когда она должна быть 192.168.1.36. Таким образом, я могу подключиться к любому устройству в локальной сети, но не могу получить доступ к какому-либо адресу в Интернете.

Я даже пытался отправить некоторые AT-команды непосредственно в SoftwareSerial.h, но я не получаю никакого ответа.

Придется ли мне начинать весь проект с нуля (используя другую комбинацию оборудования), или есть способ изменить gateway вручную? А еще лучше, есть ли способ заставить его правильно определять адрес шлюза?

РЕДАКТИРОВАТЬ: может ли это быть связано с прошивкой, которую я установил на ESP-01? Я следовал этому руководству и получил его по этой ссылке.

Заранее благодарю.

Обновлено: в этом примере я использовал функцию WiFi.config(localIP) для установки фиксированного IP-адреса. На самом деле мне это не нужно, это была просто попытка заставить его получить правильный адрес шлюза. Даже если я прокомментирую эту строку, Шлюз все равно ошибочен.

, 👍2

Обсуждение

используйте шлюз по адресу 192.168.1.1, @Juraj

Я не могу этого сделать. Мой шлюз настроен на 192.168.1.36, и я не могу его изменить. Кроме того, было бы неплохо, если бы он мог определять настройки, даже если устройство находится в другом месте., @MrCabana

нет никакого способа определить настройки. если вы используете статический IP, DHCP не запрашивается. прошивка AT использует адрес шлюза по умолчанию на основе статического IP-адреса. моя библиотека WiFiEspAT имеет полную конфигурацию, но требует AT 1.7.x (SDK3) и не может использовать https, @Juraj


2 ответа


0

Использование статического IP-адреса со шлюзом не реализовано (как вы можете видеть из исходного кода).

Чтобы выйти в Интернет с помощью этой библиотеки, вы можете использовать только DHCP (пропустив вызов WiFi.config (localIP)).

,

да, это была первоначальная форма. Он также получает неправильный адрес шлюза., @MrCabana


1

Я добился некоторого прогресса в своих исследованиях этой проблемы.

Фактически, Arduino получает правильный адрес шлюза с моего DHCP-сервера, но отображает неправильный. Где-то в библиотеке WiFiEsp должна быть ошибка.

Чтобы отладить это, я внес несколько изменений в следующие файлы:

  • WiFiEsp-Master/src/WiFiEsp.h
void config(IPAddress local_ip, IPAddress gateway);
void config(IPAddress local_ip, IPAddress gateway, IPAddress subnetMask);
  • WiFiEsp-Master/src/WiFiEsp.c
void WiFiEspClass::config(IPAddress ip, IPAddress gateway)
{
  EspDrv::config(ip, gateway);
}
void WiFiEspClass::config(IPAddress ip, IPAddress gateway, IPAddress subnetMask)
{
  EspDrv::config(ip, gateway, subnetMask);
}
  • WiFiEsp-Мастер/ src/утилита/EspDrv.h
static void config(IPAddress local_ip, IPAddress gateway);
static void config(IPAddress local_ip, IPAddress gateway, IPAddress subnetMask);
  • WiFiEsp-Master/src/utility/EspDrv.cpp
void EspDrv::config(IPAddress ip, IPAddress gateway) {
  LOGDEBUG(F("> config"));

  // отключить DHCP станции
  sendCmd(F("AT+CWDHCP_CUR=1,0"));

  // похоже, нам нужно подождать здесь...
  delay(500);

  char buf_ip[16];
  sprintf_P(buf_ip, PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]);

  char buf_gateway[16];
  sprintf_P(buf_gateway, PSTR("%d.%d.%d.%d"), gateway[0], gateway[1], gateway[2], gateway[3]);

  int ret = sendCmd(F("AT+CIPSTA_CUR=\"%s\",\"%s\""), 2000, buf_ip, buf_gateway);
  delay(500);

  if (ret==TAG_OK)
  {
    LOGINFO1(F("IP and gateway addresses set"), buf_ip);
  }
}

void EspDrv::config(IPAddress ip, IPAddress gateway, IPAddress subnet)
{

  LOGDEBUG(F("> config"));

  // отключить DHCP станции
  sendCmd(F("AT+CWDHCP_CUR=1,0"));

  // похоже, нам нужно подождать здесь...
  delay(500);

  char buf_ip[16];
  sprintf_P(buf_ip, PSTR("%d.%d.%d.%d"), ip[0], ip[1], ip[2], ip[3]);

  char buf_gateway[16];
  sprintf_P(buf_gateway, PSTR("%d.%d.%d.%d"), gateway[0], gateway[1], gateway[2], gateway[3]);

  char buf_subnet[16];
  sprintf_P(buf_subnet, PSTR("%d.%d.%d.%d"), subnet[0], subnet[1], subnet[2], subnet[3]);

  int ret = sendCmd(F("AT+CIPSTA_CUR=\"%s\",\"%s\",\"%s\""), 4000, buf_ip, buf_gateway, buf_subnet);
  delay(500);

  if (ret==TAG_OK)
  {
    LOGINFO1(F("IP, gateway and subnet mask addresses set"), buf_ip);
  }
}

Этих нескольких изменений должно быть достаточно для реализации исправления IP-адреса и указания адреса вручную для шлюза и маски подсети (пожалуйста, не стесняйтесь поправить меня, если я ошибаюсь).

Но после этого я понял, что шлюз по-прежнему остается "192.168.1.0". Затем я добавил этот фрагмент кода в функцию EspDrv::readUntil, внутри EspDrv.cpp :"

        ringBuf.push(c); // эта строка уже была там
        Serial.print(c);

Таким образом, я мог видеть точно все ответы на команды AT, отправленные библиотекой WiFiEsp. Когда его спросили, результаты были следующими:

+CIPSTA:ip:"192.168.1.60"
+CIPSTA:gateway:"192.168.1.36"
+CIPSTA:netmask:"255.255.255.0"

Потом я понял, что проблема была не в шлюзе, а в DNS. Если библиотека отправляет команду "AT+CIPSTART=3,"TCP","www.google.com ",80", результат был следующим:

Not connected

busy p...

И, если увеличить значение тайм-аута до 15000 вместо 5000, результат будет следующим:

DNS ERROR

Теперь моя проблема частично решена. Я могу подключиться к внешнему серверу, если использую IP-адрес, но я не могу установить доменное имя, потому что оно не будет разрешено DNS.

По-видимому, версия прошивки моего ESP-01 не будет принимать "AT + CDNSCFG =?", необходимый для установки / повторного поиска DNS-адреса. Я попытался установить 8.8.8.8 в качестве DNS, но результат был "НЕ В ПОРЯДКЕ".

Пока я буду придерживаться этого "решения", но был бы рад услышать любые комментарии по поводу того, что я описал здесь, и более окончательное решение.

Спасибо.

,