问题标签 [nsd]

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 投票
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 投票
1 回答
30 浏览

android - 如何正确更改我的 kotlin android 库的部分访问权限,以便用户无法与它们交互?

所以我一直在尝试编写我的第一个 Kotlin Android 库。它是一个包装器,(理论上)应该使使用网络系统发现更容易一些。回顾正在发生的事情以及我正在尝试做的事情。我将抽象大部分代码并将其省略。所以androids内置的NSD在实际使用之前需要大量的样板代码和监听器来实现。我尝试使用现代方法并利用 Kotlins 功能来解决这个问题。所以现在我有一个 NsdHelper 类,您创建一次并使用它来注册、取消注册、发现服务等。这是通过对listers 进行包装来实现的,这些listers 调用helper 类中的特定方法。

辅助方法示例

要注册服务,您需要传递所有必要的信息以及将在失败或成功的情况下执行的 lambda。问题出现在这里,因为我必须在类中存储回调registerSuccessCallBackregisterFailureCallBack。所以看起来像这样

正如我自己评论的那样,它们应该是私有的,并且用户不应该可以访问它们,但是我不能像这样实现监听器的方式那样简单地将它们设为私有

所以它们必须是公开的才能被听众访问。我想到了 2 种解决方案,但在网上找不到任何有关如何正确处理此问题的信息。首先是让 Listeners 成为内部类,但这会大大增加 Helper 类的大小,而且感觉不对。另一种解决方案是在函数调用中创建侦听器并将回调传递给它们的构造函数。如果有人有想法,我会非常感谢一些关于如何正确编写以及为什么这样的建议或提示。这是我下定决心要做的最具挑战性的事情之一。

0 投票
1 回答
96 浏览

android - 如何构建可以使用网络内的打印机打印文件(PDF、照片等)的 Android 应用程序?

我正在构建一个Android使用网络内的打印机打印文件的应用程序,我已经使用过network service discovery (NSD)并且已经获得了一个Ipport一个打印机名称,所以现在我需要如何调用这台打印机并向它发送打印命令,这些是初步的我为他工作的应用程序的图片:

我的应用程序:单击搜索按钮之前的图像

我的应用程序:单击搜索按钮后的图像

所以任何人都可以帮助我!

0 投票
0 回答
87 浏览

android - 使用 Android NSD 推广 IPv6 地址而不是 IPv4 地址

我在我的应用程序中成功注册了一项服务,我可以使用命令行工具在我的通用 Linux 设备上看到该服务avahi-browse。我想知道的是:为什么 avahi-browse 确实显示我的 Android 的 IPv4 地址而不是 IPv6(本地链接)地址?这两个部分都打印在屏幕上。

如何使服务发现提升 IPv6 地址。请在下面查看我的代码片段:

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

0 投票
0 回答
41 浏览

android - NSD 问题查找 raspberrypi.local 服务/ip

您好,我正在编写一个需要自动连接到我的 rpi 服务器的应用程序,我发现没有 nsd 的情况下 android dosent 支持这个,所以我按照本教程为您的 Raspberry Pi 设置 Bonjour (Zeroconf) 服务名称并从 Android 应用程序访问它

但不幸的是,我仍然无法从 raspberrypi.local 找到我的 ip,它在我的电脑上 ping jsut 很好,所以这不是问题。我按照教程到 at ,我不知道从这里去哪里。有任何想法吗?

0 投票
2 回答
95 浏览

java - NSD发现服务android

任务描述:我打算使用NSD android构建一个可以在我的网络中发现ESP32提供的服务的应用程序,所以我实现了以下代码:

但我收到以下错误:

