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

Pet*_*irn 38 android bonjour zeroconf

我正在使用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的新手,因此无法发布多个网址.)

我测试了他们的代码,但没有运气.

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

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

小智 12

我也是新手,否则我会对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();
Run Code Online (Sandbox Code Playgroud)

只要确保lock.release()在完成后再打电话.这可能只是Android 2.0+所必需的,Droid是我目前唯一的测试设备,所以我不能肯定地说.


sra*_*ski 8

我设法交叉编译Bonjour for Android并使其运行的方式与Apple打算在打印机等嵌入式设备上运行的方式相同.是构建脚本.

是一个小型便利包装器,可以让它按照您的预期运行.

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

Apple_不完全支持client_shim层 - 实际上我在变量名中发现了拼写错误,但它仍在运行.您需要应用此修补程序以包含正确的头文件,修复拼写错误并通过Android API获取日志记录.

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

除此之外,我在Android API Level 8上工作,我们正在维护一个预先构建的Bonjour for Android库,但我不确定这是否可以按照许可证进行操作.

编辑:

预编译中的版本是330.10,较新的版本使用client_shim作为静态库无法在Windows上使用MSVC2010进行编译,因此我们保留了这个版本.

祝好运!


nat*_*evw 7

Android 4.1为应用程序添加了本机Bonjour支持(看起来像是通过mDNSResponder实现的).高级API似乎被称为网络服务发现,但似乎是下面的Bonjour.似乎还有一个通过android.net.wifi.p2p.WifiP2pManager公开的低级API .

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

  • 遗憾的是,原生API不允许访问TXT记录,这是一个严重限制 - https://code.google.com/p/android/issues/detail?id=136099 (5认同)