Клиент + сервер DNS, Wemos + Node MCU - работает через браузер компьютера, но не между 2-мя устройствами

lennen
Offline
Зарегистрирован: 10.11.2015

1. Нашел и подредактировал DNS-server

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>

const byte DNS_PORT = 53;
IPAddress apIP(192, 168, 1, 1);
DNSServer dnsServer;
ESP8266WebServer webServer(80);

void setup() {
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("locator");

  // modify TTL associated  with the domain name (in seconds)
  // default is 60 seconds
  dnsServer.setTTL(300);
  // set which return code will be used for all other domains (e.g. sending
  // ServerFailure instead of NonExistentDomain will reduce number of queries
  // sent by clients)
  // default is DNSReplyCode::NonExistentDomain
  dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure);

  // start DNS server for a specific domain name
  dnsServer.start(DNS_PORT, "www.example.com", apIP);

  // simple HTTP server to see that DNS server is working
  webServer.onNotFound([]() {
    String message = "Hello World!\n\n";
    message += "URI: ";
    message += webServer.uri();

    webServer.send(200, "text/plain", message);
  });
  webServer.begin();
}

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient();
}

2. В примерах Arduino выбрал клиент и вставил свои данные:

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;

void setup() {

  USE_SERIAL.begin(115200);
  // USE_SERIAL.setDebugOutput(true);

  USE_SERIAL.println();
  USE_SERIAL.println();
  USE_SERIAL.println();

  for (uint8_t t = 4; t > 0; t--) {
    USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
    USE_SERIAL.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("locator");

}

void loop() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    HTTPClient http;

    USE_SERIAL.print("[HTTP] begin...\n");

    // configure server and url
    //http.begin("http://www.example.com/index.html:80");
    http.begin("http://www.example.com", 80, "/index.html");

    USE_SERIAL.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();
    if (httpCode > 0) {
      // HTTP header has been send and Server response header has been handled
      USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

      // file found at server
      if (httpCode == HTTP_CODE_OK) {

        // get lenght of document (is -1 when Server sends no Content-Length header)
        int len = http.getSize();

        // create buffer for read
        uint8_t buff[128] = { 0 };

        // get tcp stream
        WiFiClient * stream = http.getStreamPtr();

        // read all data from server
        while (http.connected() && (len > 0 || len == -1)) {
          // get available data size
          size_t size = stream->available();

          if (size) {
            // read up to 128 byte
            int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

            // write it to Serial
            USE_SERIAL.write(buff, c);

            if (len > 0) {
              len -= c;
            }
          }
          delay(1);
        }

        USE_SERIAL.println();
        USE_SERIAL.print("[HTTP] connection closed or file end.\n");

      }
    } else {
      USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();
  }

  delay(10000);
}

 

Клиент работает, но если подключаться к роутеру и на сайт гугла. Сервер работает, если заходить на него из гугл хром.

Внимание, вопрос, товарищи знатоки.

Мне нужно, чтобы клиент коннектился к этому DNS-серверу. Коды перед вами. Почему может писать "Connection Refused"? DNS-сервер у меня - Wemos, клиент - Node MCU.

lennen
Offline
Зарегистрирован: 10.11.2015

Я еще немного поразбирался, получается интересная вещь. В клиенте мне удалось добиться того, что вылетает что-то типа "Вот такой сайт. Вы можете использовать этот домен для своих проектов, дерзайте! ляляля". И я ничего не понял, у меня-то написано просто Hello World в примере. Откуда эта хрень берется? Возможно, истина где-то рядом, ну можете кто-то протестить, просто я относительно новичок по IoT, хотя в проектах вроде шарю. Что-то с адресацией + что именно и что это у меня за строки вылезали с ссылкой на какой-то левый сайт?

 

<h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
sadman41
Offline
Зарегистрирован: 19.10.2016

Пинг-то после ресолва куда ведет - смотрели?

А то у нас в колхозе был случай... настроили AD на домен abcd.com (условно). Деньги на регистрацию решили не тратить... Ну и юзали его спокойненько, пока китайцы какие-то не зарегистрили его на себя. Теперича ежели VPN не забыл включить, то к себе на RDP попадаешь, а если забыл - на иероглифы ))

lennen
Offline
Зарегистрирован: 10.11.2015

Вот этот момент как раз плохо понимаю. Вроде действительно ведет на внешний example.com. Но выхода во внешний интернет-то нет, откуда он берет эту инфу? Данных роутера в программе точно нет, еще раз смотрю, строчка такая у клиента http.begin("http://www.example.com:80/");

