Android разрешает .local (mDNS)

Я ищу решение для разрешения имен хостов .local с Android 4.0.4 (без NSD из-за уровня API 15). На устройстве у меня нет службы для обнаружения, только имя хоста. Не могли бы вы привести пример, как решить? Я интегрировал jmDNS, но не знаю, как использовать его для разрешения имен хостов.

Win-команда:

ping kcmeasurement.local

Pinging kcmeasurement.local [10.202.0.29] with 32 bytes of data:
Reply from 10.202.0.29: bytes=32 time<1ms TTL=64
...

Спасибо,

Даниэль


person MartoniczD    schedule 18.12.2014    source источник


Ответы (2)


У меня были почти те же требования, что и в вашем вопросе, за исключением требования использовать jmDNS, поэтому я решил его с помощью NSD. Я понимаю, что это не совсем относится к вашему вопросу, но подумал, что вам и другим может быть несколько полезно увидеть, как я его решил.

Я настроил прослушиватель обнаружения NSD и прослушиватель разрешения NSD, а в коде прослушивателя обнаружения добавил фильтр для имени целевого хоста (например, «kcmeasurement» или, в моем случае, «garagedoor»).

Здесь есть сообщение в блоге, в котором подробно объясняется, как это сделать. Обратитесь к шагам 3–4, которые относятся к необходимому коду приложения Android.

http://www.dodgycoder.net/2015/02/setting-up-bonjourzeroconfmdnsnsd.html

В вашем случае, я полагаю, вам придется выполнить аналогичный процесс, но просто используя библиотеку jmDNS вместо NSD.

person dodgy_coder    schedule 01.03.2015
comment
Похоже, речь идет о разрешении сервиса mDNS, а не о разрешении имени — в частности, в статье предлагается изменить конфигурацию raspberry pi, а не просто распознать rapsberrypi. локальное имя mDNS, которое у него уже должно быть по умолчанию. - person Chris Stratton; 12.08.2017
comment
Мне только что удалось добраться до RPi с ПК, - только после того, как я установил самбу и перезапустил авахи-демон. Не повезло с Android - person jaromrax; 13.09.2020
comment
проблема с андроидом в том, что он не поставляется с сервисом mdns. Адреса .local обрабатываются avahi в Linux и bonjour в ios/macos. jmdns или приложение nsd должны включить это - person Fuseteam; 23.02.2021

Вы должны иметь возможность использовать класс InetAddress для разрешения имени хоста для данного IP-адреса. Например, используя IP-адрес, указанный в исходном вопросе, попробуйте следующее:

try
{
    String hostname = InetAddress.getByName("10.202.0.29").getHostName();
}
catch (UnknownHostException e)
{
    Log.e("MyApplication", "Attempt to resolve host name failed");
}

Поскольку это сетевая операция, убедитесь, что она не выполняется в потоке пользовательского интерфейса.

ИЗМЕНИТЬ

Вы должны иметь возможность разрешать локальное имя хоста с помощью jmDNS следующим образом:

InetAddress localHost = InetAddress.getByName("10.202.0.29");
JmDNS jmdns = JmDNS.create(localHost);
String localHostName = jmdns.getHostName();
person Willis    schedule 28.12.2014
comment
Спасибо за ваш ответ! К сожалению, это не работает, потому что kcmeasurement — это имя хоста mDNS, а моя версия Android (4.0.4) не имеет встроенного преобразователя mDNS. Поэтому, если я вызову InetAddress.getByName, я получу исключение не найдено. - person MartoniczD; 05.01.2015
comment
Кроме того, я включил пакет jmDNS в свой Apk, поэтому реклама работает, но я не нахожу, как разрешать имена .local. - person MartoniczD; 05.01.2015
comment
-1 Ни первоначальная, ни измененная форма этого ответа не касаются фактического вопроса вообще. Вероятно, вы не поняли, о чем вас спрашивали — так называемое локальное имя, которое, как вы утверждаете, разрешается во второй части, не является ни mDNS-именем, ни каким-либо другим именем, это числовой IP-адрес, и нет необходимости решить это вообще. - person Chris Stratton; 12.08.2017
comment
Я просто использую IP-адрес для создания объекта «InetAddress». Имя хоста можно найти, вызвав «getHostName». - person Willis; 12.08.2017
comment
Это не то, что спросили. Вопрос в том, чтобы превратить имя вроде kcmeasurement.local в IP-адрес. Если у вас есть числовой IP-адрес, все готово. Вы начали с числового IP-адреса, что делает ваш ответ совершенно неприменимым к проблеме заданного вопроса - вы предполагаете предварительное знание того самого предмета, о раскрытии которого идет речь! - person Chris Stratton; 12.08.2017