D:\ProgQt\build-app-Android_for_armeabi_v7a_arm64_v8a_x86_x86_64_Clang_Qt_5_15_0_for_Android-Debug\android-build\src\org\qtproject\example\musiclist\MusicList.java:127:错误:找不到符号 discoveryListener = new NsdManager.DiscoveryListener() { ^

你能帮忙吗?

0 投票
1 回答
80 浏览

android - NsdServiceInfo 不包含 Android 6.0 上的属性

在应该在 Android 6+ 上运行的 Android 应用程序上,我正在尝试使用网络服务发现来检查我的网络上是否有一些设备可用。

基于官方文档的这一部分,我创建了这个小 POC:

此代码在 Android 7 到 11 上正常工作。但在 Android 6 上不能正常工作。我可以正确解析服务,但根据日志它不包含任何属性:

例如,这里是 Android 6.0 上的结果:

onServiceResolved : 名称:TJA470 (TJA470-F40103),类型:._http._tcp,主机:/10.0.0.177,端口:80 || {}

这是 Android 11 上的结果:

onServiceResolved : 名称:TJA470 (TJA470-F40103),类型:._http._tcp,主机:/10.0.0.177,端口:80,txtRecord:1device.type=urn:schemas-hager-com:device:tja470:1device.modelName =TJA470 export=是$device.modelURL=http://www.hager.comdevice.hostName=TJA470-F40103device.manufacturer=Hagerdevice.ip=10.0.0.1771device.modelDescription=Hager Pilot 配置+device.manufacturerURL=http:// /www.hager.com(device.UDN=uuid:M2VSZEVUELAJYECHAJLU1708device.UPC=470,device.serialNumber=M2VSZEVUELAJYECHAJLU1708device.modelNumber=3.1.15'presentationURL=http://TJA470-F40103:80*device.friendlyName=TJA470 (TJA470 -F40103) || {device.type=[117, 114, 110, 58, 115, 99, 104, 101, 109, 97, 115, 45, 104, 97, 103, 101, 114, 45, 99, 111 , 109, 58, 100, 101, 118, 105, 99, 101, 58, 116, 106, 97, 52, 55, 48, 58, 49], device.modelName=[84, 74, 65, 52, 55 , 48], 出口=[89, 101,115], device.modelURL=[104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 104, 97, 103, 101, 114, 46, 99, 111, 109], 设备.hostName=[84, 74, 65, 52, 55, 48, 45, 70, 52, 48, 49, 48, 51], device.manufacturer=[72, 97, 103, 101, 114], device.ip =[49, 48, 46, 48, 46, 48, 46, 49, 55, 55], device.modelDescription=[72, 97, 103, 101, 114, 32, 80, 105, 108, 111, 116, 32, 67, 111, 110, 102, 105, 103, 117, 114, 97, 116, 105, 111, 110], device.manufacturerURL=[104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 104, 97, 103, 101, 114, 46, 99, 111, 109], device.UDN=[117, 117, 105, 100, 58, 77, 50, 86, 83, 90, 69, 86, 85, 69, 76, 65, 74, 89, 69, 67, 72, 65, 74, 76, 85, 49, 55, 48, 56], device.UPC=[52, 55, 48] , device.serialNumber=[77, 50, 86, 83, 90, 69, 86, 85, 69, 76, 65, 74, 89, 69, 67, 72, 65, 74, 76, 85, 49, 55, 48, 56], device.modelNumber=[51, 46, 49, 46,49, 53],presentationURL=[104, 116, 116, 112, 58, 47, 47, 84, 74, 65, 52, 55, 48, 45, 70, 52, 48, 49, 48, 51, 58, 56, 48], device.friendlyName=[84, 74, 65, 52, 55, 48, 32, 40, 84, 74, 65, 52, 55, 48, 45, 70, 52, 48, 49, 48, 51, 41]}

如您所见,这些属性出现在 Android 11 而不是 Android 6.0 上。是 Android 6.0 上的 NSD_SERVICE 的问题还是我开发的 POC 的问题?

该类NsdServiceInfo已添加到 API 16 中,getAttributes方法已添加到 API 21 中。所以通常一切都应该在 Android 6.0 上正常工作:(