2010-03-18 8 views
36

Estoy trabajando con un Droid/Android 2.0.1 y encuentro un problema que al parecer mucha gente tiene: 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).¿Cómo puedo descubrir los servicios zeroconf (Bonjour) en Android? Tengo problemas con jmDNS

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 parece estar generando usuarios de jmDNS, también: http://code.google.com/p/android/issues/detail?id=2323

¿Alguna idea de por qué esta persona puede estar teniendo éxito? Ver el comentario 22 en el informe de errores. (Soy nuevo en SO, así que no puedo publicar más de una URL.)

He probado su código, pero sin suerte.

¿Alguien ha logrado con éxito el descubrimiento de servicio zeroconf en Android, utilizando jmDNS u otra biblioteca?

¿Es posible que mi problema de descubrimiento esté relacionado con el problema de multidifusión IPv6?

+0

No hay comentarios 22 en ese informe de fallos. Solo va a 14. – CommonsWare

+0

Parece que el enlace del Rastreador de incidencias debe ser: http://code.google.com/p/android/issues/detail?id=2917 –

+0

Lo sentimos, se corrigió: http://code.google. com/p/android/issues/detail? id = 2917 # c22 –

Respuesta

12

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(); 

Sólo asegúrese de llamar lock.release() cuando haya terminado con él. 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.

+0

Tan cerca de poder hacer comentarios generales ... Estoy usando JmDNS, he tenido éxito con un Motorola Droid corriendo 2.1-update1 utilizando el enfoque MulticastLock. Recientemente obtuve un HTC Incredible con la misma versión de Android, y el descubrimiento del servicio no funciona usando exactamente el mismo código. He estado tirando de mi pelo en eso, buena suerte ... – Churlbong

+0

¿Puedes agregar algún código? ¿Cómo llamas a todo? He intentado agregar el permiso CHANGE_WIFI_MULTICASR_STATE ... pero todavía no estoy obteniendo ningún resultado. – mudit

+0

Gracias, Churlbong - por curiosidad, ¿estás usando jmDNS o simplemente escribiendo la implementación del cliente directamente? (o usando otra biblioteca)? Voy a probar esto, ya que mi código de bloqueo no es el mismo y no estoy seguro de saber que también tenía un permiso independiente, independientemente del permiso de la red. ;) –

3

¿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(); 

De acuerdo con el 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?

3

Si usted no ha visto ya, yo sugiero revisar este proyecto en GitHub (descargo de responsabilidad - No soy el autor): https://github.com/twitwi/AndroidDnssdDemo

Es un proyecto de ejemplo que más o menos se muestra cómo obtener 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.

8

Logré hacer una compilación cruzada de Bonjour para Android y ejecutarlo de la misma manera en que Apple pretende ejecutarlo en dispositivos integrados como impresoras. Here es el script de compilación.

Here es 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 sigue funcionando. Tendrá que aplicar this patch 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: Usted necesidad de adquirir y mantener el bloqueo de multidifusión desde dentro de su código de 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 preconstruida de Bonjour for Android, aunque no estoy seguro de si esto está bien según la licencia.

Editado:

La versión de los prebuilts es 330,10, más nuevos con client_shim como bibliotecas estáticas dejar de compilar con MSVC2010 en las ventanas, así que mantuvo éste.

¡Buena suerte!

+0

Algunos de los enlaces están muertos, pero logré encontrar ejemplos precompilados. ¿Pueden estas Clases (Publicador, Suscriptor, Nodo, Descubrimiento) usarse para comunicarse con un dispositivo Apple que usa su implementación de Bonjour o el dispositivo Apple también debe estar ejecutando umundo? –

+0

Todavía tenemos prebuilt, pero pasaron a [tarball] (http://umundo.tk.informatik.tu-darmstadt.de/prebuilt/0.4.3/) que se descarga en configure-time. Para cada plataforma, pero darwin, hay un interior libmdnsembedded. uMundo es ZeroMQ + mDNS para pub/sub: si solo desea buscar servicios, utilice libmdnsembedded y dns_sd.h sin seleccionar como hecho en la implementación client_shim. – sradomski

+0

Me gustaría simplemente encontrar servicios a través de mi dispositivo Android. ¿Hay algún ejemplo para usar el archivo 'libmDNSEmbedded.a' en un dispositivo Android junto con dns_sd.h? ¿Hay un contenedor de Java para un simple descubrimiento de servicio? –

6

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 Network Service Discovery pero parece ser Bonjour debajo. También parece haber una API de nivel inferior expuesta a través del android.net.wifi.p2p.WifiP2pManager.

Aunque parece que no se usa para búsquedas de DNS en todo el sistema (p. Ej., Simplemente no puedo navegar a http://machine.local mediante Chrome) parece que esta sería la forma de hacer búsquedas con ceroconf/Bonjour para aplicaciones nativas de Android avanzando.

+5

Desafortunadamente, la API nativa no permite el acceso al registro TXT, que es una gran limitación: https://code.google.com/p/android/issues/detail?id=136099 –

Cuestiones relacionadas