Есть ли библиотека Arduino, которая использует ARP для получения списка подключенных устройств в сети?
Я искал библиотеку, которая может выполнять команду ARP (протокол разрешения адресов) для возврата списка подключенных устройств в сети. Идея состоит в том, что он отправляет запрос на шлюз и получает список MAC-адресов подключенных в данный момент устройств в качестве своего рода запроса «кто дома».
Я поискал в библиотеках Arduino и не нашел ни одной, которая специально выполняла бы этот тип функций, поэтому я надеялась, что, возможно, она доступна в функции в более широкой сетевой библиотеке.
Конкретный сетевой интерфейс (Wi-Fi через ESP8266/ESP32 или Ethernet) не имеет значения, так как я еще не выбрал конкретную плату для работы. Меня интересует любое библиотечное решение, которое позволило бы мне опрашивать шлюз, чтобы узнать, какие устройства в данный момент находятся в сети, без необходимости покупать специальное устройство, такое как Фингбокс.
Есть ли какие-нибудь рекомендации по библиотеке, включающей эту функцию, или по подходу, который позволил бы мне отправлять команды ARP по сети?
@tshimkus, 👍1
Обсуждение2 ответа
Лучший ответ:
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
Я искал ту же функцию, но думаю, вам не нужно запрашивать шлюз.
Моя идея состоит в том, чтобы перебрать все действительные IP-адреса, отправить пинг каждому из них (не имеет значения, если они не отвечают на пинг), и у нас должен быть MAC для этого IP. Затем проверьте, находится ли этот MAC-адрес в списке, сохраненном в каком-то энергонезависимом пространстве (может быть на SD-карте), и нет ли его в списке «известных одноранговых узлов». список, добавьте его и отправьте сообщение с предупреждением о новом устройстве, добавленном в сеть. Использование MAC-адреса вместо IP-адреса для идентификации устройств позволит избежать проблем с динамическими IP-адресами, распознаваемыми как новые.
- Чтение данных из Google Таблиц с помощью Nodemcu
- WiFiClient::connected() не работает
- Установка параметров после компиляции
- Сколько мА / ч в ESP8266-01 Работает в LiPo-аккумуляторе, если функция WI-FI постоянно включена
- ESP32 не подключается к Wi-Fi
- Команда продолжает повторяться, потому что веб-страница пытается обновить
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
способ, которым я это делаю, заключается в цикле от 0 до 255 и сканировании каждого локального IP-адреса., @dandavis
@dandavis, я чувствую, что это то, что делают команда DOS arp и такие приложения, как Fing. Я думаю что-то вроде [
WiFi.ping()
](https://www.arduino.cc/en/Reference/WiFi101Ping), @tshimkus