9

我正在构建一个使用网络服务发现的应用程序。我已经跟进了这篇文章http://developer.android.com/training/connect-devices-wireless/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 消息“。有什么想法吗?

4

2 回答 2

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 中,一个字符 = 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 之类的方法是否更好地编码数据。Wikipedia 说 base64 将三个八位字节转换为四个编码字符,即对于 92 个 ASCII 字符,我们将获得 69 个字节的数据,这使得 base64 对这一小数据集的效率更高。

于 2014-02-17T10:55:35.563 回答
1

据我所知,Android NSD Api 缺乏对 txt 记录的适当支持。

这是 wat 提示我为最近需要使用 txtrecords 的项目切换到 jmdns

更多关于使用 jmdns 的信息可以在这里找到:http: //home.heeere.com/tech-androidjmdns.html

于 2014-10-10T19:50:59.693 回答