是否有一种简单的方法可以扫描给定的网络以获取Bonjour/Zeroconf服务?
我有一套计算机(Linux,Windows,Apple),并希望在我的Intranet中自动生成所有可用的支持Zeroconf的网络节点的列表.
我试图弄清楚这是否可行,但是通过Visual C++宣传Bonjour服务的最简单方法是什么?
我最近发现,通过Ubuntu的同理心客户端,存在一种协议,使用户能够与他的实际本地网络上的任何人交谈.似乎同理心称这项服务为" 人们附近 "和Windows" 我附近的人 ".
经过一些研究后,我发现了更多信息:似乎"协议"被称为Avahi(或Apple的Bonjour/Salut(?)),允许用户连接到网络上的用户,打印机和文件.
我的问题:
我想开发一款可以在Blackberry PlayBook上运行的Android应用程序.应用程序需要在运行相同应用程序的本地网络上查找其他设备.
我正在考虑实施Bonjour/Zeroconf/jmDNS协议来寻找设备,但......
我刚学会了android权限
android.permission.CHANGE_WIFI_MULTICAST_STATE
Blackberry或PlayBook不支持.(需要首选jmDND(Bonjour)协议才能工作.)
https://bdsc.webapps.blackberry.com/android/apisupport/
你能给我一些建议吗?这是在PlayBook上实现这一目标的最佳方法.还有其他选择吗?
如果使用原生SDK或Adobe AIR构建,是否可以使用Bonjour?
如何Java构建可Spring Boot发现的Web应用程序应用程序zeroconf?
我试过以下JmDNS但它似乎不起作用:
@Bean
public JmDNS jmdns() {
try {
JmDNS jmdns = JmDNS.create(InetAddress.getLocalHost());
ServiceInfo serviceInfo = ServiceInfo.create("_http._tcp.local.", "appName", port, "path=index.html");
jmdns.registerService(serviceInfo);
return jmdns;
} catch (final Exception e) {
logger.error(e.getMessage());
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后,我希望能够在Windows 10网络概述中看到该服务,但它不会出现在那里.
编辑
该应用程序列在avahi浏览器中,显示它以某种方式工作.
但我的目标是让它在Windows网络服务概述中可见.
我已经阅读了使用NSD查找特定网络服务的android 文档.以下是我发现所有可用_http._tcp服务的代码.
final NsdManager.DiscoveryListener discoveryListener = new NsdManager.DiscoveryListener() {
@Override
public void onDiscoveryStarted(String s) {
Log.i(TAG, "onDiscoveryStarted: " + s);
}
@Override
public void onServiceFound(NsdServiceInfo nsdServiceInfo) {
Log.i(TAG, "onServiceFound: " + nsdServiceInfo.toString());
}
@Override
public void onServiceLost(NsdServiceInfo nsdServiceInfo) {
Log.i(TAG, "onServiceLost: " + nsdServiceInfo.toString());
}
@Override
public void onDiscoveryStopped(String s) {
Log.i(TAG, "onDiscoveryStopped: " + s);
}
@Override
public void onStartDiscoveryFailed(String s, int i) {
Log.i(TAG, "onStartDiscoveryFailed: " + s);
}
@Override
public void onStopDiscoveryFailed(String s, int …Run Code Online (Sandbox Code Playgroud) 我正在为Haskell开发一个跨平台的Zeroconf/Bonjour/DNS-SD库,并且认为我最好的选择是定位dns_sd.hAPI.在Linux下,此接口的实现由Avahi提供,Avahi声称支持Bonjour API的一个子集.
作为我的库的健全性检查,我在C中编写了一个小型测试程序,它只使用了API的基础.它浏览网络上的任何类型的服务_http._tcp,一看到它就打印一条消息,然后死掉:
#include <dns_sd.h>
#include <stdio.h>
#include <stdlib.h>
void cb(DNSServiceRef sdRef,
DNSServiceFlags flags,
uint32_t interfaceIndex,
DNSServiceErrorType errorCode,
const char *serviceName,
const char *regtype,
const char *replyDomain,
void *context) {
printf("called!\n");
}
int main() {
DNSServiceRef sd = malloc(sizeof(DNSServiceRef));
const char *regtype = "_http._tcp";
DNSServiceErrorType err1 = DNSServiceBrowse(&sd, 0, 0, regtype, NULL, &cb, NULL);
printf("err1=%d\n", err1);
DNSServiceErrorType err2 = DNSServiceProcessResult(sd);
printf("err2=%d\n", err2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的Mac上,这个测试程序在C和等效的Haskell中都运行良好(它找到了我的打印机;令人兴奋!):
$ gcc test.c -o …Run Code Online (Sandbox Code Playgroud) 我正在制作需要使用的Windows 8 metro应用程序zeroconf library.根据我的观察,有一些库和最值得信赖的库Mono.Zeroconf.但是我似乎无法通过NuGet安装它,我得到一个错误,说"无法安装Mono.Zeroconf,因为它与解决方案中的任何项目都不兼容."
"该软件包的目标是以下框架:.NETFramework,Version = v2.0"
.
Mono.Zeroconf是否有任何记录良好的替代方案或我可以做的任何其他方法使其在我的Windows 8应用程序上运行?
编辑:好吧,我试图使用零配置库在这里,但我只是通过调用简单函数得到一个错误.我打电话的时候
await ZeroconfResolver.BrowseDomainAsync();
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
mscorlib.dll中出现"System.InvalidOperationException"类型的异常,但未在用户代码中处理
WinRT信息:Socket已经绑定到一个地址.
附加信息:在意外时间调用方法.
任何人都知道为什么会这样或者如何解决?
提前致谢.
我想尽可能多地发现有关网络上物联网设备的信息.我见过代码来枚举设备,找到IP地址和MAC地址,但我还能找到什么?特别是,我想知道有些东西是灯,更重要的是,制造商是什么.
我一直在查看IoTivity和AllJoyn的一些文档以及各种零配置协议.据我所知,这些事情更关注所暴露的服务,而不是设备的确切含义.
我误解了吗?是否有某种方法来映射本地网络并确切知道每个设备是什么?
我在 Android 应用程序中使用 NsdManager 来发现由我开发的另一台设备发布的 NSD 服务。我只在 Android App 上做服务发现(这边不需要服务注册)。网络上同时发布了多个相同类型服务的实例。
我开始使用 Google 提供的示例代码(https://developer.android.com/training/connect-devices-wireless/nsd),但由于同时重复使用同一个解析器对象不止一个,我遇到了致命错误服务解决。然后我发现有几个人建议每次都创建一个新的解析器对象(例如在Listener already in use (Service Discovery) 中)。
我这样做了,致命错误被解决失败错误代码 3 取代,这意味着解决过程处于活动状态。比以前好多了,但只有第一个服务得到解决,其余的都因为这个失败而被忽略了。
然后我发现有人建议对错误代码 3 进行特殊处理,方法是递归地重新发送解析请求,直到它最终被解析(NSNetworkManager.ResolveListener 消息 Android)。
我在 Kotlin 中实现了这个解决方案,它有点工作,但我并不满意,因为:
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 示例使用单个解析器对象,并且在网络上以相同类型发布多个相同类型的服务时失败。
你能提出更好的解决方案吗?或者对我下面的代码有什么改进?
import android.app.Application
import android.content.Context
import android.net.nsd.NsdManager
import android.net.nsd.NsdServiceInfo
import androidx.lifecycle.AndroidViewModel
import timber.log.Timber
class ViewModel(application: Application) : AndroidViewModel(application) {
// Get application context
private val myAppContext: Context = getApplication<Application>().applicationContext …Run Code Online (Sandbox Code Playgroud)