mirror of
https://github.com/arduino/Arduino.git
synced 2025-03-03 00:29:21 +01:00
IDE network discovery now reacts to new networks: it monitors available IP addresses and, when one is added, it starts listening to bonjours coming from it
This commit is contained in:
parent
7fae00bce4
commit
1f7ad71218
@ -23,7 +23,7 @@ public interface Discovery {
|
|||||||
/**
|
/**
|
||||||
* Stop discovery service
|
* Stop discovery service
|
||||||
*/
|
*/
|
||||||
public void stop();
|
public void stop() throws Exception;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the list of discovered ports.
|
* Return the list of discovered ports.
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package cc.arduino.packages;
|
package cc.arduino.packages;
|
||||||
|
|
||||||
import static processing.app.I18n._;
|
import cc.arduino.packages.discoverers.NetworkDiscovery;
|
||||||
|
import cc.arduino.packages.discoverers.SerialDiscovery;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import cc.arduino.packages.discoverers.NetworkDiscovery;
|
import static processing.app.I18n._;
|
||||||
import cc.arduino.packages.discoverers.SerialDiscovery;
|
|
||||||
|
|
||||||
public class DiscoveryManager {
|
public class DiscoveryManager {
|
||||||
|
|
||||||
@ -39,8 +39,13 @@ public class DiscoveryManager {
|
|||||||
private Thread closeHook = new Thread(new Runnable() {
|
private Thread closeHook = new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
for (Discovery d : discoverers)
|
for (Discovery d : discoverers) {
|
||||||
|
try {
|
||||||
d.stop();
|
d.stop();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package cc.arduino.packages.discoverers;
|
|||||||
|
|
||||||
import cc.arduino.packages.BoardPort;
|
import cc.arduino.packages.BoardPort;
|
||||||
import cc.arduino.packages.Discovery;
|
import cc.arduino.packages.Discovery;
|
||||||
|
import cc.arduino.packages.discoverers.network.NetworkChecker;
|
||||||
import processing.app.Base;
|
import processing.app.Base;
|
||||||
import processing.app.helpers.PreferencesMap;
|
import processing.app.helpers.PreferencesMap;
|
||||||
import processing.app.zeroconf.jmdns.ArduinoDNSTaskStarter;
|
import processing.app.zeroconf.jmdns.ArduinoDNSTaskStarter;
|
||||||
@ -12,17 +13,18 @@ import java.io.IOException;
|
|||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class NetworkDiscovery implements Discovery, ServiceListener {
|
public class NetworkDiscovery implements Discovery, ServiceListener, cc.arduino.packages.discoverers.network.NetworkTopologyListener {
|
||||||
|
|
||||||
|
private Timer timer;
|
||||||
private List<BoardPort> ports;
|
private List<BoardPort> ports;
|
||||||
|
private final Map<InetAddress, JmDNS> mappedJmDNSs;
|
||||||
|
|
||||||
public NetworkDiscovery() {
|
public NetworkDiscovery() {
|
||||||
DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter());
|
DNSTaskStarter.Factory.setClassDelegate(new ArduinoDNSTaskStarter());
|
||||||
this.ports = new ArrayList<BoardPort>();
|
this.ports = new ArrayList<BoardPort>();
|
||||||
|
this.mappedJmDNSs = new Hashtable<InetAddress, JmDNS>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -56,21 +58,14 @@ public class NetworkDiscovery implements Discovery, ServiceListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start() throws IOException {
|
public void start() throws IOException {
|
||||||
for (InetAddress addr : NetworkTopologyDiscovery.Factory.getInstance().getInetAddresses()) {
|
this.timer = new Timer(this.getClass().getName() + " timer");
|
||||||
JmDNS jmDNS = JmDNS.create(addr);
|
new NetworkChecker(this, NetworkTopologyDiscovery.Factory.getInstance()).start(timer);
|
||||||
jmDNS.addServiceListener("_arduino._tcp.local.", this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop() {
|
public void stop() throws IOException {
|
||||||
// Removed cleanup: is extremely slow on closing
|
timer.purge();
|
||||||
|
// we don't close each JmDNS instance as it's too slow
|
||||||
// try {
|
|
||||||
// jmDNS.close();
|
|
||||||
// } catch (IOException e) {
|
|
||||||
// e.printStackTrace();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -130,4 +125,29 @@ public class NetworkDiscovery implements Discovery, ServiceListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inetAddressAdded(InetAddress address) {
|
||||||
|
if (mappedJmDNSs.containsKey(address)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
JmDNS jmDNS = JmDNS.create(address);
|
||||||
|
jmDNS.addServiceListener("_arduino._tcp.local.", this);
|
||||||
|
mappedJmDNSs.put(address, jmDNS);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inetAddressRemoved(InetAddress address) {
|
||||||
|
JmDNS jmDNS = mappedJmDNSs.remove(address);
|
||||||
|
if (jmDNS != null) {
|
||||||
|
try {
|
||||||
|
jmDNS.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
package cc.arduino.packages.discoverers.network;
|
||||||
|
|
||||||
|
import javax.jmdns.NetworkTopologyDiscovery;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class NetworkChecker extends TimerTask {
|
||||||
|
|
||||||
|
private final NetworkTopologyListener topologyListener;
|
||||||
|
private final NetworkTopologyDiscovery topology;
|
||||||
|
|
||||||
|
private Set<InetAddress> knownAddresses;
|
||||||
|
|
||||||
|
public NetworkChecker(NetworkTopologyListener topologyListener, NetworkTopologyDiscovery topology) {
|
||||||
|
super();
|
||||||
|
this.topologyListener = topologyListener;
|
||||||
|
this.topology = topology;
|
||||||
|
this.knownAddresses = Collections.synchronizedSet(new HashSet<InetAddress>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start(Timer timer) {
|
||||||
|
timer.schedule(this, 0, 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
InetAddress[] curentAddresses = topology.getInetAddresses();
|
||||||
|
Set<InetAddress> current = new HashSet<InetAddress>(curentAddresses.length);
|
||||||
|
for (InetAddress address : curentAddresses) {
|
||||||
|
current.add(address);
|
||||||
|
if (!knownAddresses.contains(address)) {
|
||||||
|
topologyListener.inetAddressAdded(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (InetAddress address : knownAddresses) {
|
||||||
|
if (!current.contains(address)) {
|
||||||
|
topologyListener.inetAddressRemoved(address);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
knownAddresses = current;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package cc.arduino.packages.discoverers.network;
|
||||||
|
|
||||||
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
public interface NetworkTopologyListener {
|
||||||
|
|
||||||
|
void inetAddressAdded(InetAddress address);
|
||||||
|
|
||||||
|
void inetAddressRemoved(InetAddress address);
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user