Skip to content

Commit 947951d

Browse files
committed
Merge pull request #2658 from ffissore/better-yun-discovery
An attempt to improve Yun's discovery
2 parents bedc550 + 0990f98 commit 947951d

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,32 @@ public NetworkDiscovery() {
5858

5959
@Override
6060
public List<BoardPort> discovery() {
61-
List<BoardPort> ports = clonePortsList();
62-
Iterator<BoardPort> iterator = ports.iterator();
63-
while (iterator.hasNext()) {
61+
List<BoardPort> boardPorts = clonePortsList();
62+
Iterator<BoardPort> boardPortIterator = boardPorts.iterator();
63+
while (boardPortIterator.hasNext()) {
6464
try {
65-
BoardPort board = iterator.next();
66-
if (!NetUtils.isReachable(InetAddress.getByName(board.getAddress()), Integer.parseInt(board.getPrefs().get("port")))) {
67-
iterator.remove();
65+
BoardPort board = boardPortIterator.next();
66+
67+
InetAddress inetAddress = InetAddress.getByName(board.getAddress());
68+
int broadcastedPort = Integer.valueOf(board.getPrefs().get("port"));
69+
70+
List<Integer> ports = new LinkedList<Integer>();
71+
ports.add(broadcastedPort);
72+
73+
//dirty code: allows non up to date yuns to be discovered. Newer yuns will broadcast port 22
74+
if (broadcastedPort == 80) {
75+
ports.add(0, 22);
76+
}
77+
78+
boolean reachable = NetUtils.isReachable(inetAddress, ports);
79+
if (!reachable) {
80+
boardPortIterator.remove();
6881
}
6982
} catch (UnknownHostException e) {
70-
iterator.remove();
83+
boardPortIterator.remove();
7184
}
7285
}
73-
return ports;
86+
return boardPorts;
7487
}
7588

7689
private List<BoardPort> clonePortsList() {

arduino-core/src/processing/app/helpers/NetUtils.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,41 @@
44
import java.net.InetAddress;
55
import java.net.InetSocketAddress;
66
import java.net.Socket;
7+
import java.util.Arrays;
8+
import java.util.List;
79

810
public abstract class NetUtils {
911

12+
private static boolean isReachableByEcho(InetAddress address) {
13+
try {
14+
return address.isReachable(100);
15+
} catch (IOException e) {
16+
return false;
17+
}
18+
}
19+
1020
public static boolean isReachable(InetAddress address, int port) {
21+
return isReachable(address, Arrays.asList(port));
22+
}
23+
24+
public static boolean isReachable(InetAddress address, List<Integer> ports) {
25+
if (isReachableByEcho(address)) {
26+
return true;
27+
}
28+
29+
boolean reachable = false;
30+
for (Integer port : ports) {
31+
reachable = reachable || isPortOpen(address, port);
32+
}
33+
34+
return reachable;
35+
}
36+
37+
private static boolean isPortOpen(InetAddress address, int port) {
1138
Socket socket = null;
1239
try {
1340
socket = new Socket();
14-
socket.connect(new InetSocketAddress(address, port), 100);
41+
socket.connect(new InetSocketAddress(address, port), 300);
1542
return true;
1643
} catch (IOException e) {
1744
return false;

0 commit comments

Comments
 (0)