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

Сканирование и поиск устройств в сети

ESP-01S

Member
Доброго времени суток.

Подскажите в ситуации: в локальной сети есть ESP-модуль, который исполняет функции условного сервера - накопление и обработка информации, переданной клиентами. Соответственно есть неизвестное количество клиентов, которые по HTTP протоколу ( http://адрес_сервера/update&key=val?key2=val2 ) эту информацию предоставляют. Естественно (для интереса и максимальной реалистичности) в сети присутствуют другие устройства, которые отношения работе всей системы не имеют (в данном контексте - мусор). Ни клиенты ни сервер не знают друг о друге вообще ничего, кроме общих принципов приема/предоставления информации: как у людей - мы знаем, что у каждого человека вверху голова, а ноги внизу, но не знаем ни имени ни места жительства, до тех пор, пока не познакомимся; при кормлении, еду мы направляем в верхнюю часть туловища, а обувь подталкиваем снизу.

Задачи:
для клиентов - узнать адрес сервера, куда каждый из них будет отправлять информацию;
для сервера - собрать адреса всех клиентов, которые в данный момент времени находятся в сети, чтобы отслеживать их активности и, при необходимости, запрашивать доп. информацию.

Мой вариант решения: каждый клиент при запуске проходит сеть по каждому IP от 192.168.*.2 до 255 по заранее известному HTTP адресу (напр. http://192.168.*.*/hello ) и если получаем заранее известный ответ ( напр. JSON {"type" : "server"} ) - значит "УРА - познакомились, сервер найден", дальше работаем по алгоритму. Таким сервер формирует для себя список адресов клиентов, с которым в дальнейшем и работает.

Одно НО: этот вариант ОЧЕНЬ долгий - если сервер "сидит" на 255-ом адресе, процесс поиска может весьма затянуться, а если клиент внезапно отсоединяется - для актуализации списка его нужно выполнять периодически ...

Может есть какие другие, более оптимальные и быстрые варианты?
Если можно, то с примерами кода.
 

Сергей_Ф

Moderator
Команда форума
 

nikolz

Well-known member
Доброго времени суток.

Подскажите в ситуации: в локальной сети есть ESP-модуль, который исполняет функции условного сервера - накопление и обработка информации, переданной клиентами. Соответственно есть неизвестное количество клиентов, которые по HTTP протоколу ( http://адрес_сервера/update&key=val?key2=val2 ) эту информацию предоставляют. Естественно (для интереса и максимальной реалистичности) в сети присутствуют другие устройства, которые отношения работе всей системы не имеют (в данном контексте - мусор). Ни клиенты ни сервер не знают друг о друге вообще ничего, кроме общих принципов приема/предоставления информации: как у людей - мы знаем, что у каждого человека вверху голова, а ноги внизу, но не знаем ни имени ни места жительства, до тех пор, пока не познакомимся; при кормлении, еду мы направляем в верхнюю часть туловища, а обувь подталкиваем снизу.

Задачи:
для клиентов - узнать адрес сервера, куда каждый из них будет отправлять информацию;
для сервера - собрать адреса всех клиентов, которые в данный момент времени находятся в сети, чтобы отслеживать их активности и, при необходимости, запрашивать доп. информацию.

Мой вариант решения: каждый клиент при запуске проходит сеть по каждому IP от 192.168.*.2 до 255 по заранее известному HTTP адресу (напр. http://192.168.*.*/hello ) и если получаем заранее известный ответ ( напр. JSON {"type" : "server"} ) - значит "УРА - познакомились, сервер найден", дальше работаем по алгоритму. Таким сервер формирует для себя список адресов клиентов, с которым в дальнейшем и работает.

Одно НО: этот вариант ОЧЕНЬ долгий - если сервер "сидит" на 255-ом адресе, процесс поиска может весьма затянуться, а если клиент внезапно отсоединяется - для актуализации списка его нужно выполнять периодически ...

Может есть какие другие, более оптимальные и быстрые варианты?
Если можно, то с примерами кода.
я делаю это так:
датчики работают в широковещательном режиме.
Сервер прослушивает порт и принимает данные от всех датчиков на этом порту.
Сервер различает датчики по мас-адресу либо по ID, который вы присваиваете датчику и тот передает его вместо мас-адреса.
Серверы могут различаться по номеру порта передачи, либо приема.
--------------------
Примерно так.
 

ESP-01S

Member
Извини, но я немного не понял идеи - по ссылке речь идет про WiFi-объявления и их применении в коммерческих целях.
Насколько я углубился в тему - это немного не то: там цели и задачи WiFi-рекламы, ее монетизация и пр. То есть, речь идет про организацию самой сети, а у меня работа с уже известным каналом - т.е. внутри уже подключенной сети.

я делаю это так:
датчики работают в широковещательном режиме.
Сервер прослушивает порт и принимает данные от всех датчиков на этом порту.
Вы за UDP речь ведете?
Как-то про него я и не подумал - никогда дел с ним не имел, потому этот вариант не рассматривал.
Правильно ли я понял, что "широковещательный режим" - это типа публичной радиостанции: кто-то вещает в сеть, а все вокруг, кто настроен "на волну" (в данном случае на порт) это слышат?
За идею спасибо - сейчас буду искать примеры и экспериментировать.
 

pvvx

Активный участник сообщества
Для этого, когда-то очень давно, был сделан DHCP, который присутствует в любом сегменте сети (роутере). Запрос к нему даст весь список устройств в данной сети и их имен.
Правильно ли я понял, что "широковещательный режим" - это типа публичной радиостанции: кто-то вещает в сеть, а все вокруг, кто настроен "на волну" (в данном случае на порт) это слышат?
Он так и работает.
Любое устройство включающееся в сеть получает от него свой IP. А кому какие IP выданы он и знает.
 

Сергей_Ф

Moderator
Команда форума
цели и задачи WiFi-рекламы, ее монетизация и пр
Вы считаете появление принтера или медиа-плеера в списке сетевых устройств - это монетизация? Это тот же широковещательный протокол для объявления устройств в сети.
 

Сергей_Ф

Moderator
Команда форума
Для этого, когда-то очень давно, был сделан DHCP, который присутствует в любом сегменте сети (роутере). Запрос к нему даст весь список устройств в данной сети и их имен.
DHCP разве показывает какие функции поддерживает каждое устройство?
Но список сканируемых устройств может значительно сократит, это да.
 

Сергей_Ф

Moderator
Команда форума

pvvx

Активный участник сообщества
Мой вариант решения: каждый клиент при запуске проходит сеть по каждому IP от 192.168.*.2 до 255 по заранее известному HTTP адресу (напр. http://192.168.*.*/hello ) и если получаем заранее известный ответ ( напр. JSON {"type" : "server"} ) - значит "УРА - познакомились, сервер найден", дальше работаем по алгоритму.
Так-же, любой нормальный роутер сразу отвечает посылкой пакета IGMP, что запрашиваемый в локальной сети адрес отсутствует. И ожидать соединения с ним не стоит.
Вроде цель понятна. Я ошибаюсь?
"в локальной сети есть ESP-модуль, который исполняет функции условного сервера" и он прописан по имени и любое обращение по этому имени (http://имя/update&key=val?key2=val2 ) попадет на данный сервер.
"Задачи:
для клиентов - узнать адрес сервера, куда каждый из них будет отправлять информацию;
для сервера - собрать адреса всех клиентов, которые в данный момент времени находятся в сети, чтобы отслеживать их активности и, при необходимости, запрашивать доп. информацию.
"
узнать адрес сервера - если нужен IP, то его знает DHCP.
 

pvvx

Активный участник сообщества
Конечно знает, но он вряд ли узнает, что это именно сервер ТС, если это не объявить.
A если не отвечать и не запрашивать - то как узнать? :)
Прикинуться шпионом в локалке?
Или порекомендуете написать свою IP сеть как это любит nikolz? :) :)
 

ESP-01S

Member
Для этого, когда-то очень давно, был сделан DHCP, который присутствует в любом сегменте сети (роутере). Запрос к нему даст весь список устройств в данной сети и их имен.

узнать адрес сервера - если нужен IP, то его знает DHCP.
А можно кратенький пример запроса к DHCP и его обработку?
А то гугл выдает только примеры с АТ-командами, без каких-либо обработок.

Показывает и функции, типа сервер времени или прочие.
И как "какие функции" влияют на вопрос топикастера?
Для DHCP-сервера мой сервер ничем не выделяется среди прочих устройств сети.
Как минимум по двум причинам:
1. это обычное присоединенное устройство, которое никак внешне себя не выделяет, кроме наличия открытого порта (в частности 21 и 80).
2. я даже представления не имею, как его специально выделить ... Буду очень признателен, если подкинете материал для изучения.

Но список сканируемых устройств может значительно сократит, это да.
То есть после запроса все-равно придется проходить каждое устройство и предпринимать попытки "персонального знакомства" - отсылать запрос http://адрес/hello и ждать ответ. Если ответ получен - значит оно, а если нет - идем знакомиться дальше.

На настоящий момент мне наиболее простым (с учетом найденных примеров) кажется вариант с использованием UDP - так сразу и практически явно в сеть вещается адрес сервера, а клиенты уже его подхватывают и дальше с ним работают.
 

pvvx

Активный участник сообщества
я делаю это так:
датчики работают в широковещательном режиме.
Т.е. пробуждают всех "спящих" в локалке? Конкретно не дают им войти в энерго-экономичные режимы и WiFi AP только и занят передачей каждому устройству этих ненужных ему пакетов. :) :)
Сервер прослушивает порт и принимает данные от всех датчиков на этом порту.
Это каким образом? UDP не гарантирует доставки.
Сервер различает датчики по мас-адресу либо по ID, который вы присваиваете датчику и тот передает его вместо мас-адреса.
А если сеть большая или присутствуют "неизвестные" - им тоже придут не зашифрованные данные с датчиков и Вася с горя начнет слать дубли пакетов обратно...
Хорошая котовасия :) :)
Серверы могут различаться по номеру порта передачи, либо приема.
А могут и цветом корпуса. :) :) :)
 

