我正在尝试实施JmDNS发现,以便在Android应用和桌面应用之间进行通信。我遵循了以下教程: http://home.heeere.com/tech-androidjmdns.html
Android应用注册服务,桌面应用程序为服务添加了一个监听器。我用四分之三的设备完全正常工作,但是第四部分(运行Android 3.2的三星Galaxy Tab 10.1 PT7500)我无法解析该服务。
我的处理程序收到serviceAdded
个事件,但没有serviceResolved
个事件。
我也尝试过调用jmdns.requestServiceInfo
和jmdns.getServiceInfo
,但前者没有做任何事情,后者超时并返回null。
然而,jmdns-browser能够很好地解析服务,所以它不是设备。 两个设备上都没有防火墙。该服务始终使用IPv4地址。
有人知道可能导致这个问题的原因吗?
启动服务的代码:
jmdns = JmDNS.create(wifiAddress);
ServiceInfo serviceInfo = ServiceInfo.create(Constants.SERVICE_TYPE,
Constants.SERVICE_NAME, Constants.ZEROCONF_PORT, "my service");
HashMap<String, String> deviceInfoMap = new HashMap<String, String>();
deviceInfoMap.put(Constants.KEY_DEVICE_NAME, getDeviceName());
deviceInfoMap.put(Constants.KEY_DEVICE_ID, getDeviceId());
// ...
serviceInfo.setText(deviceInfoMap);
jmdns.registerService(serviceInfo);
客户/听众的代码:
jmdns = JmDNS.create();
jmdns.addServiceListener(Constants.SERVICE_TYPE, serviceListener = new ServiceListener() {
@Override
public void serviceResolved(ServiceEvent event) {
System.out.println("Service resolved: " + event.getName() +
" of type " + event.getType());
}
@Override
public void serviceRemoved(ServiceEvent event) {
System.out.println("Service removed: " + event.getName() +
" of type " + event.getType());
}
@Override
public void serviceAdded(ServiceEvent event) {
System.out.println("Service added: " + event.getName() +
" of type " + event.getType());
ServiceInfo info = jmdns.getServiceInfo(event.getType(), event.getName());
System.out.println("Service info: " + info); // --> null
}
});
输出:
Service added: my service @ GT-P7500 of type _mytype._tcp.local.
Service info: null
Service added: my service @ Galaxy Nexus of type _mytype._tcp.local.
Service info: [ServiceInfoImpl@183779345
name: 'my service @ Galaxy Nexus ._mytype._tcp.local.'
address: '/192.168.1.154:4242 ' status: 'DNS: myhost.local.
state: probing 1 task: null', has data
deviceName: Galaxy Nexus
deviceId: <id>
displayDensity: XHDPI
]
答案 0 :(得分:8)
从github repository查看最新的源代码版本就可以了。发现该服务现在可以在所有设备上正常运行。 (注意:我使用的是我之前从sourceforge下载过的JmDNS版本3.4.1)
浏览了SVN历史记录后,自3.4.1版本发布以来,似乎有一些与解析服务问题相关的提交。
编辑:自从jmdns移动到那里后,用github存储库替换了svn。
答案 1 :(得分:1)
使用JmDNS.create(InetAddress addr, String name)
代替JmDNS.create()
。在更新版本的Android中,JmDNS需要了解有关本地设备及其正在侦听的网络接口的更多信息。
JmDNS jmdns; // somewhere global
// In a background thread
public void buildJmDNS() {
InetAddress addr = InetAddress.getLocalHost();
String hostname = InetAddress.getByName(addr.getHostName()).toString();
try {
jmdns = JmDNS.create(addr, hostname); // throws IOException
} catch (IOException e) {
e.printStackTrace(); // handle this if you want
}
}
我遇到了您遇到的同样问题,这为我解决了这个问题。我试图找到我发现的例子,说明为什么这是必要的,但我不能。