• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как достучаться до esp через глобальную сеть ?

Ivanov

New member
Здравствуйте, возник вопрос. Как можно достучаться до сервера на esp.
В режиме клиента отправляют запрос на сервер (глобальный. www.my-server.com) данные обрабатываются вносятся в базу( которую esp8266 периодически считывает). При клике на кнопку сайта также вношу изменения в эту базу например ( GPIO1 - 1/0) вкл/выкл - диода.
Это все работает, но есть подозрения что управление esp-хой через интернет можно сделать избежав постоянного опроса БД.
Как можно реализовать это?
Подключал esp к роутеру , на esp локальный сервер поднял, все работает.
Как до esp сервера достучаться из вне ( с веб сайта ) .
Спасибо
 

Petrynchyn

New member
1. Настроить DDNS на роутере или купить внешний IP у провайдера.
2. Настроить переброс нужных портов на роутере из внешнего IP на внутренний IP ESP.
 

Ivanov

New member
Как я понимаю при такой настройке весь трафик на определенный порт будет отсылаться на esp?
Можно ли при esp8266 ( клиенте ) на него отправлять данные get запросом с сайта?
Просто при отправке на сервер get запроса на esp приходит подтверждение в ответ с сервера.
Сервер как-то додалбливается до esp клиента.
Я и думаю , есть ли возможность отправки какого-нибудь файла с сайта на esp по нажатию кнопки.
 

Petrynchyn

New member
Как я понимаю при такой настройке весь трафик на определенный порт будет отсылаться на esp?
Да

Можно ли при esp8266 ( клиенте ) на него отправлять данные get запросом с сайта?
Можно реализовать нечто подобное WebSockets, для этого сервер сайта должен быть еще и сервером WebSockets -> ESP клиент подсоединяется по WebSockets к серверу WebSockets (держит с ним постоянное соединение) -> Web страница по WebSockets соединяется с сервером и передает команду (такстом) -> команда моментально передается на ESP -> если нужно ESP отвечает

Я и думаю , есть ли возможность отправки какого-нибудь файла с сайта на esp по нажатию кнопки.
По WebSockets можно и такое реализовать
 

CodeNameHawk

Moderator
Команда форума
DDNS стал платным для большинства роутеров.
Если на веб сайте есть php, то узнать ваш IP адрес, с которого работает ESP, позволяет переменная $_SERVER['REMOTE_ADDR']
пример простого использования на сайте :
PHP:
<?php
    echo $_SERVER['REMOTE_ADDR'];
?>
(ESP должна периодично обращаться к сайту, сохраняя IP адрес в файл.)
А дальше настроив
2. Настроить переброс нужных портов на роутере из внешнего IP на внутренний IP ESP.
сможете, зная свой IP адрес, управлять ESP с веб сайта.
 
Последнее редактирование:

Ivanov

New member
DDNS стал платным для большинства роутеров.
Если на веб сайте есть php, то узнать ваш IP адрес, с которого работает ESP, позволяет переменная $_SERVER['REMOTE_ADDR']
пример простого использования на сайте :
PHP:
<?php
    echo $_SERVER['REMOTE_ADDR'];
?>
(ESP должна периодично обращаться к сайту, сохраняя IP адрес в файл.)
А дальше настроив

сможете, зная свой IP адрес, управлять ESP с веб сайта.
Можете привести пример команды обращеия к esp с сервера
С клиента знаю как отправлять
Get /my-php.ph?i=1 HTTP/1.1
Host: my-site.com
Connection: close

А как выглядит запрос с сервера на клиент ?
 

CodeNameHawk

Moderator
Команда форума
На ESP запускаете свой веб сервер и подключаетесь к нему как обычно. (вместо my-site.com ваш IP адрес ESP)
 

Atom

Member
Здравствуйте, возник вопрос. Как можно достучаться до сервера на esp.
В режиме клиента отправляют запрос на сервер (глобальный. www.my-server.com) данные обрабатываются вносятся в базу( которую esp8266 периодически считывает). При клике на кнопку
Все зависит от вашего желания быть открытым чуваком и дать возможность незнакомым друзьям видеть ваши данные.
У рутерa обычно есть поддержка DDNS, как вам уже писали, настраивается она на доступ к рутеру извне. Далее на рутере делаете NAT-Port - то есть связываете внешний(WAN) порт рутера с определенным адресом и портом в локальной (LAN) сети рутера. Получаетсыа, что при обращении к выделенному DDNS внеснему адресу и указанному порту, рутер посредством NAT, будет пересылать это все на узел в своей и указанный порт.

