Достучаться к esp32 (находящейся за роутером) - из внешнего интернета

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Всем доброго!

Знаю, вопрос уже жеванный -пережеванный :-).

 Хотя бы даже тут. 

Но вопрос не в этом. Несколько иной будет вопрос. Я уже знаю, что для того, чтобы достучаться извне-к ардуине ethernet (или esp32-в моем конкретном случае), находящейся за роутером-нужен проброс портов, настройка DDNS, регистрация на noip.com.

У меня же сейчас, суть сервиса заключается в том, что (пошагово):

1) esp32 подключается к wifi сети роутера;

2) при каждом подключении - esp32 узнает и передает свой текущий ip адрес на удаленный веб сервер -во внешнем интернете.

 

САМ ВОПРОС (кому то покажется глупым- просто я так не делал, поэтому спрашиваю): может ли теперь (зная текущий ip адрес, внешний веб сервер -  достучаться до esp32 ? Или всё равно нет?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Всё равно нет, потому что IP у ESP - во внутренней сети 192.168.* Без NAT не обойтись.

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Ок, я тоже так думал-сейчас глянул свой внешний ip- он 37.... что то там. А внутренний как раз 192.168.*

Ок, тогда несколько перефразирую вопрос: у меня этот сервис будут юзать всякие люди, не сильно сведущие в таких делах. То есть: настроить DDNS, NAT и т.д. - это такие страшные слова для них -что дальше можно не продолжать :-)))))

САМ ВОПРОС: есть ли некий простой автоматический способ дать возможность достучаться к любой esp32, находящейся за роутером-из внешнего интернета- без настройки всяких сложных вещей? :-)

P.S. Будут пользовать условно "домохозяйки". Поэтому все эти страшные слова-темный лес для них. Я то-настрою. Они- гарантированно нет.

rkit
Offline
Зарегистрирован: 23.11.2016

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

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Ну либо на сервере постоянно обновляется некий файлик -минимального веса, а esp32 постоянно запрашивает этот файлик. Скажем раз в сколько миллисекунд.. Или базу данных некую. И если есть изменение-исполняет. 

Тоже вполне по-моему. Временной лаг может и будет-но не сильный.

Тогда даже не надо достукиваться до esp32. Она сама всё что надо- с сервера забирает...

rkit
Offline
Зарегистрирован: 23.11.2016

Какой файлик, господи. Стандартный сервер сообщений, поддерживает постоянное соедниение, никакой задержки. Тот же пресловутый mqtt.

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Ну вот. И это будет самое простое. Зачем стучать с той стороны-если можно с этой :-)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Интерес энтомологический: а два доллара в месяц за  VPS в Амстердаме или Франкфурте, который решит все подобные траблы, это большая брешь в бюджете?

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Поясните свою мысль. И причем тут VPS? Сервис то "железный". То бишь вебсайт+железные устройства у пользователей.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

mu_ssina пишет:

Поясните свою мысль. И причем тут VPS? Сервис то "железный". То бишь вебсайт+железные устройства у пользователей.

????? Тугой?

VPN туннель от твоего роутера на VPS, например на OpenVPN. Проброс порта с реального IP на VPS-ке на внутренний IP твоего ESP32. Я где-то полгода назад тут это показывал. Но нормальному админу показывать не надо, это  с закрытыми глазами и после поллитра текилы строится за полчаса.

 

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Для начала: я вам не тыкал. Это раз. 

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

Я нигде словом не обмолвился, что я "супер-пупер-админ-решаю-всё-за-2-секунды". Я-спросил совета.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

mu_ssina пишет:

Для начала: я вам не тыкал. Это раз. 

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

Я нигде словом не обмолвился, что я "супер-пупер-админ-решаю-всё-за-2-секунды". Я-спросил совета.

Бате своему советы давай, если знаком, это раз.

Два - в инете принято обращение на "ты", а "вы" это заявка на срач. Это сосунки многие уже не помнят, но динозавры, как я, еще помнят.

Три  - шолпты... Это тебе нужен ответ, а не мне. Хочешь слушай, не хочешь - пшел вон отсюда.

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Я твоих советов, "динозавр" сраный вроде как не спрашивал :-) Это ты влез в чужую тему, устроил срач на пустом месте (на вежливое обращение "ВЫ" -смею заметить!) . Что говорит о тебе многое. Не всегда ум приходит с годами-иногда годы приходят одни :-))))))))

Вобщем, проходи мимо человек, не загораживай свет :-) 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

mu_ssina пишет:

