我正在构建一个使用网络服务发现的应用程序。我已经跟进了这篇文章http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html并且该应用程序正在运行,但我根据下面的代码提出了几个问题。
WifiP2pDnsSdServiceInfo.newInstance(“_ test”,“_ presence._tcp”,记录);
似乎记录无法容纳大量数据。例如,如果记录大小为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消息“。有什么想法吗?
答案 0 :(得分:4)
我是Java / Android的新手,但我能够进行一些实验。
DNS服务API需要记录的<String, String>
地图。如果我们只想关注数据,我们只使用一对并将键设置为“”。在这种情况下,您可以传输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中一个字符=一个字节),第二个示例使用范围内的所有值0x8000 - 0xffff(即UTF-32中一个char = 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个字节的限制。请注意,您不能将备用的两个字节用于通用数据(例如0x1234),因为它被编码为3字节值,这不再适用。
有趣的问题是数据是使用二进制方法更好地编码还是使用类似base64的数据。维基百科称base64将三个八位字节转换为四个编码字符,即对于92个ASCII字符,我们将获得69个字节的数据,这使得base64对这一小组数据的效率更高。
答案 1 :(得分:1)
据我所知,Android NSD Api缺乏对txt记录的适当支持。
有人提示我切换到 jmdns 以获取最近需要使用txtrecords的项目。
有关使用jmdns的更多信息,请访问: http://home.heeere.com/tech-androidjmdns.html