web-dev-qa-db-fra.com

Comment découvrir les services zeroconf (Bonjour) sur Android? J'ai des problèmes avec jmDNS

Je travaille avec un Droid/Android 2.0.1 et je rencontre un problème apparemment que beaucoup de gens ont: je ne peux pas découvrir de services en utilisant la seule bibliothèque de zeroconf pur Java que je connaisse, jmDNS . (Bonjour d'Apple, alors qu'il fonctionne sur Linux et Windows Java, je pense qu'il serait plus difficile de le porter sur Android en raison de la dépendance au code natif.)

Je peux créer des services, mais pas les découvrir. J'essaie de comprendre ce qui se passe.

Il y a un rapport de problème en cours ici; liés à la multidiffusion et à IPv6, mais semblent également lancer des utilisateurs de jmDNS: http://code.google.com/p/Android/issues/detail?id=232

Une idée pourquoi cette personne pourrait avoir du succès? Voir le commentaire 22 dans le rapport de bogue. (Je suis nouveau sur SO, donc je ne peux pas poster plus d'une URL.)

J'ai testé leur code, mais sans aucune chance.

Quelqu'un a-t-il réussi la découverte du service zeroconf sur Android, à l'aide de jmDNS ou d'une autre bibliothèque?

Est-il possible que mon problème de découverte soit lié au problème de multidiffusion IPv6?

38
Peter Kirn

Je suis nouveau aussi sinon j'aurais juste laissé un commentaire sur la réponse de smountcastle qui est en grande partie correcte. Je viens de faire face au même problème sur un Droid exécutant Android 2.1. J'ai trouvé que je devais définir le MulticastLock sur compté par référence, sinon il semblait être libéré automatiquement.

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

Assurez-vous simplement d'appeler lock.release() lorsque vous avez terminé. Cela peut être nécessaire uniquement pour Android 2.0+, le Droid est actuellement mon seul appareil de test, donc je ne peux pas le dire avec certitude.

12
Churlbong

J'ai réussi à compiler de façon croisée Bonjour pour Android et à le faire fonctionner de la même manière Apple a l'intention de l'exécuter sur des appareils intégrés comme des imprimantes. Ici est le script de construction.

ici est un petit emballage pratique pour le faire fonctionner comme vous vous en doutez.

Nous utilisons la couche client_shim de la distribution Bonjour pour encapsuler tous les accès à l'implémentation mDNS intégrée via l'API dns_sd.h habituelle. Vous n'utilisez pas l'idiome avec les descripteurs de fichiers et la sélection avec le calque de calage.

La couche client_shim n'est pas exactement bonne prise en charge par Apple - en fait, j'ai trouvé des fautes de frappe dans les noms de variables, mais cela fonctionne quand même. Vous devrez appliquer ce patch à inclure les fichiers d'en-tête corrects, corriger les fautes de frappe et obtenir la journalisation via les API Android.

Encore une chose: vous avez besoin d'acquérir et de maintenir le verrou MultiCast depuis votre Java, sinon vous ne trouverez personne d'autre. Voir l'exemple - ici .

En dehors de cela, je le fais travailler sur Android API niveau 8 et nous maintenons une bibliothèque préconstruite de Bonjour pour Android , bien que je ne sois pas sûr que ce soit ok selon la licence.

Modifié:

La version dans les préconfigurations est 330.10, les plus récentes avec client_shim car les bibliothèques statiques ne se compilent pas avec MSVC2010 sur Windows, nous avons donc conservé celle-ci.

Bonne chance!

8
sradomski

Android 4.1 ajoute un support natif Bonjour (ressemble à son implémentation via mDNSResponder) pour les applications. L'API de haut niveau semble s'appeler Network Service Discovery mais semble être Bonjour en dessous. Il semble également y avoir une API de niveau inférieur exposée via Android.net.wifi.p2p.WifiP2pManager .

Bien qu'il ne semble pas être utilisé pour les recherches DNS à l'échelle du système (par exemple, je ne peux pas simplement parcourir http: //machine.local via Chrome), il semble que ce serait le moyen de faire des recherches zeroconf/Bonjour pour les applications natives Android applications à l'avenir.

7
natevw

Avez-vous explicitement acquis le verrou de multidiffusion afin de pouvoir recevoir les paquets de multidiffusion?

 AndroidManifest.xml: 
 <Uses-permission Android: name = "Android.permission.CHANGE_WIFI_MULTICAST_STATE" />[.____.[/0. ______________//// Code réseau: 
 WifiManager wifi = (WifiManager) getSystemService (Context.WIFI_SERVICE); 
 MulticastLock lock = wifi.createMulticastLock ("mylock"); 
 Lock.acquire (); 

Selon cela Android Problème, il semble que 2.0.1 n'a pas le correctif. Peut-être devriez-vous passer à une version ultérieure?

3
smountcastle

Si vous ne l'avez pas déjà vu, je vous suggère de vérifier ce projet sur github (avertissement - je ne suis pas l'auteur): https://github.com/twitwi/AndroidDnssdDemo

Il s'agit d'un exemple de projet qui montre à peu près comment tout faire fonctionner. Il comprend également un jmdns.jar personnalisé qui résout certains problèmes que j'avais avec le jmdns.jar prêt à l'emploi ayant un fichier de classe en double.

3
svoisen