嵌入式bonjour mdnsresponder for Android无法正常工作(错误-65563;守护程序未运行)



,由于JMDNS不支持子类型的服务浏览,所以我随身携带了Android的Cross,我遵循以下步骤。

  1. Cross编译了Android的MDNSRESPONDER
  2. 用JNI包装器写了DNS-SD客户端,该包装使用上述具有2个JNI函数的共享库:
    1. 一个用于调用主循环的人
    2. 另一个用于浏览服务的
  3. 我已经用WiFi MulticastLock编写了Java应用程序

但是,当我调用DNSServiceBrowse时,我收到的错误响应是DNS service call failed -65563,"背景守护程序都没有运行"。

通常在Linux上运行时,我们开始MDNS守护程序。

如何解决此问题?有任何建议吗?

但是,当我调用DNSServiceBrowse时,我收到的错误响应是DNS服务呼叫失败-65563,"背景守护程序未运行"。

您不能在Android中运行守护程序。请参阅:Android守护程序过程

为了在嵌入式实现中使用MDNSResponder,您必须直接与MDNSCORE进行通信。请参阅[1]。

如何解决此问题?

在[2]上查看mdnsembedded.h中的" note"部分,而不是通过守护程序进行通信,需要在[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][2][3][4][5]

这意味着您在获得" DNS服务呼叫失败-65563"时尚未启动服务。

MDNSResponder软件包中有一个DNSSDEMBEDDAEMON类,您需要使用此Java类首先启动守护程序服务,然后您可以调用Browse()查找所需的网络服务。

>

顺便说一句,您需要为守护程序获取/释放mutlti-cast锁。

这是您可能需要的示例代码的一部分,这是您在浏览网络服务之前启动的服务。

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();
    }
}

最新更新