Клиент + сервер 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 клиент чем не устраивает?