Два, может быть, три возможных решения, о которых я знаю:
Вариант 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
i have searched regarding this
чтоthis
? В основном вам нужно перечислить все устройства в локальной сети и повторить их проверку их MAC-адреса. Я полагаю, вы не знаете, как получить список устройств в локальной сети? - person Vladyslav Matviienko   schedule 20.06.2018