web-dev-qa-db-ja.com

Androidでzeroconf(Bonjour)サービスを検出するにはどうすればよいですか? jmDNSに問題があります

私はDroid/Android 2.0.1を使用していて、明らかに多くの人々が抱えている問題に遭遇しています:私が知っている1つのpure-Java zeroconfライブラリ、jmDNSを使用してサービスを発見できません(AppleのBonjourはLinuxとWindows Javaで動作しますが、ネイティブコードに依存しているため、Androidへの移植は難しいと思います。)

サービスを作成することはできますが、発見することはできません。私は何が起こっているのかを理解しようとしています。

ここには進行中の問題レポートがあります。マルチキャストとIPv6に関連していますが、jmDNSのユーザーもスローしているようです: http://code.google.com/p/Android/issues/detail?id=232

なぜこの人は成功しているのでしょうか?バグレポートのコメント22を参照してください。 (私はSOを始めたばかりなので、複数のURLを投稿することはできません。)

私は彼らのコードをテストしましたが、運がありませんでした。

JmDNSまたは別のライブラリを使用して、Androidでzeroconfサービスの検出を成功させた人はいますか?

私の発見の問題がIPv6マルチキャストの問題に関連している可能性はありますか?

38
Peter Kirn

私も新しいので、さもなければ、smountcastleの答えにコメントを残しておいたほうがいいでしょう。私はちょうどAndroid 2.1。を実行しているDroidでまったく同じ問題を扱っています。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は私の唯一のテストデバイスであるため、はっきりとは言えません。

12
Churlbong

AndroidのBonjourをクロスコンパイルして、ほぼ同じように実行できるようにしましたAppleは、プリンターなどの組み込みデバイスで実行することを意図しています。 ここで はビルドスクリプトです。

ここ は、期待どおりに機能させるための小さな便利なラッパーです。

Bonjourディストリビューションのclient_shimレイヤーを使用して、通常のdns_sd.h APIを介した組み込みmDNS実装へのすべてのアクセスをラップしています。ファイルハンドルでのイディオムとシムレイヤーでの選択は使用しません。

Client_shimレイヤーは、Apple=でサポートされていません。実際、変数名にタイプミスがありますが、それでも機能します。 このパッチ を適用する必要があります正しいヘッダーファイルを含め、タイプミスを修正し、Android APIs。

もう1つ、あなたは[必要 Javaコード内からMultiCastロックを取得して保持する必要があります。そうしないと、他の人を見つけることができません。例を参照してください ここ

それ以外は、Android APIレベル8で動作しており、ビルド済みのライブラリ Bonjour for Android を維持していますが、これが問題ないかどうかはわかりません。ライセンスごと。

編集:

ビルド済みのバージョンは330.10で、静的ライブラリはWindowsでMSVC2010を使用してコンパイルできないため、client_shimを使用するバージョンは新しいため、そのままにしました。

幸運を!

8
sradomski

Android 4.1では、アプリケーションにネイティブBonjourサポート(mDNSResponderを介して実装されているように見える)が追加されています。高レベルAPIは Network Service Discovery と呼ばれているようですが、その下にはBonjourがあるようです。 Android.net.wifi.p2p.WifiP2pManager を介して公開される低レベルのAPIもあるようです。

システム全体のDNSルックアップには使用されていないようです(たとえば、Chrome経由で http://machine.local を参照することはできません)。これは、ネイティブのAndroid今後のアプリについては、zeroconf/Bonjour検索を実行します。

7
natevw

マルチキャストパケットを受信できるように、マルチキャストロックを明示的に取得しましたか?

 AndroidManifest.xml:
 <uses-permission Android:name = "Android.permission.CHANGE_WIFI_MULTICAST_STATE" />

//ネットワーキングコード:
 WifiManager wifi =(WifiManager)getSystemService(Context.WIFI_SERVICE); 
 MulticastLock lock = wifi.createMulticastLock( "mylock"); 
 lock.acquire(); 

それによるとAndroid問題のスレッドは2.0.1に修正がないようです。おそらく、新しいリリースに移行する必要がありますか?

3
smountcastle

まだご覧になっていない場合は、githubでこのプロジェクトを確認することをお勧めします(免責事項-私は作成者ではありません)。 https://github.com/twitwi/AndroidDnssdDemo

これは、すべてを起動して実行する方法をほぼ示すサンプルプロジェクトです。また、カスタムのjmdns.jarも含まれています。これにより、すぐに使用できるjmdns.jarに重複したクラスファイルがあるという問題がいくつか解決されます。

3
svoisen