由于jmDNS不支持按子类型进行服务浏览,因此我选择了交叉编译bonjour for android,然后按照以下步骤操作。
但是当我调用DNSServiceBrowse时,我得到的错误响应是DNS service call failed -65563
,“后台守护程序没有运行”。
通常在linux上运行时我们启动mdns守护进程。
如何解决此问题?有什么建议吗?
答案 0 :(得分:2)
但是当我调用DNSServiceBrowse时,我得到的错误响应是DNS服务调用失败-65563,"后台守护程序没有运行"。
您无法在Android中运行守护进程。请参阅:Android daemon process
要在嵌入式实现中使用mdnsresponder,您必须直接与mDNSCore通信。请参阅"工作原理"本[1]的自述文章部分。
如何解决此问题?
查看"注意" mDNSEmbedded.h中的部分[2]基本上不是通过守护进程通信,而是需要在[3]使用dnssd_clientshim.c。这样您就可以"still use the preferred dns_sd.h APIs by linking in "dnssd_clientshim.c", which implements the standard "dns_sd.h" API calls, allocates any required storage using malloc(), and then calls through to the low-level malloc-free mDNSCore routines"
注意:似乎dnssd_clientshim.c有一些拼写错误和缺少引用会阻止编译,因此您需要在构建时执行补丁(参见[4]& [5])。在编译时,您仍然需要包含dnssd_clientlib.c,否则您将获得TXTRecord函数引用的构建错误。
答案 1 :(得分:1)
这意味着当你得到" DNS服务调用失败-65563"时,你还没有启动服务。
mdnsresponder包中有一个DNSSDEmbeddedDaemon类,您需要先使用此java类启动守护程序服务,然后调用browse()来查找所需的网络服务。
顺便说一句,你需要获取/释放守护进程的多重锁定。这是您可能需要的示例代码部分,这是您在浏览网络服务之前启动的服务。
public class DNSSDEmbeddedDaemon extends Service {
private static final String TAG = DNSSDEmbeddedDaemon.class.getName();
public IBinder onBind(Intent paramIntent) {
return null;
}
public void onCreate() {
super.onCreate();
DNSSDEmbedded.listeners.clear();
DNSSDEmbedded.init(new DNSSDEmbedded.Listener() {
@Override
public void onStart() {
Log.d(TAG, "EmbededMDNS onStart");
}
@Override
public void onEnd() {
Log.d(TAG, "EmbededMDNS onEnd");
DNSSDEmbedded.listeners.clear();
}
@Override
public void onError() {
Log.d(TAG, "EmbededMDNS onError");
}
});
}
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "EmbededMDNS Exit() is called");
DNSSDEmbedded.Exit();
}
}