Как мне найти сервисы zeroconf (Bonjour) на Android? У меня проблемы с jmDNS - PullRequest
38 голосов
/ 19 марта 2010

Я работаю с Droid / Android 2.0.1 и сталкиваюсь с проблемой, которая, по-видимому, возникает у многих людей: я не могу обнаружить службы, используя одну из известных мне библиотек zeroconf на чистой Java, jmDNS. (Apple Bonjour, хотя она работает на Linux и Windows Java, я думаю, было бы сложнее портировать ее на Android из-за зависимости от собственного кода.)

Я могу создавать сервисы, но не открывать их. Я пытаюсь понять, что происходит.

Здесь есть текущий отчет о проблеме; связан с многоадресной рассылкой и IPv6, но, похоже, также выбрасывает пользователей jmDNS: http://code.google.com/p/android/issues/detail?id=2323

Есть идеи, почему этот человек может иметь успех? Смотрите комментарий 22 в отчете об ошибке. (Я новичок в SO, поэтому не могу опубликовать более одного URL.)

Я проверил их код, но безуспешно.

Кто-нибудь успешно выполнил обнаружение службы zeroconf на Android, используя jmDNS или другую библиотеку?

Возможно ли, что моя проблема обнаружения связана с проблемой многоадресной рассылки IPv6?

Ответы [ 5 ]

12 голосов
/ 22 апреля 2010

Я тоже новичок, иначе я бы просто оставил комментарий к ответу smountcastle, который в основном правильный. Я только что имел дело с точно такой же проблемой на Droid под управлением Android 2.1. Я обнаружил, что мне нужно установить MulticastLock для подсчета ссылок, в противном случае он, казалось бы, освобождается автоматически.

AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

// Networking code:
WifiManager wifi = getSystemService( Context.WIFI_SERVICE );
MulticastLock lock = wifi.createMulticastLock("fliing_lock");
lock.setReferenceCounted(true);
lock.acquire();

Обязательно позвоните lock.release(), когда закончите. Это может быть необходимо только для Android 2.0+. В настоящее время Droid - мое единственное тестовое устройство, поэтому я не могу точно сказать.

8 голосов
/ 30 марта 2012

Мне удалось создать кросс-компиляцию Bonjour для Android и запустить ее примерно так же, как Apple намеревается запускать на встроенных устройствах, таких как принтеры. Здесь - скрипт сборки.

Здесь - это небольшая удобная оболочка, чтобы заставить ее работать так, как вы ожидаете.

Мы используем слой client_shim из дистрибутива Bonjour, чтобы обернуть весь доступ к встроенной реализации mDNS через обычный API-интерфейс dns_sd.h. Вы не используете идиому с дескрипторами файлов, а выбор - со слоем подкладки.

Уровень client_shim не совсем хорошо поддерживается Apple - на самом деле я нашел опечатки в именах переменных, но тем не менее он работает. Вам нужно будет применить этот патч , чтобы включить правильные заголовочные файлы, исправить опечатки и войти в систему через API-интерфейсы Android.

Еще одна вещь: вам нужно , чтобы получить и удерживать блокировку многоадресной передачи изнутри вашего Java-кода, иначе вы больше никого не найдете. Смотрите пример здесь .

Кроме того, он работает на Android API Level 8, и мы поддерживаем предустановленную библиотеку Bonjour для Android , хотя я не уверен, что это нормально для лицензии.

Отредактировано:

Версия в предварительных сборках - 330.10, более новая версия с client_shim, поскольку статические библиотеки не могут компилироваться с MSVC2010 в Windows, поэтому мы сохранили эту.

Удачи!

7 голосов
/ 31 октября 2012

В Android 4.1 добавлена ​​встроенная поддержка Bonjour (похоже, она реализована через mDNSResponder) для приложений. Похоже, высокоуровневый API называется Обнаружение сетевых служб , но, похоже, находится под Bonjour. Также, кажется, есть API более низкого уровня, предоставляемый через android.net.wifi.p2p.WifiP2pManager .

Хотя он, кажется, не используется для поиска DNS в масштабе всей системы (например, я не могу просто перейти к http://machine.local через Chrome), похоже, что это был бы способ сделать поиск zeroconf / Bonjour для нативных приложений для Android в будущем.

3 голосов
/ 20 апреля 2011

Если вы еще не видели, я предлагаю проверить этот проект на github (заявление об отказе - я не автор): https://github.com/twitwi/AndroidDnssdDemo

Это пример проекта, который в значительной степени показывает, как все запустить и запустить. Он также включает в себя пользовательский файл jmdns.jar, который решает некоторые проблемы, с которыми я столкнулся при использовании готового файла jmdns.jar с дублирующимся файлом классов.

3 голосов
/ 21 апреля 2010

Вы явно получили многоадресную блокировку, чтобы вы могли получать многоадресные пакеты?

AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

// Networking code:
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = wifi.createMulticastLock("mylock");
lock.acquire();

Согласно этой ветке Android Issue, похоже, что 2.0.1 не имеет исправления. Возможно, вам стоит перейти на более позднюю версию?

...