【问题标题】:How can I discover zeroconf (Bonjour) services on Android? I'm having trouble with jmDNS如何在 Android 上发现 zeroconf (Bonjour) 服务?我在使用 jmDNS 时遇到问题
【发布时间】:2011-01-29 06:28:57
【问题描述】:

我正在使用 Droid / Android 2.0.1 并遇到一个显然很多人都有的问题:我无法使用我所知道的一个纯 Java zeroconf 库 jmDNS 来发现服务。 (Apple 的 Bonjour,虽然它可以在 Linux 和 Windows Java 上运行,但我相信由于依赖于原生代码,它更难移植到 Android。)

我可以创建服务,但不能发现它们。我试图弄清楚发生了什么。

这里有一个持续的问题报告;与多播和 IPv6 相关,但似乎也抛出了 jmDNS 的用户: http://code.google.com/p/android/issues/detail?id=2323

知道为什么这个人会成功吗?请参阅错误报告中的评论 22。 (我是 SO 新手,所以不能发布多个 URL。)

我已经测试了他们的代码,但没有任何运气。

有没有人在 Android 上使用 jmDNS 或其他库成功完成 zeroconf 服务发现?

我的发现问题是否可能与 IPv6 多播问题有关?

【问题讨论】:

  • 该错误报告中没有评论 22。只到 14 点。
  • 看起来问题跟踪器链接应该是:code.google.com/p/android/issues/detail?id=2917
  • 抱歉,我无法提出更具体的问题。问题是,当什么都没有发生时,很难解决问题。 ;) 我很惊讶没有更多的人尝试过这个,但也许这是因为 Java zeroconf 库的糟糕状态......鸡和蛋的问题。
  • zeroconf 协议故意非常非常简单。我建议直接从 RFC 编写一个简单的客户端,看看你是否正确接收数据包。它不应该与多播的怪癖有任何关系,但它肯定可能与发送/接收广播 UDP 数据包的问题有关。

标签: android bonjour zeroconf


【解决方案1】:

您是否明确获取了多播锁以便接收多播数据包?

AndroidManifest.xml: // 网络代码: WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); MulticastLock lock = wifi.createMulticastLock("mylock"); lock.acquire();

根据那个 Android 问题线程,看起来 2.0.1 没有修复。也许您应该过渡到更高版本?

【讨论】:

    【解决方案2】:

    我也是新手,否则我只会对 smountcastle 的回答发表评论,这基本上是正确的。我刚刚在运行 Android 2.1 的 Droid 上处理了完全相同的问题。我发现我需要将 MulticastLock 设置为引用计数,否则它似乎会自动释放。

    AndroidManifest.xml:
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
    
    // Networking code:
    WifiManager wifi = getSystemService( Context.WIFI_SERVICE );
    MulticastLock lock = wifi.createMulticastLock("fliing_lock");
    lock.setReferenceCounted(true);
    lock.acquire();
    

    请务必在完成后致电lock.release()。这可能只对 Android 2.0+ 是必需的,The Droid 是我目前唯一的测试设备,所以我不能肯定。

    【讨论】:

    • 如此接近能够制作通用 cmets...我正在使用 JmDNS,我在使用 MulticastLock 方法运行 2.1-update1 的摩托罗拉 Droid 上取得了成功。刚刚获得了运行相同版本 Android 的 HTC Incredible,并且使用完全相同的代码无法进行服务发现。我一直在拉我的头发,祝你好运......
    • 你能添加一些代码吗?你是怎么称呼一切的。我已经尝试添加 CHANGE_WIFI_MULTICASR_STATE 权限。但我仍然没有得到任何结果。
    • 谢谢,Churbong - 出于好奇,您是使用 jmDNS 还是直接编写客户端实现? (或使用另一个库)?我会试一试,因为我的锁码不太一样,而且我不确定我是否知道它也有独立于网络权限的单独权限。 ;)
    【解决方案3】:

    如果你还没有看过,我建议在 github 上查看这个项目(免责声明 - 我不是作者):https://github.com/twitwi/AndroidDnssdDemo

    这是一个示例项目,几乎展示了如何启动和运行所有内容。它还包括一个自定义 jmdns.jar,它解决了我在使用具有重复类文件的开箱即用 jmdns.jar 时遇到的一些问题。

    【讨论】:

      【解决方案4】:

      我设法交叉编译了适用于 Android 的 Bonjour,并使其运行方式与 Apple 打算在打印机等嵌入式设备上运行的方式大致相同。 Here 是构建脚本。

      Here 是一个方便的小型包装器,可以让它按您的预期工作。

      我们使用 Bonjour 发行版中的 client_shim 层来包装通过常用 dns_sd.h API 对嵌入式 mDNS 实现的所有访问。您不要使用带有文件句柄的习语和带有填充层的选择。

      Apple 并不完全支持 client_shim 层 - 事实上,我发现变量名中有拼写错误,但它仍然有效。您需要申请 this patch 以包含正确的头文件、修正拼写错误并通过 Android API 获取日志记录。

      还有一件事:您需要从您的 Java 代码中获取并持有 MultiCast Lock,否则您将找不到其他人。请参阅示例here

      除此之外,我在 Android API Level 8 上运行它,我们正在维护一个预构建的 Bonjour for Android 库,但我不确定这是否符合许可。

      已编辑:

      prebuilts 中的版本是 330.10,带有 client_shim 作为静态库的较新版本无法在 windows 上使用 MSVC2010 编译,所以我们保留了这个。

      祝你好运!

      【讨论】:

      • 一些链接已经失效,但我设法找到了预构建的示例。这些类(Publisher、Subscriber、Node、Discovery)能否用于与使用其 Bonjour 实现的 Apple 设备进行通信,或者 Apple 设备是否也必须运行 umundo?
      • 我们仍然有预建的,但它们移到了 tarball,在配置时下载。对于除 darwin 之外的每个平台,内部都有一个 libmdnsembedded。 uMundo 是用于 pub/sub 的 ZeroMQ + mDNS - 如果您只是想查找服务,请使用 libmdnsembedded 和 dns_sd.h,而无需在 client_shim 实现中进行选择。
      • 我只想通过我的 Android 设备查找服务。有没有在安卓设备上将libmDNSEmbedded.a 文件与 dns_sd.h 结合使用的示例?是否有用于简单服务发现的 java 包装器?
      • 您可以使用 umundo 并忽略除发现子系统之外的所有内容。这是an example project 用于android 上的umundo。 Discovery 对象可用于按服务类型/域浏览/宣传服务。完成后不要忘记取消浏览/取消广告。如果您选择这样做并遇到问题,请继续使用 umundo 问题跟踪器。
      【解决方案5】:

      Android 4.1 为应用程序添加了原生 Bonjour 支持(看起来像是通过 mDNSResponder 实现的)。高级 API 似乎被称为Network Service Discovery,但在下面似乎是 Bonjour。似乎还通过android.net.wifi.p2p.WifiP2pManager 公开了一个较低级别的API。

      虽然它似乎没有用于系统范围的 DNS 查找(例如,我不能简单地通过 Chrome 浏览到 http://machine.local),但这似乎是对原生 Android 进行 zeroconf/Bonjour 查找的方法未来的应用程序。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2020-12-16
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多