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-адреса. На самом деле мне это не нужно, это была просто попытка заставить его получить правильный адрес шлюза. Даже если я прокомментирую эту строку, Шлюз все равно ошибочен.
@MrCabana, 👍2
Обсуждение2 ответа
Использование статического IP-адреса со шлюзом не реализовано (как вы можете видеть из исходного кода).
Чтобы выйти в Интернет с помощью этой библиотеки, вы можете использовать только DHCP (пропустив вызов WiFi.config (localIP)
).
да, это была первоначальная форма. Он также получает неправильный адрес шлюза., @MrCabana
Я добился некоторого прогресса в своих исследованиях этой проблемы.
Фактически, 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, но результат был "НЕ В ПОРЯДКЕ".
Пока я буду придерживаться этого "решения", но был бы рад услышать любые комментарии по поводу того, что я описал здесь, и более окончательное решение.
Спасибо.
- Могу ли я использовать выход 3,3 В Arduino напрямую к esp8266?
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Как подключить ESP8266 с помощью адаптера ESP-01 к Arduino Uno?
- ESP8266 Аналоговое чтение мешает Wi-Fi?
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- Как установить связь между веб-камерой и Arduino UNO и получать прямую трансляцию на мобильном телефоне с помощью ESP8266?
- Управление реле 5В с помощью Wemos D1 R1
используйте шлюз по адресу 192.168.1.1, @Juraj
Я не могу этого сделать. Мой шлюз настроен на 192.168.1.36, и я не могу его изменить. Кроме того, было бы неплохо, если бы он мог определять настройки, даже если устройство находится в другом месте., @MrCabana
нет никакого способа определить настройки. если вы используете статический IP, DHCP не запрашивается. прошивка AT использует адрес шлюза по умолчанию на основе статического IP-адреса. моя библиотека WiFiEspAT имеет полную конфигурацию, но требует AT 1.7.x (SDK3) и не может использовать https, @Juraj