我的目标是在WIFI网络中找到所有的bonjour服务,找到他们的IP /端口,并通过HTTP进行通信。
发现错误地发现了在iMac上托管的Bonjour服务 - 找到了服务名称,但是port = 0,InetAddress [] = null。 与Windows PC上托管的相同服务的连接工作正常(来自一个供应商的相同版本的软件) - 正确发现名称,URL和端口。 Bonjour服务浏览器正确地看到两种服务。 使用了JmDNS 3.4.0 lib,参见代码示例(省略了一些代码):
MulticastLock lock = wifi.createMulticastLock(MULTICAST_LOCK_TAG);
lock.setReferenceCounted(true);
lock.acquire();
final InetAddress inetAddress = getLocalIpAddress();
jmdns = JmDNS.create(inetAddress, JMDNS_NAME);
ServiceInfo[] infos = jmdns.list(CAMERA_SERVERS);
if (infos != null && infos.length > 0) {
for (int i = 0; i < infos.length; i++) {
name = infos[i].getName();
InetAddress[] addresses = infos[i].getInetAddresses();
url = addresses[0].getHostAddress();
port = infos[i].getPort();
}
PS。尝试过来自Apple的 dns_sd.jar ,但它依赖于原生代码,无法在Android中使用。
有什么想法吗?
感谢。
答案 0 :(得分:1)
使用下面的代码。经过测试和实施,工作正常
android.net.wifi.WifiManager.MulticastLock lock;
android.os.Handler handler = new android.os.Handler();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handler.postDelayed(new Runnable() {
public void run() {
setUp1();
}
}, 1000);
}
private void setUp1()
{
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
lock = wifi.createMulticastLock("mylockthereturn");
lock.setReferenceCounted(true);
lock.acquire();
try {
//http://stackoverflow.com/questions/13677199/jmdns-doesnt-work-properly-on-android-4-1
WifiInfo wifiInfo = wifi.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);
InetAddress _bindingAddress = InetAddress.getByName(ipAddress);
jmdns = JmDNS.create(_bindingAddress);
ServiceInfo[] infos = jmdns.list("_afpovertcp._tcp.local.");
for (int i=0; i < infos.length; i++) {
notifyUser("\nServic : "+infos[i].getName()+"");
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
private void notifyUser(final String msg) {
handler.postDelayed(new Runnable() {
public void run() {
TextView t = (TextView)findViewById(R.id.text);
t.setText(msg+"\n=== "+t.getText());
}
}, 1);
}
答案 1 :(得分:0)
对于初学者,尝试使用不带参数的JmDNS.create
方法重载。问题是可能有几个网络接口(移动和wifi)和你可能使用getLocalIpAddress
绑定到错误的IP 。详细了解JmDNS如何自己猜测这些参数here。它在PC上工作的原因是因为getLocalIpAddress
返回了WiFi ip。也许是因为它是唯一的网络接口。
还要确保您可以通过WiFi获得要访问的服务。出于明显的安全原因,无线路由器将WiFi网络和以太网网络分开是非常常见的。