Подтвердить что ты не робот

Как я могу найти сервисы zeroconf (Bonjour) на Android? У меня проблемы с jmDNS

Я работаю с 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?

4b9b3361

Ответ 1

Я новичок, иначе я бы просто оставил комментарий на 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 - это мое единственное тестовое устройство, поэтому я не могу сказать точно.

Ответ 2

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

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

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

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

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

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

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

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

Удачи!

Ответ 3

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

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

Ответ 4

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

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, похоже, что 2.0.1 не имеет исправления. Возможно, вам следует перейти к более позднему выпуску?

Ответ 5

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

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