2013-07-26 13 views
8

Ich arbeite an einer Anwendung, die Network Service Discovery verwendet. Ich habe diesen Beitrag http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html verfolgt und die Anwendung funktioniert, aber ich habe ein paar Fragen basierend auf dem unten gezeigten Code.Network Service Discovery Android

WifiP2pDnsSdServiceInfo.newInstance ("_test", "_presence._tcp", Datensatz);

Es scheint, als ob der Datensatz nicht viel von Daten halten kann. Wenn die Datensatzgröße beispielsweise 20 ist, wird die Information nicht gesendet. Kannst du mir von der Größenbeschränkung erzählen? Wie viel Daten kann ich senden?

Ich bin nicht klar über die verfügbaren Servicetypen wie _ presence._tcp. Ist es herstellerspezifisch? Eine Liste der unterstützten Servicetypen ist nett zu wissen. Gibt der Diensttyp die Menge an Informationen an, die ich senden kann? Wenn ja, welche Servicetypen sind für das Senden einer guten Karte vorzuziehen?

Ein Update: Ich habe diesen Entwurf unter http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt überprüft und siehe Abschnitt 6.2 DNS-SD TXT Rekordgröße. Es sieht so aus, als sei die Größenbeschränkung klein wie angegeben "Die Gesamtgröße eines typischen DNS-SD TXT-Datensatzes soll klein sein. - 200 Bytes oder weniger. In Fällen, in denen mehr Daten gerechtfertigt sind (z. B. LPR-Druck [BJP]) , Bei einer Gesamtgröße unter 400 Byte sollte es in eine einzige 512-Byte-DNS-Nachricht passen ". Irgendwelche Gedanken?

+1

Vielleicht, meine [Antwort auf die damit verbundene Frage] (http://stackoverflow.com/a/19356052/1102014) hilfreich sein kann. – Stan

Antwort

3

Ich bin ein Neuling in Java/Android, aber ich konnte einige Experimente durchführen.

Die DNS-Dienst-API erwartet eine Karte <String, String> für Datensatz. Wenn wir uns ausschließlich auf Daten konzentrieren wollen, verwenden wir nur ein Paar und setzen den Schlüssel auf "". In diesem Fall können Sie 92 Zeichen übertragen:

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

Dies ist die maximale Sie (oder besser gesagt, erhalten) senden kann über die Luft. Ich war neugierig, was passiert, wenn ich einige Binärdaten senden möchte. eine byte[] Array statt String verwendet, ist keine gute Idee (Absturz), so haben wir es mit Saiten halten:

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

Interessanterweise ist dies die maximale Sie (30 Unicode-Zeichen/60 Bytes) senden kann. Der Grund dafür ist, dass die Wi-Fi-API alle Zeichenfolgen in UTF-32 konvertiert, dh während das erste Beispiel nur ASCII-Werte verwendete (dh in UTF-32 ein Zeichen = ein Byte), verwendete das zweite Beispiel alle Werte aus dem Bereich 0x8000 - 0xffff (dh in UTF-32 ein Zeichen = 3 Bytes).

Wenn Sie die Mathematik zu tun, sehen Sie 30 x 3 Bytes = 90 Bytes, dh es sollte 2 Bytes (Zeichen) links und indeeed sein:

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

noch funktioniert, die Grenze von 92 Bytes erreicht . Beachten Sie bitte, dass Sie die zwei Ersatzbytes für generische Daten (d. H. Etwa 0x1234) nicht verwenden können, da sie als 3-Byte-Wert codiert werden und dies nicht mehr funktioniert.

Interessante Frage ist, ob die Daten besser mit der Binär-Methode oder mit etwas wie Base64 codiert werden. Wikipedia sagt, base64 konvertiert drei Oktette in vier kodierte Zeichen, d. H. Für 92 ASCII-Zeichen würden wir 69 Byte Daten erhalten, was base64 für diesen kleinen Datensatz viel effizienter macht.

1

Soweit ich weiß, die Android NSD Api fehlt die richtige Unterstützung für TXT-Datensätze.

Es ist wat hat mich aufgefordert, zu jmdns für ein neues Projekt, in dem ich die TXTRECORD verwenden musste.

Mehr Informationen über jmdns Verwendung finden Sie hier: http://home.heeere.com/tech-androidjmdns.html

Verwandte Themen