Клиент + сервер DNS, Wemos + Node MCU - работает через браузер компьютера, но не между 2-мя устройствами
- Войдите на сайт для отправки комментариев
Пнд, 24/12/2018 - 14:24
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.
Я еще немного поразбирался, получается интересная вещь. В клиенте мне удалось добиться того, что вылетает что-то типа "Вот такой сайт. Вы можете использовать этот домен для своих проектов, дерзайте! ляляля". И я ничего не понял, у меня-то написано просто Hello World в примере. Откуда эта хрень берется? Возможно, истина где-то рядом, ну можете кто-то протестить, просто я относительно новичок по IoT, хотя в проектах вроде шарю. Что-то с адресацией + что именно и что это у меня за строки вылезали с ссылкой на какой-то левый сайт?
Пинг-то после ресолва куда ведет - смотрели?
А то у нас в колхозе был случай... настроили AD на домен abcd.com (условно). Деньги на регистрацию решили не тратить... Ну и юзали его спокойненько, пока китайцы какие-то не зарегистрили его на себя. Теперича ежели VPN не забыл включить, то к себе на RDP попадаешь, а если забыл - на иероглифы ))
Вот этот момент как раз плохо понимаю. Вроде действительно ведет на внешний 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 моего сайта в Интернете. И все, таки, что делать-то?)
Вам VPN никак пока не поможет.
Я в этих ESP не особо понимаю, но у клиентской библиотеки есть способ посмотреть, что она получила в качестве IP / Netmask / Gateway / DNS ?
sadman, немного подредактировал прошлый пост. Получается, у меня все время есть связь с внешним Интернетом. Поэтому даже когда сети "locator" нет, я могу заходить на сайты. Ну факт есть факт, я в шоке, что можно в таком случае глянуть?) Я бы конечно мог бы говорить про кеш и тп, но я сам понимаю, что бред какой-то. Но вот лежит клиент. Сервер давно отключен. Интернет на компьютере отключен из USB. И клиент шлет мне данные уже с моего сайта.
Выходит, что Илон Маск уже запустил свой всепланетный Интернет?
Но я думаю, что магию тут искать рановато. Есть wi-fi клиент (ESP). Он куда-то подключился (к соседу на открытую точку может), получил IP / Netmask / Gateway / DNS. Ими и оперирует. Во втором скетче ищите возможность посмотреть эти данные. После этого размышляйте - кто этому клиенту ресолвит FDQN во внешний IP.
Так это стандартные примеры же. Если подключился куда-то без пароля - ну ок, но это же не должно портить всю малину соединения. Как можно тогда сделать, чтобы по адресу example.com открывался именно мой сайт?
Не надо ставить телегу вперед лошади. Получите объективные данные о роутинге, потом думайте - должно это портить или нет. У меня историй много, только пересказывать лень.
Доменные имена используют во внутренней сети - какая у людей интересная жизнь )))
Поставьте ActiveDirectory без доменного имени...
Поставьте ActiveDirectory без доменного имени...
я уж точно не фанат винды, старый добрый Линукс, один раз настроил и забыл для небольшой сеточки в полсотни компов WINS достаточно
Ну ок, ок, не сошелся же мир на этих днс.
Я вот так вбиваю, в браузере все работает в компьютере, а на клиенте Node MCU пишет "Connection Refused".
http://192.168.1.1:80/
Значит, видимо, что-то мой пример с сервером и точкой доступа не обеспечивает. А может у кого есть простенький вариант, как просто 2 вемос связать между собой без какого-либо роутера, чтобы одна из плат была в итоге точкой доступа... ?
А не, когда по IP входишь все ок. Надо было просто правильный запрос сделать, на index.html.
Получается, полпроблемы, все-таки, решено, но что за хрень с нетом Илона Маска и халявным попаданием на сайты?
Подайте юному хакеру на понимание!!!
Думаю, что именно в приведенном примере порт не надо в url втыкать. Библиотека, возможно, с урезанным функционалом и не будет сплит на доменное имя и порт делать.
Refused - значит отвергнут. Причин множество - закрытый/неоткрытый порт (в том числе порт указанный на черте-знает каком хосте), файерволл...
Юному хакеру я уже два раза написал, с чего начать. Выезжать на дом и его руками долбить по клавиатуре я не стану.
а связка ESP WiFi AccessPoint - wifi клиент чем не устраивает?