Если у вас имеется домашний сервер, то можно на нем организовать аналог DDNS (больше инфы на сайте no-ip.org), затем настроить маскарадинг и далее тоже самое.

Оба эти пути имеют один недостаток: вы фактически создаете дырку в безопасности своей сети. И без особых талантов рискуете привлеч незванных гостей на исследование вашей сетки и компьютеров вней. Поэтому есть еще вариант - с выделенным внешним сервером, установки на нем VPN и связи через него с вашим рутером и узлами сети.


Вы решили MQTT изобрести?
Не всегда MQTT является панацеей. Например есть домашний сервер (а ля брокер)[извияюсь за мой французкий]. Обязан ли мусье устанавливать mosquitto, если у него на этом домашнем сервере и так крутится какой-то Апач для других домашних сервисов и проще сделать завязку на него? Тут все дело вкусов, возможностей и предпочтений. И уже в последнюю очередь желаний.
 
Не всегда MQTT является панацеей. Например есть домашний сервер (а ля брокер)[извияюсь за мой французкий]. Обязан ли мусье устанавливать mosquitto, если у него на этом домашнем сервере и так крутится какой-то Апач для других домашних сервисов и проще сделать завязку на него? Тут все дело вкусов, возможностей и предпочтений. И уже в последнюю очередь желаний.
Зачем изобретать велосипед и стрелять из пушки по воробьям?
Что касается всего остального - нужен внешний IP - адрес. У большинства провайдеров такая услуга есть.
 

Ivanov

New member
Оба эти пути имеют один недостаток: вы фактически создаете дырку в безопасности своей сети. И без особых талантов рискуете привлеч незванных гостей на исследование вашей сетки и компьютеров вней. Поэтому есть еще вариант - с выделенным внешним сервером, установки на нем VPN и связи через него с вашим рутером и узлами сети.
.
Имеется внешний хостинг в сети, можете поподробнее описать процесс установки на нем VPN и связь через роутер с узлами сети?
Как я понимаю этот вариант исключает проброс портов?
С пробросом портов получилось сделать, смущает безопасность всего этого дела.
 

lsm

Разработчик Smart.js
Команда форума
Имеется внешний хостинг в сети, можете поподробнее описать процесс установки на нем VPN и связь через роутер с узлами сети?
Как я понимаю этот вариант исключает проброс портов?
С пробросом портов получилось сделать, смущает безопасность всего этого дела.
Мы делаем так: ESP8266 создает постоянное secure websocket (WSS) соединение с сервером, сообщая свой уникальный ID устройства. А к серверу можно обращаться через WSS или обычный HTTPS, указывая в качестве адресата - ID устройства.

Вот пример.
 

CodeNameHawk

Moderator
Команда форума
С пробросом портов получилось сделать, смущает безопасность всего этого дела.
Не переживайте за свою безопасность. То, что вы сделали переброс порта, практически ничего не поменяло.
Ну попадет кто то с "интернета" на вашу ESP8266 и что. Комп вы не боитесь подключать напрямую к интернету, а в нем дыр дофига.
Да и большинство роутеров "дырявые".
 

lsm

Разработчик Smart.js
Команда форума
Не переживайте за свою безопасность. То, что вы сделали переброс порта, практически ничего не поменяло.
Ну попадет кто то с "интернета" на вашу ESP8266 и что. Комп вы не боитесь подключать напрямую к интернету, а в нем дыр дофига.
Да и большинство роутеров "дырявые".
Не соглашусь, коллега :)
Давать кому угодно управлять модулем - неправильно. Нужно использовать стандарты индустрии, в данном случае для шифрования - TLS, а для аутентификации - либо TLS client certs, либо руками пароли делать, либо другие варианты
 

Atom

Member
Имеется внешний хостинг в сети, можете поподробнее описать процесс установки на нем VPN и связь через роутер с узлами сети?
Как я понимаю этот вариант исключает проброс портов?
С пробросом портов получилось сделать, смущает безопасность всего этого дела.
Именно пробросом портов и занимается VPN - точно также, как и рутер, только программно.

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

Даже TLS мало поможет - нужно чтоб соединение было авторизовано. А еще лучше, чтоб работа была с сессией(чтом каждый раз пору пользователь/пароль не пересылать).

