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:
@@ -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() {
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user