¿Cómo puedo descubrir los servicios zeroconf(Bonjour) en Android? Estoy teniendo problemas con jmDNS
(5)
¿Ha adquirido explícitamente el bloqueo de multidifusión para que pueda recibir los paquetes de multidifusión?
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();
Según ese hilo de Android Issue parece que 2.0.1 no tiene la solución. Tal vez deberías hacer la transición a un lanzamiento posterior?
Estoy trabajando con un Droid / Android 2.0.1 y encuentro un problema que aparentemente muchas personas tienen: no puedo descubrir servicios usando la biblioteca de ceroconfiguración pura de Java que conozco, jmDNS. (Bonjour de Apple, si bien funciona en Linux y Windows Java, creo que sería más difícil ingresar a Android debido a la dependencia del código nativo).
Puedo crear servicios, pero no descubrirlos. Estoy tratando de dar sentido a lo que está pasando.
Hay un informe de problemas en curso aquí; relacionado con multidifusión e IPv6, pero también parece estar generando usuarios de jmDNS: http://code.google.com/p/android/issues/detail?id=2323
¿Alguna idea de por qué esta persona podría estar teniendo éxito? Ver el comentario 22 en el informe de errores. (Soy nuevo en SO, por lo que no puedo publicar más de una URL).
He probado su código, pero sin suerte.
¿Alguien ha logrado con éxito el descubrimiento del servicio zeroconf en Android, usando jmDNS u otra biblioteca?
¿Es posible que mi problema de descubrimiento esté relacionado con el problema de multidifusión IPv6?
Android 4.1 agrega soporte Bonjour nativo (parece que está implementado a través de mDNSResponder) para las aplicaciones. La API de alto nivel parece llamarse Descubrimiento de servicios de red, pero parece ser Bonjour debajo. También parece haber una API de nivel inferior expuesta a través de android.net.wifi.p2p.WifiP2pManager .
Si bien parece que no se usa para búsquedas de DNS en todo el sistema (p. Ej., No puedo simplemente navegar a http: //machine.local a través de Chrome), parece que esta sería la forma de hacer búsquedas con ceroconf / Bonjour para los nativos Aplicaciones de Android en el futuro.
Logré hacer una compilación cruzada de Bonjour para Android y hacer que funcione de la misma manera en que Apple pretende ejecutarlo en dispositivos integrados como impresoras. Here está el script de construcción.
Here hay una pequeña envoltura de conveniencia para que funcione como es de esperar.
Estamos utilizando la capa client_shim de la distribución de Bonjour para ajustar todo el acceso a la implementación mDNS integrada mediante la API dns_sd.h habitual. No utiliza la expresión idiomática con las manetas de archivo y la selección con la capa de calce.
La capa client_shim no es exactamente compatible con Apple, de hecho, encontré errores tipográficos en los nombres de las variables, pero funciona de todos modos. Tendrá que aplicar este parche para incluir los archivos de encabezado correctos, corregir los errores tipográficos y obtener el registro a través de las API de Android.
Una cosa más: debe adquirir y mantener MultiCast Lock desde dentro de su código Java; de lo contrario, no encontrará a nadie más. Vea el ejemplo here .
Aparte de eso, lo tengo trabajando en Android API Nivel 8 y estamos manteniendo una biblioteca precompilada de Bonjour para Android , aunque no estoy seguro de si esto está bien según la licencia.
Editado:
La versión en los prebuilt es 330.10, los más nuevos con client_shim ya que las bibliotecas estáticas no compilan con MSVC2010 en Windows, así que mantuvimos esta.
¡Buena suerte!
Si aún no lo ha visto, le sugiero que revise este proyecto en github (descargo de responsabilidad: no soy el autor): https://github.com/twitwi/AndroidDnssdDemo
Es un proyecto de muestra que muestra cómo poner todo en funcionamiento. También incluye un jmdns.jar personalizado que resuelve algunos problemas que estaba teniendo con el jmdns.jar listo para usar que tiene un archivo de clase duplicado.
También soy nuevo, de lo contrario hubiera dejado un comentario sobre la respuesta de smountcastle, que en su mayoría es correcto. Acabo de lidiar con el mismo problema en un Droid con Android 2.1. Descubrí que necesitaba configurar MulticastLock como referencia; de lo contrario, parecía que se había liberado automáticamente.
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();
Solo asegúrate de llamar a lock.release()
cuando hayas terminado. Esto solo puede ser necesario para Android 2.0 o superior. Actualmente, el Droid es mi único dispositivo de prueba, por lo que no puedo asegurarlo.