Сергей_Ф

Moderator
Команда форума
А можно кратенький пример запроса к DHCP и его обработку?
А то гугл выдает только примеры с АТ-командами, без каких-либо обработок.


Для DHCP-сервера мой сервер ничем не выделяется среди прочих устройств сети.
Как минимум по двум причинам:
1. это обычное присоединенное устройство, которое никак внешне себя не выделяет, кроме наличия открытого порта (в частности 21 и 80).
2. я даже представления не имею, как его специально выделить ... Буду очень признателен, если подкинете материал для изучения.


То есть после запроса все-равно придется проходить каждое устройство и предпринимать попытки "персонального знакомства" - отсылать запрос http://адрес/hello и ждать ответ. Если ответ получен - значит оно, а если нет - идем знакомиться дальше.

На настоящий момент мне наиболее простым (с учетом найденных примеров) кажется вариант с использованием UDP - так сразу и практически явно в сеть вещается адрес сервера, а клиенты уже его подхватывают и дальше с ним работают.
Сервер может периодически слать широковещательные рекламные пакеты. Клиенты слушают сеть и принимая пакет, посылают запрос. Всё.
Ssdp разве тут не подойдёт?
 

pvvx

Активный участник сообщества
По хорошему, вам необходимо в сервер встроить поддержку:

