Как установить связь между сервером в интернете и сервером в локальной сети WiFi роутера?
Здравствуйте.
Делаю IoT систему и возникло пару вопросов по IP и маршрутизации.
Что имеется
* Микроконтроллер NodeMCU с WiFi модулем ESP8266 (C, C++) в качестве WebServer'а
* Мобильный 2G интернет-флэшка включена в WiFi роутер
* NodeJS сервер на домене
* Forntend на домене
Последовательность действий
* NodeMCU подключается к WiFi роутеру и поднимается на своём адресе, например 192.168.0.100:80
* NodeJS сервер должен стучатся POST запросами на NodeMCU.
* NodeMCU принимает запросы NodeJS сервера и тоже может стучатся POST'ами на NodeJS сервер.
* Frontend стучится на NodeJS сервер, сервер проверят, обрабатывает и стучится на NodeMCU.
В чем проблема
Вроде все просто, но проблема в IP. На какой адрес будет стучатся NodeJS сервер если NodeMCU поднялся в локальной сети?
Когда frontend, NodeJS и NodeMCU находятся в одной локальной сети роутера, все работает, но как это перевести в интернет?
Вопрос решил с помощью протокола MQTT. Принцип работы очень похожий на WebSocket.
NodeMCU соединяется с NodeJS сервером (mqtt брокер, поднятый на mosca) и обменевается пакетами. В таком случае NodeJS серверу не нужно знать IP NodeMCU.
вам нужен белый ip, либо обращаться по dns (сервисы no-ip). Белый ip назначать либо сразу на железку, либо NAT с белого ip на серый ip железки в локальной сети.
Ошибочное мнение.
Общаться по DNS нельзя - это служба доменных имен. Единственное что она делает - дает ответы.
Вы ей сообщаете домен, она отвечает какой у этого домена IP адрес.
Если у человека нет белого адреса - каким образом тут поможет эта служба?
АртемЪ, т.е. зарезолвить его по статичному dns имени, если у него будет динамический белый ip не получится? может я не совсем правильно выразился, но когда говорил про белый ip - имел ввиду белый статический. совет про dyn dns тоже имеет место быть
BRAGA96, почитайте про dynamic dns , сервисы вроде no-ip предоставляют это фактически бесплатно или за небольшую плату. но вопрос в том, сможет ли ваш сервис работать с таким решением? это нужно уже будет узнавать на практике.
максимально простое решение (но более дорогое) - аренда белого статического адреса у провайдера.
АртемЪ, Я так понял у меня 2 варианта.
1) Не посылать запросы с NodeJS сервера на NodeMCU, только принимать. Нужен будет один белый IP для локальной сети роутера?
2) Принимать/Посылать запросы, нужны белые IP для всех NodeMCU
Вам нужен белый IP адрес, без него никак.
Причем на каждом клиенте.
Это 60-80рублей в месяц примерно на каждого клиента.
Без этого работать не будет никак.
Ну или меняйте архитектуру, чтобы стучался клиент, а не сервер, тогда вам нужен будет белый адрес только на сервере.
BRAGA96, поясню, у Вас видимо хостинг с доменом и поднятым Nodejs - это серверная сторона, которая принимает запросы, а Ваш NodeMCU это клиент, который отправляет серверу запросы\ответы.
Учитывая скудность информации, непонятно, можете ли вы организовать vpn между сервером и роутером, если да, тогда Ваши веб сервера будут в одной сети. Но для этого серверу обязательно нужно иметь белый адрес.
BRAGA96, Я особо не вникал в вашу архитектуру что у вас на чем, да это и не важно.
Если у вас инициатор соединения сервер, именно он подключается к клиентам.
А чтобы куда-то подключиться - нужен адрес. В итоге всем клиентам нужны белые IP адреса.
А у сервера белого адреса может и не быть.
Если у вас инициатор соединения клиент - он подключается к серверу. Поэтому достаточно одного белого IP для сервера, а у клиентов наличие белого адреса не требуется.
В общем если проще - белые адреса нужны тем к кому будут подключаться.
BRAGA96, под клиентом имеется ввиду приложение, которое инициирует IP-соединение. если инициирует NodeMCU - то он является клиентом в данном конкретном случае. если инициирует NodeJS - то клиент он. если оба инициируют, то они оба выступают в роли клиентов.
BRAGA96, Для начала выясните какие адреса на данный момент предлагает ваш провайдер.
Выяснить очень просто - посмотрите какой адрес вы получили от провайдера в настройках сети.
Обычно это либо белые динамические - что очень хорошо, либо серые.
Далее - обычно адрес который выдает провайдер присваивается роутеру, а вся локальная сеть на серых адресах.
В таком случае нужно будет пробрасывать порты с роутера на тот хост где будет крутится программа принимающая запросы.
Мой вариант - унжен упр сервер в вебе с внешним IP. И стучаться только через него.
Вариант два - я выбрал его для своих задач - все клиенты вначале ломятся к собственному VPN в инете, и уже общаются внутри впн сети. В таком случае на клиенте может быть любой интернет, всё будет пучком.
А что скажете по поводу WebSocket?
Можно наладить связь, NodeJS и NodeMCU пожмут друг другу руки и никаких vpn, никаких белых ip. Из минусов только к-во трафика, будет ли оно большим. А из плюсов это realtime связь между NodeMCU и NodeJS, что даже лучше чем POST запросы. Или здесь тоже есть подводный камень и не получится с socket'ами?
Что если использовать протокол MQTT, только слышал о нём, не знаю возможно ли реализовать его в моём случае, но он как раз создан для плохого соединения и IoT