• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Проблема с DNS (WiFi.hostByName)

tms320

New member
Пытаюсь установить соединение с smtp.mail.ru (имя хоста не особо важно, ибо с другими хостами та же проблема).
Код (упрощённо) такой:
Код:
WiFi.begin(ssid, ssid);
while (WiFi.status() != WL_CONNECTED) delay(500);
IPAddress hostIP;
if (!WiFi.hostByName("smtp.mail.ru", hostIP))
{
      Serial.println("Couldn't get IP");
      return;
}
WiFiClientSecure client;    // "WiFiClient client;" - тоже пробовал
if (!client.connect(hostIP, 465))
{
      Serial.println("Couldn't connect");
      return;
}
Либо напрямую вызываю client.connect с текстовым именем хоста:
Код:
if (!client.connect("smtp.mail.ru", 465))
{
      Serial.println("Couldn't connect");
      return;
}
Включив режим оладки в IDE, увидел в последовательном порту следующее сообщение:
[hostByName] Host: smtp.mail.ru lookup error: -5!
Т.е. в обоих случаях не получается получить IP-адрес хоста по его имени.
Порывшись в исходниках библиотек, нашёл, что данное сообщение выводится в методе "ESP8266WiFiGenericClass::hostByName" после вызова функции "dns_gethostbyname".
Судя по описанию функции espconn_gethostbyname в SDK, ошибка "-5" - это "ESPCONN_INPROGRESS - error code : already connected".
Что это может значить? Куда оно "already connected"?
Пару дней назад абсолютно тот же код работал, иногда отлично, иногда через раз. А вот сегодня вообще не работает.
В админке моего WiFi-роутера выводятся следующие адреса DNS:
85.21.192.5
213.234.192.7
Я попробовал принудительно задать эти DNS для ESP8266:
Код:
WiFi.begin(ssid, ssidPassword);
IPAddress ip(192, 168, 1, 40);
IPAddress gateway(192, 168, 1, 1);    // это мой роутер
IPAddress subnet(255, 255, 255, 0);
IPAddress dns1(85, 21, 192, 5);
IPAddress dns2(213, 234, 192, 7);
WiFi.config(ip, gateway, subnet, dns1, dns2);
Не помогает.
В чём может быть проблема или куда "копать"?
 

pvvx

Активный участник сообщества
В чём может быть проблема или куда "копать"?
1) Определиться - это не работает DNS или повторный вызов соединения сокета.
2) Прочитать это
3) Сменить модуль.
Ваш пример на другом модуле с добавкой строки
Код:
if (!client.connect(hostIP, 465))  {
      Serial.println("Couldn't connect");
      return;
  }
  Serial.println("Connected");
часть лога:
Код:
....
Interface 0 IP address : 192.168.1.122
Connected
 

tms320

New member
1) Определиться - это не работает DNS или повторный вызов соединения сокета.
Не совсем понял про "повторный вызов соединения сокета".
Вот отладочный лог библиотек, когда я пытаюсь получить IP для smtp.ngs.ru (он не требует SSL):
Connecting to <SSID роутера>..........
wifi evt: 1
STA disconnect: 15
...wifi evt: 0
.wifi evt: 3
.
ESP connected to AP and got IP address: 192.168.1.40
[hostByName] request IP for: smtp.ngs.ru
[hostByName] Host: smtp.ngs.ru lookup error: -5!
[hostByName] request IP for: smtp.ngs.ru
[hostByName] Host: smtp.ngs.ru lookup error: -5!

Т.е. как только ESP подключился к моей WiFi-точке доступа (роутеру), я вызываю функциюWiFi.hostByName, и при первом же её вызове получаю 'lookup error: -5'.
И все последующие попытки получить IP - без результата.

2) Прочитать это
Эту тему читал, пробовал из неё библиотеку MailSSL. Успел дойти до момента, где проверяется валидность отпечатка (работало через раз, что с mail.ru, что c yandex.ru). А потом начались проблемы с получением IP. Повторюсь, несколько дней назад всё почти хорошо работало. Потом WiFi.hostByName начал работать хуже, выдавал IP не с первого раза, и вот последние три дня вообще ничего не выдаёт.
Я пробовал запрашивать IP других хостов (они не требуют SSL):
aspmx.l.google.com - это типа гугловский smtp-сервер для принтеров/сканеров:
G Suite SMTP settings to send mail from a printer, scanner, or app - G Suite Administrator Help
Или API сайта thingspeak.com:
api.thingspeak.com
Один хрен - IP получить не удаётся.

3) Сменить модуль.
Увы, пока возможности нет...

PS: Создал точку доступа на своём android-смартфоне. ESP к ней подключилась и функция WiFi.hostByName сразу начала работать и выдавать IP:
Connecting to <SSID смартфона>..........
wifi evt: 1
STA disconnect: 15
...wifi evt: 0
.wifi evt: 3
.
ESP connected to AP and got IP address: 192.168.43.172
[hostByName] request IP for: smtp.mail.ru
[hostByName] Host: smtp.mail.ru IP: 217.69.139.160

Получается, что проблема с DNS не связана с ESP. А с кем? С роутером? Но его настройки я не менял. Домашний комп через него нормально выходит в Сеть...
 
Сверху Снизу