网络服务发现Android

Zak*_*Mak 9 android service-discovery

我正在构建一个使用网络服务发现的应用程序.我已经跟进了这篇文章http://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html,该应用程序正在运行,但我有几个问题基于下面显示的代码.

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消息".有什么想法吗?

Mir*_*cek 4

我是 Java/Android 的新手,但我能够进行一些实验。

DNS 服务 API 需要一个<String, String>用于记录的映射。如果我们只想关注数据,我们只使用一对并将密钥设置为“”。在这种情况下,您可以传输 92 个字符:

record.put("", "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012");
Run Code Online (Sandbox Code Playgroud)

这是您可以通过无线方式发送(或者更好地说,接收)的最大值。我很好奇如果我想发送一些二进制数据会发生什么。使用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");
Run Code Online (Sandbox Code Playgroud)

有趣的是,这是您可以发送的最大值(30 个 Unicode 字符/60 字节)。原因是 Wi-Fi API 似乎将所有字符串转换为 UTF-32,即第一个示例仅使用 ASCII 值(即在 UTF-32 中一个字符 = 一个字节),第二个示例使用以下范围内的所有值: 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");
Run Code Online (Sandbox Code Playgroud)

仍然有效,达到 92 字节的限制。请注意,您不能将多余的两个字节用于通用数据(即 0x1234 之类的内容),因为它被编码为 3 字节值,这将不再起作用。

有趣的问题是,使用二进制方法还是使用诸如 Base64 之类的方法对数据进行编码是否更好。维基百科表示,base64 将三个八位位组转换为四个编码字符,即对于 92 个 ASCII 字符,我们将获得 69 个字节的数据,使得 base64 对于这一小组数据更加有效。