Я твоих советов, "динозавр" сраный вроде как не спрашивал :-)


Вот как раз брехня. Их и спрашивал. Так что мало что дурак, ещё и брехун!

inspiritus
Offline
Зарегистрирован: 17.12.2012

Тема собственностью не является.

каждый волен писать что считает необходимым.

если написанное неприемлемо приходит модер и разбирается

достучаться инициативно не может, пакет от сервера придет только как ответ на пакет изнутри сети

то, что Вам надо называется белый IP и проброс порта. Гуголь в помощь

Komandir
Offline
Зарегистрирован: 18.08.2018

ТС загуглить VPN не судьба ?

rkit
Offline
Зарегистрирован: 23.11.2016

VPN сложно для домохозяек, не годится.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rkit пишет:

VPN сложно для домохозяек, не годится.

А ты так понял, что у ТС и устройства у домохозяек и фронт-енд? Я то подумал, что устройства в известном месте. Может я не прав.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Имхо самое простое, как правильно предложит rkit - MQTT в облаке, и пздц головнякам. И пущай обмениваются топиками, как хотят, не нужен внешний IP, достаточно только продумать уникальное именование каждой ESP в системе, чтобы это было именем клиента для MQTT - и всё, остальное работает уже и так, искаропки.

Уникально именовать можно, например, перед отдачей девайса клиенту, прописывая в память какой-нибудь GUID, сгенерённый той же виндой, или любым онлайн-сервисом генерации, коих как говна за баней.

rkit
Offline
Зарегистрирован: 23.11.2016

В esp32 есть глобально уникальный MAC-адрес.

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Кстати да (насчет MAC адреса)! 

А в целом, в любом случае-всем спасибо за то, что нашли время зайти и отписаться! ;-) 

Уже копаю плотно MQTT....

P.S. да, сервис железный - то есть: а) ручное управление по bluetooth со смартфона или б) есть сайт -с которого происходит удаленное управление железным устройством, если человек находится не дома(почему не напрямую со смартфона-этому есть свои резоны;-) ) 

Места расположения железных устройств заранее неизвестны, владельцы-условные "домохозяйки". Которые если на сайт зайти сумеют-и то спасибо...Настроить что то сложное-вообще никак им:-))))

inspiritus
Offline
Зарегистрирован: 17.12.2012

Но arp не везде пролезает, чтобы работать по мас ам

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

кстати часто интернет юзеры имеют внешний адрес роутера из диапазона 10.0.0.0 и это означает, что они уже во внутренней подсети и тут форвардинг должен протаптывать провайдер

тут уже девайс сидит за двумя маскарадингами 

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

inspiritus пишет:

Но arp не везде пролезает, чтобы работать по мас ам

 

Я так понимаю, что он говорил не о протоколе arp, а о способе раздобыть постоянно уникальное имя для девайса, -в рамках системы MQTT (то есть или придумывать постоянно самому, или взять готовый MAC-ничего не выдумывая). 

Могу и ошибаться....

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А бридж (или как там правильнее говорить) не подойдёт? Пусть роутер отдаст все права по авторизации esp32 и она получит внешний ip, правда такое решение возможно если интернет только для неё. 
Но лично бы я, имея ввиду, что все равно используется какой-то ресурс в интернете (общий), использовал в качестве этого ресурса дешевую vps и поднял бы VPN на том же openVPN. Это проще и доступнее. Куда железку не принеси - она «понюхала интернет» и автоматом подняла соединение и, к примеру, оповестила что доступна. 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Структуру нарисуйте, о которой гоаорите, с адресами и протоколами

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

BOOM пишет:

Но лично бы я, имея ввиду, что все равно используется какой-то ресурс в интернете (общий), использовал в качестве этого ресурса дешевую vps и поднял бы VPN на том же openVPN. Это проще и доступнее. Куда железку не принеси - она «понюхала интернет» и автоматом подняла соединение и, к примеру, оповестила что доступна. 

То есть, юзеру не потребуется пробрасывать порты на роутере? 

Просто повторюсь-это будет домохозяйка-которая не сможет:-)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

mu_ssina пишет:

То есть, юзеру не потребуется пробрасывать порты на роутере? 

В реализации с VPN - ничего делать не придется, только "дать доступ в интернет".

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

inspiritus пишет:

Структуру нарисуйте, о которой гоаорите, с адресами и протоколами

Это вопрос мне?

rkit
Offline
Зарегистрирован: 23.11.2016

BOOM пишет:

mu_ssina пишет:

То есть, юзеру не потребуется пробрасывать порты на роутере? 

