9

Network Service Discovery を使用するアプリケーションの構築に取り組んでいます。この投稿http://developer.android.com/training/connect-devices-wireless/nsd-wifi-direct.htmlをフォローアップしました。アプリケーションは動作していますが、以下に示すコードに基づいていくつか質問があります。

WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", 記録);

レコードには多くのデータを保持できないようです。たとえば、レコード サイズが 20 の場合、情報はディスパッチされません。サイズ制限について教えてください。どのくらいのデータを送信できますか?

_presents._tcpのような利用可能なサービス タイプについては明確ではありません。ベンダー固有ですか?サポートされているサービス タイプのリストを知っておくと便利です。サービスの種類によって、送信できる情報の量が決まりますか? もしそうなら、適切なサイズのマップを送信するのに適したサービスの種類はどれですか。

更新: http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txtでこのドラフトを確認しました。セクション6.2 DNS-SD TXT レコード サイズを参照してください。「典型的な DNS-SD TXT レコードの合計サイズは、200 バイト以下に抑えるように意図されています。より多くのデータが正当化される場合 (LPR 印刷 [BJP] など)、合計サイズを 400 バイト未満に保つことで、単一の 512 バイトの DNS メッセージに収まるはずです」. 何かご意見は?

4

2 に答える 2

4

私は Java/Android の初心者ですが、いくつかの実験を行うことができました。

DNS サービス API は、<String, String>for recordのマップを想定しています。データだけに注目したい場合は、ペアを 1 つだけ使用し、キーを "" に設定します。この場合、92 文字を転送できます。

record.put("", "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012");

これは、無線で送信 (より正確には、受信) できる最大値です。バイナリデータを送信したい場合にどうなるか興味がありました。byte[]の代わりに配列を使用するのStringは良い考えではありません (クラッシュ)。そのため、文字列に固執する必要があります。

record.put("", "\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u1234\u5678\u9012\u3456\u7890\u1234\u5678");

興味深いことに、これが送信できる最大値です (30 Unicode 文字/60 バイト)。その理由は、Wi-Fi API がすべての文字列を UTF-32 に変換するように見えるためです。つまり、最初の例では ASCII 値のみを使用していましたが (つまり、UTF-32 では 1 文字 = 1 バイト)、2 番目の例では範囲のすべての値を使用していました。 0x8000 - 0xffff (つまり、UTF-32 では 1 文字 = 3 バイト)。

計算すると、30 x 3 バイト = 90 バイトが表示されます。つまり、実際には 2 バイト (文字) が残っているはずです。

record.put("", "\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u9012\u1234\u5678\u9012\u3456\u7890\u1234\u5678\u0031\u0032");

それでも機能し、92 バイトの制限に達します。予備の 2 バイトを汎用データ (0x1234 など) に使用できないことに注意してください。これは、3 バイト値としてエンコードされ、これが機能しなくなるためです。

興味深い質問は、バイナリ メソッドを使用してデータをより適切にエンコードするか、base64 などを使用してエンコードするかです。ウィキペディアによると、base64 は 3 つのオクテットを 4 つのエンコードされた文字に変換します。つまり、92 個の ASCII 文字の場合、69 バイトのデータが得られるため、base64 はこの小さなデータ セットに対してはるかに効率的です。

于 2014-02-17T10:55:35.563 に答える
1

私の知る限り、Android NSD API は txt レコードを適切にサポートしていません。

txtrecordsを使用する必要がある最近のプロジェクトでは、jmdnsに切り替えるように促されました。

jmdns の使用に関する詳細については、http://home.heeere.com/tech-androidjmdns.html を参照して ください。

于 2014-10-10T19:50:59.693 に答える