• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. А с кем? С роутером? Но его настройки я не менял. Домашний комп через него нормально выходит в Сеть...
 
Сверху Снизу