2013-07-26 155 views
8

我正在努力構建使用網絡服務發現的應用程序。我跟進了這個帖子http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html,該應用程序正在工作,但我有幾個基於下面顯示的代碼的問題。網絡服務發現Android

WifiP2pDnsSdServiceInfo.newInstance(「_ test」,「_presence._tcp」,record);

看起來好像記錄不能容納大部分數據。例如,如果記錄大小爲20,則不調度信息。你能告訴我關於尺寸限制嗎?我可以發送多少數據?

我不清楚可用服務類型像_ presence._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消息「。有什麼想法嗎?

+1

也許,我[對相關問題的答案(http://stackoverflow.com/a/19356052/1102014)可能會有所幫助。 – Stan

回答

3

我是Java/Android的新手,但我能夠進行一些實驗。

DNS服務API需要<String, String>的地圖記錄。如果我們只想專注於數據,我們只使用一對,並將密鑰設置爲「」。在這種情況下,您可以傳輸92個字符:

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

這是您可以通過無線發送(或更好地說,接收)的最大值。我很好奇如果我想發送一些二進制數據會發生什麼。使用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一個char =一個字節),第二個示例使用範圍爲0x8000 - 0xffff(即在UTF-32中一個char = 3個字節)。

如果你做數學題,你會看到30×3個字節= 90個字節,也就是說,應該是2個字節(字)左,indeeed:

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個字節的限制。請注意,你不能使用備用的兩個字節作爲通用數據(即類似於0x1234),因爲它被編碼爲3字節的值,並且不再工作。

有趣的問題是數據是使用二進制方法編碼還是使用類似base64的東西。維基百科說,base64將三個八位字節轉換爲四個編碼字符,即對於92個ASCII字符,我們將獲得69個字節的數據,這使得base64對這一小部分數據的效率更高。

1

據我所知,Android NSD Api缺乏對txt記錄的適當支持。

這是wat促使我切換到jmdns最近的項目,我需要使用txtrecords。

有關使用jmdns的更多信息可以在這裏找到: http://home.heeere.com/tech-androidjmdns.html