А выводит в Serial.print так, словно подключен ко внешнему Интернету. ?? А если VPN включить, то как это сделать в моем случае?

Кстати, и да, когда я меняю адрес с example.com на robofeya.com и на сервере и в клиенте, оно пишет refused. Ну у меня robofeya.ru есть, com вроде свободен. Но NodeMCU не должен выходить во внешний Интернет и у него нет ни данных, ни подключения к домашнему роутеру. Что сейчас происходит?

Да, уже веселее. Отключаю сервер DNS, просто из USB компьютера. А Нод МЦУ (клиент) все равно получает данные сайта. Может я пример не тот выбрал и с компьютером как-то взаимодействие происходит. Тогда скажите, пожалуйста, подробнее, про VPN и тп, мне бы скетч домыслить, в чем конкретно ошибка или неточность, все таки.

И да! Вы оказались правы, оно и на мой сайт заходит, который на внешнем ресурсе. Причем я в шоке, к чему оно может подключаться, чтобы взять данные? Интернет на ноутбуке отключил, захожу в терминал, а там все также выводит html моего сайта в Интернете. И все, таки, что делать-то?)

sadman41
Offline
Зарегистрирован: 19.10.2016

Вам VPN никак пока не поможет.

Я в этих ESP не особо понимаю, но у клиентской библиотеки есть способ посмотреть, что она получила в качестве IP / Netmask / Gateway / DNS ?

lennen
Offline
Зарегистрирован: 10.11.2015

sadman, немного подредактировал прошлый пост. Получается, у меня все время есть связь с внешним Интернетом. Поэтому даже когда сети "locator" нет, я могу заходить на сайты. Ну факт есть факт, я в шоке, что можно в таком случае глянуть?) Я бы конечно мог бы говорить про кеш и тп, но я сам понимаю, что бред какой-то. Но вот лежит клиент. Сервер давно отключен. Интернет на компьютере отключен из USB. И клиент шлет мне данные уже с моего сайта.

sadman41
Offline
Зарегистрирован: 19.10.2016

Выходит, что Илон Маск уже запустил свой всепланетный Интернет?

Но я думаю, что магию тут искать рановато. Есть wi-fi клиент (ESP). Он куда-то подключился (к соседу на открытую точку может), получил  IP / Netmask / Gateway / DNS. Ими и оперирует. Во втором скетче ищите возможность посмотреть эти данные. После этого размышляйте - кто этому клиенту ресолвит FDQN во внешний IP.

 

lennen
Offline
Зарегистрирован: 10.11.2015

Так это стандартные примеры же. Если подключился куда-то без пароля - ну ок, но это же не должно портить всю малину соединения. Как можно тогда сделать, чтобы по адресу example.com открывался именно мой сайт?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Доменные имена используют во внутренней сети - какая у людей интересная жизнь )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Поставьте ActiveDirectory без доменного имени...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Поставьте ActiveDirectory без доменного имени...

я уж точно не фанат винды, старый добрый Линукс, один раз настроил и забыл для небольшой сеточки в полсотни  компов WINS достаточно

lennen
Offline
Зарегистрирован: 10.11.2015

Ну ок, ок, не сошелся же мир на этих днс. 

Я вот так вбиваю, в браузере все работает в компьютере, а на клиенте Node MCU пишет "Connection Refused".

http://192.168.1.1:80/

Значит, видимо, что-то мой пример с сервером и точкой доступа не обеспечивает. А может у кого есть простенький вариант, как просто 2 вемос связать между собой без какого-либо роутера, чтобы одна из плат была в итоге точкой доступа... ?

lennen
Offline
Зарегистрирован: 10.11.2015

А не, когда по IP входишь все ок. Надо было просто правильный запрос сделать, на index.html.

Получается, полпроблемы, все-таки, решено, но что за хрень с нетом Илона Маска и халявным попаданием на сайты?

Подайте юному хакеру на понимание!!!

sadman41
Offline
Зарегистрирован: 19.10.2016

Думаю, что именно в приведенном примере порт не надо в url втыкать. Библиотека, возможно, с урезанным функционалом и не будет сплит на доменное имя и порт делать.

Refused - значит отвергнут. Причин множество - закрытый/неоткрытый порт (в том числе порт указанный на черте-знает каком хосте), файерволл... 

Юному хакеру я уже два раза написал, с чего начать. Выезжать на дом и его руками долбить по клавиатуре я не стану.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а связка ESP WiFi AccessPoint - wifi клиент чем не устраивает?