diff --git a/hal.conf.example b/hal.conf.example index c4341332..3a812de0 100644 --- a/hal.conf.example +++ b/hal.conf.example @@ -27,10 +27,6 @@ hal_core.http_external_port=8081 #hal_nutups.host= #hal_nutups.port= -## NetScan plugin -# Network scanning should probably be disabled in some networks -#hal_netscan.ipscan=true - ## Zigbee plugin #hal_zigbee.com_port=COM4 #hal_zigbee.dongle=CC2531|CONBEE|XBEE diff --git a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java index 81babaeb..de1adec2 100644 --- a/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java +++ b/plugins/hal-netscan/src/se/hal/plugin/netscan/NetScanController.java @@ -20,16 +20,22 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -public class NetScanController implements HalEventController, HalAutostartController, InetScanListener, Runnable { +public class NetScanController implements + HalEventController, + HalAutostartController, + HalScannableController, + InetScanListener, + Runnable { public static Logger logger = LogUtil.getLogger(); + private static final int NETWORK_SYNC_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours private static final int PING_INTERVAL = 10 * 1000; // 10 sec - private static final String PARAM_IPSCAN = "netscan.ipscan"; private ScheduledExecutorService executor; private List deviceListeners = new CopyOnWriteArrayList<>(); /** A register and a cache of previous state **/ private HashMap devices = new HashMap<>(); + private boolean scanRunning = false; @Override @@ -41,22 +47,6 @@ public class NetScanController implements HalEventController, HalAutostartContro public void initialize() { executor = Executors.newScheduledThreadPool(2); executor.scheduleAtFixedRate(NetScanController.this, 10_000, PING_INTERVAL, TimeUnit.MILLISECONDS); - if (HalContext.getBooleanProperty(PARAM_IPSCAN, true)) { - executor.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - try { - logger.fine("Starting network scan..."); - InetScanner scanner = new InetScanner(); - scanner.setListener(NetScanController.this); - scanner.scan(InetUtil.getLocalInet4Address().get(0)); - logger.fine("Network scan done"); - } catch (Exception e) { - logger.log(Level.SEVERE, null, e); - } - } - }, 30_000, NETWORK_SYNC_INTERVAL, TimeUnit.MILLISECONDS); - } } @Override @@ -89,6 +79,7 @@ public class NetScanController implements HalEventController, HalAutostartContro logger.log(Level.SEVERE, null, e); } } + @Override public void foundInetAddress(InetAddress ip) { logger.fine("Auto Detected ip: " + ip.getHostAddress()); @@ -101,6 +92,34 @@ public class NetScanController implements HalEventController, HalAutostartContro } + @Override + public synchronized void startScan() { + if (!scanRunning) { + scanRunning = true; + executor.schedule(new Runnable() { + @Override + public void run() { + try { + logger.fine("Starting network scan..."); + InetScanner scanner = new InetScanner(); + scanner.setListener(NetScanController.this); + scanner.scan(InetUtil.getLocalInet4Address().get(0)); + logger.fine("Network scan done"); + } catch (Exception e) { + logger.log(Level.SEVERE, null, e); + } finally { + scanRunning = false; + } + } + }, 0, TimeUnit.MILLISECONDS); + } + } + + @Override + public boolean isScanning() { + return scanRunning; + } + @Override public void register(HalDeviceConfig deviceConfig) {