DHCP – общее
NETBIOS – это для windows
LLMNR – это для Linux
mDNS – это для iOS

Тогда любое устройство будет иметь возможность найти ваш сервер в локальной сети по имени.

Все эти сервисы и примеры к ним для ESP есть в Arduino.
 

Сергей_Ф

Moderator
Команда форума
По хорошему, вам необходимо в сервер встроить поддержку:

DHCP – общее
NETBIOS – это для windows
LLMNR – это для Linux
mDNS – это для iOS

Тогда любое устройство будет иметь возможность найти ваш сервер в локальной сети по имени.

Все эти сервисы и примеры к ним для ESP есть в Arduino.
А зачем? У него вполне конкретные клиенты на esp. Достаточно только одного протокола на сервере и клиентах.
 

pvvx

Активный участник сообщества
Сервер может периодически слать широковещательные рекламные пакеты. Клиенты слушают сеть и принимая пакет, посылают запрос. Всё.
Ssdp разве тут не подойдёт?
Вам для начала необходимо изучить различия Unicast, Broadcast и Multicast. Особенно обратить внимание как это обеспечивается (или нет) в WiFi.
А зачем? У него вполне конкретные клиенты на esp. Достаточно только одного протокола на сервере и клиентах.
Этого не было написано в условиях. А имея указанное - обеспечивает полную совместимость со всеми вариантами.
На телефоне удобно в строке эксплорера набирать http://111.222.333.444 ? Обычно он сопротивляется и не дает это сделать.
 

pvvx

Активный участник сообщества
И это не требуется на клиентах - это нужно только на сервере.
 

ESP-01S

Member
Вы считаете появление принтера или медиа-плеера в списке сетевых устройств - это монетизация?
Это тот же широковещательный протокол для объявления устройств в сети.
Действительно. Это я неправильно перевел слово "аdvertising" - по традиции я воспринял его как "реклама", "рекламной предложение" ...
 
Сверху Снизу