Ну а сделав вывод всего того же через https-сервер вы получаете в сухом остатке:
1. Надежную аутентификацию с обкатанными элементами защиты и возможностью реализации хоть какого угодно типа проверок.
2. Возможность организовать юзерфрендли тип данных или в виде API с любыми web-итерфейсами и протоколами(там правда вбор не особо: Soap и Rest).
3. Логически защитить локальную сеть от глобального доступа, предотвратит возможные вторжения: https получает запрос извне и обрабатывает свои обращения через vpn-соединение, ничем не выдавая себя.

PS: Пардон, по OpenVPN забыл. Я сам не особо мастер в настройке и выполнял ее первый раз (тем более уже года два назад). Обычно записываю все ходы, но в этот раз что то инструкции не нашел. Пользовался вроде вот этой инструкций Установки и настройка OpenVPN в Ubuntu Linux за 5 минут | Записки программиста

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

PPS:
Установка VPN на Ubuntu 12.04 сервере и клиенте.


mkdir /etc/openvpn/easy-rsa/

Скопируем шаблон для создания ключей:

cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa/


в этом каталоге ( /etc/openvpn/easy-rsa/) будут формироваться ключи. Если они будут созданы криво, то система не заработает.


открываем файл vars и изменяем там переменные под наши реалии:

export KEY_COUNTRY="US"

export KEY_PROVINCE="NZ"

export KEY_CITY="NewYourk"

export KEY_ORG="<myorg>"

export KEY_EMAIL="<admin@example.org>"

export KEY_CN=something


Важно! Значения переменных не должны повторяться! Значения в <> нужно заменить на свои.


после этого очищаем конфигурацию

source vars

,/clear-all

теперь идем в папку ./keys и меняем в файле ./keys/index.txt.attr значение параметра

unique_subject = no

если этого не сделать, то при генерации клиентского ключа возникнет сообщение


failed to update database

TXT_DB error number 2


, файл сертификата будет иметь размер 0 и не будет работать.


Затем возвращаемся назад, в каталог /etc/openvpn/easy-rsa и продолжим генерировать ключи:


./build-dh

./pkitool --initca

./pkitool --server server

./pkitool client



теперь в каталоге ./keys должны появиться файлы с именами ca.*, server.*, client.*. Их нужно скопирвать в папку /etc/openvpn. Так же туда нужно скопировать конфигурационный файл, но с другим именем:

mv ./openssl-1.0.0.cnf openssl.cnf


теперь для настройки сервера нужно распаковать его примерную конфигурацию :

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/cd /etc/openvpngunzip -d /etc/openvpn/server.conf.gz


в файле конфигурации server.conf проверяем параметры

ca ca.crtcert server.crtkey server.keydh dh1024.pem


Такие файлы должны лежать в той же папке. для большей безопасности я добавил к ним еще и путь:

ca /etc/openvpn/ca.crtcert /etc/openvpn/server.crtkey /etc/openvpn/server.key


Кроме того желательно изменить адрес выделяемой подсети. По умолчанию это 10.8.0.0, я поменял на 192.168.30.0. При серии экспериментов я добился того, что этот адрес у клиента гдето капитально прописался и сервер пингуется всегда, даже при отсутствии физического соединения с сервером.


стартуем конфигурацию:

service openvpn start

должно пойти сообщение, что демон нашел конфигурацию для server.


Теперь проверим, все ли там в порядке:

openvpn --config /etc/openvpn/server.conf

должен сообщить, что ничего ошибочного не нашел. Если есть ошибки, то нужно их исправить.


проверку того, что конфигурация работает нужно посмотреть в настройках сети:

ifconfig


должно вывести информацию о новом сетевом устройстве tun0.


разрешаем на сервере форвардинг

echo 1 > /proc/sys/net/ipv4/ip_forward

и добавляем новый разрешенный маршрут

iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o eth0 -j MASQUERADE

Его даже лучше добавить в файл конфигурации /etc/init.d/rc.local.


копируем файлы ca.crt, client.crt, client.key клиенту для использования в его конфигурации.


------- КЛИЕНТ -------

также устаноавливаем пакет, распаковываем конфигурацию клиента:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf.gz /etc/openvpn/cd /etc/openvpngunzip -d /etc/openvpn/client.conf.gz


В эту же паку (/etc/openvpn) копируем наши ключи и сертификаты. Так же меняем значения в cilent.conf:


ca /etc/openvpn/ca.crtcert /etc/openvpn/client.crtkey /etc/openvpn/client.key


Запуск и проверка точно такие же, как и для сервера.
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Не соглашусь, коллега
С чем вы не согласны? Я же не писал, что "Давать кому угодно управлять модулем - правильно." Доступ к модулю из интернета это одно, а возможность им управлять без разрешения это другое.
 
Сверху Снизу