В реализации с VPN - ничего делать не придется, только "дать доступ в интернет".

ЭЭм, а VPN клиент сам по себе волшебно где-то поднимется?

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Всем доброго!

В общем пытаюсь поднять MQTT подключение.

Накопал мануал-пытаюсь на его основе сотворить нечто свое :-)))

Итак мануал: все ок- но он для Esp 8266:https://habr.com/ru/post/393277/  . Пытаюсь переделать под ESp32.

С тех времен, когда был написан мануал - бесплатные тарифы www.cloudmqtt.com уже закончились. Поэтому накопал такой сервер:

https://mqtt.4api.ru/  

 

В принципе не особо сложно. Но! Так как я изучаю java- а это C++ (насколько мне известно), возникла ошибка -видимо скетч был изначально с ошибкой. Но как исправить не знаю, т.к. мне такая структура незнакома. Любому совету буду благодарен.

Ругается на строку 030(эта конструкция мне незнакома) и на строку 046 (это знакомо-но пока не пойму, почему).

Сам скетч(если получится у вас запустить и протестить его на этом бесплатном MQTT, было бы вообще прекрасно. Но -не наглею-даже совету буду рад:-):

// Светодиод подлкючен к 5 пину
// Датчик температуры ds18b20 к 2 пину


#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const char *ssid = "Имя вайфай точки доступа"; 
const char *pass = "Пароль от точки доступа"; 

const char *mqtt_server = "Имя сервера MQTT"; // 
const int mqtt_port = Порт для подключения к серверу MQTT; // например 9000
const char *mqtt_user = "Логин от сервера"; 
const char *mqtt_pass = "Пароль от сервера"; 

#define BUFFER_SIZE 100

bool LedState = false;
int tm=300;
float temp=0;

// Функция получения данных от сервера

void callback(const MQTT::Publish&pub)
{
Serial.print(pub.topic()); // выводим в сериал порт название топика
Serial.print(" => ");
Serial.print(pub.payload_string()); // выводим в сериал порт значение полученных данных

String payload = pub.payload_string();

if(String(pub.topic()) == "test/led") // проверяем из нужного ли нам топика пришли данные
{
int stled = payload.toInt(); // преобразуем полученные данные в тип integer
digitalWrite(5,stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
}
}

WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);

void setup() {

sensors.begin();
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
pinMode(5, OUTPUT);
}

void loop() {
// подключаемся к wi-fi
if (WiFi.status() != WL_CONNECTED) {
Serial.print("Connecting to ");
Serial.print(ssid);
Serial.println("...");
WiFi.begin(ssid, pass);

if (WiFi.waitForConnectResult() != WL_CONNECTED)
return;
Serial.println("WiFi connected");
}

// подключаемся к MQTT серверу
if (WiFi.status() == WL_CONNECTED) {
if (!client.connected()) {
Serial.println("Connecting to MQTT server");
if (client.connect(MQTT::Connect("arduinoClient2")
.set_auth(mqtt_user, mqtt_pass))) {
Serial.println("Connected to MQTT server");
client.set_callback(callback);
client.subscribe("test/led"); // подписывааемся по топик с данными для светодиода
} else {
Serial.println("Could not connect to MQTT server");
}
}

if (client.connected()){
client.loop();
TempSend();
}

}
} // конец основного цикла

