Есть ли библиотека Arduino, которая использует ARP для получения списка подключенных устройств в сети?

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

Я поискал в библиотеках Arduino и не нашел ни одной, которая специально выполняла бы этот тип функций, поэтому я надеялась, что, возможно, она доступна в функции в более широкой сетевой библиотеке.

Конкретный сетевой интерфейс (Wi-Fi через ESP8266/ESP32 или Ethernet) не имеет значения, так как я еще не выбрал конкретную плату для работы. Меня интересует любое библиотечное решение, которое позволило бы мне опрашивать шлюз, чтобы узнать, какие устройства в данный момент находятся в сети, без необходимости покупать специальное устройство, такое как Фингбокс.

Есть ли какие-нибудь рекомендации по библиотеке, включающей эту функцию, или по подходу, который позволил бы мне отправлять команды ARP по сети?

, 👍1

Обсуждение

способ, которым я это делаю, заключается в цикле от 0 до 255 и сканировании каждого локального IP-адреса., @dandavis

@dandavis, я чувствую, что это то, что делают команда DOS arp и такие приложения, как Fing. Я думаю что-то вроде [WiFi.ping()](https://www.arduino.cc/en/Reference/WiFi101Ping), @tshimkus


2 ответа


Лучший ответ:

3

ARP обычно не используется так, как вы описали. Согласно спецификации, чтобы преобразовать IP-адрес в MAC-адрес, вы передаете запрос ARP для IP-адреса и получаете одноадресный ответ от хоста, чей это адрес, а не от маршрутизатора. Он также разрешает только один IP-адрес в одном запросе; он не возвращает содержимое всего кеша ARP.

Хотя вы потенциально можете отправлять одноадресные ARP-запросы на маршрутизатор, никто не может догадаться, ответит ли маршрутизатор — это не обязательно. По спецификации должен отвечать только компьютер, IP-адрес которого запрашивается, поэтому маршрутизатор не должен, если вы не отправили ему запрос ARP для его IP-адреса. Вам также придется отправить один запрос для каждого IP-адреса в диапазоне, указанном сетевой маской локальной сети.

Лучше использовать SNMP, если его поддерживает маршрутизатор. SNMP может считывать весь кэш ARP маршрутизатора с очень небольшими издержками (и с очень небольшим количеством обменов пакетами).

Есть реализации SNMP для ESP32 и ESP8266, но их, вероятно, будет сложно использовать. Google найдет их для вас.

,

Спасибо, поищу библиотеки SNMP. Я думал, что ARP — это имя протокола, который возвращает таблицы маршрутизации, поскольку это команда DOS, которая возвращает список подключенных устройств. MAC-адресация была бы наиболее полезной, поскольку IP-адреса устройств обычно могут меняться., @tshimkus

Это имя этой команды, но она возвращает не таблицу маршрутизации, а таблицу преобразования MAC-адресов компьютера, на котором вы ее запускаете, а не маршрутизатора. Протокол отличается от команды., @romkey


1

Я искал ту же функцию, но думаю, вам не нужно запрашивать шлюз.

Моя идея состоит в том, чтобы перебрать все действительные IP-адреса, отправить пинг каждому из них (не имеет значения, если они не отвечают на пинг), и у нас должен быть MAC для этого IP. Затем проверьте, находится ли этот MAC-адрес в списке, сохраненном в каком-то энергонезависимом пространстве (может быть на SD-карте), и нет ли его в списке «известных одноранговых узлов». список, добавьте его и отправьте сообщение с предупреждением о новом устройстве, добавленном в сеть. Использование MAC-адреса вместо IP-адреса для идентификации устройств позволит избежать проблем с динамическими IP-адресами, распознаваемыми как новые.

,