From 3fec636b295c7aebfb3cc13f946ce3f81867a130 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Mon, 16 Feb 2015 20:11:17 +0100 Subject: [PATCH 1/2] An attempt to improve Yun's discovery. Thanks @roadfun. See #2576 --- .../discoverers/NetworkDiscovery.java | 32 ++++++++++++++----- .../src/processing/app/helpers/NetUtils.java | 2 +- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index 85cd05c66..106b50924 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -58,19 +58,35 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. @Override public List discovery() { - List ports = clonePortsList(); - Iterator iterator = ports.iterator(); - while (iterator.hasNext()) { + List boardPorts = clonePortsList(); + Iterator boardPortIterator = boardPorts.iterator(); + while (boardPortIterator.hasNext()) { try { - BoardPort board = iterator.next(); - if (!NetUtils.isReachable(InetAddress.getByName(board.getAddress()), Integer.parseInt(board.getPrefs().get("port")))) { - iterator.remove(); + BoardPort board = boardPortIterator.next(); + + InetAddress inetAddress = InetAddress.getByName(board.getAddress()); + int broadcastedPort = Integer.valueOf(board.getPrefs().get("port")); + + List ports = new LinkedList(); + 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 = false; + for (Integer port : ports) { + reachable = reachable || NetUtils.isReachable(inetAddress, port); + } + if (!reachable) { + boardPortIterator.remove(); } } catch (UnknownHostException e) { - iterator.remove(); + boardPortIterator.remove(); } } - return ports; + return boardPorts; } private List clonePortsList() { diff --git a/arduino-core/src/processing/app/helpers/NetUtils.java b/arduino-core/src/processing/app/helpers/NetUtils.java index c67245801..96fe6ff09 100644 --- a/arduino-core/src/processing/app/helpers/NetUtils.java +++ b/arduino-core/src/processing/app/helpers/NetUtils.java @@ -11,7 +11,7 @@ public abstract class NetUtils { Socket socket = null; try { socket = new Socket(); - socket.connect(new InetSocketAddress(address, port), 100); + socket.connect(new InetSocketAddress(address, port), 300); return true; } catch (IOException e) { return false; From 0990f98b1430bdd79022d48981f91ddf354bae78 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Thu, 19 Feb 2015 09:34:32 +0100 Subject: [PATCH 2/2] InetAddress.isReachable is reported reliable on mac and recent java versions Refactored NetUtils.isReachable to two functions: isReachableByEcho and isPortOpen If the first one will fail, the second one will be used --- .../discoverers/NetworkDiscovery.java | 5 +--- .../src/processing/app/helpers/NetUtils.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index 106b50924..6f593571a 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -75,10 +75,7 @@ public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino. ports.add(0, 22); } - boolean reachable = false; - for (Integer port : ports) { - reachable = reachable || NetUtils.isReachable(inetAddress, port); - } + boolean reachable = NetUtils.isReachable(inetAddress, ports); if (!reachable) { boardPortIterator.remove(); } diff --git a/arduino-core/src/processing/app/helpers/NetUtils.java b/arduino-core/src/processing/app/helpers/NetUtils.java index 96fe6ff09..67201bf3d 100644 --- a/arduino-core/src/processing/app/helpers/NetUtils.java +++ b/arduino-core/src/processing/app/helpers/NetUtils.java @@ -4,10 +4,37 @@ import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; +import java.util.Arrays; +import java.util.List; 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) { + return isReachable(address, Arrays.asList(port)); + } + + public static boolean isReachable(InetAddress address, List 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; try { socket = new Socket();