40

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

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

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

この人が成功している理由は何ですか?バグレポートのコメント 22 を参照してください。(SO は初めてなので、複数の URL を投稿することはできません。)

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

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

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

4

5 に答える 5

13

私も新しいです。さもなければ、smountcastleの答えにコメントを残していたでしょう。これはほとんど正しいです。Android2.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()してください。これはAndroid2.0以降でのみ必要になる可能性があります。現在、Droidは私の唯一のテストデバイスであるため、はっきりとは言えません。

于 2010-04-22T18:43:20.037 に答える
8

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

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

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

client_shim レイヤーは、Apple によって正確にサポートされているわけではありません。実際、変数名にタイプミスが見つかりましたが、それでも機能しています。このパッチを適用して、正しいヘッダー ファイルを含め、タイプミスを修正し、Android API を介してログを取得する必要があります。

もう 1 つ: Java コード内からマルチキャスト ロックを取得して保持する必要があります。ここの例を参照してください。

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

編集:

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

幸運を!

于 2012-03-30T16:10:38.403 に答える
7

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

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

于 2012-10-30T20:21:49.933 に答える
3

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

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 Issue スレッドによると、2.0.1 には修正がないようです。おそらく、新しいリリースに移行する必要がありますか?

于 2010-04-21T14:45:50.283 に答える
3

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

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

于 2011-04-19T22:34:01.587 に答える