// Функция отправки показаний с термодатчика
void TempSend(){
if (tm==0)
{
sensors.requestTemperatures(); // от датчика получаем значение температуры
float temp = sensors.getTempCByIndex(0);
client.publish("test/temp",String(temp)); // отправляем в топик для термодатчика значение температуры
Serial.println(temp);
tm = 300; // пауза меду отправками значений температуры коло 3 секунд
}
tm--;
delay(10);
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ругаеца-то какими словами?

пропробуй так 

void callback(const MQTT::Publish &pub)

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

DetSimen пишет:

Ругаеца-то какими словами?

пропробуй так 

void callback(const MQTT::Publish &pub)

 

Выглядит это так(поправил):


ESP32_MQTT_2:30:21: error: 'MQTT' does not name a type

ESP32_MQTT_2:30:35: error: expected unqualified-id before '&' token

ESP32_MQTT_2:30:35: error: expected ')' before '&' token

ESP32_MQTT_2:30:36: error: expected initializer before 'pub'

ESP32_MQTT_2:30:21: error: 'MQTT' does not name a type

ESP32_MQTT_2:30:35: error: expected unqualified-id before '&' token

ESP32_MQTT_2:30:35: error: expected ')' before '&' token

ESP32_MQTT_2:30:36: error: expected initializer before 'pub'

 

А потом закомментил этот кусок кода, глянуть, где еще есть косяки(то что я закомментил, не должно вызвать ошибку вроде) и вылезло вот это еще:

no matching function for call to 'PubSubClient::PubSubClient(WiFiClient&, const char*&, const int&)'

 

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Два сообщения запостилось-удалил одно...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

скорее всего какой то заголовочный файл в котором обьявлен тип MQTT не подключен.  Ищи, где обьявляется этот тип и подключай #include-ом

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Ок, исправил.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вопщем, вот это 

ESP32_MQTT_2:30:21: error: 'MQTT' does not name a type

говорит о том, что в доступных программе файлах нигде не описан тип MQTT.  Пока не найдешь заголовочник, где он описан, и не подключишь его,  дальше тебя не пустют

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Ок, буду дальше копать...

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Всё, удалось поднять MQTT! 

Долго копался с кодом, который я постил выше (где пытался переделать код от Esp 8266 - в ESP32). 

В конце концов надоели мне все эти глюки-и пошел гуглить. В рунете ничего сносного не нашел-а в буржунете моментально!

Короче говоря, если кто в будущем будет копать эту же тему, вот тут лежит полностью рабочий код: https://iotdesignpro.com/projects/how-to-connect-esp32-mqtt-broker

Все сделал по мануалу как там и без проблем настроилось подключение  и сообщение в esp32 с внешнего интернета проходят без проблем!

Повторюсь для тех, кому лень лопатить все, что выше: esp32 подключена по wifi -к сети роутера. И с помощью mqtt - удалось получить соединение с ней, без всяких пробросов портов, DDNS и.т.д. 

Как сказал бы чукча "моя счастлива" :-))))

Всем спасибо!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

mu_ssina пишет:

Как сказал бы чукча "моя счастлива" :-))))

Ну а тебе что говорили? ;) Всё правильно сделал ;)

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Всем доброго, еще раз!

Сейчас ломаю голову вот над чем-может кто подскажет чего...

Хочу установить на вебсервер -mqtt брокер. Под вебсервером имеется в виду купленный хостинг. По ряду причин, не хочу пользоваться существующими платными/бесплатными mqtt брокерами - нужно запустить свой, на своем хостинге. 

Вот и думаю...Весь интернет полон историй :-)  - как установить на ubuntu, debian; на raspberri и т.д. А как поставить это добро -на ПОКУПНОЙ ХОСТИНГ-вообще в упор не вижу.

Может конечно чего не знаю или не понимаю... В общем, как всегда- любому совету буду рад...

P.S. пытался с Mosquitto -вот отсюда: https://mosquitto.org/download/

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

Установить можно на VPS/VDS/etc.
При покупке http/email/dns хостинга ничего кроме оплаченного использовать не получится.

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Спасибо! Подозревал нечто такое...

mu_ssina
Онлайн
Зарегистрирован: 30.08.2013

Заодно спрошу еще такую штуку-может есть какое простое решение-если кто в курсе:

есть ли готовая некая система, которая позволяет создать mqtt брокер на vps, на котором могут регистрироваться чужие люди? Если с нуля писать -это понятно, можно реализовать что угодно. А есть ли готовые системы, которые позволяют это ?

Вкратце, для чего нужно: мои железки на базе esp32 будут находится у абсолютно разных людей. Хочу, чтобы при коннекте к домашней wifi- esp32 коннектилась к серверу mqtt, регилась автоматом на нем и для нее заводился там аккаунт(при коннекте передается ее MAC-адрес, как уникальное имя+ сгенеренный уникальный пароль. Все это происходит автоматом, "под капотом"-невидимо для пользователя).

Зачем это надо: убрать с пользователя чисто технический геморрой по максимуму. Приконнектился к wifi-и управляй esp32 с сайта. А как там и что происходит "под капотом"- до барабана... Вот так хочу выстроить. Программистов, чтобы собрать систему уже нашел. Только вот думаю, может готовое есть? 

Интересует именно серверная часть для vps. Насчет скетча для esp32- там все прозрачно и понятно.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Что мешает на сервере поднять простенький скрипт, который по переданным данным будет дёргать mosquitto_passwd и возвращать ESP данные для авторизации в брокере? Заодно - можно миррорить данные юзеров в любую БД, тот же мускуль.

Короче: https://mosquitto.org/man/mosquitto_passwd-1.html - ну и вообще весь man по mosquitto смотреть, всё решаемо.