如何在Android上发现zeroconf(Bonjour)服务? 我在使用jmDNS时遇到了麻烦

我正在使用Droid / Android 2.0.1,遇到了很多人遇到的问题:我无法使用我所知的一个纯Java-zeroconf库jmDNS来发现服务。 (苹果的Bonjour,虽然它在Linux和Windows Java上工作,但由于依赖本机代码,我相信将难以移植到Android。)

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

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

任何想法为什么这个人可能会成功? 请参阅错误报告中的评论22。 (我是新来的,所以不能发布多个url。)

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

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

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

我是新来的,否则我只会留下一个关于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是我目前唯一的testing设备,所以我不能肯定地说。

我设法交叉编译Bonjour for Android,并使它运行的方式与苹果计划在打印机等embedded式设备上运行的方式大致相同。 这是构build脚本。

这是一个小的便利包装,使其按预期工作。

我们使用Bonjour发行版中的client_shim层,通过通常的dns_sd.h API封装所有对embedded式mDNS实现的访问。 你不使用习惯用文件句柄和select与填充层。

client_shim图层并不完全被苹果公司所支持 – 实际上我在variables名称中发现了拼写错误,但它仍在工作。 您将需要应用此修补程序来包含正确的头文件,修复打字错误并通过Android API进行logging。

还有一件事:您需要从Java代码中获取并保持MultiCast Lock,否则您将找不到其他人。 看到这里的例子。

除此之外,我已经在Android API Level 8上工作了,而且我们正在维护一个预编译好的Android的Bonjour库,不过我不确定这是否正常。

编辑:

在prebuilts版本是330.10,新的client_shim作为静态库无法编译MSVC2010在Windows上,所以我们保持这一个。

祝你好运!

Android 4.1为应用程序添加了原生Bonjour支持(看起来像通过mDNSResponder实现)。 高级API似乎被称为networking服务发现,但似乎在下面的Bonjour。 也似乎有一个较低级别的API通过android.net.wifi.p2p.WifiP2pManager暴露。

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

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

 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没有修复。 也许你应该过渡到更高的版本?

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

这是一个很好的示例项目,展示了如何让所有的东西都能正常运行。 它还包括一个自定义的jmdns.jar,它解决了我使用具有重复类文件的开箱即用jmdns.jar时遇到的一些问题。