1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-08-09 22:24:14 +03:00

Merge pull request #2658 from ffissore/better-yun-discovery

An attempt to improve Yun's discovery
This commit is contained in:
Federico Fissore
2015-02-19 16:42:44 +01:00
2 changed files with 49 additions and 9 deletions

View File

@@ -58,19 +58,32 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.
@Override @Override
public List<BoardPort> discovery() { public List<BoardPort> discovery() {
List<BoardPort> ports = clonePortsList(); List<BoardPort> boardPorts = clonePortsList();
Iterator<BoardPort> iterator = ports.iterator(); Iterator<BoardPort> boardPortIterator = boardPorts.iterator();
while (iterator.hasNext()) { while (boardPortIterator.hasNext()) {
try { try {
BoardPort board = iterator.next(); BoardPort board = boardPortIterator.next();
if (!NetUtils.isReachable(InetAddress.getByName(board.getAddress()), Integer.parseInt(board.getPrefs().get("port")))) {
iterator.remove(); InetAddress inetAddress = InetAddress.getByName(board.getAddress());
int broadcastedPort = Integer.valueOf(board.getPrefs().get("port"));
List<Integer> ports = new LinkedList<Integer>();
ports.add(broadcastedPort);
//dirty code: allows non up to date yuns to be discovered. Newer yuns will broadcast port 22
if (broadcastedPort == 80) {
ports.add(0, 22);
}
boolean reachable = NetUtils.isReachable(inetAddress, ports);
if (!reachable) {
boardPortIterator.remove();
} }
} catch (UnknownHostException e) { } catch (UnknownHostException e) {
iterator.remove(); boardPortIterator.remove();
} }
} }
return ports; return boardPorts;
} }
private List<BoardPort> clonePortsList() { private List<BoardPort> clonePortsList() {

View File

@@ -4,14 +4,41 @@ import java.io.IOException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.util.Arrays;
import java.util.List;
public abstract class NetUtils { public abstract class NetUtils {
private static boolean isReachableByEcho(InetAddress address) {
try {
return address.isReachable(100);
} catch (IOException e) {
return false;
}
}
public static boolean isReachable(InetAddress address, int port) { public static boolean isReachable(InetAddress address, int port) {
return isReachable(address, Arrays.asList(port));
}
public static boolean isReachable(InetAddress address, List<Integer> ports) {
if (isReachableByEcho(address)) {
return true;
}
boolean reachable = false;
for (Integer port : ports) {
reachable = reachable || isPortOpen(address, port);
}
return reachable;
}
private static boolean isPortOpen(InetAddress address, int port) {
Socket socket = null; Socket socket = null;
try { try {
socket = new Socket(); socket = new Socket();
socket.connect(new InetSocketAddress(address, port), 100); socket.connect(new InetSocketAddress(address, port), 300);
return true; return true;
} catch (IOException e) { } catch (IOException e) {
return false; return false;