由于mdns官方sample中是JmDNS.create()创建的,但是我就遇到了有的客户端设备可以被发现有的不可以被发现,所以就尝试用
JmDNS.create(InetAddress.getByName(ip),"RegisterDevices");
才让所以设备都能正常。供参考。希望如果遇到同样的问题时,你可以试试这个。
注册客户端:
public class RegisterMdns {
private ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
private final static String REMOTE_TYPE = "_sample._tcp.local.";//注册的type是这个的话,你的发现设备的代码中的type也是这个才能找到这个设备。
private int PORT = 1025;//默认端口号,可能会与实际端口有冲突,所以代码中加了动态获取端口号的逻辑
private static JmDNS jmdns;
public RegisterMdns() {
}
private ServiceInfo mServiceInfo;
public void start(final String ip) {
/**
动态获取端口
*/
int localPort = 0;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(0);
localPort = serverSocket.getLocalPort();
} catch (IOException e) {
e.printStackTrace();
}
if (localPort!=0)
PORT = localPort;
mExecutorService.execute(new Runnable() {
@Override
public void run() {
/**
这个ip是手机或盒子的ip地址
*/
try {
jmdns = JmDNS.create(InetAddress.getByName(ip),"RegisterDevices");
final HashMap<String, String> values = new HashMap<String, String>();
values.put("test", "vlaue");
mServiceInfo = ServiceInfo.create(REMOTE_TYPE, name, PORT, 0, 0, values);
jmdns.registerService(mServiceInfo);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
public void close() {
mExecutorService.execute(new Runnable() {
@Override
public void run() {
if (jmdns != null) {
try {
if (mServiceInfo != null) {
jmdns.unregisterService(mServiceInfo);
}
jmdns.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
}
查找设备端:查找并ui显示
public class DiscoverServices {
private final static ExecutorService executorService = Executors.newCachedThreadPool();
public final static String REMOTE_TYPE = "_sample._tcp.local.";
static class SampleListener implements ServiceListener {
private Handler mHandler;
private TextView mTextView;
private StringBuilder stringBuilder = new StringBuilder();
public SampleListener(Handler handler,TextView resultView) {
mHandler = handler;
mTextView = resultView;
}
@Override
public void serviceAdded(ServiceEvent event) {
}
@Override
public void serviceRemoved(ServiceEvent event) {
System.out.println("Service removed : " + event.getName() + "." + event.getType());
}
private int count=0;
@Override
public void serviceResolved(final ServiceEvent event) {
mHandler.post(new Runnable() {
@Override
public void run() {
ServiceInfo serviceInfo;
if (event != null) {
count++;
serviceInfo = event.getInfo();
stringBuilder.append(""+count+": name:"+ serviceInfo.getName() + " type: " + serviceInfo.getType() +" version="+serviceInfo.getPropertyString("version")+" uuid="+serviceInfo.getPropertyString("uuid")+" roomNumber="+serviceInfo.getPropertyString("roomNumber")+ " WanIpAddress="+serviceInfo.getPropertyString("WanIpAddress")+" BoxIpAddress="+serviceInfo.getPropertyString("BoxIpAddress")+"\n");
mTextView.setText(stringBuilder.toString());
}
}
});
System.out.println("Service resolved: " + event.getInfo());
}
}
private static JmDNS jmDNS;
public static void start(final Context context, final Handler handler, final TextView resultView) {
executorService.execute(new Runnable() {
@Override
public void run() {
try {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
InetAddress deviceIpAddress = getDeviceIpAddress(wifiManager);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock("ListServices");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
jmDNS = JmDNS.create(deviceIpAddress,"FindDevice");
jmDNS.addServiceListener(REMOTE_TYPE, new SampleListener(handler,resultView));
/* while (!close) {
ServiceInfo[] list = jmDNS.list(REMOTE_TYPE);
for (ServiceInfo item : list) {
String name = item.getName();
String type = item.getType();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private static boolean close=false;
public static void close(){
executorService.execute(new Runnable() {
@Override
public void run() {
if (jmDNS != null) {
try {
close=true;
jmDNS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}
private static InetAddress getDeviceIpAddress(WifiManager wifi) {
InetAddress result = null;
try {
// default to Android localhost
result = InetAddress.getByName("10.0.0.2");
// figure out our wifi address, otherwise bail
WifiInfo wifiinfo = wifi.getConnectionInfo();
int intaddr = wifiinfo.getIpAddress();
byte[] byteaddr = new byte[] { (byte) (intaddr & 0xff), (byte) (intaddr >> 8 & 0xff), (byte) (intaddr >> 16 & 0xff), (byte) (intaddr >> 24 & 0xff) };
result = InetAddress.getByAddress(byteaddr);
} catch (UnknownHostException ex) {
Log.w(LogUtils.TAG, String.format("getDeviceIpAddress Error: %s", ex.getMessage()));
}
return result;
}
}