40

我正在使用 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。)

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

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

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

4

5 回答 5

13

我也是新手,否则我只会对 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+,Droid 是我目前唯一的测试设备,所以我不能肯定。

于 2010-04-22T18:43:20.037 回答
8

我设法为 Android 交叉编译 Bonjour 并让它以与 Apple 打算在打印机等嵌入式设备上运行的方式大致相同的方式运行。是构建脚本。

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

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

Apple 并不完全支持 client_shim 层——事实上我发现变量名中有拼写错误,但它仍然可以工作。您将需要应用此补丁以包含正确的头文件、修复拼写错误并通过 Android API 获取日志记录。

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

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

编辑:

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

祝你好运!

于 2012-03-30T16:10:38.403 回答
7

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

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

于 2012-10-30T20:21:49.933 回答
3

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

AndroidManifest.xml:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

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

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

于 2010-04-21T14:45:50.283 回答
3

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

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

于 2011-04-19T22:34:01.587 回答