【问题标题】:Network Service Discovery Android网络服务发现 Android
【发布时间】:2013-07-26 04:56:09
【问题描述】:

我正在构建一个使用网络服务发现的应用程序。我已跟进此帖子 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 消息中“。有什么想法吗?

【问题讨论】:

标签: android service-discovery


【解决方案1】:

我是 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 对这一小数据集的效率更高。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 2012-05-27
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多