Как получить динамический IP любого устройства в локальной сети, используя MAC-адрес [Android]?

У меня есть устройство iOT, я знаю Mac-адрес устройства. Мое устройство iOT подключено к моему Wi-Fi, я хочу знать, есть ли способ узнать локальный IP-адрес этого устройства, используя его MAC-адрес? Мое требование - подключить приложение Android к тому же Wi-Fi, найти IP-адрес устройства, используя адрес Mac, и установить TCP-соединение. До сих пор я искал по этому поводу, я не получил идеального ответа на этот вопрос, для этого действительно требуется ssdp сканирование или есть какой-либо другой способ сделать это.

возможен ли RARP в Android?

пожалуйста, помогите мне .


person Dhiru    schedule 20.06.2018    source источник
comment
i have searched regarding this что this? В основном вам нужно перечислить все устройства в локальной сети и повторить их проверку их MAC-адреса. Я полагаю, вы не знаете, как получить список устройств в локальной сети?   -  person Vladyslav Matviienko    schedule 20.06.2018
comment
Спасибо за ваш комментарий @VladyslavMatviienko, я беспокоюсь о задержке, поэтому я не ищу список устройств, подключенных к той же сети, я хочу пропинговать устройство, используя mac-адрес, получить его IP, я хочу знать, есть ли способ сделайте это, если это невозможно, опубликуйте свой ответ, чтобы отсканировать все подключенные устройства к сети WIFI.   -  person Dhiru    schedule 20.06.2018
comment
На этот вопрос был дан ответ здесь stackoverflow.com/a/51773718/4466607   -  person Dhiru    schedule 11.08.2018
comment
Отвечено здесь: stackoverflow.com/a/51773718/4466607   -  person Dhiru    schedule 11.08.2018


Ответы (1)


Два, может быть, три возможных решения, о которых я знаю:

Вариант 1. Пропингуйте широковещательный адрес, затем прочитайте таблицу ARP

Это предполагает, что вы не можете запустить какой-либо специальный код на удаленном устройстве, для которого вы пытаетесь обнаружить IP-адрес, но у него есть включенный стек ICMP. (т.е. вы можете пропинговать его)

Предполагая, что это устройство поддерживает ICMP (ping). Вы можете отправить один или несколько пинг-запросов ICMP на широковещательный адрес вашей подсети и прослушивать ответы от всех устройств в подсети. Затем обратитесь к локальной таблице ARP, чтобы узнать, какие сообщения устройства вы возвращаете. Вы можете попробовать это из командной строки любого компьютера. Допустим, ваш локальный IP-адрес — 192.168.1.2, а маска подсети — 255.255.255.0. Отсюда следует, что широковещательный IP-адрес вашей подсети — 192.168.1.255. Поэтому вы можете сделать это в командной строке (Linux, Windows, Mac)

$> ping 192.168.1.255   // let this run for a few seconds, then cancel after it retries a few times
$> arp -a               // this will dump the local ARP table of every MAC to IP mapping discovered and cached 

Потребуется немного усилий, чтобы написать эквивалентный код для Android, чтобы сделать это, но это должно быть возможно. Возможно, вам придется использовать NDK, чтобы получить доступ к функциям сокета более низкого уровня для чтения таблицы arp. Возможно, вы сможете получить исходный Ethernet через recvmsg.

Вариант 2. Широковещательная рассылка UDP.

Это предполагает, что вы можете запустить какой-то код на удаленном устройстве, на которое оно может ответить. Он просто прослушивает назначенный порт (например, порт UDP 29999). Как и в предыдущем случае, устройство поиска Android просто отправляет широковещательное UDP-сообщение на широковещательный адрес маски подсети. Полезная нагрузка этого сообщения — просто ваш собственный протокол, чтобы спросить «у кого есть 88-66-aa-6c-d5-c1»? Аппарат чем-то отвечает на эффект "у меня 88-66-аа-6с-d5-с1". IP-адрес возвращается как адрес «от» в вызове recvfrom сокета. Вы также можете встроить его в полезную нагрузку протокола.

Вариант 3. Прошло некоторое время, но вот несколько советов. Я помню, когда работал над аппаратным продуктом с Wi-Fi, мы собирались сделать какой-то протокол автоматической настройки, где целевое устройство могло бы даже не на предполагаемом Wi-Fi, но мы хотели отправить ему какое-то сообщение. Мы экспериментировали с некоторым сочетанием широковещательной рассылки UDP на 255.255.255.255 и отправки пакета UDP на многоадресный адрес между устройствами. Я думаю, что когда вы транслируете на 255.255.255.255 или используете многоадресную рассылку, она поражает все устройства, если они находятся в одном физическом сегменте или имеют общую точку доступа. Требуются некоторые эксперименты. Возможно, вы сможете комбинировать этот подход с вариантом 1 или 2 выше.

person selbie    schedule 20.06.2018
comment
возможен ли RARP в Android? - person Dhiru; 20.06.2018