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

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

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

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

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

Я проверил их код, но без какой-либо удачи.

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

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

5 ответов


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

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+, дроид-мое единственное тестовое устройство в настоящее время, так что я не могу сказать наверняка.


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

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

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

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

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

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

редактировать:

версия в prebuilts-330,10, более новые с client_shim, поскольку статические библиотеки не компилируются с MSVC2010 в windows, поэтому мы сохранили это один.

Удачи!


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

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


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

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


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

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