问题标签 [nsdmanager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
804 浏览

android - Android NsdManager 无法发现服务

在遵循他们的教程Using Network Service Discovery时,我遇到了 Androids NsdManager的问题。

我的网络上有一些 zeroconf/bonjour 硬件设备。从我的 Mac 中,我可以通过以下命令从终端中按预期发现所有这些 dns-sd -Z _my-mesh._tcp.

从我的 Android 应用程序的第一次运行开始,我可以使用 NsdManager 完美地发现这些服务。但是,如果我重新启动应用程序并重试,则找不到任何服务。onDiscoveryStarted被成功调用,但之后没有别的。在等待时,我可以从我的 mac 确认服务仍然成功。

然后我可以打开我的 Zeroconf 应用程序(在 Android 上),它会显示我的 mac 等服务。当我返回我的应用程序时,我看到它立即收到了我之前预期的所有回调。所以我相信我的方法有问题,但我不确定是什么。下面是我用来发现和解析服务的代码。该视图是一个巨大的文本视图(在滚动视图中),我不断向其中写入文本以便于调试。

0 投票
1 回答
611 浏览

android - 调用 resolveService 时,NSD 在 DiscoveryListener-callback 中缺少 NSDManager

我想在android设备之间交换数据,因此应该使用NSD来查找其他设备。我遵循了Android Developers上的示例

服务端成功在网络上注册服务,客户端设备识别服务并进入discoveryListener回调方法onServiceFound()。然后我初始化resolveListener并调用resolveService(),但是应用程序崩溃了

我的 mNsdManager 在 NSDFinder 类中不为空,但在 DiscoveryListener 的回调方法中不知何故为空。似乎我在使用不同的线程时遇到了问题,或者在使用上下文时存在误解。我的 NSDFinder 类应该扩展服务还是什么?我不希望主要活动中的 NSD 代码保持代码结构良好。


(缩短)主要活动

NSDFinder 类 (NSDFinder.java)

0 投票
0 回答
51 浏览

android - Android NSD Manager 服务注册

我在 android 应用程序中使用 NSD Manager 来注册服务。但是服务注册有时会成功,有时甚至几分钟都不会发生。对于未成功注册服务的时间,也不会调用 onRegistrationFailed 回调,因此无法调试服务注册未发生的原因。我无法确定服务注册何时不发生的特定模式。

0 投票
1 回答
271 浏览

java - 在没有泄漏的情况下从 AsyncTask 终止网络服务发现

我试图简单地找到一个带有 mDNS 的设备,保存 IP 并在完成后终止“网络服务发现”(NSD)。

NSD 和 AsyncTask 在这里发生冲突。

使用 NSD 获取 IP 是可行的,但如果 AsyncTask 不是静态的,它会警告泄漏。

如果 AsyncTask 是静态的,NSD 说 from onPostExecute();
不能从静态上下文中引用非静态字段“mNsdManager”

如果我将 AsyncTask 设为静态但必须注释掉mNsdManager.stopServiceDiscovery(mDiscoveryListener); 在 onPostExecute() 中执行此操作。

使用NSD,我可以在 5-15 秒内获得 IP,但是如果 AsyncTask 是静态的,如果我无法杀死它,NSD 会保持非常忙碌。

如果我通过使其成为静态mNsdManager来满足 AsyncTask 的抱怨:
无法从静态上下文中引用非静态字段“mNsdManager”

我可以编译的唯一方法是使 AsyncTask 非静态并接受可能的泄漏- 或 -将 AsyncTask 保留为静态并注释掉 onPostExecute() 中的 KILL 行。

下面的代码中标记了 2 个错误。

使用基于 Android 事件的 AsyncTask 似乎是最好的方法,但它是正确的方法吗?

我怎样才能杀死mNsdManager并仍然使AsyncTask静态以阻止泄漏?

0 投票
0 回答
226 浏览

android - NsdManager 从未在 Google Pixel 3 (Pie) 上发现任何服务

相同的代码适用于三星 S8 和索尼 XZ,但不适用于 Google Pixel 3。

我从 NsdManager 开始发现:

discoveryListener 提供与指定的相同 serviceType 的 onDiscoveryStarted 回调。我和我的服务坐在同一个 wifi 上,我等着等,但没有 onServiceFound 回调来。在三星 S8 和索尼 XZ 上开始发现后,onServiceFound 回调会出现毫秒。

Google Pixel 3 的 NsdManager 是否存在任何已知问题?

0 投票
1 回答
1829 浏览

android - NsdManager 发现不适用于 Android 9

我现在已经尝试让 NsdManager 发现功能在 Android 9 上运行。它可以在之前的任何 Android 版本上运行,没有任何问题。

出于测试目的,我使用了这个简单的代码片段,并且清单中有“INTERNET”的权限。

执行此代码时,我在日志中看不到任何调试或错误消息。

使用 Wireshark,我可以看到“_https._tcp.local”的广播 mDNS 标准查询以及来自所有预期设备的所有相应响应。在 Android 上似乎没有收到响应,因为从未调用过函数“onServiceFound”。事实上,除了“onDiscoveryStared”之外,没有任何函数被调用过。

我在 Android 9 上没有看到任何关于为什么这不应该工作的变化,并且很高兴提供任何帮助。也许我做错了什么或错过了当前 Android 版本中的任何权限更改。

更新:在带有当前 Android 9 测试版的三星 S9+ 上,服务发现可以正常工作。在另一边的我的 Pixel 3XL 上它不起作用。

0 投票
3 回答
1790 浏览

android - NSdManager ResolveListener 错误代码 3:失败已经激活

我在 Android 应用程序中使用 NsdManager 来发现由我开发的另一台设备发布的 NSD 服务。我只在 Android App 上进行服务发现(这方面不需要服务注册)。网络上同时发布了多个同类型服务的实例。

我开始使用 Google 提供的示例代码(https://developer.android.com/training/connect-devices-wireless/nsd),但由于同时重复使用同一个解析器对象不止一个,我遇到了致命错误服务解决。然后我发现有几个人建议每次都创建一个新的解析器对象(比如在Listener already in use (Service Discovery) 中)。

我这样做了,致命错误被 Resolve Failure 错误代码 3 取代,这意味着解决过程处于活动状态。比以前好多了,但只有第一个服务被解决了,其余的都因为这个失败而被忽略了。

然后我发现有人建议通过递归地重新发送解析请求直到最终解决(NSNetworkManager.ResolveListener 消息 Android)来对错误代码 3 进行特殊处理。

我在 Kotlin 中实现了这个解决方案,它有点工作,但我并不满意,因为:

  1. 我相信我正在创建很多额外的 Resolver 对象,但我不确定它们是否会被垃圾收集。
  2. 我在一个循环中重试了几次,可能会给设备和网络带来额外的和不必要的负担。不确定我是否应该在再次调用服务解析之前添加一个短暂的睡眠。
  3. 如果出现网络问题,程序可能会尝试上千次来解决同一个服务,而不是放弃解决,等待服务再次被发现。

RxBonjour2 的人提供了一个更复杂、更强大的解决方案,但它对我来说太复杂了,无法遵循:https ://github.com/mannodermaus/RxBonjour/blob/2.x/rxbonjour-drivers/rxbonjour-driver-nsdmanager /src/main/kotlin/de/mannodermaus/rxbonjour/drivers/nsdmanager/NsdManagerDiscoveryEngine.kt

我对 Google 的官方示例没有正确处理这些问题感到沮丧。nsd_chat 示例使用单个解析器对象,并且在网络上以相同类型发布多个具有相同类型的服务时失败。

您能提出更好的解决方案吗?或者对我下面的代码有什么改进?

0 投票
0 回答
314 浏览

android - 在 Android 手机上重新启用 WiFi 后,NsdManager 发现、立即丢失并重新发现相同的服务

在我的 Android 应用程序中,我必须使用 avahi 0.6.32(Linux 的 Bonjour/zeroconf 守护程序)显示由另一台机器(RPi 3B con Raspbian Stretch)发布的网络上可用服务的列表。我使用 NsdManager 在 Android 手机上获取列表。但是,在测试期间,我遇到了一个奇怪的行为:当我在手机中关闭并重新打开 WiFi 时,大多数情况下服务会被发现,然后立即丢失然后重新发现(而不是只发现一次)并且所有的不到一秒钟。

这会导致服务列表短暂出现在屏幕上,然后消失,最后几乎立即重新出现,但仍然非常明显。它强制服务被发现和解决两次。由于我希望有很多电话连接到同一个 LAN 中的多个服务,因此我想避免网络过载。

我不确定我做错了什么,或者这只是 NsdManager 在 Android 上的工作方式。为了减少可能的问题来源,我注释掉了解决服务的行(只留下日志消息),但问题仍然存在(超过一半的时间)。

我该如何解决?

从 Logcat 中提取的示例:

2019-09-26 04:33:50.262 27300-27420/com.example.myapp D/NsdHelper$initializeDiscoveryListener:服务发现成功:名称:MyService-1490247,类型:_mytype._tcp.,主机:null,端口:0, txt记录:

2019-09-26 04:33:50.879 27300-27420/com.example.myapp D/NsdHelper$initializeDiscoveryListener:服务丢失:名称:MyService-1490247,类型:_mytype._tcp.,主机:null,端口:0,txtRecord :

2019-09-26 04:33:50.970 27300-27420/com.example.myapp D/NsdHelper$initializeDiscoveryListener:服务发现成功:名称:MyService-1490247,类型:_mytype._tcp.,主机:null,端口:0, txt记录:

我正在使用 Android O 在三星 Note 8 上进行测试。我尝试了 2 个不同的 WiFi 路由器,并且行为是相同的。

我正在使用以下 NsdHelper 类(在 Kotlin 中):

在 View Model 的 init 块上,我启动服务发现:

注意:Timber 是一个日志工具,几乎可以直接替代标准 Log 命令,但更易于使用。

0 投票
0 回答
40 浏览

android - 检索 NsdManager 总是泄漏 Activity

在分析我的应用程序时,我发现通过使用检索 NsdManager

正在泄漏活动,而

才不是。我制作了一个小型测试应用程序,除了使用 Activity 上下文检索它之外,它对 NsdManager 没有任何其他作用,但它仍在泄漏活动。这是一个错误吗?我真的必须一直使用应用程序上下文吗?

设备:模拟器(Android 11、API 30、x86)

0 投票
1 回答
35 浏览

dns - 如何更改 SRV 记录格式

我使用 NsdManager 注册了服务:

我得到 TXT 和 SRV 记录。SRV 记录的格式是inventory._itxpt_http._tcp.local 120 CLASS32769 SRV 0 0 8090 Android-2.local.

如何更改当前格式?我想在服务名称(库存)之后删除 DOT,我希望它看起来像这样:inventory_itxpt_http._tcp.local 120 CLASS32769 SRV 0 0 8090 Android-2.local